You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 7cd81a8
Browse filesBrowse the repository at this point in the historyBrowse files
Pass Claude's structured answer to the plan parser unchanged (#166) (#169)
* Load plan schemas through the registry and close#6
Every version in schema/versions.json is now compiled from its retained
snapshots, and plans and edit replies are checked by the version they
declare. The loader refuses a registry that disagrees with the snapshots
or validators, and treats a version with no validator as unsupported.
Pin the released v1 files by SHA-256, keep them LF on checkout, and add
the remaining #6 tests: path identity and Git mode mapping, hostile text
in every authoring prompt, and output limits at the exact byte.
Runtime gaps move to #162-#166.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Pass Claude's structured answer to the plan parser unchanged (#166)
parseClaudeOutput re-encoded structured_output with JSON.parse and
JSON.stringify, so a duplicate key or an inexact integer reached
parseV1 already resolved. Cut the exact text of structured_output from
the envelope with a length-bounded scanner instead, and refuse a
planning envelope that repeats a top-level key before classifying it.
Whether the Claude API or CLI resolves duplicates before writing the
envelope is not verified; the docs say so.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Name the current base in the plan library alignment note
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Compare large decoded answers without a diff so a broken decoder fails at once
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Keep the diff-free comparison for the megabyte answers only
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/implementation/plan-library-alignment.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -21,12 +21,12 @@ Issue #6 tracked the v1 plan library contract and the runner obligations that ca
21
21
| Container mounts: Git metadata on its own filesystem, read-only, with no writable hard links or aliases into it | Done before this change |`agents/container/profile.ts`, probe `metadata-alias` in `agents/policy.ts`; `test/agent-container.test.ts` ("keeps Git metadata read-only, on another filesystem, and mounted against replacement", "keeps Git metadata unchanged under link, alias, truncation and replacement attempts during %s"), negative controls in `test/agent-gate.test.ts` (real Docker) |
22
22
| Process termination: output overflow, deadline and cancellation stop the whole container, including a process that ignores SIGTERM | Done before this change |`agents/adapters/supervisor.ts`; `test/agent-supervisor.test.ts` ("terminates %s at bounded output limits", "enforces a finite wall deadline and force-settles the container", "preserves the first cancellation reason until an ignored SIGTERM fully settles") (real Docker) |
23
23
| Output shown in the UI bounded: captured output comes only from the supervisor, which bounds stdout and stderr; when a planning run exits with an error, the provider's message quotes its output with whitespace collapsed, cut to at most 300 UTF-16 code units (`runner/planning-provider.ts`) | Done before this change; 300-unit quote tested in this change |`test/agent-supervisor.test.ts` output-limit cases (real Docker); `test/planning-provider.test.ts` ("quotes at most 300 code units of a failed run's output, with whitespace collapsed"). The Docker daemon's own log is #165|
24
-
| Output limits at the exact byte |**This change** (tests; the supervisor already enforced the limits) | Supervisor enforcement: `test/agent-supervisor.test.ts` (real Docker). Decoder behaviour only, not a limit: the Claude decoder handles an envelope of exactly the stdout ceiling, and the 1 MiB parser limit applies to the decoded answer at the exact byte: `test/agent-adapter.test.ts`. The decoder re-serializes the answer, so the limit applies to the decoded text, not to the provider's bytes; #166 may change that|
24
+
| Output limits at the exact byte |**This change** (tests; the supervisor already enforced the limits) | Supervisor enforcement: `test/agent-supervisor.test.ts` (real Docker). Decoder behaviour only, not a limit: the Claude decoder handles an envelope of exactly the stdout ceiling, and the 1 MiB parser limit applies to the decoded answer at the exact byte: `test/agent-adapter.test.ts`. At #6 the decoder re-serialized the answer, so the limit applied to the re-encoded text. *Later:*#166 returns the exact text of `structured_output` in the CLI's envelope, so the limit applies to those bytes|
25
25
| Prompt byte budget before spawn | Done before this change |`MAX_PROMPT_BYTES` in `core/planning-author.ts`; `test/planning-author.test.ts` ("accepts exactly the prompt byte limit and rejects the next byte without truncation") |
26
26
| Model budget before spawn | Moved to #163| — |
27
27
| Planning profile probed at startup | Moved to #164| — |
28
28
| Docker daemon log limits | Moved to #165| — |
29
-
| Claude structured output under the v1 parsing contract | Moved to #166 (found during this change)| —|
29
+
| Claude structured output under the v1 parsing contract | Moved to #166 (found during this change). *Later:* fixed in #166|`agents/adapters/claude.ts`; `test/agent-adapter.test.ts` ("lets draft validation refuse %s in a structured answer")|
0 commit comments