Repository navigation
feat(denkraum): split progress and patch plans onto the store (DR-04c-1) - #671
Merged
Merged
Conversation
Move putProgress/#progress and putPatch from the frozen P1 DeskStore (lines 264-347) into tools/denkraum/store/progress.mjs as ProgressStore extends DeliveryStore. Only three kinds of change: this.#change( to this.change(, receiptFor(state, event) to receiptFor(state, event, this.rootAgentId), and the progress actor taken from the injected root agent id instead of the P1 constant (D2). progressTransition now binds the DR-04a hook to #progress, so a V2 "applied" acknowledgement runs the transition inside its own change. Without a configured root agent id, progress and patches fail closed with 503. Idea and question operations follow in DR-04c-2. Test-First: tools/denkraum/store/progress.test.mjs::progress and patches fail closed without a configured root agent id Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This was referenced Oct 8, 2026
Brings dc34cae (V2 pending, inbox and delivery require the root id even on an empty ledger) up the DR-04/DR-06 stack. Merge, no rebase, as ordered by Root; no conflict, no code change of this package. No-Test: merge commit only; the fix is red-first tested in dc34cae (delivery.test.mjs R669-O1) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…671-O1) OpenAI R1 on #671 found that a replayed progress or patch request returned the stored result from a store without a configured root agent id: the replay branch returned before receiptFor() checked the root. putProgress, the acknowledgement hook and putPatch are root-bound, so the root id is now checked first, before input validation and replay. Same class as R669-O1; the 04a receipt and ack paths already check the root before their replay, and answer, ideas and question import are not root-bound (local saves as in P1). Test-First: tools/denkraum/store/progress.test.mjs::replayed progress and patch requests refuse a missing root agent id like new ones (R671-O1) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This was referenced Oct 8, 2026
Cuarroc
marked this pull request as ready for review
October 8, 2026 17:05
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
30 of 46 tasks
Contributor
Merge Queue Status
This pull request spent 31 minutes 2 seconds in the queue, including 12 minutes 26 seconds running CI. Required conditions to merge
|
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.
Der Denkraum kann jetzt auf dem neuen Speicherkern den Fortschritt einer Antwort (geprüft, geplant, umgesetzt) und Patchpläne festhalten, genauso wie im bisherigen Stand P1.
Ohne konfigurierte Root-Kennung lehnt er beides mit Fehler 503 ab; eine Bestätigung „umgesetzt“ mit Fortschrittsbeleg funktioniert jetzt, statt wie bisher mit 503 abgelehnt zu werden.
Ideen und Fragen folgen im nächsten Paket (DR-04c-2), danach Server und CLI (DR-06); zwei Fremdprüfungen und Roots Abnahme stehen noch aus.
Report
Package: DR-04c-1 (Z1), parent ticket
55ea21ce. Root decision 14:00Z via Orchestrator (msg-0muzlobgi): Option A. Compose the P1 ops that DR-06 needs before the server: putProgress/#progress, putPatch, putIdea and putQuestion from P1592b309dlines 264–382 and 392–415, plus thestore.mjsre-export.store.mjsre-export. Both together with meaningful tests would exceed 300 ALL.claude-opus-5-5[1m]). Stacked on feat(denkraum): split pending, inbox and delivery onto the store (DR-04b) #669: baseclaude/dr-04b-denkraum-delivery@144f12faa3dbebabbdeb0c4d743b05a87253537c(→ DR-04a: answers, receipts and acks on the store core + C-3 root check #666 → DR-03: DeskStore core with serialized atomic writes + C-2 stored-shape fix #661). Tier A (persistence, D2 trust boundary).What changed (2 new files, 203 ALL incl. the R671-O1 fix)
tools/denkraum/store/progress.mjs(99):class ProgressStore extends DeliveryStorewithputProgress, private#progress,putPatch, moved from P1 lines 264–347.diffof P1 264–347 againstprogress.mjslines 12–95 shows exactly 5 hunks:this.#change(→this.change((2);receiptFor(state, event)→receiptFor(state, event, this.rootAgentId)(2), because the DR-02 model takes the root id as an argument;actor: rootAgentId(P1 constant) →actor: this.rootAgentId(D2).progressTransition(state, input) { return this.#progress(state, input); }binds the named DR-04a hook. A V2ackwithstatus:'applied'and a progress proof now runs the transition inside the ack's ownchange(P1 behaviour), instead of the 503 that DR-04a: answers, receipts and acks on the store core + C-3 root check #666 returned while no progress module existed.tools/denkraum/store/progress.test.mjs(104): 5 tests, synthetic ids only.ack+ the hook with observed evidence. Replay returns the stored transition without a write; reuse with another payload gives 409. Root is the actor.applied400; a deferred answer cannot reachplanned409. Nothing is written.Evidence
144f12fnode --test --test-name-pattern='progress and patches fail closed without a configured root agent id' tools/denkraum/store/progress.test.mjsERR_MODULE_NOT_FOUNDforprogress.mjs(new module, same red pattern as DR-03/04b); log sha256e3879df18b800f19…node --test tools/denkraum/store/progress.test.mjs;npm run test:denkraum(Windows)progress.test.mjs,patches.test.mjs,store.test.mjs) + P1ideas.test.mjs+ thismodel/core/answers/delivery/progress+ only P1putIdea/migrate/putQuestionleft in the shim asDeskStore extends ProgressStorewith injected root id;node --test --test-concurrency=1 *.test.mjsCARGO_TARGET_DIR=~/targets/slot5,CARGO_BUILD_JOBS=2, foregroundssh_exece35500cprecommit exit 0 (14:00:24–14:00:36Z)bash scripts/ci/gates.sh lane prepushone35500cssh_exec), 22 gatesgruen, rust-suite nextest 1873 run / 1873 passed / 7 skipped; log sha2566aa9bbf24e498004…bash scripts/ci/red-first.sh7e3a7afand green at the headgit push+git ls-remotePA_PREPUSH=light git push -uafter the full prepush on the same head, exit 0;git ls-remote14:04:13Z =e35500cea3fa6570fbe7d9a865c7883d1a4742b0; #669 branch unchanged at144f12fgit merge --no-ffof dc34cae (#669), no rebase (Root order)d45d610brings onlydelivery.mjs/delivery.test.mjs(+18/−3), no conflict, no change of this package's files; trailerNo-Test(fix is red-first tested indc34cae). prepush exit 0 14:30:26–14:32:10Z, nextest 1873 / 1873 passed / 7 skipped, log sha2565e8680e1ea3bbdb9…; red-first exit 0;git ls-remote14:33:10Z =d45d610c6f255a6a9e5c7b3999f4af96d399540e. D1 composition rerun with the fixeddelivery.mjs: 101/1015d31ef50e5703731c797ef4…; red-first exit 0 (new trailer red at merge base, green at head);git ls-remote14:47:59Z =5d31ef56b8086fe84f8bc93d5caf7279dd744eac; localnpm run test:denkraum58/58Limits (unchanged, not solved here)
activeEventsis quadratic and also runs in every progress and patch call.verifyProgressEvidence/verifyPatchAuthorityare injected verifiers as in P1. Which verifier the server binds is DR-06 (P1 server bindsasync () => truebehind the root receipt token).Review
Tier A. OpenAI R1 on
e35500crejected (R671-O1). The fix is in5d31ef5.At head
5d31ef5:review-drdelta-openai-r2): R671-O1 FIXED and the red check is proven (exit 1 against the oldprogress.mjs); verdict approve.review-dr-google-r1-671-674-676): approve.The inherited R669-O1 remainder is follow-up DR-04B-FU (PLAN #695) and does not block this PR. Root acceptance: 2026-10-08 17:06Z.
progress.mjs:32and:77: a replayed progress or patch request returned the stored result from a store without a root id, because the replay branch returned beforereceiptFor(:36/:86) checked the root.5d31ef5. A module helperrequireRootis now the first statement of#progressand ofputPatch, before input validation and replay.#progresscoversputProgressand the V2appliedack hook. Test:progress.test.mjs::replayed progress and patch requests refuse a missing root agent id like new ones (R671-O1). Server RED 14:42:53Z ond45d610: exit 1, 4 pass / 1 fail ("Missing expected rejection: progress replay"), log sha2563344b6d5a45cac5e….receiptandackcall#requireRootbefore their replay branches (answers.mjs:53,:89). A V1 receipt answers 409 before the root check; that is a refusal, not success. 04b (#669): R669-O1, fixed indc34cae. 04c-2 (#674): no defect.putIdea,putQuestionandanswernever read receipts or attest the root. They are local saves as in P1 and stay usable without a root id; their automatic delivery fails closed in the store. Without a defect there is no red test.NICHT ABGEDECKT
putIdea/putQuestionand thestore.mjsre-export are DR-04c-2. The frozen P1 suites still run only in the scratch composition.#[cfg(windows)]tests (run_in_pty, npm_shim, ConPTY, DPAPI) and the Windows arms of clippy are not covered. Browser smoke, frontend build and workflow gates run only in lanelinux. External services are not checked by any gate. The Windows verdict comes from the merge queue.🤖 Generated with Claude Code