8.9 KiB
Phase 0.9D existing-stack endpoint matrix
Date: 2026-07-18
Status: DESIGN_ONLY
Scope and common behavior
The full-profile matrix is bound to controlled Payload Manager commit
e23d94ff91233aa770e2342800c1467875bdef44,
include/pldmgr.h:8-40 and src/http_server.c:188-1181. Its public-base
equivalent is commit cfbc70f30f419b09bf2b52283f7409e2d3117ee1;
the public base lacks the two chimera routes. The separately compiled minimal
controlled profile is in src/controlled_manager.c:181-334.
Unless a row says otherwise:
- authentication is absent and full-profile responses add permissive CORS;
- every non-
OPTIONSfull-profile request writes the process-localserver_active_flag(http_server.c:207-208); - non-noisy requests also append stdout/ring log state
(
http_server.c:638-641); - handler responses are bounded in-memory text/JSON/static assets, not an arbitrary-file response;
- there is no automatic server-side retry, but client/UI retry is not a safe property of the route;
- exact timeouts and maximum request/response sizes are
UNPROVENunless explicitly bounded in the handler; - no row is a readback candidate.
ANY means the handler branch itself does not enforce a verb. This is not a
recommendation to call it.
Full-profile routes
| Method | Exact endpoint | Handler lines | Parameters / response | File and functional effects | Classification |
|---|---|---|---|---|---|
OPTIONS |
any | 193-205 | empty CORS preflight | no active flag; sockets/counters only | observation false; not file readback |
ANY |
/, /index.html, /cache.appcache, /favicon.svg, /icon.png |
709-733 | compiled static bytes | no file open; active flag | LOW_VOLATILE, observation partial |
POST |
/chimera:upload-controlled |
212-252, 481-537 | query filename plus identity headers; text | exclusive write flags, then verified `O_RDONLY | O_NOFOLLOW |
ANY |
/manage:upload |
254-286, 540-585 | query filename, request body; text | fopen("wb"), write, rename/import, metadata |
forbidden: create/truncate/write/rename |
POST |
/set_config |
288-295, 363-398 | form body; text | reads current config, then config/autoload files can use fopen("w") |
forbidden: configuration write |
POST |
/repository_push |
297-304, 401-443 | JSON body; text | temp/cache write, remove on error, rename, config timestamp | forbidden: write/remove/rename |
POST |
/sources_set |
306-313, 446-478 | JSON body; text | sources file replacement | forbidden: configuration write |
POST |
/repository_install_push |
315-356, 588-636 | filename/repo URL plus body; text | fopen("wb"), write, install rename/metadata |
forbidden: create/truncate/write/rename |
ANY |
/usb_move_check |
648-674 | query path; JSON includes USB size |
directory/stat reads only; path resolve | not binary response; observation partial |
ANY |
/usb_move_perform |
676-706 | path, overwrite, keep; JSON | reads USB, writes internal copy, optionally removes source | forbidden: write/remove |
ANY |
/manage:check |
735-759 | filename; existence JSON | stat directory and file |
no bytes/size/hash; observation partial |
ANY |
/list_payloads |
760-767 | JSON list | directory traversal, stat, metadata-sidecar reads |
no file bytes/size/hash attestation; observation partial |
ANY |
/processes_list |
768-775 | process JSON | process enumeration | functional observation only; not readback |
ANY |
/process_kill |
776-796 | pid query; text | sends process signal | forbidden: process action |
ANY |
/repository_payloads |
797-810 | JSON cache/list | cache/config reads; multi-source path can refresh/write | forbidden: possible network/cache write |
ANY |
/repository_refresh |
811-824 | JSON | network download, cache/temp/config writes and renames | forbidden: network/write/rename |
ANY |
/repository_install |
825-865 | filename/source/detail; JSON | network or cache reads, temp/final write and rename | forbidden: install/write/rename |
ANY |
/sources_list |
866-873 | JSON | reads sources configuration | configuration disclosure; no binary file framing |
ANY |
/sources_add |
874-900 | URL query; JSON | sources configuration write | forbidden: configuration write |
ANY |
/sources_remove |
901-921 | index query; JSON | sources configuration write | forbidden: configuration write |
ANY |
/chimera:load-controlled |
922-951 | filename plus identity headers; text | `O_RDONLY | O_NOFOLLOW |
ANY |
/loadpayload:<path> |
952-983 | path suffix; text | open(O_RDONLY), stat/read, sends to elfldr and launches |
forbidden: payload launch |
ANY |
/manage:delete |
984-1008 | filename query; text | unlinks payload/metadata, may update autoload | forbidden: delete/configuration |
ANY |
/shutdown |
1009-1015 | text | changes server run state | forbidden: service action |
ANY |
/log |
1016-1024 | log JSON | reads ring; active flag and connection state | observation partial |
ANY |
/version |
1025-1028 | text version | no file open; active flag | observation partial |
ANY |
/getip |
1029-1036 | text address | interface/socket query; active flag | observation partial; device/network metadata |
ANY |
/autoload_status |
1037-1091 | JSON | reads config/autoload; sets autoload_triggered=1 |
forbidden in Windows 1 and 2 |
ANY |
/autoload_clear |
1092-1097 | text | resets process-local autoload counters/trigger state; no file write in this call | forbidden: functional autoload mutation |
ANY |
/abort |
1098-1103 | text | changes autoload abort state | forbidden: functional mutation |
| unreachable | /autoload_status |
1104-1111 | short JSON | duplicate branch shadowed by 1037 | never independently callable |
ANY |
/get_config |
1112-1155 | JSON | fopen("r") config/autoload |
no arbitrary file bytes; observation partial |
ANY |
/events |
1156-1165 | server-sent log stream | connection allocation and log reads | indefinite stream; not file readback |
Minimal controlled-profile routes
This source defines a different listener/profile, not extra routes proven to be installed beside the full profile.
| Method | Exact endpoint | Handler lines | Parameters / response | Effects | Classification |
|---|---|---|---|---|---|
POST |
/chimera/upload |
181-303, 322-324 | required identity headers and filename; text status | exclusive temp create/write, then verified read/hash, fsync/rename | forbidden: device write |
POST |
/chimera/launch |
305-309, 324-326 | filename and identity headers; text status | verified local read/hash, sends and launches | forbidden: payload launch |
DELETE |
/chimera/artifact |
311-327 | filename; text status | unlink | forbidden: delete |
Requested capability inventory
| Capability | Existing route | Result |
|---|---|---|
| Directory listing | /list_payloads |
yes, filtered payload listing |
| File stat | /manage:check, /usb_move_check, listing internals |
partial/fixed-purpose; no general stat identity |
| File read | internal only | no arbitrary bytes returned |
| File download | none | absent |
| File hash | internal controlled-launch verification only | no hash response route |
| File size | /usb_move_check for allowed USB source |
no general live component size route |
| Upload | both upload routes and minimal /chimera/upload |
present and forbidden |
| Rename | internal upload/install commits | present and forbidden; no standalone route |
| Delete | /manage:delete, minimal /chimera/artifact |
present and forbidden |
| Process listing | /processes_list |
present |
| Service listing | none | absent |
| Listener listing | none | absent |
| Firmware | none | absent |
| Configuration | /get_config |
present, but request has functional active-flag effect |
| Autoload | status/clear/config routes | present and excluded |
| Payload launch | both load routes and minimal /chimera/launch |
present and forbidden |
File-open evidence
Filesystem reads occur in listing, configuration, repository/source handling,
USB checking, self-update discovery, and launch verification. The only
launch-side exact flags are controlled
O_RDONLY|O_NOFOLLOW|O_CLOEXEC (verified_launcher.c:83-99) and legacy
O_RDONLY (ps5_launcher.c:77-84). Upload paths use the write/create flags
shown above. None of these internal reads is wired to an HTTP binary-body
response.
Consequently:
readback_candidate=falsefor every existing route;- binary framing, remote EOF, returned byte count, partial-transfer detection, and end-to-end integrity are absent;
- a local file read for launch is not evidence of host readback;
- a general HTTP response is not evidence of file streaming.
The machine-readable matrix in
manifests/runtime/phase-0.9d-existing-stack-readback.json records the
per-route booleans and hard-stop reasons used by the validator.