Conversation
The `/actor-runtime/*` endpoints - live dev folder, debug mode, browser
view, migration emulation, upstream API fallback, the per-run events
channel - have no counterpart on the Apify platform, so nothing described
them except prose scattered through `requirements/api.md`. A client had no
way to ask a runtime what it supports.
They now have their own OpenAPI 3.1 document, `src/api/openapi/actor-runtime.json`,
and that document is what the namespace is:
- The runtime serves it from itself, so the CLI can enumerate the
namespace in one stock call: `apify api GET /actor-runtime` returns it
`{data}`-enveloped, `GET /actor-runtime/openapi.json` returns it bare
for OpenAPI tooling. Both are unauthenticated, and the real platform
answers `404` on the same path, so the call doubles as "am I pointed at
a local runtime, and which one?".
- Everything under `/actor-runtime/*` the document does not describe is
now answered from the document rather than falling through to the
catch-all that only knows the emulated platform surface: an undescribed
path is `404 not-found` pointing back at `GET /actor-runtime`, a
described path with an undescribed method is `405 method-not-allowed`
with an `Allow` header, and a plain request to the events websocket path
is `426 upgrade-required` instead of a bare `401`/`404`.
- `requirements/api.md` now references the document for paths, bodies,
payloads and per-rejection error types, and keeps only what OpenAPI
cannot express: behaviour over time, cross-surface consistency, and the
fallback/migration guarantees.
An integration test drives every documented operation, so a route without
a document entry loses its 404/405 contract and a document entry without a
route answers `501` - neither can drift silently.
Closes #40
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
…st its schemas The first pass moved the request/response shapes into the OpenAPI document but left the behavioural prose in `requirements/api.md`, so the requirements barely shrank - the point of the exercise. All of it now lives in the document, where each operation's own `description` carries it: migration emulation (window, counters, what an abort during the window does), the whole upstream-fallback contract (eligibility, all-methods, marker headers, fail-closed, token forwarding), the dev-folder re-check at run start, and the events channel's lifecycle. Runtime behaviour grafted onto otherwise faithful platform endpoints - `?devFolder=false`, `?gracefully=`, reboot - is listed at the document root under `x-actor-runtime-platform-notes`, so a client enumerating the document still sees every local deviation. `requirements/api.md`'s Actor-runtime section is now 22 lines instead of 174: what the namespace is, where its specification lives, how it is served, and what an undescribed path answers. Code comments and tests that cited the deleted section headings now cite the operation in the document instead. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Resolves three conflicts against master's Agent Skill work (#54): - `CLAUDE.MD`: master moved every usage instruction into `skills/actor-runtime/SKILL.md` and left the file a pointer, so the discovery note this branch added there moves to SKILL.md's "Inspecting state directly" instead of being restated in a file that no longer documents endpoints. - `requirements/api.md`: kept this branch's 22-line Actor-runtime section. The per-endpoint prose master edited is the prose this branch deleted in favour of the OpenAPI document. - `src/api/server.ts`: kept both mounts. The public `/skill` router stays registered first - it has to be a separate router, because this branch's router ends in a terminal handler that would otherwise answer `/skill` itself. `GET /actor-runtime/skill` is new in master, so it is now described in `src/api/openapi/actor-runtime.json` like every other endpoint in the namespace, and the unit test's endpoint list names it - otherwise the document would no longer be the whole namespace. Verified: build, lint, format:check clean; 793 tests passing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Resolves three conflicts, all around the graceful-abort contract that #64 made responsive: - requirements/api.md: kept this branch's 22-line Actor-runtime section. Master's edit lands entirely inside the "Graceful abort" heading this branch deletes in favour of the OpenAPI document. - src/services/runs.ts: took master's new wording (the call returns the ABORTING record straight away; a hard abort cancels the window rather than escalating), retargeted at the spec's abort platform note. - test/integration/graceful-abort.test.ts: took master's rewritten tests wholesale - the behaviour changed, so their assertions are the correct ones - and retargeted the four requirements/api.md citations their rewrite reintroduced. Also updates the abort entry in x-actor-runtime-platform-notes to the post-#64 behaviour. The document is normative for that parameter, so leaving it describing a request that "stays open until" the window elapsed would have made the specification wrong. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Conflict: skills/actor-runtime/SKILL.md - kept both bullets under "Inspecting state directly": master's named-resource addressing and this branch's `GET /actor-runtime` discovery note. Named addressing (#67) reaches the namespace's own `{actorId}` parameter, which the OpenAPI document is normative for, so its description now names every accepted form (`~name`, `username~name`, `userId~name`), the case-insensitive match, and the empty-name `400`. No conflict flagged that - the routes moved to `resolveActorParam` cleanly. Also retargeted three `api.md` citations in `dev-folder.ts`/`debug-mode.ts` that this branch had left pointing at prose it deleted. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Conflict: requirements/api.md - kept this branch's Actor-runtime section. #68's edit to it splits three ways: the spec-list entry and the new "Last-run shortcuts" section sit outside the section this branch deletes and are kept as master wrote them; its third hunk adds a fallback rule inside the prose this branch deletes in favour of the document, so that rule moves there. The OpenAPI document is normative for the upstream-fallback contract, so the setApiFallbackState description now carries the one-source rule: where one request resolves several records in turn (runs/last), the first record decides where all of them come from. No conflict flagged that - api-fallback.ts grew pinRequestToLocal cleanly - but leaving it out would have made the specification incomplete. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Conflict: requirements/api.md - both sides added a bullet to the
"exceptions to the {data} envelope" list, this branch's
GET /actor-runtime/openapi.json and #69's POST /v2/actor-runs/:runId/charge.
Kept both and corrected the count the two independent additions left wrong:
four becomes five.
The OpenAPI document needs no change for #69. Its events-channel edit only
adds internal counters and a read-only telemetry accessor - the frames a
websocket client receives are unchanged - and the new charge endpoint is a
faithful platform endpoint on the emulated /v2 surface (spec-table.ts), with
nothing grafted on locally, so it warrants no x-actor-runtime-platform-notes
entry either.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Two conflicts in requirements/api.md: - The run-start input validation #72 documents sits outside the section this branch deletes, so it is kept as #72 wrote it, above this branch's "Five endpoints are exceptions to the {data} envelope" line. - The Actor-runtime section: kept this branch's, as before. The OpenAPI document is normative for the upstream-fallback contract, and #72 extends the never-relayed error types, so setApiFallbackState's exhaustive list now names invalid-input and invalid-input-schema too. No conflict flagged that - #72's own edit to the same list lands inside the prose this branch deletes - and the list claims to be exhaustive, so leaving them out would have made the specification wrong. Nothing else in #72 reaches the namespace: input validation is faithful to the platform, message for message, so it warrants no platform note. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Conflict in README.md: master (#73) rewrote it around what the runtime lets you do locally and moved the developer material into CONTRIBUTING.md. Took master's README wholesale and re-added this branch's specification note in the new shape - four lines under "What you can do only locally", where the endpoints those features use are introduced, instead of the 18-line section this branch had put between the Podman notes and the dev loop, both of which have since moved or gone. CONTRIBUTING.md's new "Specification" section says the behavioural spec lives in requirements/*.md, which stopped being the whole truth on this branch: it now names the OpenAPI document as the contract for the /actor-runtime/* namespace, with api.md pointing at it. No change to the document itself - #73 is documentation only and alters no behaviour it is normative for. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Clean merge of #74 (run memory from .actor/actor.json). No conflicts: its edits to runs.ts and SKILL.md land away from this branch's. No change to the OpenAPI document. Memory sizing is platform-faithful behaviour on the emulated /v2 surface, not runtime behaviour grafted onto an endpoint, so it warrants no x-actor-runtime-platform-notes entry - the same call made for input validation (#72), pay-per-event charging (#69) and the runs/last shortcuts (#68). Its local differences (log notes, no plan cap, a bad memory field failing the build) are emulation-fidelity notes, which live in requirements/actor-driver.md, where #74 put them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
#76 adds Actor Standby, and with it a new path inside this namespace: /actor-runtime/standby/<label>, the addressing for clients that cannot resolve *.localhost. Git merged it without a conflict, but the document is normative for the namespace and said nothing about it, so: - `proxyStandbyRequest` is now in the document, with the standbyLabel parameter, the two addressings, the fact that every method, sub-path and websocket upgrade reaches the Actor (the single GET entry is the forwarding operation, not a shape this API defines), the token sources and the errors this router produces before the Actor is reached. - `setApiFallbackState`'s exhaustive never-relayed list now says the standby addresses are answered by a router ahead of the fallback, so no standby-* error can reach it - matching api.md's new "Actor Standby" section. - A fourth x-actor-runtime-platform-notes entry, for GET /v2/actors/{actorId}: an Actor's standbyUrl is a local address, and is picked from the request's own Host, which the platform's value never is. Standby itself is faithful, so nothing else is noted. - api.md's Actor-runtime section names both in its two pointer bullets; the unit test's endpoint and platform-note lists name them too. Verified: build, lint, format:check, and 1022 tests across 73 files. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Clean merge of #79 (the build log announces a registered dev folder). No conflicts, and no change to the OpenAPI document: the addition is a log line at the end of a successful build, not a change to anything the document states about setActorDevFolder - registration, the re-check at every run start, the ownership scoping, the read-back response, or the ?devFolder=false opt-out are all as described. The document does not describe log output for any endpoint. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Clean merge of #81 (changelog and GitHub releases) and #80 (configurable API and console ports), plus the two release-bot commits. #81 is CI and release workflows only - nothing the OpenAPI document is normative for. #80 does touch the document. It replaced the fixed-ports contract: `ACTOR_RUNTIME_API_PORT` and `ACTOR_RUNTIME_CONSOLE_PORT` now move the ports, and `system.md`'s "Both ports are fixed and not configurable" is gone. The document's `servers` entry still called the API port fixed and cited that requirement, so this corrects it: the port is 3333 unless the env var moves it, and the entry now says so once and states that every `:3333` elsewhere in the document is that same default. That covers the two standby addresses (`proxyStandbyRequest` and the `standbyUrl` platform note for `GET /v2/actors/{actorId}`), which keep the literal default port the README's own examples use. No endpoint changed, so the endpoint list in test/unit/actor-runtime-spec.test.ts is untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Clean merge of #82 (sample actors reorganized into samples/), plus the release-bot changelog commit. No change to the OpenAPI document. #82 moves `sample_actor_*` to `samples/actor_*` and retargets the paths that named them - e2e tests, SKILL.md, README, .gitignore, eslint config, two requirements files. The document describes API endpoints, not repository layout, and names no sample directory anywhere; neither do the spec tests or `actor-runtime-spec.ts`. Checked rather than assumed, as for every merge before it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
Clean merge of #83 (the console shows human-readable names instead of ids), plus the release-bot changelog commit. No change to the OpenAPI document. #83 is a console-rendering change: owners by username, Actors as `username~actorname` linked to their detail view, a run's build by its build number. The document mentions the console in five places and none of them is about how an identifier is rendered - the console's own dev-folder and debug-mode forms (still console-local unauthenticated routes accepting exactly what the API endpoints accept), the browser-view viewer URL served on the console's port, the Migrate button on the run detail view, and the dev-folder response field being the same path the Actor detail page shows. That path is not an id and #83 does not touch it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #40.
The problem
The
/actor-runtime/*endpoints — live dev folder, debug mode, browser view, migration emulation, upstream API fallback, the per-run events channel — have no counterpart on the Apify platform, so nothing described them except prose scattered throughrequirements/api.md. A client pointed at a runtime had no way to ask what that runtime supports.The proposal
Turn the namespace into an OpenAPI 3.1 document,
src/api/openapi/actor-runtime.json, and make that document be the namespace — it holds the contract, the runtime serves it, and the runtime answers from it.1. The whole contract moves into the document, not just the schemas: each operation's
descriptioncarries the behaviour that used to be requirements prose — the migration window and its counters, the full upstream-fallback contract (eligibility mapping, all-methods, marker headers, fail-closed, token forwarding), the dev-folder re-check at run start, the events channel's lifecycle. Runtime behaviour grafted onto otherwise faithful platform endpoints (?devFolder=falseon run start,?gracefully=on abort, reboot, the Actor object's locally shapedstandbyUrl) is listed at the document root underx-actor-runtime-platform-notes, so a client enumerating the document still sees every local deviation.requirements/api.md's Actor-runtime section is 22 lines, down from 174 — what the namespace is, where its specification lives, how it is served, and what an undescribed path answers. Nothing about those endpoints is restated there.2. The runtime serves its own specification (both unauthenticated: the document is static, identical for every caller, carries no user data):
GET /actor-runtime{data}envelope, soapify api GET /actor-runtimeprints itGET /actor-runtime/openapi.jsonThe real platform answers
404 page-not-foundon/v2/actor-runtime(verified againstapi.apify.com), so the same call also answers "am I pointed at a local runtime, and which one?" —info.versionis the runtime's own version.3. Anything the document does not describe is answered from the document, instead of falling through to the app-level catch-all that only knows the emulated platform surface:
This is the namespace-local counterpart of what
spec-table.tsalready does for the emulated/v2surface. The 426 route is registered from the document itself, before the namespace'sauth(), because that operation declares no security — a401there would contradict the document the same caller can read.What keeps it honest
test/integration/actor-runtime-spec.test.tsdrives every documented operation against a running server: a route added without a document entry loses its 404/405 contract, and a document entry added without a route answers501. Neither can drift silently. The unit test also checks every$refresolves, that the platform notes are complete, and thatinfo.versiontrackspackage.json.Notes for review
api.mdheadings ("Upstream fallback", "Migration emulation", "Graceful abort") cite the corresponding operation in the document instead.api-fallback.test.ts's case-variedPUT /v2/ACTOR-RUNTIME/api-fallbacknow gets405 method-not-allowedrather than404 not-found. The guarantee that test exists for — the namespace is never relayed upstream — is unchanged and still asserted (stub.hitCount() === 0).src/sotscemits it intodist/and the existingCOPY --from=builder distships it; no build-step or Dockerfile change needed.GET /actor-runtimebeing unauthenticated is a deliberate call (discovery before a token). Say the word if you would rather it sat behindauth()like the rest of the namespace.Merges from
mastermastermoved under this branch thirteen times, so it carries thirteen merge commits. Six of them needed a matching change in the document — it is normative, so an upstream change to something it describes makes it wrong rather than merely stale.Onto the Agent Skill work (#54) — three conflicts, and one addition they made necessary:
CLAUDE.MD— Ship Agent Skill documentation in runtime image #54 moved every usage instruction intoskills/actor-runtime/SKILL.mdand left the file a pointer. The discovery note this branch had added there moves into SKILL.md's "Inspecting state directly" rather than being restated in a file that no longer documents endpoints.requirements/api.md— kept this branch's 22-line section. The per-endpoint prose Ship Agent Skill documentation in runtime image #54 edited is the prose this branch deletes in favour of the document.src/api/server.ts— kept both mounts. The public/skillrouter stays registered first, and has to stay a separate router: this branch's namespace router ends in a terminal handler that would otherwise answer/skillitself.GET /actor-runtime/skillis now in the document (with its?format=jsonparameter, aSkillDocumentschema, and the500 skill-unavailablecase), and the unit test's endpoint list names it. Without that, the document would have stopped being the whole namespace — which is this PR's entire claim.Onto responsive abort (#64) — three conflicts, all downstream of that behaviour change:
requirements/api.md— kept this branch's section again. fix: Make Abort responsive #64's edit lands entirely inside the## Graceful abortheading this branch deletes.src/services/runs.ts— took fix: Make Abort responsive #64's new wording (the call returns theABORTINGrecord straight away; a hard abort cancels the window rather than escalating), with the citation pointed at the spec's abort note.test/integration/graceful-abort.test.ts— took fix: Make Abort responsive #64's rewritten tests wholesale, since the behaviour changed and their assertions are the correct ones; retargeted the fourrequirements/api.mdcitations the rewrite reintroduced.The spec's abort note was updated to match #64. It still said the request "stays open until" the window elapsed and that a hard abort "escalates". No conflict flagged that — the document is normative for
?gracefully=, so leaving it would have made the specification wrong.Onto resource addressing by name (#67) — one conflict, and one change it made necessary:
skills/actor-runtime/SKILL.md— both sides added a bullet under "Inspecting state directly". Kept both, feat: Add storage addressing by username~name and userId~name #67's addressing rule first, since it follows straight on from theapify apiexamples above it.actorIdparameter was updated to match feat: Add storage addressing by username~name and userId~name #67. That change routes/actor-runtime/dev-folder/:actorId,/debug/:actorIdand/browser-view/:actorIdthrough the newresolveActorParam, so those paths now accept~name,username~nameanduserId~nameas well. No conflict flagged it — the three routes took the new resolver cleanly — but the document is normative for that parameter, so it now names every accepted form, the case-insensitive match, and the empty-name400.Also retargeted three
api.mdcitations indev-folder.tsanddebug-mode.tsthat this branch had left pointing at prose it had itself deleted (the dev-folder body shape, the debug-mode field rules, and the deliberate absence of aGET).Onto the
runs/lastshortcuts (#68) — one conflict, splitting three ways:requirements/api.md— feat: Implement the runs/last shortcuts #68's spec-list entry and its new "Last-run shortcuts" section sit outside the section this branch deletes, and are kept exactly as feat: Implement the runs/last shortcuts #68 wrote them. Its third hunk adds a fallback rule inside the prose this branch deletes, so that rule moves into the document instead.setApiFallbackState's description now carries the one-source rule: where one request resolves several records in turn (runs/lastresolves the Actor, then its newest run, then that run's log or storage), the first record decides where all of them come from. No conflict flagged it —api-fallback.tsgrewpinRequestToLocalcleanly — but the document is normative for that contract, so leaving it out would have made the specification incomplete.x-actor-runtime-platform-notesentry was added:runs/lastis an ordinary platform endpoint implemented faithfully, with nothing grafted on locally.Onto pay-per-event pricing (#69) and the docs guides (#39) — one conflict, and no document change:
requirements/api.md— both sides added a bullet to the "exceptions to the{data}envelope" list: this branch'sGET /actor-runtime/openapi.jsonand feat: Support pay-per-event pricing and estimate run cost #69'sPOST /v2/actor-runs/:runId/charge. Kept both, and corrected the count the two independent additions left wrong — four becomes five.events-channel.tsedit only adds internal counters and a read-only telemetry accessor, so the frames a websocket client receives are unchanged; andPOST /v2/actor-runs/:runId/chargeis a faithful platform endpoint on the emulated/v2surface (spec-table.ts), with nothing grafted on locally, so it warrants no platform note either. Checked rather than assumed — the two merges before it each needed exactly such a change.Onto input-schema validation (#72) — two conflicts, and one change it made necessary:
requirements/api.md— feat: Validate Actor input and apply input-schema defaults #72's run-start validation bullet sits outside the section this branch deletes, so it is kept as feat: Validate Actor input and apply input-schema defaults #72 wrote it; the Actor-runtime section is this branch's, as before.invalid-inputandinvalid-input-schema, and neither is ever relayed — sosetApiFallbackState's list, which states it is exhaustive, now names them. No conflict flagged it: feat: Validate Actor input and apply input-schema defaults #72's own edit to that same list lands inside the prose this branch deletes.Onto the README/CONTRIBUTING split (#73) — one conflict, and no document change:
README.md— docs: Focus README on local-only use cases, move developer docs to CONTRIBUTING.md #73 rewrote it around "what you can do only locally" and moved the developer material intoCONTRIBUTING.md. Took docs: Focus README on local-only use cases, move developer docs to CONTRIBUTING.md #73's README wholesale and re-added this branch's specification note in the new shape: four lines right under that feature list, where the endpoints behind those features are introduced, instead of the 18-line section this branch had put between the Podman notes and the dev-loop walkthrough — both of which have since moved or gone.CONTRIBUTING.md— its new "Specification" section says the behavioural spec lives inrequirements/*.md, which stops being the whole truth on this branch. It now names the OpenAPI document as the contract for the/actor-runtime/*namespace, withapi.mdpointing at it.Onto run memory from
.actor/actor.json(#74) — no conflicts, and no document change:runs.tsandSKILL.mdland away from this branch's./v2surface, not runtime behaviour grafted onto an endpoint, so it warrants no platform note — the same call as for feat: Validate Actor input and apply input-schema defaults #72, feat: Support pay-per-event pricing and estimate run cost #69 and feat: Implement the runs/last shortcuts #68. Its local differences (the run-log notes, no plan cap, a bad memory field failing the build) are emulation-fidelity notes, which live inrequirements/actor-driver.md, where feat: Size runs by the memory fields of .actor/actor.json #74 put them.Onto Actor Standby (#76) — no conflicts, and the largest document change since the initial commit:
/actor-runtime/standby/<label>, the addressing for clients that cannot resolve*.localhost. Git merged it cleanly, but the document is normative for the namespace and said nothing about it, so the document had stopped being the whole namespace.proxyStandbyRequestis now in the document, with astandbyLabelparameter, both addressings (the path form and the platform-shapedhttp://<label>.localhost:3333/), the fact that every method, sub-path and websocket upgrade reaches the Actor — the singleGETentry is the forwarding operation, not a request shape this API defines — the token sources, and the errors this router produces before the Actor is reached (standby-not-enabled,standby-bad-gateway,standby-run-failed,standby-run-finished,standby-run-not-ready, …).setApiFallbackState's exhaustive never-relayed list now states that the standby addresses are answered by a router mounted ahead of the fallback, so nostandby-*error can reach it — matchingapi.md's new "Actor Standby" section.GET /v2/actors/{actorId}: an Actor'sstandbyUrlis a local address, and is picked from the request's ownHost(container alias vs. host), which the platform's value never is. Standby itself — the pool, the per-run limits, the idle timeout, the configuration on the Actor — is faithful, so nothing else is noted.api.md's Actor-runtime section names both in its two pointer bullets; the unit test's endpoint list and platform-note list name them too.Onto the dev-folder build-log line (#79) — no conflicts, and no document change: it adds a line to the end of a successful build's log, and changes nothing the document states about
setActorDevFolder— registration, the re-check at every run start, the ownership scoping, the read-back response and the?devFolder=falseopt-out all still hold. The document describes no endpoint's log output.Onto configurable ports (#80) and the release workflows (#81) — no conflicts, and one change #80 made necessary:
CHANGELOG.md.serversentry was corrected for feat: Make the API and console ports configurable #80. It called the API port "fixed" and citedsystem.mdfor it — but feat: Make the API and console ports configurable #80 deleted that requirement ("Both ports are fixed and not configurable") and made the ports settable throughACTOR_RUNTIME_API_PORTandACTOR_RUNTIME_CONSOLE_PORT. No conflict flagged it, and the document is normative for the namespace it mounts, so the claim would have stayed wrong. The entry now says the port is 3333 unless the env var moves it, and states once that every:3333elsewhere in the document is that same default — which covers the two standby addresses (proxyStandbyRequestand thestandbyUrlplatform note), whose literal examples match the README's own.Onto the samples reorganization (#82) — no conflicts, and no document change: it moves
sample_actor_*tosamples/actor_*and retargets the paths that named them (e2e tests,SKILL.md, README,.gitignore, the eslint config, two requirements files). The document describes API endpoints, not repository layout, and names no sample directory anywhere; neither do the spec tests oractor-runtime-spec.ts. Checked rather than assumed, as for every merge before it.Onto human-readable names in the console (#83) — no conflicts, and no document change: it renders owners by username, Actors as
username~actornamelinked to their detail view, and a run's build by its build number. The document mentions the console in five places and none is about how an identifier is rendered — the console's own dev-folder and debug-mode forms (still console-local unauthenticated routes accepting exactly what the API endpoints accept), the browser-view viewer URL served on the console's port, the Migrate button on the run detail view, and the dev-folder response field being the same path the Actor detail page shows. That path is not an id, and #83 does not touch it.Verified locally after the latest merge:
pnpm run build,pnpm run lint,pnpm run format:checkall clean, andpnpm testgreen — 1032 tests across 74 files, all passing.🤖 Generated with Claude Code
https://claude.ai/code/session_016VvUV6661cyYbxoHZv2Pby