You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Follow-up to #233 item 4, split out when #268 shipped the existing-surface half (inspect + doctor). #98's visibility contract reads: "The compiler and Workbench expose the effective lifetime, runtime instance identity, and degraded states rather than allowing application code to infer durability from the presence of an MCP server."
agent-bundle doctor: filesystem-only inventory of workspace-durable SQLite stores per installed bundle (AB7316).
Still missing (needs new plumbing, deliberately not faked in #268):
Workbench catalog display (G6: read-only). The compiled route manifest (packages/agent-bundle/src/dev/routes/route-manifest.ts) and ArtifactInspection (src/dev/types.ts) carry no state metadata, so the Workbench catalog cannot show effective lifetime/driver today. Requires extending the manifest projection with the normalized state definition and a read-only catalog panel. The Workbench runtime UI already shows live stateStoreId/stateVersion (DevRuntimeStateIdentity); the static/declared side is what is absent. Coordinate with the active workbench atom lanes.
Runtime-instance identity.createWarmFlightHost owns WarmRuntimeIdentity { instanceId, artifactEpoch } and generated workers codegen processLifetime { pid, instanceId, hits }, but no read-only introspection endpoint exposes them: doctor only probes event-IPC sockets (event-*.sock) with a bare TCP connect and never speaks the protocol. Surfacing which runtime instance owns process-lifetime state (and its degraded runtime-restarted/runtime-unavailable states) needs a pinned read-only status verb on the event runtime IPC (or an equivalent surface) before doctor/Workbench can honestly report it.
Item 1 — Workbench state-lifetime catalog (G6 read-only) — #323 (merge ce1725e164524ac42f2577f94c6d2383ecf5e0e2)
The compiled route manifest now carries the normalized state declaration (RouteManifest.state?: RouteManifestState): declared id, effective lifetime, driver kind, budgets (declared/defaults resolved numbers or honest dynamic), the described durable location, the notice-ledger co-mount note, and the conventional source. One shared derivation (src/core/state-inspection.ts) feeds both inspect --state (#268) and the manifest; static inspection stays independent of the optional runtime peer, with a cross-package drift guard against AGENT_STATE_DEFAULT_BUDGETS. The Workbench Routes page renders it as a read-only State panel — zero mutation affordances (pinned), honest "declares no state module" absence with no alert role. Strict z.strictObject decode throughout; an unknown field inside state fails loudly. Real-Chrome 1440×900 proof: populated panel on audiobook-curator (workspace-durable/sqlite), honest absence on mcp-app.
Item 2 — runtime-instance identity introspection — #324 (merge e2fee4f7865e24a5cd2221dbfe77b3ecfa5a30f1)
A pinned read-only status verb on the event-runtime IPC ({"kind":"status","protocolVersion":1}, strict both ways, protocol version unchanged) exposes runtime: { instanceId, artifactEpoch, availability, pid, startedAt? } from the warm host's own WarmRuntimeIdentity — with no artifact-epoch gate, since the caller's whole purpose is learning the epoch. Degraded states are first-class: WarmFlightHost.availability() is a new read-only accessor, worker death now marks the host (runtime-restarted/runtime-unavailable), and the verb keeps answering with the same instanceId while degraded (pinned in the generated-server integration test). Backward compat is a detectable state: an older runtime strict-rejects the verb and the client reports one honest unsupported, distinct from unavailable. Doctor speaks the verb per live event-*.sock under a 1 s bound (never mutates, cannot hang) — new AB7317 (info, pre-verb runtime) and AB7318 (error, failed probe) registered — and the identity flows through the pinned discovery wire onto the Hosts page per the #285 conventions. Generated hook thin-client behavior (including standalone fallback on connect errors) is byte-identical.
#218 note: the stage-2/3 deferral ("state-lifetime catalog / WarmRuntimeIdentity assertions blocked on #269") is now unblocked on both halves: the matrix can read the static catalog from the manifest wire, and can assert warm-runtime instance identity at the packed / installed-host boundaries via requestEventRuntimeStatus (accepts an endpointId or a raw socket path, exactly what those suites hold). Wiring those assertions stays #218 work. Artifacts with no event routes expose no endpoint — identity introspection there remains honestly absent rather than fabricated.
Activity
Merge pull request #323 from ScriptedAlchemy/wave/269-visibility
feat(events): expose runtime identity over event IPC (#269)
test(events): pin runtime identity after worker restart (#269)
fix(events): preserve hook fallback on connect errors (#269)
Merge pull request #324 from ScriptedAlchemy/wave/269-runtime-identity
ScriptedAlchemy commentedon Sep 2, 2026
Landed — both remainder items shipped as two PRs
Item 1 — Workbench state-lifetime catalog (G6 read-only) — #323 (merge
ce1725e164524ac42f2577f94c6d2383ecf5e0e2)The compiled route manifest now carries the normalized state declaration (
RouteManifest.state?: RouteManifestState): declared id, effective lifetime, driver kind, budgets (declared/defaultsresolved numbers or honestdynamic), the described durable location, the notice-ledger co-mount note, and the conventional source. One shared derivation (src/core/state-inspection.ts) feeds bothinspect --state(#268) and the manifest; static inspection stays independent of the optional runtime peer, with a cross-package drift guard againstAGENT_STATE_DEFAULT_BUDGETS. The Workbench Routes page renders it as a read-only State panel — zero mutation affordances (pinned), honest "declares no state module" absence with no alert role. Strictz.strictObjectdecode throughout; an unknown field insidestatefails loudly. Real-Chrome 1440×900 proof: populated panel onaudiobook-curator(workspace-durable/sqlite), honest absence onmcp-app.Item 2 — runtime-instance identity introspection — #324 (merge
e2fee4f7865e24a5cd2221dbfe77b3ecfa5a30f1)A pinned read-only
statusverb on the event-runtime IPC ({"kind":"status","protocolVersion":1}, strict both ways, protocol version unchanged) exposesruntime: { instanceId, artifactEpoch, availability, pid, startedAt? }from the warm host's ownWarmRuntimeIdentity— with no artifact-epoch gate, since the caller's whole purpose is learning the epoch. Degraded states are first-class:WarmFlightHost.availability()is a new read-only accessor, worker death now marks the host (runtime-restarted/runtime-unavailable), and the verb keeps answering with the same instanceId while degraded (pinned in the generated-server integration test). Backward compat is a detectable state: an older runtime strict-rejects the verb and the client reports one honestunsupported, distinct fromunavailable. Doctor speaks the verb per liveevent-*.sockunder a 1 s bound (never mutates, cannot hang) — newAB7317(info, pre-verb runtime) andAB7318(error, failed probe) registered — and the identity flows through the pinned discovery wire onto the Hosts page per the #285 conventions. Generated hook thin-client behavior (including standalone fallback on connect errors) is byte-identical.#218 note: the stage-2/3 deferral ("state-lifetime catalog / WarmRuntimeIdentity assertions blocked on #269") is now unblocked on both halves: the matrix can read the static catalog from the manifest wire, and can assert warm-runtime instance identity at the packed / installed-host boundaries via
requestEventRuntimeStatus(accepts an endpointId or a raw socket path, exactly what those suites hold). Wiring those assertions stays #218 work. Artifacts with no event routes expose no endpoint — identity introspection there remains honestly absent rather than fabricated.Gates (run per-PR on the rebased trees at landing):
pnpm build·pnpm lint0/0 ·pnpm typecheck·pnpm test:unit(2582 → 2599 passed, 0 failed) ·pnpm test:route-unit(24) ·pnpm test:projection(59) · targeted integration + e2e (examples-real.e2e5/5;generated-route-server10/10;host-discovery-dev-server2/2;discovery.e2e1/1).Refs: #98, #233, #251, #268, #211, #285, #175, #292, #218.