Skip to content

release: memory silent-failure repair + dag-auto routing reduction - #399

Merged
LeXwDeX merged 34 commits into
mainfrom
dev
Aug 20, 2026
Merged

release: memory silent-failure repair + dag-auto routing reduction#399
LeXwDeX merged 34 commits into
mainfrom
dev

Conversation

@LeXwDeX

@LeXwDeXLeXwDeX commented Aug 20, 2026

Copy link
Copy Markdown
Owner

Summary

Promotion of dev to main, carrying five deliveries:

Test plan

Process disclosure

Closes#386, closes#387, closes#388, closes#389, closes#392, closes#395, closes#396, closes#397

fix(test): declare per-test timeouts for dag-node-supervision long tests
The output_schema instruction and the submit_result tool description now
state the single-authority contract: the summary belongs inside the
payload, message text must not duplicate it, and a successful submission
ends the turn without restating the result. Previously nothing told the
child not to narrate the report in prose before submitting, so the same
content entered the child transcript twice and the post-submit replay
step carried both copies (issue #386).
A block instruction equal to the workflow objective (after trim and
line-ending normalization) rendered the same content twice in the single
child prompt: once via the objective section and again via the
Block-specific instruction section. The compiler now drops the
instruction instead of duplicating it; genuinely block-specific
instructions keep their place and ordering (issue #387).
The live completion path captures {content_ref, size, sha256, summary}
into captured_output when a schemaless node's final reply IS one
existing absolute file path. Recovery settled the same reply inline
without the capture, so the same completed child produced different
durable output metadata depending on crash timing. Recovery now reuses
captureOutputFileRef (plus the report-area gitignore guarantee) with the
same best-effort fallback: any anomaly keeps the plain inline
settlement and never fails the node (issue #388).
- issue #386: drive the acceptance chain past prompt construction —
replay the submit_result durable write and assert spawn's completion
gate settles the node with the payload as durable output
- issue #387: dedicated compiler cases for duplicate-drop and the
objective-plus-detail superset (exact, not fuzzy, equivalence)
- issue #388: live-path file-ref capture asserted in lockstep with the
recovery receipt (identical durable effects side-by-side)
- drop an unnecessary non-null assertion and an unused binding; disable
unsafe-assertion lint in the recovery mock harness (4851 -> 4846 on
the merge ref, under the 4850 ratchet)
- output-ref persistence failure completes inline (best-effort contract)
- makeLastAssistantTextReader: last assistant text + missing-session
tolerance, restoring the 95% recovery.ts coverage floor (93.88% -> 99.49%)
fix(dag): resolve DAG prompt and output duplication
Todo lists drifted silently: todowrite is the only write path and nothing
ever re-surfaced the list, so completed work stayed pending, stale items
lingered, and in_progress was never set. A new TodoReminders pass runs
after SessionReminders in the session run loop and appends ONE synthetic
in-memory part (model-visible, never persisted) to the last user message
whenever the session holds uncompleted todos — covering tool-free steps
too, which a PreToolUse-based reminder cannot.
Skip conditions: no todos, all settled (completed or cancelled), or the
turn's last assistant message already contains a successful todowrite
call (the model just updated the list itself; a failed call does not
satisfy the guard). Applies per session, including child/subagent
sessions that hold their own todos (issue #389).
…t mock
- the in-memory convention cites SessionReminders' non-plan-mode branch;
its plan-mode branch persists via updatePart and is not the pattern
- the freshness guard is session-scoped (findLast), not turn-scoped
- drop the tautological sessionID filter in the test mock
Encode the PR #391 review O3 backlog as explicit behavior tests:
- one reminder per model step regardless of parallel tool fan-out
- per-step fresh reads never accumulate reminders (no persistence)
- a compacted transcript still receives the reminder
…ssertions
- .specgit.yaml context.branch follows the renamed delivery branch
(feat/389-issue389 was a duplicated-name mistake; naming convention
is type/short-name)
- remove four unnecessary non-null assertions in release-notes.ts so
the branch adds zero lint warnings over the dev baseline (4850)
feat(session): re-surface uncompleted todos each model step
…d make /memory state truthful
#395: openai-compatible downgrades response_format to bare json_object and
never sees the streamObject schema, so the maintenance model free-styles a
fresh shape every call and validation always rejects — topics are never
created. Render the draft-07 JSON Schema ($refs inlined, nullable-union arms
simplified) into the system prompt; GenerateError now renders an empty
provider error message legibly instead of blank.
#396: /memory replies for non-on/off arguments were hardcoded to
"Memory remains off"; they now report the true state via Memory.status().
#397: statusReason omits the model gate — an enabled config whose model no
longer resolves reads as "Memory on" while Memory is inert. statusReason now
returns an actionable model-unavailability reason and a failed /memory on
surfaces it instead of a bare "remains off".
Zero new lint warnings vs the dev baseline (the ratchet cap was exceeded
by 5 on CI); behavior identical, guarded by test/memory/model-wire.test.ts.
…nly trigger
The d6ce53a rewrite switched to pnpm + build-from-source, but this is a
bun workspace (packageManager: bun@1.3.14, no pnpm-lock.yaml): the setup
step fails with 'No pnpm version is specified' and the wait step's 'yaml'
import would not resolve without pnpm-installed node_modules. First run on
the dev→main promotion PR (#399) exposed it. Restore the verified steps
(node 22 + npm install -g specgit@^0.5.0 + regex policy parse + 40min
wait budget); keep the main-only trigger narrowing.
fix(ci): restore proven specgit-accept install strategy
… align release-train spec
Review findings R2/S2/S3: release-version.ts derives patch+1 over
graphagent-v* tags only (1.0.28 -> 1.0.29; the v1.17.11-* family is
invisible to it), so the series file must be named for the derived
version. The train spec now states the mechanical derivation, requires
closing keywords on the promotion PR (R1 lesson), and branches fix
deliveries from dev. Local workflow state dirs are gitignored.
@LeXwDeX
LeXwDeX merged commit bec6d75 into mainAug 20, 2026
16 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment