Conversation
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
…-init /dag-flow /dag-template-update
Delivery reduce-dag-auto
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.
Delivery memory-topic-creation
…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
5 tasks
Closed
2 tasks
…ries-file step to release train
… 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.
Delivery release-train-remediation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Promotion of dev to main, carrying five deliveries:
Test plan
Process disclosure
npm i -g specgit@^0.5.0), keeping the main-only trigger.Closes #386, closes #387, closes #388, closes #389, closes #392, closes #395, closes #396, closes #397