@llblab/pi-actors 0.56.1 → 0.57.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +7 -7
- package/BACKLOG.md +4 -14
- package/CHANGELOG.md +13 -0
- package/README.md +7 -2
- package/dist/lib/execution-output.js +13 -2
- package/dist/lib/observability.js +9 -14
- package/dist/lib/registry.js +82 -117
- package/dist/lib/run-delivery.d.ts +1 -1
- package/dist/lib/run-delivery.js +146 -32
- package/dist/lib/run-ui-runtime.js +18 -27
- package/dist/lib/runs-process-windows-mi.d.ts +71 -0
- package/dist/lib/runs-process-windows-mi.js +146 -3
- package/dist/lib/tools-inspect.js +109 -59
- package/dist/lib/tools-local.js +16 -8
- package/dist/lib/tools-message.js +76 -65
- package/dist/lib/tools-response.d.ts +18 -0
- package/dist/lib/tools-response.js +88 -21
- package/dist/lib/tools-spawn.js +19 -12
- package/dist/skills/actors/SKILL.md +1 -1
- package/dist/skills/actors/references/diagnostics.md +3 -0
- package/dist/skills/actors/references/runs.md +1 -1
- package/docs/README.md +1 -0
- package/docs/actor-inspector.md +2 -2
- package/docs/agent-experience.md +51 -4
- package/docs/coordinator-delivery.md +2 -2
- package/docs/inactive-foundations-inventory.md +73 -0
- package/docs/inspection.md +9 -8
- package/docs/output-projection-map.md +19 -17
- package/docs/windows-process-observation.md +2 -2
- package/lib/execution-output.ts +13 -2
- package/lib/observability.ts +9 -11
- package/lib/registry.ts +89 -124
- package/lib/run-delivery.ts +130 -31
- package/lib/run-ui-runtime.ts +18 -34
- package/lib/runs-process-windows-mi.ts +167 -3
- package/lib/tools-inspect.ts +109 -59
- package/lib/tools-local.ts +26 -15
- package/lib/tools-message.ts +85 -58
- package/lib/tools-response.ts +97 -20
- package/lib/tools-spawn.ts +19 -12
- package/package.json +1 -1
- package/skills/actors/SKILL.md +1 -1
- package/skills/actors/references/diagnostics.md +3 -0
- package/skills/actors/references/runs.md +1 -1
package/AGENTS.md
CHANGED
|
@@ -81,8 +81,8 @@ For ordinary Run-file investigation, follow the accepted [same-session research
|
|
|
81
81
|
- `runs-retention.ts`: single owner of manual archive/prune and startup Run cleanup. Reuse lifecycle locks and ownership/generation/native/descendant/reuse guards; filesystem age is selection only, unknown PID is never absence. Keep candidate observations fenced across lock acquisition; ordinary temp preparation owns no Run deletion. Preserve manual APIs, TTL and evidence schemas. Automatic refusal/unbound retention does not certify positive native closure or add reporting. Manual retirement preserves an exact single surfaced rejection (including undefined/primitive/AggregateError) and ordered original/formatting/failed-evidence/lifecycle-release causes when multiple stages fail. Its journal appender separately preserves append plus release errors. Keep nested original aggregates intact and cause/errors non-enumerable; record failure text once under guard with compiled fallback, never let formatting mask primary. No synthetic missing id, rollback/retry, new public failure DTO or assumption that a pruned Run-local Trace survives. Queued/handled journal writes and filesystem effects remain independently committed observations; lower-layer already-masked faults are not recoverable by this owner.
|
|
82
82
|
- `runs-artifacts.ts`: captured artifact references, body-free metadata observation and explicit hash manifests. Read-model reference observation never hashes file bodies; anchor relative paths to captured cwd without lexical retargeting of symlink/parent semantics.
|
|
83
83
|
- `execution-sessions.ts`, `trace-projection.ts`, `control-projection.ts`, `recipe-projection.ts`, `session-evidence.ts`: shared bounded/redacted evidence owners. Recipe projection also owns pure captured-sensitive literal masking, explicit original recorded-content policy and exact reference comparison; these functions admit no identity/body/runtime authority. Recipe provenance privacy is shared by Recipe and canonical Trace context projection, stripping private origin fields/tokens without corrupting logical references. Trace coverage accounts for read omissions and malformed evidence.
|
|
84
|
-
- `tools-message.ts`: exact Control facade and its implemented
|
|
85
|
-
- `tools-inspect.ts`: exact `run:<id>`, `runtime`, `recipes`, and `tool:<name>` inspection. Fresh non-runtime compact text uses
|
|
84
|
+
- `tools-message.ts`: exact Control facade and its implemented bare block-YAML metadata-only receipt/error projection. Private local selection helpers (`controlSelected`, `controlChoices`, `controlNextPart`, `controlDocument`) compose the shared tools-response `selectYamlField`/`growYamlDocument` primitives, keeping whole selected scalars/lists or explicit whole-field/sequence omission records, seeding the shorter complete-or-omitted form and growing by priority under the existing16KiB including the public LF; authored values stay quoted scalar content, never parsed back into fields. Never duplicate run: in a labeled run value; canonical next-action targets stay typed read-only inspect nodes and other advice stays one opaque `next.instruction`, while structured/verbose payloads stay unchanged JSON. Queued/delivered does not certify handling, a legacy kill result leaves termination unconfirmed, and public dispatch errors retain exact private cause with no correlation disclosure. Whole-id omission reserves the complete safety/next record; transport/admission/lock/native behavior is untouched.
|
|
85
|
+
- `tools-inspect.ts`: exact `run:<id>`, `runtime`, `recipes`, and `tool:<name>` inspection. Fresh non-runtime compact text uses bare block-YAML metadata (native numbers/booleans/sequences, real required/optional argument sequences including one item, opaque selected values and one typed read-only `next` or opaque `next.instruction`), with whole-value-or-omission selection through the shared tools-response helpers, including complete required/optional argument-group coverage; verbose JSON must bypass compact formatting, and emitter unavailability must never become undefined text; focused doctor keeps its portable source_location as one whole quoted scalar. Run views retain their compact run/view header only, not a new status/snapshot/body route. Verbose text stays JSON of the unchanged details, while `tool:* view=schema` text is bare block-YAML generated metadata (own defined fields only, native parameter nodes) with the machine `details` object still exact JSON; an over-ceiling schema keeps the exact legacy JSON text rather than a clipped or partly reformatted document. Recipe `summary` and `registry` are one inspection path: the alias normalizes before the existing view guard and downstream projection, so identical `verbose` and other inputs yield identical facts, details and rendering, and the compact label stays `recipes: registry`. Neither name changes inventory, coverage or semantics; only `verbose` selects compact versus full output, and the view parameter description names the actual per-target sequences. Select at most the first existing hint; tools-response:formatInspectionHint recognizes only the three closed read-only recipes doctor/imports/summary literals, otherwise returns opaque instruction content without parsing/normalizing/spawning/registering. Full next_actions remains in details. The runtime compact branch also uses AX fields, selecting only its existing status identity/review facts, full exact-owner inventory length or existing triage pressure/attention counts. Keep full inventory independent of bounded verbose navigation and never derive counts from the40display rows. The successful compact branch adds no reads/caps/default snapshot/clock/source/recipient behavior; A1/B1 integration stays gated. Ten locally authored inspect errors now use private formatInspectFailure rendering bare block-YAML metadata with a field-local whole-field coverage record (state/reason/shown/omitted/total), native supported-value sequences and one typed read-only inspect next (or next_action coverage), under the existing shared budget with the public adapter's leading LF; the retained formatInspectNextAction stays a flat primitive for historical completion text, not a second refusal format. Exact existing guards, Error construction sites and dependency evaluation order remain. target_kind names the selector family, not admitted ownership. Supported values are actual sequences. Only missing-tool/schema errors retain their producer-known read-only next; this does not broaden formatInspectionHint's three-string recognizer. Unmarked helper fields must be bounded compiler literals/lists; every selected variable scalar is explicitly omittable. Seed each variable with its shorter complete value or whole-field omission row; reserve fixed facts/safety and an optional complete next, then admit whole values in source order without later shrinkage under existing16KiB minus the public adapter's one leading LF. An unfit action has next_action omission coverage, not a fake next command; counts are fields/actions, never raw/private character lengths. No clipping/character repair, catch-all, error wrapping, new Error metadata/schema or retries. Uncaught dependency/session/scope throws, existing runtime observation fallback and prior discovery/getter/String side effects remain; do not label all refusals effect-free or all errors AX.
|
|
86
86
|
- `file-state.ts`: canonical generic file-mutation locks and atomic JSON/text writers. withFileMutationLock preserves an exact synchronous callback rejection and a later surfaced release fault as ordered non-enumerable standard AggregateError errors/cause, including undefined/primitive/original aggregates; never coerce/flatten, replay callbacks, roll back bytes or interpret returned thenables. A single callback/release-only rejection and normal return remain exact. Atomic replacement separately preserves a single surfaced native-shaped rejection exactly, including null/undefined; retry-code access is null-safe and guarded. If that access throws, ordered private standard AggregateError errors/cause retains original then observation fault without coercion/flattening; no retry follows failed classification. Keep ordinary EPERM/EBUSY 20-attempt / 19×50ms limits, one onBeforeReplace call and already committed bytes unchanged. This is not writer rollback, fsync or cleanup proof. Acquisition, token/reclaim/lock interval and best-effort removal uncertainty stay separate. No async locking, exhaustive cleanup/native closure, public receipt or recovery of already-masked lower writer causes follows. Controlled release-fault fixtures retain their exact owner/frame and assert no workload/host exit.
|
|
87
87
|
- `state-readers.ts`: resilient JSON/JSONL parsing; strict UTF-8 JSON is opt-in; capped strict reads use available nonblocking/nofollow flags, require a regular opened descriptor and reach the complete declared file, never admit a valid prefix after premature EOF. Legacy degradation stays unchanged; bounded ownership-marker admission also selects strict reading. Execution manifest export/reference admission selects it; malformed bytes must not normalize into admitted source metadata.
|
|
88
88
|
- `runtime-identity.ts`, `runtime-triage.ts`: immutable package/schema identity and pure pending/stale Control classification.
|
|
@@ -90,8 +90,8 @@ For ordinary Run-file investigation, follow the accepted [same-session research
|
|
|
90
90
|
- `tools-spawn.ts`, `tools-register.ts`, `tools-local.ts`: Run creation, persistent capabilities, Recipe-backed tools and compact results. Compact spawn/async-tool launch receipts retain facts, expose actual existing-Run reuse and omit the redundant session-map hint only when the complete direct row is shown; absent/unavailable/omitted rows retain that request. Compact launch metadata uses bare block YAML with nested complete location values; preserve the original JSON details, expert facts, shared bounds and old completion text. Keep one leading result-separator LF for host invocation spacing, outside the pure YAML emitter. Spawn-verbose source selects legacy pretty JSON once after eager compact evaluation, then emits full YAML only from that clone without a new fixed byte/depth cap. Keep original stringify throws outside the projection catch; absent selected JSON, malformed selected keys/strings and recoverable post-selection failures withhold the whole projection with an attributable no-auto-repeat receipt, not repaired values, partial full facts or private causes. Returned details and unrelated JSON helpers stay unchanged; compiled-package and loaded-host adoption remain separate. Do not synthesize routine Run-inspection next actions or unconditional delivery/readiness promises. Preserve existing structured/verbose metadata, expert Inspect access and separately owned targeted diagnostic remediations. Runtime argument-repair guidance is pre-dispatch only: once an executor is entered or arguments are handed to the async launcher, rethrow the exact original value/cause/details even when its text matches validation prefixes. Preparation side effects, dispatch, actuation and closure remain distinct; add no retry and preserve configured execution policy.
|
|
91
91
|
- `inspector.ts`: owned-Run evidence and exact-session/generation-fenced actions through injected canonical control dependencies. `inspector-overlay.ts` and `inspector-command.ts` retain UI/navigation and host command wiring separately. **Actor Inspector** remains the product and command name, not a separate domain.
|
|
92
92
|
- `pi.ts`: Pi SDK envelope boundary. AX completion fallback identity comes from the closed terminal marker for new records or the original headers for retained captures when private details are stripped; keep the original legacy RegExp coercion order, reject noncanonical/indented/broken markers and never acknowledge by body equality; never let authored body labels or Unicode line separators override it. Preserve older header recognition and detailed-envelope precedence. Parsed ids remain hints until exact owned-journal/content admission; they grant no recipient, source or native authority.
|
|
93
|
-
- `observability.ts`, `run-ui-runtime.ts`: Trace attention, terminal reconciliation and Pi delivery. Fresh urgent-steer admission uses formatRunSteerMessage's single canonical AX layout only after the retained run/generation/directory/event lookup. Envelope.content is already frozen presentation: replay it directly without a new journal aspect, source refresh or reformatting. Attention and steer have no presentation selector or alternate new-message formatter; deliverRunAttentionNotifications uses the same canonical AX primitives for new notify/followup output. Saved envelope.content remains the compatibility boundary. The two AX checkpoint/reference helpers now have real ordinary/urgent reuse inside observability; keep ordinary first-eight coverage independent of steer's shared16KiB reservation/refusal loop. No ambient ordinary byte cap, event/detail copy, wake change or regeneration of committed content follows. Fresh attention uses shallow typed block-YAML metadata, bare without a body and delimited before an opaque zero-added-indent body. Preserve scalar-aligned500UTF-16 legacy previews, existing ellipsis and unknown local/upstream loss, original stringify/getter faults, whole reference sequences and first-eight slots before malformed filtering. Ordinary notify/followup remains unbounded; urgent steer validates raw essentials before reference reads and fits the complete final YAML/body with later-group omission coverage under16KiB. Serialization stays local to observability, not a new global formatter allowance; selection/read/acceptance authority stays here. Fresh urgent diagnostics also reuse its opaque field primitive: event/attention/stage records distinguish retryable admission, failed send request with unconfirmed delivery/presentation, and queued recovery with its exact evidence status/reason. Do not infer no effect from an exception or turn checkpoint retry into workload replay. Diagnostic display keeps only240pair-aligned raw message units and authored Markdown, with boundary U+2026/[omitted: unknown] for loss and unavailable for malformed text. This current UI projection is separate from unchanged whitespace-normalized/trimmed4096-unit last_error, original Error/cause and frozen envelope.content; create no saved format/aspect, reader, recovery loop or extra source permission. Fresh locally owned runtime notices
|
|
94
|
-
- `run-delivery.ts`: owner-scoped durable packet/phase persistence and bounded projections. Fresh ordinary source admission captures presentation_format=ax_records, own-data result_layout=
|
|
93
|
+
- `observability.ts`, `run-ui-runtime.ts`: Trace attention, terminal reconciliation and Pi delivery. Fresh urgent-steer admission uses formatRunSteerMessage's single canonical AX layout only after the retained run/generation/directory/event lookup. Envelope.content is already frozen presentation: replay it directly without a new journal aspect, source refresh or reformatting. Attention and steer have no presentation selector or alternate new-message formatter; deliverRunAttentionNotifications uses the same canonical AX primitives for new notify/followup output. Saved envelope.content remains the compatibility boundary. The two AX checkpoint/reference helpers now have real ordinary/urgent reuse inside observability; keep ordinary first-eight coverage independent of steer's shared16KiB reservation/refusal loop. No ambient ordinary byte cap, event/detail copy, wake change or regeneration of committed content follows. Fresh attention uses shallow typed block-YAML metadata, bare without a body and delimited before an opaque zero-added-indent body. Preserve scalar-aligned500UTF-16 legacy previews, existing ellipsis and unknown local/upstream loss, original stringify/getter faults, whole reference sequences and first-eight slots before malformed filtering. Ordinary notify/followup remains unbounded; urgent steer validates raw essentials before reference reads and fits the complete final YAML/body with later-group omission coverage under16KiB. Serialization stays local to observability, not a new global formatter allowance; selection/read/acceptance authority stays here. Fresh urgent diagnostics also reuse its opaque field primitive: event/attention/stage records distinguish retryable admission, failed send request with unconfirmed delivery/presentation, and queued recovery with its exact evidence status/reason. Do not infer no effect from an exception or turn checkpoint retry into workload replay. Diagnostic display keeps only240pair-aligned raw message units and authored Markdown, with boundary U+2026/[omitted: unknown] for loss and unavailable for malformed text. This current UI projection is separate from unchanged whitespace-normalized/trimmed4096-unit last_error, original Error/cause and frozen envelope.content; create no saved format/aspect, reader, recovery loop or extra source permission. Fresh locally owned runtime notices use tools-response.ts:formatYamlNotice, a UI-only flat-field serializer without the model byte/depth ceilings: retain full well-formed fields, withhold malformed selected text explicitly, and keep existing diagnostic-preview bounds. Callback failure preserves the original onCallbackError value and opaque diagnostic; completion recovery preserves evidence status/pending phase/reason with no forced send; idle completion delivery is labeled accepted only after the original durable acceptance; teardown counts/whole literal summary path are explicitly report data, not scope closure. Watcher/retirement messages are forwarded unchanged from observability's new AX producer formatting. Watcher messages reuse the already captured detail/recovery strings: never read Error.message twice, add primitive-error coercion, change raw signatures/IDs/ts/dedup/32suffix/rearm policy or regenerate older diagnostic text. Paths stay whole dynamic literals. Retirement notices preserve optional-notify argument short-circuiting, exact error-message observations, attempted/sendStop/cancel/result/failure behavior including notifier throws, and unconfirmed closure. Stop returned and cancellation reported are not native success; fallback reason is stop path failed because the path also contains notifier execution. Do not repair already-discarded lower causes or rewrite result errors from the display. No new clipping, identities, state reads, notifier timing/levels/dedup, retries, error wrappers or native authority. Fresh completion admission creates canonical AX only after existing owner/location rechecks; an already-admitted batch returns untouched, including every older presentation format. Keep active/idle timing, acceptance, exact generation and source admission authority unchanged; fresh completion-prefix allocation follows the run-delivery contract below. Color terminal status only in `ctx.mode === "tui"`; JSON/print/RPC status must not require an initialized terminal theme or disable mandatory completion delivery. Shared ready-forest selection and ambient candidate checks are metadata-only for primary sources. Read/verify a selected primary source only when collecting eligible completion members, retaining exact source owner/generation and refusing capture promotion or lost-source stdout substitution. Unsupported complete raw-stream selections remain explicit or legacy diagnostics, never fabricated primary output; separately admitted executor-final-response text is not complete raw-stream selection.
|
|
94
|
+
- `run-delivery.ts`: owner-scoped durable packet/phase persistence and bounded projections. Fresh ordinary source admission captures presentation_format=ax_records, own-data result_layout=completion_yaml_files_v1 and frozen text_budget, with no presentation selector/excerpt_format; direct and ordinary UI admission share this path. The separate inactive numbered-stream capture still inherits frontmatter_v2; do not change the private default globally or relabel retained captures. Preserve all stored encodings/absence and exact replay bytes/hints, including headings_shared_kinds and frontmatter_v1/v2; reject mixed/unknown aspects without invoking accessors. Journals store snapshots, not complete text, so neither an unreleased version nor a schema fix permits rewriting old codecs. The second frontmatter capture layout quotes unknown index as YAML "?"; the first keeps its original bytes, including unquoted ?. Fresh headers begin index, run, state, then admitted kind:primary/diagnostic; meaningful metadata and whole source/generation/location references follow. Display index is not member_index or native identity. Raw admitted Markdown follows the closed YAML at the left margin, without #N heading, result:/preview: wrapper, structural list indentation or whole-body literal fence. Known display loss is [N characters omitted] at the cut; no added ellipsis or body clipping flags/counts in YAML. Fresh rooted captures keep unknown upstream/fallback completeness/privacy warnings in header text_warnings; only an exact known character-omission marker follows a cut body. Fallback has no primary kind. Retained layouts keep their original marker placement. Visible text is admitted output/final Actor response or error/failure diagnostics, never command metadata or copied command excerpts. Source text_basis remains technical. No routine group windows/status copies, members wrapper, outer counters, Batch caption or standing full-map instruction appears in new model content; captured facts remain journal data. Material whole-result/reference omission, non-done omitted states and a whole inventory reference remain explicit. A single shown row keeps the same shape even when other results were omitted. Complete model content includes all exact references and only the necessary YAML-core packet identity/relative body-marker lengths, without fresh compiler HTML tails, under49152UTF-8 bytes for up to64candidate rows/256captured members. Equal scalar/CRLF-safe text-prefix shares freeze at admission, including service overhead; no redistribution, fixed16KiB result/2KiB preview cap, source recapture or later reallocation. Preserve every saved16KiB/48KiB allowance. Prefix admission must consider full-list/decimal discontinuities rather than miss fitting rows when omission scaffolding shrinks. Whole text has no display-cut marker when complete; known upstream clipping still forbids a full-original-output claim. The source reader selects at most48KiB from the same verified postprivacy observation; source-binding previews stay160code points. Retain chosen packet prefixes, not64independent48KiB copies. Unfit metadata rows keep bounded inventory recovery. Curate/copy/freeze members, arrays, artifacts and bindings; schema DTOs grant no publication permission and phase changes do not mutate member facts. Preserve generation/parent/source identities, exact ranges/hashes and whole references. The completion-only TUI uses independent native Markdown body components and literal Text header/marker/service components, with no global Markdown patch, source/native IO or scheduling authority. New rooted captures expose files.groups in the header: one literal root per group, relative entry paths, English role/purpose and read_first group/entry indices. Reconstruct original selected references exactly; never normalize dot/symlink routes, guess cwd or treat declared targets as produced. Unresolved paths retain path_basis=as_recorded/base_unavailable with a null root and no recommendation. Observation.group binds its original mutable Run-directory facts. All packet/inventory/whole-row omission metadata renders in the first header, not a service footer; no runtime text follows the last body except its known cut marker. Retained core-v1 captures keep their original references/locations and compact hiding rules; authored body lookalikes never disappear. Fresh ordinary hints use completion_yaml_core_v1 plus a whole-content digest; validated core lengths derive block positions. Retained completion_frontmatter_v1 hints keep their SHA-256-bound UTF-16 header/body/marker/service blocks and original compiler frames, dense ordered coverage and scalar/CRLF-safe endpoints. Invalid/missing hints and expansion reveal original full Text. These are display/correlation consistency, not authentication/read/action/acceptance/native authority. Malformed frontmatter-shaped stripped history cannot regain identity from a body Batch label or become absence/retry permission; ordinary thematic-break prose retains its legacy path. Retained pre-record codecs keep host rendering; older record/literal codecs keep exact original hints, dynamic fences, count spelling and separators. Fresh ordinary indices remain packet-local; no default stream activation follows. Fresh UI member locations are observed before journal locks after actual current-session selection/recheck, with captured_file_locations and frozen file_navigation. Data-only decoding does not grant current body/source visibility. Location snapshots retain16KiB, outcomes outrank lower-priority references, and each shown record has a whole location row or explicit omission; wholly omitted records stay inventory-covered. Reload/render/phase recovery never refreshes sources or frozen availability. Old absent/current_session_request captures keep their bytes, and optional full-map research stays a separate current-session action. Source/package checks do not prove the loaded host was reloaded.
|
|
95
95
|
- automatic draft/tool review domains: structurally redacted model review, journaled mutation, lineage, recovery, and explicit retry/reset safety.
|
|
96
96
|
|
|
97
97
|
The bundled Skill Recipe dependency DAG is `artifacts → actors, swarm` and `project-work → actors, artifacts, swarm`; `actors`, `music-player`, `swarm`, and `recipe-memory` have no cross-Skill Recipe dependencies.
|
|
@@ -186,13 +186,13 @@ Inspector Kill confirmation is a compact popup composited over the unchanged Ins
|
|
|
186
186
|
|
|
187
187
|
Inspector Kill cancellation is silent: Esc/n or Enter on Cancel only closes the dialog; no cancellation feedback or extra dismissal. Successful callbacks already suppress duplicate success text and invalidate the visible Run status. Preserve that behavior and the original ok/getter/error/generation/once-only semantics; failures/refusals/uncertainty stay visible. This is local Inspector feedback policy, not suppression of other delivery surfaces or native-closure proof.
|
|
188
188
|
|
|
189
|
-
Inspector feedback displays the whole already-selected message directly in a modal popup: no synthetic i: prefix, i command, secondary reader or extra feedback field wrapper. Preserve authored lines/blanks/indentation/backticks opaquely through existing native-column wrapping. Esc closes the notification and clears transient feedback; only unavoidable overflow scrolls in that same popup with arrows/PgUp/PgDn. Other action/navigation keys cannot reach underlying work. A private feedbackFromAction flag comes only from entering the existing confirmKill callback path, never from message text or proof of actuation; only that path pins closure: unconfirmed and No automatic retry outside the scrollable text. Local guards/cancellation do not gain invented uncertainty receipts. Kill and feedback share a bounded rectangle compositor with terminal-default background resets, not customMessageBg or hard-coded black; selected confirmation buttons retain selectedBg. Preserve the underlying document/Trace/selector rows, stripes, focus and scroll. Cache only the last normal Inspector frame as a transient modal underlay; native column resize must not refresh evidence while a modal is open, and closing resumes the existing invalidation path. The underlay is a captured display, never fresh status/ownership/native proof. Ctrl-C retains global close behavior. Never read raw Error/cause, renew authority or reconstruct normalized180/160-unit tails. Fresh producer formatting is now AX through inspector.ts:formatActorInspectorKillFeedback, a pure selected-value formatter with actual domain/overlay reuse; it grants no source/privacy/work authority. Domain bounded retains String(value ?? empty), whitespace normalization/trim and its180-unit rule (179prefix+boundary ellipsis when clipped); overlay catch retains original Error.message versus primitive String selection, replaceAll,160slice and template coercion. Only split-pair boundaries retract one unit; malformed selected text is unavailable/unknown without fake gap or scalar repair. Dynamic selected previews use a legacy basis note and unknown loss when clipped; compiler refusal literals get no invented legacy loss. Shared action/result/state-or-diagnostic/closure records preserve ok, exact calls/getters/String/throws and success suppression, without recovering hidden lower causes. The popup recognizes only the exact anchored first two AX header lines for display color, retaining legacy-prefix compatibility; never parse body labels into actions/identity. The old195-character test bound described only the old prefixed envelope; enforce its180-unit preview allowance independently from new AX scaffolding. No journal aspect/version or saved packet migration for these fresh UI-only results.
|
|
189
|
+
Inspector feedback displays the whole already-selected message directly in a modal popup: no synthetic i: prefix, i command, secondary reader or extra feedback field wrapper. Preserve authored lines/blanks/indentation/backticks opaquely through existing native-column wrapping. Esc closes the notification and clears transient feedback; only unavoidable overflow scrolls in that same popup with arrows/PgUp/PgDn. Other action/navigation keys cannot reach underlying work. A private feedbackFromAction flag comes only from entering the existing confirmKill callback path, never from message text or proof of actuation; only that path pins closure: unconfirmed and No automatic retry outside the scrollable text. Local guards/cancellation do not gain invented uncertainty receipts. Kill and feedback share a bounded rectangle compositor with terminal-default background resets, not customMessageBg or hard-coded black; selected confirmation buttons retain selectedBg. Preserve the underlying document/Trace/selector rows, stripes, focus and scroll. Cache only the last normal Inspector frame as a transient modal underlay; native column resize must not refresh evidence while a modal is open, and closing resumes the existing invalidation path. The underlay is a captured display, never fresh status/ownership/native proof. Ctrl-C retains global close behavior. Never read raw Error/cause, renew authority or reconstruct normalized180/160-unit tails. Fresh producer formatting is now AX through inspector.ts:formatActorInspectorKillFeedback, a pure selected-value formatter with actual domain/overlay reuse; it grants no source/privacy/work authority. Domain bounded retains String(value ?? empty), whitespace normalization/trim and its180-unit rule (179prefix+boundary ellipsis when clipped); overlay catch retains original Error.message versus primitive String selection, replaceAll,160slice and template coercion. Only split-pair boundaries retract one unit; malformed selected text is unavailable/unknown without fake gap or scalar repair. Dynamic selected previews use a legacy basis note and unknown loss when clipped; compiler refusal literals get no invented legacy loss. Shared action/result/state-or-diagnostic/closure records preserve ok, exact calls/getters/String/throws and success suppression, without recovering hidden lower causes. The popup recognizes only the exact anchored first two AX header lines for display color, retaining legacy-prefix compatibility; never parse body labels into actions/identity. Verified current producer results classify failed/rejected as error and unavailable/state-only as warning, and authored lookalikes stay warning because only the exact leading pair counts; the color grammar is display-only and no action/identity follows from rendered text. The old195-character test bound described only the old prefixed envelope; enforce its180-unit preview allowance independently from new AX scaffolding. No journal aspect/version or saved packet migration for these fresh UI-only results.
|
|
190
190
|
|
|
191
191
|
Trace table alone now receives actual inner width and projects one physical preview line with native truncateToWidth(..., ellipsis). Its private traceTableLine marks genuine column/CRLF/CR/LF gaps, not source loss, privacy or lifetime counts; full already-projected item/detail remains unchanged. Compact warning fallbacks must retain whole incomplete-history and recorded-not-lifetime/unavailable-rank meaning before optional details, without partial values presented as exact counts. At the24column component floor, Trace incomplete… and # recorded ≠ lifetime / #? unavailable preserve safety; wider captions keep prior wording when it fits. No generic fit/selector/chrome modification, extra banner row, source probe, projection cap/filter/read ordering, source counter/rank/ID or selection/cache/scroll/stripe change. ANSI resets are renderer output: assertion matching uses native stripTerminalSequences rather than assuming ellipsis is the final byte. Never turn display-gap markers into fabricated omitted-character counts or new source-body permission.
|
|
192
192
|
|
|
193
193
|
Four compiler-owned Control guard errors now use private tools-message.ts:controlGuardText: unsupported runtime action, missing runtime port, unavailable Run generation and undeclared actor-local action. Format only existing caller target/action, fixed result and real supported_actions/available_actions string sequences; no saved status/owner/generation/input/correlation, mutating next or no-effects claim. Keep exact normalizer/access/declaration/dispatch order and original status/getter observations. Preserve the old undeclared join/template evaluation before formatting because its hooks/coercion can throw; its output is not an action parser. Under the shared16KiB including leading LF, whole target and whole option group grow from shorter full-or-omitted seeds, avoiding false overflow from longer omission scaffolds. Counts cover selected fields/list entries, not chars, valid-action proof or private/upstream completeness; malformed selected UTF16 withholds the whole option group without repair. No new catch, Error metadata, cause access, source read, schema or dispatch. Unowned runtime/dependency/session/normalizer/kill/archive/prune errors and awaited-send-only cause boundary remain unchanged. Reuse all14original Control declarations and whole16source/npm owner with exact standard Error/host isError/opaque value/order/budget/legacy-join properties.
|
|
194
194
|
|
|
195
|
-
Only three local pre-launch spawn guards use tools-spawn.ts:spawnGuardText: unsupported state_dir, as without run: namespace and invalid id spelling. field/value identifies selected caller input, never an admitted Run, generation, launched/no-effects receipt or retry permission. Keep original state_dir/as/startsWith/slice/regexp order, including two as getter reads and target template coercion exactly once on the original error branches. The formatter must not reread input or serialize state_dir values.
|
|
195
|
+
Only three local pre-launch spawn guards use tools-spawn.ts:spawnGuardText: unsupported state_dir, as without run: namespace and invalid id spelling. field/value identifies selected caller input, never an admitted Run, generation, launched/no-effects receipt or retry permission. Keep original state_dir/as/startsWith/slice/regexp order, including two as getter reads and target template coercion exactly once on the original error branches. The formatter must not reread input or serialize state_dir values. Guard documents are bare block YAML (field/result/accepted_format/id_rule plus one whole selected value); the selected string fits16KiB including leading LF as one quoted scalar or has an explicit whole-field omission record, and malformed selected UTF16 is unavailable without repair or char/private-tail counts. The pre-dispatch argument-repair error keeps owned tool/required/optional facts in a closed `---` header and leaves the original validation prose and verbatim JSON invocation example as unparsed body text under the shared frameMetadataDocument primitive; never parse or reserialize that example, and metadata-only guidance stays bare. Keep all startRun/session/Recipe/draft/navigation/success/verbose/details code outside new catches; the original post-guard launch tail stays byte-equal. Existing tools.test/invocation/SDK native fixtures remain untouched. New tools-spawn.test.ts is the exact library-owner mirror, not a feature-name exception; its two pure-guard properties run in source, explicit conformance and whole installed replay without new native work. Actual host clones arguments and rejects unsupported state_dir by its unchanged schema before execute: do not bypass validation, claim that SDK error is AX, or project direct accessor probes through cloning. Namespace/id guard errors do cross the real host isError boundary. No new module/authority; the earned tools-spawn→limits edge uses the existing shared response cap.
|
|
196
196
|
|
|
197
197
|
Successful normal register/update-or-persisted receipt text now belongs to private registry.ts:registrationReceiptText, not a tools-register catch or a new presentation domain. Project only original post-activation tool/outcome/source/callable flag, the originally observed optional display boundary, selected required/optional args, warnings and first existing hint. Successful normal receipts use bare block YAML. Source references remain exact safely quoted scalar values, template stays a scalar, and argument/warning groups are native sequences including empty argument lists and opaque CRLF entries. The already selected normal callability Boolean stays Boolean; absent warnings stay absent. Invocation advice is opaque instruction, never a parsed/trusted call; only the producer's existing unverified tool-status hint becomes typed read-only next. No new active/persisted/validated/default/body fields are added to compact text. Original warning map/join, outcome/boundary and Schema.formatToolArgs/template observations stay ordered before new formatting because faults can follow persistence/activation/notify. Capture the old optional boundary call in place; never query activation again for copy or repair disagreeing compact/details facts from dynamic getters. Everything in transaction/rollback/notify and details stays unchanged. Under16KiB including the old public LF, shorter full/omitted seeds grow monotonically; reserve fitting complete safety warnings before name/source/hint and large arg groups. Counts cover selected fields/list entries/actions, not raw/private chars; malformed/non-text selected values are unavailable without repair or another coercion. Preserve all14original registry declarations/scenarios/assertions/fixtures/cleanup except one approved layout expectation and pre-import test environment; add2properties and whole16installed replay. The unchanged sibling-process fixture's production new URL reference is remapped alongside direct imports, not its fixture/assertion/cleanup code. Its process-lock comparison is not new Actor/native/host readiness proof. Registry list/delete/draft/errors/notifier text remain separately scoped. The earned registry→tools-response/limits edges reuse the pure YAML emitter and existing budget owner without new exports or callbacks.
|
|
198
198
|
|
|
@@ -202,7 +202,7 @@ Draft promotion returned text uses bare block YAML for only original selected na
|
|
|
202
202
|
|
|
203
203
|
Exactly four assertRegisterToolInputModes errors now use fixed AX compiler strings in place: removed values, invalid/empty from, mixed source modes and from args/async inheritance. Do not add a helper/catch, inspect supplied values or change hasOwn/getter/trim/mode-count/outer-lock observations to format these constants. Replacement/reference/source-mode/inherited-field choices are actual lists; original repair advice is opaque instruction, never typed mutating retry or no-effects proof. The same non-empty-from legacy sentence also exists in normalizeFromReference: keep that owner separate and use a unique guard context for edits. SDK clone/coercion/validation stays outside these local refusals: removed values/object-valued from may fail before execute, while numeric from is cloned/coerced to a string and an unnamed request can retain its old listing result. Do not force every wrong-typed host input through the direct guard, spoof schema or infer original caller types from post-validation params. Direct descriptor/getter/fallible-trim failures remain exact. All successful receipts and other registry errors/notices stay independently closed.
|
|
204
204
|
|
|
205
|
-
Three ordinary executeRegisterToolUnlocked guards now project name/source AX errors only: invalid normalized name (no new raw echo), reserved name (original selected template conversion exactly once) and a new registration missing every source. Preserve all name/has/normalize/reserved-set/resolution/template/authoritative-map/blocker order and exact unowned faults; existing dependency blocker text is not a locally authored constant to restyle. Empty name stays listing and existing-tool update can still reuse its source. Reserved display uses one whole selected scalar within16KiB including old public LF, or field omission/unavailability without repair/char-tail inference; preserve legacy method-bearing identity conversions rather than re-normalizing the display. Missing-source choices are a real list and old repair advice is opaque instruction. No new catch, source/body/activation probe, registry policy, overwrite/retry authority, machine field or operation. Keep successful and other-error branches closed; compare guards against real SDK clone/coercion/schema separately from direct accessors. Both duplicate-registration refusals now reuse private duplicateRegistrationText for only the old selected name display, fixed result and exact opaque Use update=true to overwrite advice. Preserve ordinary authoritative-file/current-Map versus draft current-Map/exists short-circuit predicates, blocker-before-update and original five legacy name normalization/path/display conversions. No body/source/metadata reread, policy merge, update/overwrite/retry permission, blanket catch or no-effects receipt follows. Three template-shape constants now identify template/result: nested Recipe-shaped object with old opaque correction, empty sequence and unsupported type with real string/object/sequence choices. Only strings changed; preserve typeof/Array/key/getter/trim/reference/expand order, both helper call paths and external errors. Front null/empty deletion, undefined inheritance, later authoring null/required checks and host coercion remain distinct. A changing-getter draft probe is direct preservation evidence, not a cloneable two-source SDK contract. Four authored validation constants now identify defaults/description/template with only fixed field/result: non-object defaults, missing command-template description, null at authoring and missing final template. Preserve original args→from→description→defaults→retained-template order and all normalization/caller predicates. No new body/value echo/coercion, global null/source rule or wrapper; front deletion, inherited source, Schema argument diagnostics and observation faults retain their owners. Direct controlled method/getter probes are not SDK DTOs; host may reject defaults before execute and route missing/front-null requests through earlier source/deletion behavior. The delegated-source runtime-owned-default refusal now projects only the original first selected key plus fixed defaults/result and exact old correction as opaque instruction. Object.keys/find and the private eight-name membership stay unchanged; do not list all names, inspect values for copy, optimize rejection before normalizeDefaults finishes, or generalize the guard to command templates. Native keys are finite ASCII so full output is provably bounded without a new helper/quota/omission policy; original copy/accessor faults and command-template later stages remain. Both assertDraftPath refusals now reuse private draftPathFailureText with only the already captured allowed_root or resolved path as a whole literal field; never echo the refused caller path in the root error. Preserve original getRecipeRoot/resolve/relative/equality/dot-prefix/exists order and existing Error/formatter sites; this does not repair containment, add probes or prove absence/native closure. Full scalar references fit16KiB including LF, else whole-reference omission/unavailability without repair/count inference; keep old inspect-summary advice opaque and unchanged, not upgraded into a new listing guarantee. Only the public from-normalization catch wrapper now uses sourceNormalizationFailureText for old displayed source, selected reason, opaque legacy active_skills_summary and opaque doctor instruction. Inner normalizeFromReference errors and catch extent stay unchanged; preserve Error.message.trim versus String(error), source/reason/summary/advice left-to-right template conversions, and both canonical doctor regex/identity conversions. Never repair display/hint disagreement or undefined display, parse summary commas into a complete list, reread metadata/private causes or skip fallible old evaluations to fit budget. Whole fields grow from shorter full/omitted seeds under16KiB including LF; malformed selections unavailable without repair/char-tail inference. Normal-registration candidate-admission refusal now uses candidateAdmissionFailureText only for its two existing requestedSource truthy/falsy branches. Preserve real admitUserRecipe/validated/tool/diagnostics join and pre-Error sourceDiagnostic construction order; a truthy display object rendering empty is not the falsy branch. Joined diagnostics/legacy summary stay opaque, with original4096-UTF16 admission cap and possible malformed clipping unchanged. Fitting diagnostics get budget priority; no new body/cause read, full-list inference, catch/policy/rollback/readiness or automatic retry. Tests must use actual admission results, serialize/restore any targeted join/global Error instrumentation and settle before cleanup; never fabricate results or weaken schema for fixtures. Two draft invalid-Recipe errors now use private draftRecipeFailureText only for old selected raw reason or joined candidate diagnostics; no new path/body. Keep readRawRecipeConfig then diagnoseRawRecipeConfigFailure as separate calls, reason truthiness/once-only coercion and draft Error lookup before join (unlike normal candidate pre-Error construction). Undefined reason stays absent; a truthy object displaying empty remains a present empty reason. Whole opaque value fits16KiB/LF or is omitted/unavailable; candidate4096UTF16 legacy selection stays unchanged. Real fs/metadata faults and actual admission results must remain, with serialized restored builtins/ESM bindings and no normal/draft policy merge. Only outer post-cleanup transaction error text now uses registrationTransactionFailureText for old stage, resolution_generation, legacy active_skills_summary and surfaced error, with original template conversions at the same Error/formatter site. Cleanup/persisted bytes/unlink/Map/reactivation/setActive and their exact failures remain unwrapped; formatting faults can follow all those effects. Resolution generation is not Run/live epoch/correlation. Error.message is not newly trimmed or causes disclosed. Whole opaque values grow from shorter representations within16KiB/LF, prioritizing fitting surfaced error; legacy inner rollback/advice text remains content, not a fresh rollback/readiness/retry guarantee. Three registry notification arguments now use private registryNoticeText for only original report identity/selected name. report means compiler notice, not proved callable/host removal. Keep callback lookup/name interpolation once and callback type/position/post-effect exceptions unchanged; no activation/metadata reread or model16KiB quota. Actual runtime.notify retains hasUI gate, TUI ThemedText→native Text renders literal multiline and RPC forwards message fire-and-forget. Full well-formed values remain unbounded as before; malformed selected name unavailable without repair/hidden char counts. Loaded colored terminal/phone remains separate from native headless width tests. Runtime Recipe watcher warning/refresh messages now use report and opaque instruction constants only. Preserve direct ctx.ui.notify without adding hasUI gating, all dedup/timer/load/callback ordering and exact contained errors; old reported default root is not a freshly verified location. Runtime startup-warning AX projection preserves original classification/filter/map/push/join/template coercion before projecting known compiler warning slots into category sequences. Captured slot ranges are not authored-label parsing; old compiler layout bytes are discarded only after original join/coercion. Reuse unbounded formatMarkdownField for opaque multiline entries; malformed selected warning unavailable without repair/count guesses, doctor advice opaque. Do not add hasUI short-circuit before formatting or reconstruct missing causes/metadata.
|
|
205
|
+
Three ordinary executeRegisterToolUnlocked guards now project name/source AX errors only: invalid normalized name (no new raw echo), reserved name (original selected template conversion exactly once) and a new registration missing every source. Preserve all name/has/normalize/reserved-set/resolution/template/authoritative-map/blocker order and exact unowned faults; existing dependency blocker text is not a locally authored constant to restyle. Empty name stays listing and existing-tool update can still reuse its source. Reserved display uses one whole selected scalar within16KiB including old public LF, or field omission/unavailability without repair/char-tail inference; preserve legacy method-bearing identity conversions rather than re-normalizing the display. Missing-source choices are a real list and old repair advice is opaque instruction. No new catch, source/body/activation probe, registry policy, overwrite/retry authority, machine field or operation. Keep successful and other-error branches closed; compare guards against real SDK clone/coercion/schema separately from direct accessors. Both duplicate-registration refusals now reuse private duplicateRegistrationText for only the old selected name display, fixed result and exact opaque Use update=true to overwrite advice. Preserve ordinary authoritative-file/current-Map versus draft current-Map/exists short-circuit predicates, blocker-before-update and original five legacy name normalization/path/display conversions. No body/source/metadata reread, policy merge, update/overwrite/retry permission, blanket catch or no-effects receipt follows. Three template-shape constants now identify template/result: nested Recipe-shaped object with old opaque correction, empty sequence and unsupported type with real string/object/sequence choices. Only strings changed; preserve typeof/Array/key/getter/trim/reference/expand order, both helper call paths and external errors. Front null/empty deletion, undefined inheritance, later authoring null/required checks and host coercion remain distinct. A changing-getter draft probe is direct preservation evidence, not a cloneable two-source SDK contract. Four authored validation constants now identify defaults/description/template with only fixed field/result: non-object defaults, missing command-template description, null at authoring and missing final template. Preserve original args→from→description→defaults→retained-template order and all normalization/caller predicates. No new body/value echo/coercion, global null/source rule or wrapper; front deletion, inherited source, Schema argument diagnostics and observation faults retain their owners. Direct controlled method/getter probes are not SDK DTOs; host may reject defaults before execute and route missing/front-null requests through earlier source/deletion behavior. The delegated-source runtime-owned-default refusal now projects only the original first selected key plus fixed defaults/result and exact old correction as opaque instruction. Object.keys/find and the private eight-name membership stay unchanged; do not list all names, inspect values for copy, optimize rejection before normalizeDefaults finishes, or generalize the guard to command templates. Native keys are finite ASCII so full output is provably bounded without a new helper/quota/omission policy; original copy/accessor faults and command-template later stages remain. Both assertDraftPath refusals now reuse private draftPathFailureText with only the already captured allowed_root or resolved path as a whole literal field; never echo the refused caller path in the root error. Preserve original getRecipeRoot/resolve/relative/equality/dot-prefix/exists order and existing Error/formatter sites; this does not repair containment, add probes or prove absence/native closure. Full scalar references fit16KiB including LF, else whole-reference omission/unavailability without repair/count inference; keep old inspect-summary advice opaque and unchanged, not upgraded into a new listing guarantee. Only the public from-normalization catch wrapper now uses sourceNormalizationFailureText for old displayed source, selected reason, opaque legacy active_skills_summary and opaque doctor instruction. Inner normalizeFromReference errors and catch extent stay unchanged; preserve Error.message.trim versus String(error), source/reason/summary/advice left-to-right template conversions, and both canonical doctor regex/identity conversions. Never repair display/hint disagreement or undefined display, parse summary commas into a complete list, reread metadata/private causes or skip fallible old evaluations to fit budget. Whole fields grow from shorter full/omitted seeds under16KiB including LF; malformed selections unavailable without repair/char-tail inference. Normal-registration candidate-admission refusal now uses candidateAdmissionFailureText only for its two existing requestedSource truthy/falsy branches. Preserve real admitUserRecipe/validated/tool/diagnostics join and pre-Error sourceDiagnostic construction order; a truthy display object rendering empty is not the falsy branch. Joined diagnostics/legacy summary stay opaque, with original4096-UTF16 admission cap and possible malformed clipping unchanged. Fitting diagnostics get budget priority; no new body/cause read, full-list inference, catch/policy/rollback/readiness or automatic retry. Tests must use actual admission results, serialize/restore any targeted join/global Error instrumentation and settle before cleanup; never fabricate results or weaken schema for fixtures. Two draft invalid-Recipe errors now use private draftRecipeFailureText only for old selected raw reason or joined candidate diagnostics; no new path/body. Keep readRawRecipeConfig then diagnoseRawRecipeConfigFailure as separate calls, reason truthiness/once-only coercion and draft Error lookup before join (unlike normal candidate pre-Error construction). Undefined reason stays absent; a truthy object displaying empty remains a present empty reason. Whole opaque value fits16KiB/LF or is omitted/unavailable; candidate4096UTF16 legacy selection stays unchanged. Real fs/metadata faults and actual admission results must remain, with serialized restored builtins/ESM bindings and no normal/draft policy merge. Only outer post-cleanup transaction error text now uses registrationTransactionFailureText for old stage, resolution_generation, legacy active_skills_summary and surfaced error, with original template conversions at the same Error/formatter site. Cleanup/persisted bytes/unlink/Map/reactivation/setActive and their exact failures remain unwrapped; formatting faults can follow all those effects. Resolution generation is not Run/live epoch/correlation. Error.message is not newly trimmed or causes disclosed. Whole opaque values grow from shorter representations within16KiB/LF, prioritizing fitting surfaced error; legacy inner rollback/advice text remains content, not a fresh rollback/readiness/retry guarantee. All locally authored mode/name/source/template/draft/transaction refusals in this paragraph are now bare block-YAML metadata documents rendered by private registry.ts:registryMetadataText/registrySelected/growRegistryDocument: fixed fields and choice sequences stay compiler literals/lists, every opaque selected value is one whole double-quoted scalar or an explicit whole-field omission record, seeds are the shorter complete-or-omitted form grown monotonically by priority under the unchanged16KiB including the one public LF, and authored text stays scalar content with escaped line breaks rather than becoming keys/actions. Keep the guard/getter/coercion/join/Error order, predicates, clipping and post-effect faults recorded above; only presentation changed. Three registry notification arguments now use private registryNoticeText for only original report identity/selected name, still flat report/tool fields outside this refusal migration. report means compiler notice, not proved callable/host removal. Keep callback lookup/name interpolation once and callback type/position/post-effect exceptions unchanged; no activation/metadata reread or model16KiB quota. Actual runtime.notify retains hasUI gate, TUI ThemedText→native Text renders literal multiline and RPC forwards message fire-and-forget. Full well-formed values remain unbounded as before; malformed selected name unavailable without repair/hidden char counts. Loaded colored terminal/phone remains separate from native headless width tests. Runtime Recipe watcher warning/refresh messages now use report and opaque instruction constants only. Preserve direct ctx.ui.notify without adding hasUI gating, all dedup/timer/load/callback ordering and exact contained errors; old reported default root is not a freshly verified location. Runtime startup-warning AX projection preserves original classification/filter/map/push/join/template coercion before projecting known compiler warning slots into category sequences. Captured slot ranges are not authored-label parsing; old compiler layout bytes are discarded only after original join/coercion. Reuse unbounded formatMarkdownField for opaque multiline entries; malformed selected warning unavailable without repair/count guesses, doctor advice opaque. Do not add hasUI short-circuit before formatting or reconstruct missing causes/metadata.
|
|
206
206
|
|
|
207
207
|
Public first-layer UX/AX must serve both audiences from the same facts: understandable progress for the human, compressed decision context for the agent, and only a relevant drill-down when needed. Do not substitute a raw dump, add blanket fields/hints, coerce status objects into text, or promise later delivery that is not established. Delivery is not handling; a legacy kill attempt is not full-scope closure. Keep raw detail explicit and recipient-scoped at every level, including details/verbose; an identity-change refusal must not publish the replacement's status. Preserve original action/refusal facts and underlying uncertainty; separate presentation/curation fixes from lifecycle/native authority. Actor-local delivery_failed may coexist with recorded handled state; retirement exceptions may follow a move/removal. Missing Trace/correlation proves no inaction. Preserve causal/correlation evidence in its existing owner before public failure projection; do not build one generic recovery/receipt domain or release a transport-spanning lifecycle lock without equivalent generation/endpoint fencing. runs-control-delivery now retains surfaced primary failures in standard non-enumerable cause and combines later failed-status recording in ordered AggregateError.errors with only genuinely returned admitted control id/generation. Endpoint-not-ready, post-send delivered-record failure and unprintable failure text retain their distinct causes. FIFO write/close faults preserve both failures and already-written bytes, not rollback. Raw chains stay Kernel-local; ordinary serialization does not publish them. After actor-local dispatch, tools-message wraps any rejection in a bounded conservative Error, preserving the exact thrown value in non-enumerable cause without coercing it. Keep the original request target/action only (whole target or explicit omission under 16 KiB), report delivery/handling/effects uncertainty and no automatic replay, and point to fresh owned inventory. Captured admission ids/generation are deliberately not copied into that public error, including verbose: an old context or error DTO does not prove current reply scope. Do not add a second lifetime registry or weaken error semantics to publish correlation. Admission or lower-owner/facade release failures without a returned record must not gain invented correlation. The selected delivery/facade/retirement/locked-mutation/replacement boundaries preserve surfaced original/later faults; that does not recover errors already discarded below them or close B2's separate awaited-transport gate.
|
|
208
208
|
|
package/BACKLOG.md
CHANGED
|
@@ -6,27 +6,19 @@ Task IDs name bounded work, not execution order. The operator authorizes autonom
|
|
|
6
6
|
|
|
7
7
|
## Next bounded work
|
|
8
8
|
|
|
9
|
-
- **Separate remaining owners:** F1.
|
|
9
|
+
- **Separate remaining owners:** F1.7 (one rollout candidate) remains the last open F1 owner; the migrated surfaces do not by themselves prove the loaded rollout or registry notice layout. Registry activation/promotion/deletion notice text stays outside the completed refusal migration. Inspector popup color recognition is verified against current producer results; a later feedback syntax change must update that anchored recognition with it.
|
|
10
10
|
- **Explicit gates:** U1 requires authorized loaded-host observation/reload; N1.2p needs actual Windows profile evidence, N1.3 an asset-distribution decision, and N1.6 separate activation admission. Original-clock/native-scope, macOS research and composition decisions retain their own B/C/T gates. Existing release permission does not adopt them.
|
|
11
11
|
- **Evidence reuse:** Reuse the accepted three-OS SOURCE/PACKED quit witnesses for B2.4; extend only the missing descendants/triggers/same-ID/crash cases. N1.9 stays a gated unresolved risk, not an instruction to repeat the completed ownership inquiry.
|
|
12
12
|
|
|
13
|
-
##
|
|
13
|
+
## 2. Uniform runtime presentation — adopted, expectations owned; acceptance pending
|
|
14
14
|
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
## 2. Uniform runtime presentation — adopted, rollout pending
|
|
18
|
-
|
|
19
|
-
Outcome: JSON structured inputs, block-YAML runtime-output metadata and unchanged selected authored text/Markdown, as defined by [the AX contract](docs/agent-experience.md#json-input-yaml-output-opaque-content). This includes tool/spawn receipts, not only Actor results. Rollout remains partial; this checkpoint does not imply uniform emitter conformance, native continuation, package publication or a loaded-host change. Existing machine/input/source/history contracts remain separate.
|
|
15
|
+
Outcome: JSON structured inputs, block-YAML runtime-output metadata and unchanged selected authored text/Markdown, as defined by [the AX contract](docs/agent-experience.md#json-input-yaml-output-opaque-content). This includes tool/spawn receipts, not only Actor results. Owned projections are migrated; this checkpoint does not imply loaded-host acceptance, native continuation, package publication or a service-carrier change. Registry notice text and runtime startup warnings retain their earlier flat layout. Existing machine/input/source/history contracts remain separate.
|
|
20
16
|
|
|
21
17
|
### F1 — One readable output contract
|
|
22
18
|
|
|
23
19
|
Exit: New owned runtime projections use YAML without pseudo-records or serialized JSON objects: bare when metadata-only, `---`-delimited headers only when a separate text body follows. Literal content, meaning, source/privacy bounds and saved messages remain intact. Service-carrier adoption has its own evidence gate; do not delete current framing to simulate completion.
|
|
24
20
|
|
|
25
|
-
- [ ] **F1.
|
|
26
|
-
- [ ] **F1.3s — Separate synchronous tool metadata from selected output.** Migrate owned usage/guard/exit-label facts without parsing or reserializing stdout/stderr/report bodies or JSON invocation examples. Keep existing trim/tail/loss basis, exact executor failures and the pre-dispatch repair cutoff. Metadata plus selected text uses a delimited header; metadata-only output stays bare. Verify: tools-local/execution-output/spawn guards and packed dispatch-failure owners.
|
|
27
|
-
- [ ] **F1.4 — Migrate inspection, Control and runtime notices.** Render selected structured/verbose metadata as YAML, including generated JSON Schema views; retain literal sources. Reconcile emitter execution/depth ceilings with actual caller budgets without narrowing public allowances. Preserve error/cause, request/delivery/handling/effects/closure distinctions and recipient fences. Verify: affected Control/inspect/runtime/notification owner properties.
|
|
28
|
-
- [ ] **F1.4i — Verify remaining Inspector feedback recognition.** Check anchored feedback recognition against current AX guard/error output and correct only evidenced gaps. Preserve reviewed generic block-YAML and independent native Markdown, zero added body indentation, exact selected text and own undefined fields, source labels, native columns/wrapping, chronology/identity, chrome, frozen underlay and once-only generation actions. Verify: affected guard/modal properties and compiled parity. Loaded acceptance stays with U1.3/U1.5; no duplicate renderer migration or implicit host reload.
|
|
29
|
-
- [ ] **F1.7 — Accept one rollout candidate.** Verify exactly one visual blank line between host invocation/arguments and each result/error without altering selected bodies. Independently verify no runtime-owned JSON/pseudo-record escape remains in the selected rollout, with history/literal-body invariance, source/compiled/package/Skill parity and permitted terminal/phone acceptance. Keep current capture codec facts and new target distinct; no unrun live/native claim or automatic default activation.
|
|
21
|
+
- [ ] **F1.7 — Accept the rollout on a loaded host.** Source/headless audit is done: one shared framing owner keeps exactly one host-separation blank line on migrated paths, no runtime-authored object dump or pseudo-record remains in the migrated set, history/literal bodies are unchanged, and source/compiled/package parity passes. Remainder is the permitted loaded terminal/phone observation of one rollout candidate, including rooted completion headers, English read-first guidance and no post-Markdown runtime footer, which needs the same separate authorization as U1; keep capture codecs and live claims distinct and claim no automatic default activation.
|
|
30
22
|
|
|
31
23
|
### U1 — Loaded UI/AX acceptance
|
|
32
24
|
|
|
@@ -180,7 +172,6 @@ Exit: A separately admitted optimized shipping path preserves identity/status/au
|
|
|
180
172
|
|
|
181
173
|
- [ ] **N1.2p — Establish UTC-profile admission.** Record actual native environment/version facts and real PowerShell precision-boundary witnesses, then define/test the exact initial admission predicate. MI offset zero, runner labels, JavaScript timezone or expected-identity equality are insufficient. Keep unproved date/provider partitions unsupported. Verify: Windows differential and separately disclosed controlled formatter witnesses.
|
|
182
174
|
- [ ] **N1.3 — Decide native executable distribution.** Obtain an explicit decision on reviewed unsigned Windows x64 repository/npm assets with manifest-bound provenance and baseline fallback. Recommendation: committed prebuilts, no install-time compilation/download. This decision does not approve default activation. Verify: source/build/artifact/architecture/dependency and execution-policy review.
|
|
183
|
-
- [ ] **N1.4c — Complete asset-verified acquisition preparation.** Add the bounded complete-manifest reader, trusted exact-byte selection, fixed versioned package-relative asset verification/lookup and shell-free invocation seam under the reviewed contract. Preserve raw-null refusal and unsupported UTC admission until N1.2p; comparison/status/fences remain in their owners. No production routing or binary inventory change without their separate gates. Verify: mirrored asset/acquisition/fallback ports and source/compiled parity.
|
|
184
175
|
- [ ] **N1.5 — Bind the exact candidate asset.** After N1.3, retain reviewed Windows build bytes and manifest, verify source/artifact hashes and toolchain provenance, and make offline build/prepack copy-and-verify assets for source and compiled lookup. Ordinary users need no compiler, new runtime, download or privilege. Unsupported architecture and missing/corrupt/policy-blocked assets must not bypass policy or repair a mismatch. Verify: source/packed asset parity and differential against those exact bytes.
|
|
185
176
|
- [ ] **N1.6 — Review and integrate acquisition routing.** Gate on N1.2p/N1.4c/N1.5 and explicit activation admission. Change only the fresh scalar/shared acquisition seam; keep liveness, public status/error precedence, original-frame fallback, publication/Control/snapshot/teardown checks and callback fences. Never fall back through a supported identity mismatch or replacement. Verify: process/status/observability/results/Control owners and independent review.
|
|
186
177
|
- [ ] **N1.7 — Close real SDK/native convergence.** Run the full source-and-packed journeys through the integrated shipping path and obtain the complete three-OS/three-shard matrix plus audit. Keep 87 planned genuine Runs/layout, nine modes, both 40-spawn cohorts, workload 300 s/10 ms, SDK watchdog 900 s Windows/300 s elsewhere, operator-admitted five-second completion-boundary ESRCH settlement after canonical work readiness and separate ten-second original-close acceptance. Other existing eight-second settlement policies remain unchanged. No extra skips, forced exits, signals, fabricated birth/absence or deadline resets/inflation.
|
|
@@ -192,7 +183,6 @@ Shared N1 constraints: Retain uncertain roots; fresh ESRCH immediately precedes
|
|
|
192
183
|
|
|
193
184
|
Exit: Any later cleanup is independently justified and validated against its own tree. The immutable 0.56.0 tag is not a cleanup branch; source/packed presentation and release-narrative acceptance are already covered by the accepted release tree.
|
|
194
185
|
|
|
195
|
-
- [ ] **R1.1 — Inventory retained inactive foundations before a removal decision.** Identify packaged but unactivated supervision/stream/native-adapter owners, their actual consumers and interleaved safety guards. Produce a reachability/package inventory that distinguishes reviewed runtime dependencies from optional foundations; remove nothing merely by filename or because its default path is off. Default supervision and public completion streams remain disabled. Verify: source/compiled/default-wiring and npm-inventory audit; use existing build/package evidence where inputs are unchanged.
|
|
196
186
|
- [ ] **R1.2 — Remove temporary diagnostics after native acceptance.** Gate on N1.7; remove only proven temporary/redundant instrumentation, preserve owned regressions, then refresh invalidated focused checks and final candidate-bound packaging/native evidence. A dirty status note or earlier executable result is not final-tarball proof.
|
|
197
187
|
|
|
198
188
|
## Evidence and scope notes
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,19 @@
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.57.1: Rooted Completion Headers
|
|
8
|
+
|
|
9
|
+
- `Completion Headers`: New captures keep all runtime metadata above the Actor Markdown, with no service/file footer. File references share literal roots with relative entries, English purposes and a read-first pointer. External roots and unresolved bases stay explicit; declarations do not prove production. Known cut counts remain at the cut. Original Markdown, source/generation/privacy fences, shared budgets and exact historical replay are preserved.
|
|
10
|
+
|
|
11
|
+
## 0.57.0: YAML Runtime Output
|
|
12
|
+
|
|
13
|
+
- `Control and Inspection`: Compact Control receipts and inspect views/refusals use block YAML with native lists, whole-value omissions and conservative delivery/handling facts. Generated tool schemas use YAML when renderable, retaining the legacy JSON fallback and explicit verbose JSON. Recipe view=registry aliases summary. Large argument groups and next actions stay bounded without breaking verbose inspection.
|
|
14
|
+
- `Registry Refusals`: Locally authored registration mode/name/source/template/draft/transaction errors now use bare YAML. Selected values stay whole or explicitly omitted/unavailable; prior correction advice stays content, not permission to retry. Guard/coercion ordering, original faults and post-effect uncertainty remain unchanged.
|
|
15
|
+
- `Execution Guidance`: Command failures separate exit_code/killed metadata from selected stderr/stdout; empty-stream failures stay metadata-only. Argument-repair guidance uses a bounded YAML usage header, with whole argument-group omissions when needed, followed by the original validation prose and verbatim JSON example. Stream tail/spill behavior and post-dispatch error identity remain unchanged.
|
|
16
|
+
- `UI Notices`: Callback, completion recovery, steer diagnostic, teardown, watcher and retirement reports use block YAML. Full well-formed UI diagnostics remain uncapped rather than borrowing the model-output budget; malformed selected text is explicitly unavailable. Existing preview limits, deduplication, callback errors and closure uncertainty remain.
|
|
17
|
+
- `Windows Preparation`: Adds an unrouted bounded helper-manifest reader, versioned package-relative lookup, executable size/SHA-256 verification and shell-free invocation spec. Complete manifest reads detect overflow, and arguments match the native helper CLI. PowerShell remains the production backend; no binary is shipped, approved or activated.
|
|
18
|
+
- `Compatibility`: Machine details, verbose JSON and retained history keep their contracts. Metadata-only output is bare YAML; a separate selected body follows a closed header. Registry activation notices and startup warnings retain their earlier layout. Loaded terminal/phone acceptance remains pending; no host reload, public-stream or supervision activation is implied.
|
|
19
|
+
|
|
7
20
|
## 0.56.1: YAML Registry Receipts
|
|
8
21
|
|
|
9
22
|
- `Registry Receipts`: Successful registration/update, listing/deletion and draft-promotion replies now use bare block YAML with native lists, whole-value omissions and exact opaque scalars within the existing16KiB limit. Complete warnings retain priority. Normal callability stays Boolean; draft preserves its selected string display. Getter/coercion and partial-effect behavior, machine details, notices and saved messages stay unchanged. No input migration, automatic reload or retry is introduced.
|
package/README.md
CHANGED
|
@@ -92,10 +92,13 @@ inspect target=runtime view=status
|
|
|
92
92
|
inspect target=runtime view=runs status=failed
|
|
93
93
|
inspect target=runtime view=triage
|
|
94
94
|
inspect target=recipes view=status
|
|
95
|
+
inspect target=recipes view=summary
|
|
95
96
|
inspect target=recipes view=doctor identity=music-player/playback
|
|
96
97
|
inspect target=tool:my_tool view=status
|
|
97
98
|
```
|
|
98
99
|
|
|
100
|
+
Recipe `summary` and `registry` are the same inspection path; only `verbose` selects compact text versus structured details. Recipe and tool views are listed above; `inspect` parameter help and unsupported-view refusals name the actual accepted view sequences.
|
|
101
|
+
|
|
99
102
|
A Run exposes exactly `recipe`, `trace`, and `control` views. Run-specific `inspect` and `message` require a current coordinator session whose id exactly matches the persisted non-empty Run owner; possessing `run:<id>` alone is not authorization. Missing-session, ownerless, and cross-owner access fails closed. Use `inspect target=runtime view=runs` for the current session's exact-owner inventory. See the complete [management inspection matrix](./docs/inspection.md).
|
|
100
103
|
|
|
101
104
|
### `register_tool`
|
|
@@ -163,9 +166,9 @@ Generic command lifecycle is Trace-only: runner-owned `command.done` records pre
|
|
|
163
166
|
|
|
164
167
|
Ordinary finite Runs project terminal results through one root-coordinator completion scheduler. Nested actors inherit durable parent-generation lineage: their own Pi sessions never emit completion turns, and their results wait for the complete containing top-level tree. While the root Pi is active, the next completed `turn_end` boundary snapshots all ready trees into one immutable bounded batch, appends one visible custom message after the full tool batch, and requests one next model step. This overlay uses boundary entries, not Pi's native steering or follow-up queue, so the model can integrate fresh results before its current run settles. Already-idle Pi retains a short debounce and one automatic follow-up wake. The operator and model receive the same parent-child tree with bounded actor outputs. Proposed boundary entries stay pending until exact model context or bounded active-session evidence proves acceptance; an idle send finalizes on successful Pi acceptance without requiring a later context callback. Sequence, parallel, repeat, and imported branches remain internal, while separately launched Runs retain exact independent generations. Silent Runs and synchronous stop acknowledgments remain non-projecting.
|
|
165
168
|
|
|
166
|
-
|
|
169
|
+
Implemented UX/AX subset: completions share48KiB UTF-8 including service fields, divided equally between up to64 candidate results: nearly48KiB for one,24KiB each for two,16KiB each for three. Whole admitted text fitting its share is result; otherwise preview carries the safe prefix and exact omitted count, without a fixed16KiB result/2KiB preview cap. Completions show admitted work output or the bounded executor-selected final Actor response, never command metadata. Saved packets keep their original budget/text; source-backed prefix selection occurs only at fresh admission, not replay/render. Direct Pi text-print answers and successful composition/retry responses use the original producer privacy; observed upstream clipping stays explicit and is not confused with preview loss. Ordinary completions can carry retained primary-text, artifact-declaration inventory and diagnostic-metadata references. Follow the exact reference for clipped or omitted evidence; it records capture-time identity/hash/counts, not perpetual readability. Artifact inventories list declarations only, not proof that target files exist or were produced, and do not grant body-read permission. Diagnostic excerpts identify the selected field with literal UTF-8/Unicode counts; their source contains recorded command/error/failure-reason metadata, not complete primary output. Source loss is explicit and never replaced by guessed legacy bodies or paths. See [Run supervision](docs/run-supervision.md) for implemented boundaries and remaining acceptance gates.
|
|
167
170
|
|
|
168
|
-
|
|
171
|
+
Implemented A2 subset: `inspect target=runtime view=runs verbose=true` now adds a bounded [root-first file map](docs/run-supervision.md#same-session-file-investigation) for the actual session's already cataloged directories. Follow selected locations with ordinary tools, without an original producer key. Source/npm-packed SDK fixtures resume the same saved session in a new process after real Run producers and their coordinator host have exited, then read the actual result and select recorded stdout via the mapped execution manifest with ordinary tools; another session gets no inherited branch. The read-only map exposes canonical starting-location coverage and expected format hints, not a full file inventory or format/completeness validation. Its published_sessions link locates the fixed role catalog physically under the owned Run root, even without a semantic index or producer key; this does not certify its body or historical publication. SDK checks select one controlled partial preview and also read an actual private-writer preview after its holder exits and the same saved session opens in another process. Exact tool-read paths and final byte/absence snapshots are checked, including selected-preview loss errors without cached/raw fallback; the private publisher uses controlled recorded-session sources, not genuine Actor conversations. A finite public spawn and later same-saved-session research also pass through real source/npm entrypoints, without replacement tools or copied lifecycle wiring. Corrupt catalogs stay unavailable without repair. Inventory filters observe current Run status, not the registration-time cache. Ordinary maps retain root-group recency with known failed children first; add status=failed to the verbose request for observed failed-subtree-first ordering across roots without filtering the full owned map or adding reads. Priority is partial observed data, not terminal authority. Launches and compatible singleton attachments now register after lifecycle release; catalog failure returns `catalog=unavailable` without failing or retrying the launched work. SDK fork/clone preserves inherited history but gives the new logical session no fresh map branch. Compact launch receipts now include exact-generation current-session starting locations without evidence-body or catalog reads, or explicit unavailability/whole-row omission. New completion batches freeze bounded same-session location rows at admission and render them after outcomes within the shared budget, alongside the optional current-session map command. Legacy absent/request-only packets retain their text; source/npm SDK verifies an explicitly requested result read from a terminal row. This closes representative navigation acceptance, not the release. Neither captured locations nor the request execute inspection automatically or grant copied/forked history fresh ownership. Legacy batches keep their original text; no full map is embedded into immutable outcomes. Compact/default inspection, curated previews and timing/work/native authority are unchanged.
|
|
169
172
|
|
|
170
173
|
Compact spawn/asynchronous-tool launch receipts use bare block YAML with nested file-location data and identify an existing Run reuse instead of implying another launch. Full `spawn verbose=true` metadata remains JSON during the staged rollout; private details and input schemas keep their machine formats. When a complete direct file-location row is shown, it replaces the redundant session-wide map hint; missing, unavailable or omitted rows retain that optional investigation command. Exact references, expert details, shared bounds and saved completion-packet text are preserved.
|
|
171
174
|
|
|
@@ -225,6 +228,8 @@ Core files:
|
|
|
225
228
|
|
|
226
229
|
The runtime preserves owner filtering, process-identity verification, lifecycle locking, shutdown kill independent of actor-local Control capacity, terminal reconciliation, bounded captures, owned Pi sessions, path containment, and redaction. Trace/Control quotas do not constrain user-declared artifacts, repositories, media sources, complete captures, or actor-owned workload state. Restart clears generation-local Trace, Control, endpoint, execution, and terminal evidence; archive preserves the bounded tree, while prune preserves only requested artifacts.
|
|
227
230
|
|
|
231
|
+
New completion captures in 0.57.1 keep runtime metadata above the Actor Markdown, with no service/file footer. [Rooted completion files](docs/agent-experience.md#rooted-completion-files) show one explicit path base per group, relative entries, English purpose labels and a read-first pointer. External paths have separate roots; unresolved bases stay explicit. Existing captured messages keep their original layout.
|
|
232
|
+
|
|
228
233
|
## Actor Inspector
|
|
229
234
|
|
|
230
235
|
Open the owner-filtered TUI:
|
|
@@ -8,6 +8,7 @@ import { join } from "node:path";
|
|
|
8
8
|
import { sanitizeFilePart } from "./identity.js";
|
|
9
9
|
import * as Limits from "./limits.js";
|
|
10
10
|
import * as Paths from "./paths.js";
|
|
11
|
+
import * as ToolsResponse from "./tools-response.js";
|
|
11
12
|
export function writeFullOutput(toolName, stream, content) {
|
|
12
13
|
try {
|
|
13
14
|
const outputRoot = join(Paths.getExtensionTmpDir(), "outputs");
|
|
@@ -80,10 +81,20 @@ export function formatOutput(toolName, stream, content) {
|
|
|
80
81
|
};
|
|
81
82
|
}
|
|
82
83
|
export function formatFailureOutput(toolName, code, killed, stdout, stderr) {
|
|
83
|
-
const parts = [
|
|
84
|
+
const parts = [];
|
|
84
85
|
if (stderr.trim())
|
|
85
86
|
parts.push(`stderr:\n${stderr.trimEnd()}`);
|
|
86
87
|
if (stdout.trim())
|
|
87
88
|
parts.push(`stdout:\n${stdout.trimEnd()}`);
|
|
88
|
-
|
|
89
|
+
// Compiler-owned exit status is far below the shared metadata bound.
|
|
90
|
+
const header = ToolsResponse.renderYamlMetadata({ exit_code: code, killed }, Limits.RUN_DELIVERY_MODEL_MAX_BYTES).text;
|
|
91
|
+
// A failure with no selected stream text stays metadata-only bare YAML; no filler body is invented.
|
|
92
|
+
if (parts.length === 0)
|
|
93
|
+
return { text: formatToolText(ToolsResponse.frameMetadataDocument(header)), truncated: false };
|
|
94
|
+
// The existing formatter keeps trim/tail/temp-file/loss basis; only the exit label moves into YAML.
|
|
95
|
+
const formatted = formatOutput(toolName, "error", parts.join("\n\n"));
|
|
96
|
+
return {
|
|
97
|
+
...formatted,
|
|
98
|
+
text: formatToolText(ToolsResponse.frameMetadataDocument(header, formatted.text.replace(/^\n+/u, ""))),
|
|
99
|
+
};
|
|
89
100
|
}
|
|
@@ -12,7 +12,7 @@ import * as RunsTrace from "./runs-trace.js";
|
|
|
12
12
|
import { readRunCompletionTextSource, readRunResultArtifactInventory, readRunResultDiagnosticOutcome } from "./runs-context-exports.js";
|
|
13
13
|
import { readJsonlFileResilient } from "./state-readers.js";
|
|
14
14
|
import { Document } from "yaml";
|
|
15
|
-
import {
|
|
15
|
+
import { formatYamlNotice } from "./tools-response.js";
|
|
16
16
|
export function createRunUiObservationState() {
|
|
17
17
|
return {
|
|
18
18
|
attentionEventIds: new Map(),
|
|
@@ -103,13 +103,12 @@ export function createRunStateWatcher(input) {
|
|
|
103
103
|
const recovery = code === "rearmed"
|
|
104
104
|
? "; terminal watch acceleration restored"
|
|
105
105
|
: "; terminal reconciliation remains active and watcher rearm will retry";
|
|
106
|
+
// Captured detail/recovery strings are reused as-is; only the projection becomes bare block YAML.
|
|
106
107
|
diagnostics.push({
|
|
107
108
|
code,
|
|
108
109
|
id: ++diagnosticId,
|
|
109
|
-
message:
|
|
110
|
-
|
|
111
|
-
...(detail ? [formatMarkdownField("diagnostic", detail.slice(2))] : []),
|
|
112
|
-
formatMarkdownField("recovery", recovery.slice(2))].join("\n"),
|
|
110
|
+
message: formatYamlNotice({ watcher: code, scope, path,
|
|
111
|
+
...(detail ? { diagnostic: detail.slice(2) } : {}), recovery: recovery.slice(2) }),
|
|
113
112
|
path,
|
|
114
113
|
scope,
|
|
115
114
|
ts: new Date().toISOString(),
|
|
@@ -673,15 +672,11 @@ export function findRunRetirementCandidates(summary) {
|
|
|
673
672
|
}));
|
|
674
673
|
}
|
|
675
674
|
function formatRunRetirementNotice(run, action, message = "") {
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
else
|
|
682
|
-
fields.push(formatMarkdownField("result", action === "skip" ? "skipped" : "failed"), formatMarkdownField("diagnostic", message));
|
|
683
|
-
fields.push(formatMarkdownField("closure", "unconfirmed"));
|
|
684
|
-
return fields.join("\n");
|
|
675
|
+
return formatYamlNotice({ run: run.startsWith("run:") ? run.slice(4) : run, retirement: action,
|
|
676
|
+
...(action === "stop" ? { result: "request returned", reason: "child runs reached terminal state" }
|
|
677
|
+
: action === "cancel" ? { result: "cancellation reported", reason: "stop path failed" }
|
|
678
|
+
: { result: action === "skip" ? "skipped" : "failed", diagnostic: message }),
|
|
679
|
+
closure: "unconfirmed" });
|
|
685
680
|
}
|
|
686
681
|
export async function executeRunRetirements(summary, options) {
|
|
687
682
|
const results = [];
|