Repository navigation
Cycle 0050: every defect Cycle 0049 carried is fixed or closed with evidence #118
Description
Outcome
Every defect that Cycle 0049 carried is closed in this cycle: fixed with a test that fails without the fix, or closed with recorded evidence that it is no defect or no longer applies. Nothing is carried out of it, so the feature cycle that follows starts clean (AGENTS.md, Cycle rule). This is a bug-fix cycle: no increment, nothing ranked, selected, merged away or dropped.
Source. The list is the closing comment of #107 (its last comment, 2026-10-23): 184 defects, F3 to F209 with gaps where #107 fixed one. Each task below copies #107's task text whole: its source (cycle, review and finding label, severity), the defect, and what closes it.
Why now. The cycle rule says a bug-fix cycle follows any cycle that left a defect. Learners meet some of these defects in the product today:
- F208: in Cursor, a replay with no transport until the editor restarts.
- F203: during a stop selection, the replay shows one moment beside another.
- F92 and F93: a start is refused because saved-study storage is full, and the recovery points at the wrong file.
- F63: a transient read error is kept as unavailable.
- F131: bidirectional controls in recorded text can reorder lines.
Others are agent-contract gaps, missing tests of state machines, and load-dependent test failures that make every gate less trustworthy.
Baseline. main at c0487de (0.2.35.0), the merge of #117. No product source has changed since the section "Acceptance rows reassessed" of #107's closing comment, so that section is this cycle's gap audit. The entry comment verifies it.
Acceptance criteria.
- Each task's own "Closes with …" clause is its acceptance criterion, as written in Cycle 0049: a Vitest test run the editor chat explained is saved and replayed as a learning replay in both editors #107. Shorthands:
- "closes as F4 does": rule 3 below.
- "closes as F8 does": a fix with a test that fails before it.
- A "to verify" task closes with a fix and its test, or with evidence that it is no defect.
- A closed task ends with "fixed in " and its tests, or with "evidence: ", by the closure rules below.
- On each pull request's final tree, from
extension/, each of these exits 0:pnpm test,pnpm test:package,pnpm format:check,pnpm typecheck,pnpm lint,pnpm health:static,pnpm dupes,pnpm dead-codeandpnpm health. The five Reader DOM checks also pass, and required CI passes on the exact head. - Every test a task adds or changes states
protects=…; fails_when=…; no_claim=…. - Every host-dependent task passes its native check (table below) before the merge of the pull request that closes it.
- The closing comment states that nothing is carried.
- No degradation: browser replay, live run, save, Wiki and shortcut tests keep passing, and a behavior change outside a task's own text is listed in its pull request.
Closure rules.
- A behavior defect closes with a fix and a test whose red run against the unfixed code is shown in the pull request.
- A test gap (a missing test or untested cell) closes with the test and a mutation proof: the pull request names one deliberate break of the product code, the test failing against it, and the break reverted. Code that is already correct does not need to change.
- A load-dependent failure (F4, F5, F6, F82, F112, F113, F135, F154) closes in one of two ways:
- a root-cause fix with a test that fails without it; or
- evidence that the named test passes in 20 of 20 sequential runs of its own file while four full-suite runs (
pnpm testin separate checkouts) keep running in the background, each restarted when it ends.
For F135 the unit isnode extension/scripts/wiki-reader-dom-qa.mjs verify <folder>. Failures of the background suites are recorded but do not count against the named test. The commands, the counts and the load average go in the closing note; a lower count closes nothing.
- A documentation, comment, docstring, naming or advisory task (such as F13, F41, F42, F59, F65, F127, F145, F175) closes with the change and a one-line evidence note. No test is needed unless the task names one.
- A task with several parts closes only when each part has its own test or evidence, listed in its closing note. That covers F77's six items, F70's, F125's, F139's, F147's, F166's and F179's cells, and every widening in the pinned comment.
- A task that fixes a test or validator itself (such as F17, F37, F38, F81, F84, F87, F118, F172, F181, F182, F202) closes with the change plus a mutation proof that the corrected test fails on the break it exists to catch. Where the old test could pass on a broken input (F84), the pull request also shows that input passing the old test and failing the new one.
- Bounds for the performance and timing tasks:
- F64: a growing history's refresh reads only the bytes appended since the last refresh; a read-count test over 50 refreshes asserts total bytes read at most twice the final journal size.
- F109 and F148: terminal control strings (CSI, OSC, DCS, SOS, PM, APC, in their 7-bit and 8-bit forms) are recognized across output entries. A string whose terminator arrives in a later entry is removed whole, across both entries. An introducer with no terminator within the next 4,096 code points of the whole output is a stray: only its own code points are removed and the rest stays text.
- F185 and F198:
- One deadline,
NODE_HISTORY_SLOT_DEADLINE_MS(5,000 ms, new inconstants.ts), bounds the slot's whole show: open, show, the text wait and the earlier tab's close. - The loading text still shows after
NODE_HISTORY_TRANSITION_BOUND_MS(1,000 ms). - At the deadline the moment reports its
history-sourcerow and releases Play's pending selection. Play pauses at the first failed slot. - A late completion that is no longer current is closed, not shown.
- When the new slot shows its bytes and only the earlier tab's close fails or passes the deadline, the moment commits normally and Play goes on. The Study shows a
history-sourcewarning row, "Codebook could not close an earlier recorded-source tab: .", with one Output entry, and the close is retried at the next selection. - Tested with an injected clock.
- One deadline,
- References.
- X, DS, EN, S and AC identifiers name Cycle 0049: a Vitest test run the editor chat explained is saved and replayed as a learning replay in both editors #107's plan version 7: part 1 (Designs 1 to 13), part 2 (String catalog, Error contract, AC1 to AC20, testing plan) and part 3 (N49's rules and the accepted decisions). The review record holds the Decision Audit Trail. All four are Cycle 0049: a Vitest test run the editor chat explained is saved and replayed as a learning replay in both editors #107 comments of 2026-10-21, 18:37 UTC.
- Native evidence named by a SHA-256 prefix lives in the Mac's ignored
artifacts/cycle-0049/(N49:n49/vscode,n49/cursor; spike:pr-b2-spike/shots).
Native checks (D3). Run in the Space on the pull request's candidate before its merge, by the driving agent, recorded with OBS Window Capture and inspected frames.
| Task | Host | Operation | Passes when |
|---|---|---|---|
| F137 (PR-2) | VS Code, Cursor | close the Application pane under workbench.editor.closeEmptyGroups, then Show recorded output |
the pane returns above the source in its own group |
| F142 (PR-2) | VS Code | at the result, scroll 6 px above the end, then step to an output | following stays off; Jump to latest shows |
| F3 (PR-3) | VS Code | a browser replay of the target with at least 10 stop entries (Next, Previous, seek) | every native frame of each entry inspected: no dark frame and no "Canceled". F3 also needs its fix and test: macOS frames alone do not close a defect seen on Linux |
| F158 (PR-3) | Cursor | Open replay with the test file open as a preview tab | the refusal names the file and its recovery, shown whole |
| F161 (PR-3) | VS Code, Cursor | show the slot through another group's action, then return to its tab | the line and label show; returning does not scroll |
| F203 (PR-3) | VS Code, Cursor | Next, Previous, a seek and Previous from the result, each frame-reviewed | no frame pairs one moment's state with another's |
| F204 (PR-3) | VS Code, Cursor | an output and the result after a scrolled stop | the placeholder's first line shows; sticky scroll shows no earlier source |
| F207 (PR-3) | VS Code, Cursor | a stop at the default layout | the label shows whole |
| F208 (PR-3) | Cursor | a natural /codebook live run in Agent, then Save and Open replay |
the Study pane with its transport shows without a restart |
| F209 (PR-3) | Cursor | open the Learning summary view | it sits in a supported container, with no contribution error in the log |
| F358 (PR-3) | VS Code, Cursor | a test replay of more than 20 events: end the selected stop's debugger session, then page the event list away from the stop | Inspect in native debugger stays and restarts the debugger at that stop; screenshot compared with the PNG's region 2 |
The table is the complete list of closures that need a host. Every other task closes by its tests or evidence. N50 re-observes those tasks as regression evidence only.
N50 is PR-3's full native round. It runs on PR-3's final candidate, with PR-1 and PR-2 merged, before PR-3 merges:
- Procedure: Cycle 0049: a Vitest test run the editor chat explained is saved and replayed as a learning replay in both editors #107's N49 version 2 parts 1 to 9 in each host, with the measurements of Cycle 0049: a Vitest test run the editor chat explained is saved and replayed as a learning replay in both editors #107's plan versions 5 and 6, plus the table's PR-3 rows. VS Code uses Copilot Chat with GPT-6 Luna; Cursor uses Agent with Grok 4.6 High.
- Requests: frozen in a comment titled "N50 frozen requests" before the first submission, with their causal links. They ask about processes of the target that Cycle 0049: a Vitest test run the editor chat explained is saved and replayed as a learning replay in both editors #107 did not ask.
- Pass: parts 1 to 9 hold and every PR-3 table row passes, in each host.
- Failure: fixed inside PR-3 before its merge.
Rules for the implementing agent.
- Acceptance criteria are each test's
protects / fails_when / no_claim. Never "make the tests pass". - Real code and real tests land together.
- Any change to a test, validator, CI step, timeout, tolerance, threshold, snapshot or suppression is reported on its own line with its reason.
- A reported command names the command and its observed result.
- A report is a claim until the parent re-executes it.
Delivery (D1). Three pull requests, merged in order. Each goes through the local CodeRabbit CLI and open-code-review-delegate, /ship, required CI, the exact-HEAD gate and a squash merge with --match-head-commit. In a bug-fix cycle every finding of those reviews is fixed before its merge.
| Pull request | Tasks | Scope |
|---|---|---|
| PR-1 | 96 | The test run, its MCP contracts and refusals, save and store, redaction, skill and hook, scripts, documents debt, and the load-dependent test failures |
| PR-2 | 43 | The Application pane and the Study section |
| PR-3 | 45 | The recorded-source slot, transitions, open and arrangement, Cursor placement, and the browser replay's dark frames |
PR-1 comes first because the flaky tests and the agent contracts gate every later review and native round. PR-2 comes before PR-3 because PR-3's transition order (F203) changes how the Application and Study updates that PR-2 fixes are committed. Each task is tagged with its pull request.
Rollback. Revert the pull requests in reverse order. No stored format changes unless a task's fix needs one; such a change is named in its pull request with its migration and a test that the older version still reads the data.
Effort [estimated].
- PR-1: about 40 h, mostly tests, state-machine cells and contract wording.
- PR-2: about 20 h.
- PR-3: about 25 h.
- N50: 4 h per host.
- Total: human team about 3 weeks; CC about 5 to 7 working days plus native rounds.
Out of scope. Any increment: the region-2 composition (D8 of #107), new run profiles, package-root Vitest, and #107's later candidates E3 to E11 and V3 to V12.
Tasks
The source of every task is Cycle 0049 (#107) and its finding label (F-number). The tag [PR-n] names the pull request that closes it. A finding found during this cycle becomes one more task, closed in this cycle.
- [PR-3] F3 (C49 · re-found by this cycle's entry audit): the browser replay shows dark frames for 0.5 to 1.2 s at a stop's entry and a short "Canceled" (observed in Cycle 0044, Linux; no cycle carried it). Closes with a test that fails without the fix or evidence that it no longer occurs. — fixed in
6588194(red re-executed); native check pending (N50); native: VS Code PASS (N50 second submission, candidate073f6ae, R2 take2b91c5e2…: 11 stop entries by Next, Previous and seek, every native frame inspected; the recorded-application box held luminance 243.2 at every frame after its first paint, with no dark frame and no "Canceled"); the native table names VS Code only; the label at the leave is F410 - [PR-1] F4 (C49 · found by this cycle's PR-A gate run):
studyWorkspaceRemoval.test.ts"the line “History not saved: …” of a study whose capture failed and whose run this window no longer holds goes when another study is saved" fails under concurrent load (2 of 4 concurrent runs, onmain99993f3as on this branch) and passes alone: it reads the reader's view as soon as the service reports the save. Closes with a test that fails without the fix or evidence that it no longer occurs. — fixed in8952d2e; evidence: its test 20 of 20 file runs beside four background suites (load 11 to 35); sibling "History not saved" tests failed only under that overload, recorded per D46. - [PR-1] F5 (C49 · found by this cycle's PR-A gate run):
wikiUpdateFlow.test.ts"a press that finds another window’s stopped watch and this window’s own at once names the other window’s chat, …" failed once in a full macOS run (1 !== 2) and passes alone; this branch changes no Wiki update code. Closes as F4 does. — fixed in226cc9aanda751f57(a second window acts after the first settled its marker, the cause F82 shares; four sibling tests widened alike); evidence: 20 of 20 beside four background suites (load 11 to 39). - [PR-1] F6 (C49 · found by this cycle's PR-A gate run):
withServedAddresses.test.ts"the reader filters a page of more than 1 MB … within four times the time of an ordinary page served the same way" failed once in a full macOS run (830 ms against the ordinary page's 184 ms) and passes alone; this branch changes no reader code. Closes as F4 does. Widened by PR-B1's /ship diagnostics (2026-10-22): under nine concurrent reruns of the file, its relative-timing tests ("…within six times the time of an ordinary page…", "an ordinary page of more than 1 MB within three times the time of its first half", "…select pairs after deep nesting…") failed in 7 of 9 runs; alone they pass. — fixed in05ec3a1; evidence: its tests 20 of 20 beside four background suites (load 14 to 39). - [PR-1] F9 (C49 · OCR on PR-A, low):
codebook_playbackrefuses a test replay of an earlier session withPLAYBACK_PROFILE_UNSUPPORTEDonly after this window's store listed it (extension/src/service.ts:791-799). Closes as F8 does. — fixed in0d74ba5(red re-executed). - [PR-1] F10 (C49 · OCR on PR-A, low): the root-Vitest read failure's reason in
codebook_statusis not sanitized (extension/src/environment.ts:274-277). Closes as F8 does. — fixed in7430235(mutation re-executed). - [PR-1] F11 (C49 · OCR on PR-A, low): two
as [string, string]casts inextension/src/utils/sanitizeCause.ts:91-95. Closes with the casts replaced by typed values. — evidence:94aa030replaces both casts with typed values. - [PR-1] F13 (C49 · CodeRabbit on PR-A, trivial): the comment at
extension/src/tests/nodeTestRunLifecycle.test.ts:562says one read where the assertion expects two. Closes with the comment naming both reads. — evidence:1cc746cwords the comment and the cards without stale positions. - [PR-1] F14 (C49 · CodeRabbit on PR-A, trivial): the node-history resource summarizes the history for its events and learning-material pages too (
extension/src/resources.ts:149-157). Closes with the summary read only for the history body. — fixed ine8b9205(mutation re-executed). - [PR-1] F15 (C49 · CodeRabbit on PR-A, minor): an unavailable history's
reasonis not passed throughsanitizeCause(extension/src/nodeTestHistoryStore.ts:536-545). Closes as F8 does. — fixed ina8c9f98(mutation re-executed). - [PR-1] F16 (C49 · Step 8 plan audit on PR-A): the Open replay tests
Open during Play(EN19) andPrevious reaches the start(DS1) are missing. Closes with both tests. — fixed inc96a238(mutation re-executed). - [PR-1] F17 (C49 · Step 8 plan audit): 31 changed existing tests carry no
protects / fails_when / no_claimcard (AC13; studyWorkspace.test.ts 23, configuredService 2, currentStorageOwner 2, readBootIdentity, recordingProtocol, repositoryProtocol, package.test.mjs). Closes with the cards. — evidence:14dc905gives the 42 changed tests their cards (the task counted 31). - [PR-1] F18 (C49 · Step 7 coverage gap E1):
checkNodeTestFileshas no test for an additional stop (its number, theadditionalStops[n].pathfield, the source refusal before the test-hash refusal). Closes with that test. — fixed in27b87f5(mutation re-executed). - [PR-1] F19 (C49 · Step 7 gap E2 and Step 9 testing):
NodeLearningSaveguards are untested: another run's Save in flight (the synchronous refusal), a failed seal shown before any click, an unverified summary ending at Retry, the read-back failure's Output entry. Closes with those tests. — fixed inc96a238(mutation re-executed). - [PR-1] F20 (C49 · Step 7 gap E3 and Step 9 testing): a run refused at preparation: its
historyExclusionReason, the tworecording.reasonfallbacks and itsnextActionsare asserted nowhere. Closes with those assertions. — fixed in0913678(mutation re-executed). - [PR-1] F21 (C49 · Step 7 gap E4): learning material saved after the result and before Stop is counted at the seal, untested. Closes with that test. — fixed in
0913678(mutation re-executed). - [PR-1] F22 (C49 · Step 7 gap E5): the summary memo after a writer ends without a seal is untested. Closes with that test. — fixed in
a8c9f98(mutation re-executed). - [PR-1] F23 (C49 · Step 7 gap E6, Step 9 testing and state-machines): a delayed Save click for an earlier test run is refused (
The recorded session changed…), untested for the node-test branch. Closes with a test mirroringstudyWorkspace.test.ts:2513. — fixed inc96a238(mutation re-executed). - [PR-1] F24 (C49 · Step 7 gap E7 and Step 9 testing): the browser seal failure's Output entry, and an answer free of storage paths, are untested (the stub error names no path). Closes with that test. — fixed in
c96a238(mutation re-executed). - [PR-1] F25 (C49 · Step 7 gap E8): a completed run at the whole-run deadline (
hasRunEndedwithnodePhasecompleted) needs an injected clock to be tested. Closes with that test. — fixed in0913678(mutation re-executed). - [PR-1] F26 (C49 · Step 7 gap E9): Show details of the open-failure notification is untested (the harness needs answering error dialogs). Closes with that test. — fixed in
c96a238(mutation re-executed). - [PR-1] F27 (C49 · Step 7 gap E10 and Step 9 testing): the other
INVALID_REFERENCEkinds (another source hash with its expected-hash hint, no event, the other output channel) are untested. Closes with those cases. — fixed ine8b9205(mutation re-executed). - [PR-1] F28 (C49 · Step 9 testing):
repositoryProtocol.test.ts:816is still titled "API 1.7" (and its card) while it asserts 1.8. Closes with the title and card naming 1.8. — evidence:57a495etitles the test and its card 1.8. - [PR-1] F29 (C49 · Step 9 testing):
prepareNodeTestLaunch's refusal of a missing or escapingnode_modules/vitest/vitest.mjs(PREREQUISITE_MISSING) is untested. Closes with both cases. — fixed in08a06aa(mutation re-executed). - [PR-1] F30 (C49 · Step 9 testing): the real
environment.checkNodeTestFileswiring is untested (the member is optional and service tests use fakes). Closes with an environment test (and, if chosen, a required member). — fixed in7430235(mutation re-executed). - [PR-1] F31 (C49 · Step 9 testing):
sanitizeCauseleaves a root followed by a sentence period unhidden (/Users/ada/code/scheduler.keeps the path), and roots with regex metacharacters or a/home are untested. Closes with the boundary fixed and those tests. — fixed in94aa030(mutation re-executed). - [PR-1] F32 (C49 · Step 9 testing): the outcome table test omits a result with neither an exit code nor a signal, where its oracle disagrees with the product. Closes with that row added. — fixed in
0913678(mutation re-executed). - [PR-1] F33 (C49 · Step 9 testing):
codebook_status's node-testrecordingmember (available, reason) is asserted nowhere. Closes with that assertion. — fixed in1f129c1(mutation re-executed). - [PR-1] F34 (C49 · Step 9 testing):
readVitestPrerequisite's size cap, non-JSON file and non-string version guards are untested. Closes with those cases. — fixed in24bed1e(mutation re-executed). - [PR-1] F35 (C49 · Step 9 testing): the node-history catalog entries' summary members (a widened contract) are asserted nowhere. Closes with that assertion. — fixed in
e8b9205(mutation re-executed). - [PR-1] F36 (C49 · Step 9 testing):
codebook_stop's failure answer through MCP (an unknown run) is untested since its ownstopToolResult. Closes with that test. — fixed in0913678(mutation re-executed). - [PR-1] F37 (C49 · Step 9 testing): four low-value assertions:
studyWorkspace.test.ts:244repeats an exact equality,NODE_TEST_HELP_EXAMPLEis exported only for an identity assertion,nodeTestService.test.tsrepeats three help assertions,nodeTestRunLifecycle.test.ts:613pins an incidental read count. Closes with each removed or rewritten at its boundary. — fixed in1cc746c(mutation re-executed). - [PR-1] F38 (C49 · Step 9 testing): timing-dependent tests:
nodeTestHistorySummary.test.ts:156holds reads for a fixed 10 ms and asserts exactly 4,ownedNodeTestRun.test.ts:1264sleeps 20 ms before an absence assertion. Closes with gates instead of timers. — fixed in57a495e(mutation re-executed). - [PR-1] F39 (C49 · Step 9 maintainability): the catalog's action labels are retyped as literals by their consumers (
Save now,Open replay,Close browser replay,Show details) and the question'sCancelis never read. Closes with one exported set of labels. — fixed inc96a238(mutation re-executed). - [PR-1] F40 (C49 · Step 9 maintainability): a rejection of the partial-save notice's Open replay is dropped without an Output entry (
nodeLearningSave.ts). Closes with it reported. — fixed inc96a238andebfb2f0(bounded waits; mutation re-executed). - [PR-1] F41 (C49 · Step 9 maintainability): docstrings name callers that do not exist (
listMissingNodeLearning,describeNodeTestResult,describeNodeLearningPart,summarize; the sanitize helpers omitStudyWorkspace). Closes with the real callers. — evidence:a8c9f98ande8b9205name the real callers. - [PR-1] F42 (C49 · Step 9 maintainability):
prepareNodeTestLaunch's new paragraph sits under its@param listTestFiles. Closes with it moved to the description. — evidence:08a06aamoves the paragraph into the description. - [PR-1] F43 (C49 · Step 9 maintainability): the node-test help hard-codes the Vitest major 4 in three sentences instead of
NODE_TEST_MINIMUM_VITEST_MAJOR. Closes with the constant interpolated. — fixed ine8b9205(mutation re-executed). - [PR-1] F44 (C49 · Step 9 maintainability):
explainNodeHistorystill maps a conflict by findingrevision changedin the error text, which now can hold a file path (a stop insrc/revision changed.tsturns INVALID_REFERENCE into IDEMPOTENCY_CONFLICT). Closes with a typed error. — fixed in92d66ba(red re-executed). - [PR-1] F45 (C49 · Step 9 maintainability): the shared citation check words every refusal as
codebook_explain_node_history refused…, also on read paths nobody called the tool for. Closes with a neutral message and the prefix on the save path. — fixed ine8b9205(mutation re-executed). - [PR-1] F46 (C49 · Step 9 maintainability): the Save and Open command ids are repeated as literals in
nodeLearningSave.ts,studyWorkspace.tsandextension.ts. Closes with shared constants. — evidence:c96a238shares the command ids as constants. - [PR-1] F47 (C49 · Step 9 security):
PRINTABLE_VITEST_VERSIONbounds no numeric segment, so a repository's Vitest package can padcodebook_statuswith about 64 KiB of digits. Closes with bounded segments and a test. — fixed in24bed1e(mutation re-executed). - [PR-1] F48 (C49 · Step 9 security; sibling found by Step 9 pass 2:
service.ts:3231Recording unavailable before input: ${String(error)}): a browser recording's finish failure stays raw inrecordingFailure(served asstate.recording.reason) beside the new sanitized seal cause, so onecodebook_stopanswer can carry the storage path. Closes with one sanitized value at both assignments. — fixed in92d66ba(red re-executed). - [PR-1] F49 (C49 · Step 9 security): a test run's own error is not sanitized (the domain error's cause, the new
STALE_PAUSEcause, the newreportFailuretext). Closes with sanitizing at assignment. — fixed in92d66ba(red re-executed). - [PR-1] F50 (C49 · Step 9 performance, low):
checkNodeTestFilesreads and hashes files one at a time and a file cited twice twice. Closes with one concurrent read per file. — fixed in27b87f5(mutation re-executed). - [PR-1] F51 (C49 · Step 9 core and maintainability): the run resource shows whole causes (
nodeTest.historyReason,recording.reason,contextReason) where AC17 cuts shown causes to 300 characters, andnodeHistoryFailurelost its 8,192-character bound. Closes with the bound and the display cut. — fixed in92d66ba(red re-executed). - [PR-1] F52 (C49 · Step 9 core, medium confidence): a Save receipt holds only while its material revision equals this window's cache, so material another window saved returns the item to Save after each Save. Closes with the store's revision read or a test showing it cannot happen. — fixed in
c96a238(mutation re-executed). - [PR-1] F53 (C49 · Step 9 state-machines, test gap): partial × Save (a later material revision returns a partially saved item to Save) is untested. Closes with that test. — fixed in
c96a238(mutation re-executed). - [PR-1] F55 (C49 · Step 9 state-machines):
historyExclusionState'sendeddoc and test do not namerefused-at-preparation. Closes with both. — fixed inef184c9(red re-executed). - [PR-1] F56 (C49 · Step 9 state-machines; on main too; widened by Step 9 pass 2): a node-test run stopped before its history began still lists
read-historyinnextActions, and, itshistoryExcludedleft unset, never frees its retained-run slot. Closes with an exclusion that readsendedfor such a run,read-historyleft out, and a test. — fixed inef184c9(red re-executed). - [PR-1] F57 (C49 · Step 9 red team): the dirty-editor refusal (
assertConfiguredSourceDocuments) and the Vitest program check run after the history began, so such a refusal leaves a zero-entry history that takes an undeletable Saved studies place. Closes with both checks moved into preparation. — fixed ince7df10(red re-executed). - [PR-1] F58 (C49 · Step 9 red team):
causeRootsnames the workspace and home as reported, not their real paths (a symlinked workspace or home stays in causes), andos.homedir()can throw inside catch blocks. Closes with real paths added and a guarded home. — fixed in94aa030(mutation re-executed). - [PR-1] F59 (C49 · Step 9 simplification, advisory):
CAPTURE_WORDSindescribeNodeTestReplay.tsis an identity map. Closes with it removed. — evidence:e8b9205removesCAPTURE_WORDS. - [PR-1] F60 (C49 · found by this ship's EN20 recording):
test:shard --recordrefuses a run with failed tests without naming them (2 tests failed; timings were not recorded.). Closes with the names printed. — fixed in83b1e16(red re-executed). - [PR-1] F63 (C49 · Step 9 pass 2 performance and red team): the history store's summary memo keeps any failed read: a journal read error (EBUSY, EMFILE, EIO) is remembered as
unavailable, and a material read error as no material, until a file changes, so Save's read-back Retry cannot succeed after a transient error, Saved studies keepsunavailable, and coverage readsnone. Closes with I/O errors not memoized (or Retry bypassing the memo) and a test. — fixed ina8c9f98(mutation re-executed). - [PR-1] F64 (C49 · Step 9 pass 2 performance): a history this window still writes is read, parsed and summarized in full at every refresh after it grows (O(n^2) per run on the extension host). Closes with a bounded refresh of a recording summary and a read-count test. — fixed in
a8c9f98(mutation re-executed). - [PR-1] F65 (C49 · Step 9 pass 2 maintainability):
NodeTestHistorySummary.hasResultis computed and never read. Closes with it removed or used. — evidence:a8c9f98removeshasResult. - [PR-1] F66 (C49 · Step 9 pass 2 maintainability):
openLearningReplay's docstring describes only the browser path. Closes with the test-replay branch documented. — evidence:c96a238documents the test-replay branch. - [PR-1] F67 (C49 · Step 9 pass 2 testing): the node-test profile's ready path with a root Vitest 4 and the prerequisite read's catch (
environment.ts:275) are untested. Closes with both rows. — fixed in7430235(mutation re-executed). - [PR-1] F68 (C49 · Step 9 pass 2 testing):
firstVerifiedStopSequence(DS1 landing) has no test of an unverified earlier stop or of no verified stop. Closes with that unit test. — fixed inc96a238(mutation re-executed). - [PR-1] F69 (C49 · Step 9 pass 2 testing):
partialHistoryReason's interrupted fallback and signal sentence are untested. Closes with those assertions. — fixed ine8b9205(mutation re-executed). - [PR-1] F70 (C49 · Step 9 passes 2 and 3 state-machines test gaps): untested Save-matrix cells preparing x save-now and cancel, preparing-empty x cancel, advancing x save-now and cancel, saved x save, partial x save (the notice again), saved-revised x save, seal-failed x save (no second seal), sealed-without-entry x save, another-run-saving x save; F53, F23 and F52 hold the others. Closes with those tests. — fixed in
c96a238(mutation re-executed). - [PR-1] F71 (C49 · Step 9 pass 2 red team): a history sealed with no entry still offers
save-node-learning(and the help's walkthrough then points the learner to a Save item that does not show). Closes with the action offered only for a history with an entry, and a test. — fixed in92d66ba(red re-executed). - [PR-1] F72 (C49 · Step 9 pass 2 red team): the agent's claim rule (
studyOutcomedemonstrated andlearningCoveragecomplete) ignores capture gaps that make Save read partially saved (captureMissingis not exposed). Closes with the capture gaps exposed innodeTestand the history resource, the claim rule updated, and a test. — fixed in92d66ba(red re-executed). - [PR-1] F73 (C49 · Step 9 pass 2 red team): a failed test-replay open writes the raw cause into the Study pane's archive line (and the progress, history-learning and history-position lines) beside a sanitized notification. Closes with those causes sanitized and a test. — fixed in
c96a238(mutation re-executed). - [PR-1] F74 (C49 · Step 9 pass 2 red team): the compaction hook finds its AGENTS.md sections by exact line equality after
split('\n'), so a CRLF checkout (Git for Windows' default) fails the hook. Closes with CRLF-tolerant matching and a CRLF case in its test; widened by /ship Step 11 (Claude adversarial): a renamed heading or trailing spaces fail it too, and the hook then prints nothing, not even the owner's rule. Closes also with the rule printed when a section cannot be found. — fixed in3de0642(red re-executed). - [PR-1] F75 (C49 · Step 7 repeat R1): an open of a saved test replay superseded by the reader's close is untested (
historyOpenSuperseded's close term). Closes with that test. — fixed inc96a238(mutation re-executed). - [PR-1] F76 (C49 · Step 7 repeat R2): the Save item drawn by a refresh while the Study pane is open but not rendering (a browser replay active) is untested. Closes with that test. — fixed in
c96a238(mutation re-executed). - [PR-1] F77 (C49 · Step 9 pass 2 appendix, low confidence): to verify, each closing with a fix and its test or with evidence that it is no defect:
continueNodeTestsets the phase after its awaits without checking a deadline expiry meanwhile (service.ts:1415);recordingSealFailureis never cleared after a later successful finish (service.ts:3418); the history resource summarizes before branching (F14); the memo keeps citable maps for every listed history; the memo's prune is O(n^2); the F8 guards' tests carry no recorded red run in history (shown in the Issue, D12 and F61). — fixed in7cf60e5: parts 1, 3, 4, 5 with tests (red re-executed), part 6 recorded red, part 2 evidence: no defect, the writer caches its failed finish. - [PR-1] F80 (C49 · Step 7 repeat 2 G1): no test checks that a live run brings its output tab back after each captured stop and after its result. Closes with that test (the stand-in counting reveals). — fixed in
57a495e(mutation re-executed). - [PR-1] F81 (C49 · Step 7 repeat 2 Q1; a sibling of F38): the F62 test reaches the release before the report check ends only by microtask order. Closes with a wait for
stop-debuggingbefore the check ends. — fixed in57a495e(mutation re-executed). - [PR-1] F82 (C49 · found by Step 9 pass 3's QA; the F5 family):
wikiUpdateFlow.test.ts"a Cancel pressed while the watch reads a site the chat has published … leaves no reservation …" failed once in a full macOS run (isReservedForOtherWindowstrue) and passed alone 3 of 3, in its file 118 of 118 and in the replayed suite; this branch changes no Wiki file. Closes as F4 does. — fixed in226cc9a; evidence: its test passed 20 of 20 file runs under four background suites (load 21 to 52). - [PR-1] F83 (C49 · Step 9 pass 3 performance): while the Study pane is closed, every 250 ms refresh redraws a test run's status item (text, tooltip, show or hide), about four status-bar messages a second. Closes with a redraw only on change and a test. — fixed in
c96a238(mutation re-executed). - [PR-1] F84 (C49 · Step 9 pass 3 testing): the compaction hook's test checks the re-entry rule's position with
indexOf(...) < 2_000, which also passes when the rule is missing. Closes with both bounds asserted. — fixed in3de0642(red re-executed). - [PR-1] F85 (C49 · Step 9 pass 3 testing): a history sealed with no entry is listed in Saved studies (
0 of 0 stops explained) and opens, while the run resource readsreplayAvailablefalse. Closes with one decided rule and its test. — fixed ina8c9f98(mutation re-executed). - [PR-1] F86 (C49 · Step 9 pass 3 testing): the bundled skill's tests pin seven whole sentences and the skill version inside a routing test. Closes with token pins and a separate version pin. — fixed in
83b1e16(skill 1.0.47; mutation re-executed). - [PR-1] F87 (C49 · Step 9 pass 3 maintainability): value cards of new tests cite
file:linepositions that no longer hold that code. Closes with the positions replaced by words or task ids. — evidence:1cc746cwords the comment and the cards without stale positions. - [PR-1] F88 (C49 · Step 9 pass 3 maintainability): the Save tests' host records
opened, which no test reads, so the partial notice's Open replay is untested at unit level. Closes with that test. — fixed inc96a238andebfb2f0(bounded waits; mutation re-executed). - [PR-1] F89 (C49 · Step 9 pass 3 red team): Codebook: Save Learning Replay from the palette before the first stop, once the journal holds output, ends the agent's preparing run, keeps a partial replay of boilerplate output, and leaves an error the skill reads as a refusal at preparation, so the agent starts again. Closes with a Save before the first stop refused (the plan: nothing to save before it) and a test. — fixed in
c96a238(mutation re-executed). - [PR-1] F90 (C49 · Step 9 pass 3 red team): the status item keeps a Save state that a later change outside Save makes stale (a stop-rejected row after a codebook_stop sealed the run; Preparing for a dead run whose stop failed). Closes with those rows following the run and tests. — fixed in
c96a238(mutation re-executed). - [PR-1] F91 (C49 · Step 9 pass 3 red team): after a stop whose release failed, the run resource still offers the agent
continue-serverand currentcontinueArguments, although the run can no longer continue. Closes with such a run offering only a stop, a continue refused with STALE_PAUSE, and a test. — fixed in0d74ba5(red re-executed). - [PR-1] F92 (C49 · pilot C49-11 submission 1, Major):
codebook_statusreportsnode-testready with nomissingentry while the saved-study capacity is exhausted (capacity.savedStudies77 oflimit64), so the agent spends its preparation (sources, article) and the start is refused at preparation as an untypedRUNTIME_FAILED("Saved study storage is full…"). Closes with the profile not ready, itsmissingsentence naming the limit and the count, a typed refusal, and tests. — fixed in1f129c1(red re-executed). - [PR-1] F93 (C49 · pilot C49-11 submission 1, Major): that refusal's recovery names the setting but not where or how; the agent edited the default profile's user
settings.json(the owner's file, which the runningCodebook QA 0049profile does not read; reverted after the trial), the instance kept 64, and the learner was asked to reload and send another message; removing old saved studies is not offered. The node-test refusal (Saved study storage is full. Increase Codebook: Saved Study Limit (codebook.savedStudyLimit) before starting another test; existing history was kept.) lacks what the study-library refusal has said since 0.2.22 (extension/README.md, Saved learning capacity): in Settings, or delete a saved study from Saved studies; only the learner can do either, an editor agent cannot. Closes with the node-test refusal worded as the study-library one (the learner's Settings of the running profile, or deleting a saved study; never the agent) and a test. — fixed in1f129c1(red re-executed). - [PR-1] F94 (C49 · pilot C49-11 attempt 1a, Minor): a new chat in VS Code 1.143 opens in the Copilot harness, where Codebook's MCP server asks for authentication and no Codebook tool is reachable; the skill's missing-connection rule (SKILL.md line 13) sends the learner back to Set Up AI Chat instead of a Local chat, which Set Up AI Chat's message names. Closes with the skill naming the Local session for that case, and a pinned test. — fixed in
83b1e16(skill 1.0.47; mutation re-executed). - [PR-1] F97 (C49 · /ship Step 11 Claude adversarial finding 2, Medium): a learner's stop before the first stop is recorded as a refusal at preparation (the preparation catch never checks
record.stopping,service.ts:3243-3245) and frees the start key, and after the history began a stop still leaves an error on the run. Closes with such a run read as stopped (no error, norefused-at-preparation) and a test. — fixed inef184c9(red re-executed). - [PR-1] F98 (C49 · /ship Step 11 Claude adversarial finding 3, Medium): a first open without a saved position lands on a verified stop, which needs the replay debugger; when the historical debug session does not start (a declined workspace trust, the 5 s capture timeout) the whole open fails while the pane already shows the replay, and every retry fails the same way. Closes with the debugger failure reported as
replay-debuggerand the replay kept open (or a fallback to the first event), and a test. — fixed inc96a238(mutation re-executed). - [PR-1] F99 (C49 · /ship Step 11 Claude adversarial finding 4, Low): the Output › Codebook sink throws after deactivation (the log channel is disposed with
context.subscriptions), so a seal failure while the window closes escapesstopRecordand leaves the run unreleased (also the browser path,service.ts:3422). Closes with a sink that cannot throw and a test. — fixed in0d74ba5(red re-executed). - [PR-1] F100 (C49 · /ship Step 11 Claude adversarial finding 6, Low, to verify): a transient seal failure (EMFILE, EBUSY, EPERM) is permanent: the writer is abandoned and nothing retries the seal, so a passing run stays
partial. Closes with a retry of the seal or evidence that X1's decision intends it. — fixed inb16ced3(red re-executed). - [PR-1] F101 (C49 · /ship Step 11 Claude adversarial finding 7, Low, to verify): a root
node_modules/vitestsymlinked outside the repository (pnpm's global virtual store) is reported as "none" and makescodebook_statusread node-test not ready. Closes with the wording or the containment rule decided and a test. — fixed in24bed1e(mutation re-executed). - [PR-1] F102 (C49 · /ship Step 11 Codex adversarial, Medium, and Codex structured, P2): the history store's summary memo does not watch
header.json, so a corrupt or removed header keeps a history listedverifiedthat cannot open. Closes with the header in the memo's change signals and a test. — fixed ina8c9f98(mutation re-executed). - [PR-1] F103 (C49 · /ship Step 14.5 documentation audit c49-pra-docs-2, non-blocking debt; under AGENTS.md's rule that every behavior a CHANGELOG entry names has a sentence in
extension/README.md): the README omits four details the 0.2.33.0 entry names (the node-history resource reports the same threenodeTestfields; the start's checks and that a refusal frees the run's slot and key;codebook_statusnames a missing or older root Vitest; no stored format changed), its recovery table has no row forHISTORY_SEAL_FAILEDorPLAYBACK_PROFILE_UNSUPPORTED, and Output › Codebook has no how-to. Closes with those sentences and rows. — evidence:90ee892and0d90c22add the README sentences and the two recovery rows. - [PR-2] F105 (C49 · PR-B1 CodeRabbit CLI, minor): the Application pane's muted lines read
… 1 earlier characters not shownand1 Node inspector lines hiddenfor one character or line. Closes with the singular forms in the String catalog and a test. — fixed in9c3a4e0(red re-executed). - [PR-2] F106 (C49 · PR-B1 CodeRabbit CLI, minor): the Application document's
scrolledByDocumentstays set when its scroll to the end moves nothing (no scroll event), so the learner's next scroll up is ignored and the next moment pulls the output back to its end (DS20). Closes with following decided by the position alone and a Reader DOM test. — fixed in2d427dc(Reader DOM; mutation M106, the defect's flag restored, re-executed RED). - [PR-2] F109 (C49 · PR-B1 local OCR review, low): an ANSI escape sequence split across two output entries (the launcher ends an entry at 4,096 characters) leaves its tail, such as
[32m, as text, because controls are removed per entry. Closes with removal across entry boundaries and a test. Widened by Step 11 (Codex): an OSC split across entries leaves its payload, such as a forged title, as output text. — fixed in07f748a(red re-executed). - [PR-2] F110 (C49 · PR-B1 local OCR review, low): the Study message still carries
nodeHistoryLearningMaterial, which the Study client no longer reads sincenodeHistoryLearningSummaryreplaced it. Closes with the field left out of the Study message, or evidence that a reader needs it. — fixed in18f4ab2(red re-executed). - [PR-1] F112 (C49 · PR-B1 /ship pre-gate run 2; the F5 family):
findWikiUpdateStartBlock.test.ts"a published page replaced by a link to a named pipe is reported at once instead of holding the start" andlistWikiCandidates.test.ts"a candidate folder whose receipt is a named pipe is skipped at once instead of holding the listing" timed out at their 2,000 ms test limit in a full macOS lane run, and pass alone; PR-B1 changes no Wiki code. Closes as F4 does. — fixed in7fa975dande23b61d; evidence: both files 20 of 20 under four background suites. - [PR-1] F113 (C49 · PR-B1 /ship pre-gate run 2; the F5 family):
deepWikiReader.test.ts"an image of the Wiki that its browser reads slowly but steadily is received whole, though receiving it takes longer than the send limit" received a body other than the image (bodyIsTheImagefalse) in a full macOS lane run, and passes alone. Closes as F4 does. — fixed in8bf7188; evidence: 20 of 20 under four background suites. - [PR-2] F114 (C49 · PR-B1
/shipStep 7 coverage audit, low):accumulateNodeTestOutputcounts a cut first line ascharactersplus its line feed althoughcutTextToTailmay keep fewer, so when the first kept line is a standard-error line whose text fits but whose[stderr]mark does not, the Application pane's… <n> earlier characters not shownundercounts by up to 8 (limit 15 overfirst line, stderrwarn one,last: 19 shown, 20 left out). Closes with the count taken from the kept text and a test. — fixed in8e9f3ed(red re-executed). - [PR-2] F116 (C49 · Step 8, partial item 11): the Application document's header line 1 is empty while the replay loads and for a history without entries, where E2 and AC5 ask for the header without a time. Closes with
Recorded test outputshown there without a time, and a test. — fixed in8fa356a(red re-executed). - [PR-2] F117 (C49 · Step 8, partial item 23): a refused move's error,
There is no <direction> <unit> in this Node history., says "Node" in a learner string (DS14). Closes with "test replay" in the sentence and its pinning test updated. — fixed inaff00c8(red re-executed). - [PR-2] F118 (C49 · Step 8, partial item 42): seven of the eleven new Reader DOM cases (section lines, keyboard, Study widths, Application document, the 32,768-line update, Application widths, golden sequence) and the changed existing DOM cases carry no value card (AC13), and the changed single-event focus case's name still says focus goes to "that event's own control" while it asserts
Events (1). Closes with the cards and the name. — evidence:6d77f68gives the Reader DOM cases their value cards and the single-event focus case a name that saysEvents (1). - [PR-2] F119 (C49 · Step 8, partial item 43):
studyWorkspace.test.ts:1326still asserts that PR-A's removed interim sentence is absent, an assertion that can no longer fail. Closes with it rewritten for the shown output or removed. — fixed inda02a8a(mutation re-executed). - [PR-2] F120 (C49 · Step 8, partial item 4): the Application document keeps its follow state in
setStatebut not its scroll anchor (EN3), so a pane restored from its copy loses the learner's reading position. Closes with the anchor kept and a Reader DOM test. — fixed in2d427dc(D22; Reader DOM mutation M120 re-executed RED). - [PR-2] F121 (C49 · Step 8, partial item 19): at a stop whose values are not loaded, Inspect in native debugger is offered only in the collapsed event list, not beside the hint and Show Variables (DS6). Closes with the control in that row and a DOM assertion. — fixed in
88e91f0(Reader DOM red re-executed: the flow stops at its case). - [PR-2] F122 (C49 · Step 8, partial item 34): the Reader DOM keyboard case starts after Open and never reaches the output region (DS17's path: Open, step, Next stop, Previous stop, seek, Pause, output region). Closes with the whole path. — fixed in
6d77f68(Reader DOM mutation re-executed: the output region without its role). - [PR-2] F123 (C49 · Step 8, partial item 36): the Study-pane pins of
study-bootstrap-qa.mjsare not marked as moving with D8 (plan Design 8). Closes with the marks. — evidence:6d77f68marks the Study-pane pins ofstudy-bootstrap-qa.mjsas moving with D8. - [PR-2] F124 (C49 · Step 8, partial item 41): no test puts markup into a test replay's learning material shown in the Study section (S3-1 is tested for the Application document only). Closes with that DOM test. — fixed in
6d77f68(Reader DOM mutation re-executed). - [PR-2] F125 (C49 · PR-B1
/shipStep 9 pass 1b state-machines, untested cells): of the pass's 33 matrix findings, the 5 wrong rows and 7 cells are fixed with tests in 3029b7d; these cells stay untested: the Application view with entries and no selected event; the document's following × an older view, and not-following × a scroll back to the end; with a live run's viewport lease present, a test replay's other history, same moment, closed pane and moved pane; Select event × accept and × refuse; Previous or Next event × accept and × refuse; a refused seek; a refused Inspect; an open whose journal cannot be read; a test replay open that failed or was superseded; a browser study opened, pending, failed or superseded while a test replay is selected. Closes with those tests. — fixed in65d8a58,68b4162and37885d2, the overtaken cells in648e034and97e1a6f(F250); each cell's mutation re-executed RED. - [PR-2] F126 (C49 · pass 1b testing): the harness records each
node-history-outputpost as an Application update without the panel that received it, so "each later moment is posted into it" holds for any panel. Closes with the receiving panel recorded and asserted. — fixed inda02a8a(mutation re-executed). - [PR-2] F127 (C49 · pass 1b simplification, advisory):
NodeTestReplayMessageSummaryrepeats thesaved-rowvariant's inlinePick;projectNodeTestApplicationcopiestestFileandtestTitlesinto a new object;NodeLearningStepPosition.elapsedMsis never read;usableTransportControlchecks theinstanceofpair twice (matcheswith:disabledsays it once). Closes with each simplified. — evidence:da02a8asimplifies the four: thePick, the copied fields,elapsedMs, theinstanceofpair. - [PR-2] F128 (C49 · pass 1b red team): the sticky test replay transport is not counted in the pane's focus scroll room (
--codebook-sticky-heightmeasures.live-striponly), so Shift+Tab into Step details or Events scrolls the focused control under it (focus obscured); it has noflowingfallback abovemaxStickyFraction, and during a live run it sticks at the live strip's top. Closes with the transport counted, the fallback, and a Reader DOM case at 960 × 600 that asserts the focused control's top below the transport. — fixed in6d77f68(Reader DOM red re-executed); the live-strip state's clearance by F294 (mutation M294 RED). - [PR-2] F129 (C49 · pass 1b red team): two quick Next stop presses move one stop: each computes its target from
selectedNodeHistorySequence, which changes only after the debugger presentation and the position write, and the second request supersedes the first. Closes with targets computed from a requested sequence set before the first await (restored on refusal), and a test with a held presentation. — fixed in65d8a58(red and mutation re-executed). - [PR-2] F130 (C49 · pass 1b red team; a regression of PR-B1): the Study section no longer shows why an opened test replay's capture is interrupted or partial (the old status line added
nodeHistory.reason); Saved studies shows a reason only for a replay that cannot open. Closes with the reason (sanitized, without "Node" in learner words, DS14) under the status forinterruptedandpartial, and a test. — fixed in88e91f0(red re-executed). - [PR-2] F131 (C49 · pass 1b red team): bidirectional and terminal controls are stripped only in the Application pane's output: the Study section's event rows (
entry.text, the result'soutputTail, stop facts'fact.display) and the Application header's test titles (also itstitleand accessible name) print them, so a U+202E can reorder those lines while the Application pane shows the same text in logical order. Closes with one host-side strip for every recorded text the replay surfaces show, and tests with U+202E in a title and in output. — fixed in07f748aand6d77f68(red re-executed); widened and closed with F286, F287 and F288. - [PR-2] F132 (C49 · pass 1b red team; present since PR-A's interim sentence): a selected test replay's output document takes the Application pane's place over a browser recording's own pages:
loadPlaybackdoes not retire the test replay andcapturedAppHtmlgives the test replay precedence, so a recording opened through the selected study's Recording entry or by an agent shows the test output instead of its loading page or "Recorded playback unavailable" with its recovery. Closes with the test replay retired at a recording's load (or left out while a recording is active) and a test. — fixed in8b1c542andf7738f1(D20; red re-executed). - [PR-2] F133 (C49 · pass 1b red team, low confidence):
publish()now callspresentNodeHistoryApplication, whoseviewport.showHistorythrows "Viewport lease is released" when the lease's panel was disposed beforereleased()ran;publish()was non-throwing and runs inside catch and finally blocks. Closes with the write guarded asshowRecordingLoadingOnLiveViewportguards it, and a test. — fixed in2d427dc(red re-executed). - [PR-1] F135 (C49 · PR-B1
/shipStep 9 pass 1b checks; the F5 family):wiki-reader-dom-qa.mjsfailed one case once ("in the Wiki reader at 720 px the room the article and the composer keep for focus rings moves nothing … (on a page in the shell of 0.2.29.0)") in a sequential run of the five Reader DOM checks on the Mac, and passed 55 of 55 in two reruns; PR-B1 changes no Wiki file. Closes as F4 does. — fixed in1a124cb(stills compared once settled; 9 of 20 runs needed a retake); evidence: 20 of 20 under four background suites, against 12 of 20 before. - [PR-2] F136 (C49 · PR-B1
/shipStep 9 pass 2 simplification, advisory): the Application document's output lines are drawn by two renderers that must stay identical,testOutputHtml(the first view as HTML) andinstallNodeTestOutput(lineNode,apply), each repeating the[stderr]mark rule and the line attributes. Closes with the first view passed in the script options and drawn byapplyalone. — evidence:2d427dcdraws the first view throughapplyalone, its lines passed in the script's options;testOutputHtml.test.tspins it. - [PR-2] F137 (C49 · pass 2 red team; native check owed by N49): Show recorded output and Focus application rebuild a closed Application pane through
open(), which does not put it back above the source: underworkbench.editor.closeEmptyGroupsthe closed pane's group is gone, the new pane opens at the fixed Application column, now the source's group, and the re-entry'sarrangereturns at once (receipt mode alreadystudy), so the pane comes back as a second tab before the stop's source. Closes with the rebuilt pane given a group of its own (or the Study arrangement run once the three panes exist) and a native check in VS Code and Cursor. — fixed inff9da7a(D53: D21's re-arrangement was falsified natively; the rebuilt pane takesprepareApplicationGroup, a locked group of its own above the source, when the editor removed the emptied group; red re-executed, mutation M137 for the kept group); native: PASS in VS Code 1.142.0 (take79c4e049…) and Cursor 3.26.16 (takebcb65b13…), Spacelocal:codebook-qa, candidateff9da7aVSIX462b0128…, every frame of each transition inspected: the pane returns alone above the source, the Study pane does not move, no empty group stays (the source group's tab turning toCaptured-overview.mtsis F156's, PR-3). - [PR-2] F138 (C49 · pass 2 red team): the learner's follow choice is lost when a presentation change replaces the Application pane: webview state belongs to one panel and the restore copy is written into a new one, whose state is empty, so the document follows again and Jump to latest goes (the docstring now says so). Closes with the choice kept by the host per replay and passed in the document's options, and a test. — fixed in
2d427dc(D22; red re-executed; Reader DOM mutation M120 RED). - [PR-2] F139 (C49 · pass 2 state-machines, untested cells): an overtaken Select event, Next or Previous stop, Next or Previous event, seek or Play, and Inspect each leave the step the learner chose (only an overtaken step action is tested); a background render that fails or is superseded keeps the selected test replay's output (only a render that settles is tested). Closes with those tests. — fixed in
65d8a58,68b4162,37885d2(F235) and97e1a6f(F250); mutations re-executed RED. - [PR-2] F140 (C49 · PR-B1
/shipStep 9 pass 3 performance): the Application document applies every posted moment in full, also one a newer queued moment supersedes; an in-place update of a long kept tail takes about 61 ms on the Mac, more than Play's 50 ms tick, so a log-heavy replay can fall behind while it plays (hidden today by F107). Closes with the newest queued view applied once per animation frame, and a test. — fixed in2d427dc(Reader DOM mutation M140 re-executed RED). - [PR-2] F141 (C49 · pass 3 red team): when VS Code reloads a webview's content in place (Developer: Reload Webviews), the new document reads the state frozen before the old document's
pagehidewrite, so a reload within the 500 ms write interval shows an earlier moment than the Study pane until the next move. Closes with a ready message from the document and the host posting its current view when the document's is older, and a test. — fixed in2d427dc(red re-executed; Reader DOM mutation M141 RED). - [PR-2] F142 (C49 · pass 3 red team; not reproduced):
applyreads the scroll position after the verdict and muted lines changed, so a clamp caused by hiding them might not be marked as the document's own and could turn following on. A Reader DOM case in Chromium (result, scrolled 6 px above the end, then the same lines without the verdict) kept following off before and after the proposed change, so no fix was made. Closes with a native check in N49 (a fix and its test if it reproduces) or that evidence. — evidence (no product change, D25): native PASS in VS Code 1.142.0 (take59c78aac…, candidateff9da7a): at a test replay's result with the output scrolled above its end (follow off, Jump to latest shown), Previous event to an output removed the verdict and grew the region; the top line stayed, Jump to latest stayed and following stayed off, in every frame of the step and 1.5 s after. - [PR-2] F143 (C49 · pass 3 state-machines wrong row, with F116): while another test replay opens, the loading view is projected from the replay still selected, so the earlier test's name stays under "Loading recorded test output…" and in the document title, the pane's label and the region name. Closes with the opening replay's name (or neutral words) while it opens, and a test with two replays of different titles. — fixed in
8fa356a(red re-executed).
The list continues in the pinned comment from task 126 on, so that this body keeps room under GitHub's limit of 65,536 characters for the closing notes of its tasks.
Owner decisions
- Standing: the owner's goal of 2026-10-21 and the direction of 2026-10-22 (devote every resource to the product; never spend money or break the law) are quoted verbatim in Cycle 0049: a Vitest test run the editor chat explained is saved and replayed as a learning replay in both editors #107 and AGENTS.md. The owner cannot answer, so every decision point takes the recommended option and is named here.
- D1 (recommended,
/spec): three pull requests by area, merged in order PR-1, PR-2, PR-3 (Delivery above; AGENTS.md allows up to three for a large cycle). Considered:- One pull request: its review diff would be too large for the three fixing cycles of
/ship. - Grouping by severity: it would split the same code across pull requests.
- One pull request: its review diff would be too large for the three fixing cycles of
- D2 (recommended,
/specPhase 5): no spawned agent (--no-execute). The driving agent implements under the delivery chain, and subagents may implement within it (AGENTS.md). Considered: spawningclaude -pin a worktree, which would bypass the cycle's reviews and gates. - D3 (recommended, after
/spec's quality gate): host-dependent tasks are checked natively before the merge of their own pull request, and N50 is PR-3's full both-host round before PR-3 merges (Native checks above). That way nothing waits beyond the three pull requests. F3, seen on Linux, closes only with a fix and a test plus the macOS frame check, because the WSL host is not in use. Considered: one N50 after the last merge, which leaves no pull request to deliver its fixes. - D4 (recommended,
/spec): the dedupe check found no open duplicate. The draft took the recommended confirmation. The Codex quality gate scored the first draft 7 of 10; its marker check read that answer as unavailable. The revision answered its seven ambiguities: closure rules, bounds and the native-check table. The second scoring passed at 8 of 10, and its six remaining ambiguities are answered as well: N50's procedure, the table as the complete list, the load-run unit, control strings across entries, test-fixing tasks, and a failed close of an earlier tab. No third scoring: the gate passed. - D5 (recommended, 2026-10-23, the owner's goal re-issued): the goal asks for a feature increment designed with
/autoplanand merged after CI. AGENTS.md's cycle rule, which no planning choice overrides, puts this bug-fix cycle first, so the goal is served in this order:- This Issue's three pull requests.
/specand/autoplanfor the next feature cycle, from PRODUCT_GOAL.md and a fresh gap audit.- That cycle's pull requests, merged after CI.
Considered: starting the feature cycle now and leaving these 184 defects carried, which the cycle rule forbids.
Next action
State on 2026-10-24, 14:36 JST: closed. PR-1 #119 (5267030), PR-2 #120 (62f6aa9) and PR-3 #121 (8dd675b, v0.2.38.0) are merged; every task (547) is closed and nothing is carried (closing comment). Next: a feature cycle, planned with /spec and /autoplan from PRODUCT_GOAL.md and a fresh gap audit; candidate, the region-2 composition (D8 of #107).
Tasks, continued (4)
The numbered list continues here from task 459, because the third "Tasks, continued" comment is close to GitHub's limit of 65,536 characters. The same rules apply (closure rules in the body), and the agent edits this comment when a task's state changes.
-
[PR-3] F484 (C50 · PR-3 local review of
ccfe301d..c9664ea3: CodeRabbit CLI minor; F474's fix): the retired browser replay's tab record is cleared beforetabGroups.closesettles, so a refused close is never retried and the leftover tab stays beside the test replay. Closes with the record cleared only for tabs whose close succeeded, a refused close retried at the next slot show (with itshistory-sourcewarning as for …
Activity
ryota-murakami commentedon Oct 22, 2026
Tasks, continued
The body's numbered list goes on here, from task 126; the same rules apply (closure rules in the body). The agent edits this comment when a task's state changes.
#node-learning-title) is clamped to two lines at every width with a hover tooltip only: unlike the browser summary's title, a cut title is no tab stop and is not shown whole on focus, so a keyboard or touch learner cannot read it (the Application header's test line likewise). Closes with the browser title's rule and a Reader DOM case. — fixed in6d77f68(Reader DOM mutation re-executed); the stop decided again on blur by F297 (3e25f2f).nodeHistoryPosition'stype,indexandelapsedMsare no longer read by product code;.test-output-header p{margin:0}never applies (body.test-output poutranks it);testReplayLineTextswrites its map twice andsection.pointer ?? ''is a dead fallback; the client'sstopFrameNamesItsSourcerepeats the verdict the host sends asnodeHistoryUnverifiedStops. Closes with each simplified. — evidence:da02a8asimplifies each: the unread position fields, the rule that never applied, the double write and dead fallback, the client's repeated verdict.!this.recordingActivearm offocusApplication's guard decides no tested outcome (the browser replay test selects no test replay), the F132 path. Closes with a test that opens a browser recording over a selected test replay. — fixed in8b1c542(mutation re-executed).68b4162and37885d2, the overtaken cells in648e034(F250); mutations re-executed RED.07f748a(red re-executed)./shipStep 11 Codex adversarial): the output index turns every complete line of a history into its own{ channel, text }object with a running total, before the 65,536-character view applies, so millions of short lines become millions of objects kept while the replay is selected. Closes with the index kept as offsets into the recorded chunks (or compact numeric arrays) and the line objects made only for the kept tail, and a test. — fixed in8e9f3ed(red re-executed).8fa356a(red re-executed).testOutputFollow: falsefrom an earlier document of that replay (after a browser study's page, a Retry or a playback's end rewrote the pane), and with no scroll anchor (F120) opens at the oldest kept output. Closes with the saved state keyed by the written document's identity, or evidence that the inheritance is intended, and a test. — fixed in2d427dc(D22; red re-executed; Reader DOM mutation M120 RED).presentNodeHistoryApplicationrecords a view's generation as shown beforepostMessagesettles and ignores its result, so an update the webview did not take (not live, reloading after a move) is never posted again until the moment changes. Closes with the generation cleared onfalseor a rejection, and a test. — fixed in2d427dc(red re-executed); its test made independent of the reader's own publishes inc7dd476(F300).No recorded event is linked to this step.. Closes with the block hidden (or its links kept) while suppressed, and a Reader DOM case. — fixed in8b1c542(Reader DOM mutation re-executed)./shipfinal pre-gate; the F5 family):studyWorkspaceEntry.test.ts"live entry waits for retired Study tabs before measurement and measures its final arrangement once, returning the keyboard to chat" failed once in a full pre-gate lane run on the Mac (load average 15 to 25, beside F4 and F5) and passes alone 3 of 3 and in the rerun lane (6,098 tests, 0 failed); PR-B1 does not change that file. Closes as F4 does. — fixed in46f1340(the final arrangement observed from before the run starts, told by the pane it retires); evidence: the whole file 24 of 24 runs four at a time beside four background suites, against 3 of 24 failing before.app/lib/utils.test.ts) waits 20 s for its breakpoint acknowledgement, never pauses, and ends "Owned Node test exited with code 0 before declared stop 1" (Space, VS Code 1.142.0, Vitest 5.0.2, Node 24.21.0; run journal kept privately). A chat that follows the refusal's own recovery cannot reach its first stop. Closes with the bound position accepted as a stop (or the refusal naming a position that pauses) and a test. — first half fixed inb047a76(red re-executed); the second half moved to PR-3 (D45). — second half fixed in0920870(red re-executed); native: PASS in VS Code 1.142.0 (experiment X1, take99d5c27e…, candidatec83a786): the chat declared a stop in the test file itself,utils.test.ts:147, and the run paused and captured it; later changes (R5's loading words, R6's entry) do not touch the node-test breakpoint path.Captured-overview.mtstab ("Configured source is unavailable…") opens beside the recorded-source slot, and the Study pane's top reads that article and "The tab of the captured source is behind another tab"; the test replay section starts far below. Closes with the test replay's open leaving the article's source closed and the section in view, and a test (the region-2 composition of D8 may supersede the second half). — fixed incfc0eb7and7acf9ef(red re-executed; PR-3 closing notes)Test replay · …, a learner string that says "Node". Closes with the row in the catalog's words and its test. — fixed inaff00c8(red re-executed).cfc0eb7(red re-executed); native check pending (N50) — evidence: the refusal no longer arises on Open replay. In Cursor 3.26.16 (N50 second submission, candidate3773701), Open replay with a text preview (data.test.ts) and with a non-text preview (opengraph-image.png) in the source group opened the replay, kept the preview tab and placed the panes. The modal dialog that names the file and its recovery (D33) remains for the refusals that still happen, pinned by its tests (cfc0eb7, F363's7d14cb7, F394'sa7c3535).timelineremoved (range 100 to 900 ms), so it proves the drawing of an absent timeline, not a one-event history. Closes with the case's events, count and range reduced to one event. — fixed in7acf9ef(red re-executed; PR-3 closing notes)onDidChangeVisibleTextEditors, the reveal only at a selection's commit, and tests. — fixed inf371587(red re-executed); native check pending (N50); native: VS Code PASS (N50 second submission, candidate073f6ae, R4 take80198168…: withutils.tsin front, Focus source showed the slot again with its stopped line and label, and returning did not scroll); native: Cursor PASS (N50 second submission, candidate3773701, take4b03c574…: Focus source showed the slot again with its line and label, and returning did not scroll).projectNodeTestSectionmaps the whole history onto the timeline at every Study message, although the timeline changes only with the history. Closes with the timeline kept per history and a test that counts the projections. — fixed in13c5ae1(red re-executed; PR-3 closing notes)++selectedNodeHistoryRequest(an unavailable event, Inspect on an unverified stop, a seek at a stopped debugger) supersedes an earlier selection whose leave already stripped the slot, so the shown moment keeps its Study position while its slot shows the loading text without its line and label. Closes with the request taken after the refusal checks (or the earlier moment restored) and a test. — fixed inf512dfc(red re-executed; PR-3 closing notes)ce57b0a(mutation re-executed; PR-3 closing notes)selectNodeHistoryEventwithpublish: true): thelayout,applicationandreaderrows lose therenderSelection(true, true)retry they had, Retry pauses Play and restarts a debugger the learner stopped, and a debugger failure can throw out of the Retry handler. Closes with the re-selection only for the replay's own rows,renderSelectionkept for the others, the failure reported, and tests. — fixed inc31d031(red re-executed; PR-3 closing notes)Recorded:label after its replay is retired (the close skips pinned tabs and the retire neither clears the decorations nor fires the provider). Closes with the decorations cleared and the provider fired for the retired slot, and a test. — fixed inf371587(red re-executed; PR-3 closing notes)f371587(mutation re-executed; PR-3 closing notes)failedbranch does not invalidate it when the moment does not change), against the comment "a slot that could not open leaves the debugger on no stop"; and bytes that arrive after the bound show undecorated beside the failure row. Closes with the debugger invalidated in thefailedbranch, the slot's text reset, and a test. — fixed inc31d031(red re-executed; PR-3 closing notes)awaitDocumentSettledleaves its change subscription and bounded poll running whenafterSubscribethrows. Closes with the throw ending the wait and a test. — fixed in9035c03(red re-executed; PR-3 closing notes)awaitDocumentSettled's "ignores another document" test relies on the poll's timing. Closes with both tests made order-independent. — fixed in9035c03andf371587(mutation re-executed; PR-3 closing notes)describeNodeRecordedSourcewritesCaptured-instead ofCAPTURED_SOURCE_NAME_PREFIX(constants.ts);renderTimelineCoverage's aria and tooltip words are English literals shared by both transports outside the String catalog; its legend arguments include unreachable ones. Closes with the constant, the words in the catalog, and the dead arguments removed. — fixed ine002603andf371587; evidence: PR-3 closing notes13c5ae1andf512dfc(red re-executed; PR-3 closing notes)nodeSourceSlotPathandformatEventSecondseach have one or two callers and could be inlined. Closes with each kept with a reason or inlined. — evidence: kept with a reason (PR-3 closing notes)hoverMessageis a plain string, which VS Code renders as Markdown, built from a recorded path (the browser's label does the same). Closes with aMarkdownStringwhose text is escaped, or evidence that a recorded path cannot carry Markdown links, and a test. — fixed inf371587(red re-executed; PR-3 closing notes)/shipStep 9 pass 2 core review, sideways sweep of F164; present onmain): the retired replay'shistory-positionandhistory-learningrows also survive a return to Live. Closes with the retired replay's rows cleared at the retire and a test per row. — fixed incfc0eb7(red re-executed; PR-3 closing notes)ce57b0a(mutation re-executed; PR-3 closing notes)f371587(mutation re-executed; PR-3 closing notes)setImmediate. Closes with an injected bound or clock, releases infinally, and waits on an observable state. — fixed inf371587(mutation re-executed; PR-3 closing notes)parseDiagnosticsthrough a cast. Closes with the public syntactic diagnostics API. — fixed inf371587(mutation re-executed; PR-3 closing notes)retireNodeHistorySelectionstill closes/node-history/<studyId>/previews, an address nothing opens since the slot replaced the per-stop editors, under a comment and error text that describe the old behavior. Closes with the block removed (or reworded as the clean-up of tabs an earlier version restored) and a test. — fixed inf371587(red re-executed; PR-3 closing notes)openRecording), so the slot tab, its decorations and its provider text stay while a closed reader or a browser replay owns the surfaces (the extension README says leaving the replay closes the tab). Closes with the slot retired on both paths and tests. — fixed inf371587(red re-executed; PR-3 closing notes)f371587(red re-executed; PR-3 closing notes)/shipStep 9 pass 3 testing): the rename test reads the renamed slot's bytes only after moving back to the first stop (when that URI is no longer the slot and serves the placeholder), so no test pins that the renamed slot shows its stop's sealed source. Closes with the read made at sequence 4. — fixed inf371587(mutation re-executed; PR-3 closing notes)studyWorkspace.test.tsreplaced the exact replay-debugger invalidation counts with> beforewhen the debugger began to start on the "Not recorded" thread, so one invalidation per leave (EN8 step 1) is no longer pinned. Closes with hard-coded deltas. — fixed ince57b0a(mutation re-executed; PR-3 closing notes)ce57b0a(mutation re-executed; PR-3 closing notes)showTextDocumentstill runs the sweep, which can close its own just-opened tab, the only tab of its group, before the newer selection chooses a column, so undercloseEmptyGroupsthat group can vanish and the slot moves group. Closes with the sweep run only by the current selection, and a test. — fixed inf371587(red re-executed; PR-3 closing notes)13c5ae1(red re-executed; PR-3 closing notes)showNodeSourceSlotpublishes before the commit when it clears the failure row. Closes with the surfaces' shown moment tracked and the publish left to the commit, and tests. — fixed inc31d031(red re-executed; PR-3 closing notes)f371587(red re-executed; PR-3 closing notes)tabGroups.closeis not serialized with the next show). Closes with the slot's show and close serialized (or the current slot shown again after a stale close) and a test. — fixed inf371587(red re-executed; PR-3 closing notes)publish: false) await the reader position write before the controller'schanged()publishes, so a slow write keeps the Study and Application panes on the earlier moment beside the new slot and debugger, and a write that never returns stops Play. Closes with the publish placed before the write and a test with a held write during Play. — fixed inf512dfcandc26472a(red re-executed; PR-3 closing notes)NODE_HISTORY_TRANSITION_BOUND_MScovers only the slot's text wait;openTextDocument,showTextDocumentand the tab close are unbounded, so a stalled editor call holds the selection, Play'spendingand every later seek. Closes with one deadline over the slot's whole show, late completions cleaned up, and a test. — fixed inf371587(red re-executed; PR-3 closing notes)nodeSourceSlotUrireadsthis.library!before the slot'stry, so a missing library throws a TypeError after the leave instead of thehistory-sourcerow; a debugger presentation that throws leaves the slot and debugger moved and the Study position not. Closes with both told and a test. — fixed inf371587(red re-executed; PR-3 closing notes)Captured-<basename>), so a stop in the other file does not rename the tab, against the extension README's sentence. Closes with a slot name that tells such files apart (or the README sentence narrowed) and a test. — fixed inf371587(red re-executed; PR-3 closing notes)\r, one column off. Closes with the line's length taken without its line ending and a test. — fixed inf371587(red re-executed; PR-3 closing notes)outerHTMLwith computed percentage widths, which a harmless rounding change breaks. Closes with the widths normalized in the comparison. — fixed in7acf9ef(mutation re-executed; PR-3 closing notes)7da4a178…at 956.37 to 956.77 s and 973.37 to 973.98 s), and the call stack lists the previous stop's frames for a frame under the new thread name: the leave step (EN8 step 1) neither clears the Study position nor shows the Application's loading header. Closes with every surface leaving the old moment at once (the Study position and the Application header loading or cleared until the commit) and a test with a held debugger presentation that reads all surfaces at the intermediate point. — fixed inf512dfcand8c4e154(red re-executed); native check pending (N50); native: VS Code PASS (N50 second submission, candidate073f6ae, R4 take80198168…: every native frame of stop 1 to stop 2 and stop 2 to output; no frame pairs one moment's stack, lens or bytes with another's, and the Study position and readout say loading until the commit); native: Cursor PASS (N50 second submission, candidate3773701, take4b03c574…: every native frame of stop 1 to stop 2; the Study position and readout say loading until the commit, Variables are empty in between, and no frame pairs moments).3) and VS Code's sticky scroll keeps showing the earlier stop's source lines at those moments. Closes with the placeholder revealed from its first line (and the earlier text gone from sticky scroll) whenever the slot shows it, a test, and a native recheck. — fixed inf371587(red re-executed); native check pending (N50); native: VS Code PASS (N50 second submission, candidate073f6ae, R4: at the output the placeholder shows from line 1, with no earlier source in sticky scroll); native: Cursor PASS (N50 second submission, candidate3773701, take4b03c574…: at the output the placeholder shows from line 1, and the Call Stack reads Not recorded at this moment).Node test stops must identify exact positions in their retained citations. Cause: Configured position differs from its selected citation., names neither the stop, its anchor index, the cited path and lines nor which of six conditions failed (assertCitedSourceStops), against inventory row 14 ("cause names the stop"); the chat guessed three times. Closes with the refusal naming the stop, the anchor, the cited range and the failed condition with what to send, and a test per condition. — fixed ind23456d(red re-executed, 5 of 5).fetchFilteredInvoice/s), cuts every step label with an ellipsis and places a fourth participant beyond the right edge, so the diagram alone does not name its interactions. Closes with labels that wrap at word boundaries or show whole (and every participant reachable), a Reader DOM case at the Study pane's width, and the browser summary's golden DOM updated with a reason. — fixed in6d77f68and3e25f2f(Reader DOM reds and mutations re-executed; F293, F296).Recorded: <path>:<line> · <t> sis cut at the editor group's right edge at the default layout (Recorded: app/lib/data.tes…), hiding the line and the time. Closes with the label shown whole (another placement or a shorter form) and a native check in both hosts. — fixed inf371587(red re-executed); native check pending (N50); native: VS Code PASS (N50 second submission, candidate073f6ae, R4: the CodeLens carries the wholeRecorded: app/lib/data.test.ts:307 · 91.82 s); native: Cursor PASS (N50 second submission, candidate3773701, take4b03c574…:Recorded: app/lib/data.ts:218 · 20.71 swhole on the line and on the CodeLens).codebook_presentationcalls had failed withPRESENTATION_UNAVAILABLEandcodebook_return_currentwith "Native pane, group or focus changed while presentation waited"), Open replay opens the Application, the recorded-source slot and the debugger but no Study pane, so the replay has no transport, position or summary;Codebook: Open Study Workspacerefuses with "The Application group changed. Use Codebook: Focus Application or Restore layout explicitly." (also with the chat closed),Codebook: Arrange Study Workspaceends with "Codebook could not finish arranging its panes…", and Focus Application and Focus Explanation change nothing visible; only a restart of Cursor brought the Study pane back. Closes with Open replay and Open Study Workspace reaching a usable Study pane after such a run, a recovery whose named command works, a test, and a native check in Cursor. — fixed in2ef87fd(red re-executed); native check pending (N50); native: Cursor PASS (N50 second submission, candidate3773701, take4b03c574…: the first Open replay after the Agent's live run opened the Study pane with its transport, the slot and the debugger; X3 onc83a786likewise).codebookLearningview container in the Secondary Side Bar ("View containers cannot be contributed to the Secondary Side Bar in Cursor. It is reserved for Cursor's agent UI."), so theLearning summaryview falls into Explorer. Closes with a supported placement in Cursor (and the D8 composition's plan using it) and a native check. — fixed in3f0453a(red re-executed); native: PASS in Cursor 3.26.16 (N50 first submission, take18093050…, candidate77538e0, and experiment X3, take4ab6eab2…, candidatec83a786): the Learning summary opens in its own Activity Bar container, and the log has no contribution error after the reload; later changes do not touch the manifest or the placement.claimWikiUpdateMarker.test.ts(links to an endless device),deepWikiReader.test.ts(the manifest read),deepWikiReaderOpening.test.ts(two Open LLM Wiki cases),inspectDeepWikiFreshness.test.ts,readWikiRegularFile.test.ts,readRecordedOwner.test.tsandrefreshCursorMcpCatalogFileIdentity.test.ts. Closes as F4 does, with only the act bounded (by 10 s, through one shared helper) and the runner's limit raised for the setup. — fixed in7fa975d,8bf7188ande23b61d; evidence: all eight files 20 of 20 under four background suites.constants.ts,removalRefusals.nodeHistory), a learner string that says "Node". Closes with the sentence in test-replay words and its pinning test. — fixed inaff00c8(red re-executed).test:shard --recordreports one failed test as "1 tests failed; …". Closes with the singular form for one test and a test. — fixed in38805a3(red re-executed).listedHistoryCountreads headers only), so the learner loses a place to something they can neither see nor delete. Closes with D28 (such a history removed when a read finds it, and not counted) and a test that fails without it. — fixed inc792f75(mutation re-executed).sanitizeCauseorders its roots by their raw length, so a root also named by its macOS realpath alias (/private/var/…, eight characters longer) outranks a storage folder inside it, and that folder's paths read<workspace>/…instead of<storage>/…. Closes with the roots ordered by their short spelling and a test that fails without it. — fixed in691cd53(red re-executed).studyWorkspaceRemoval.test.ts"after a removal refused because nothing was left of the study, a run refused on the full library still offers to delete a saved study" read the removal's line after the run, which the reader retires at its next refresh once another run is current; it passes alone 6 of 6. Closes as F4 does. — fixed in47ef72d; evidence: 20 of 20 beside four background suites (load 11 to 35).codebook://node-historyread) advance one shared journal scan from the same offset, so the second applies the same bytes again, breaks the scan and skips bytes; the recording then reads interrupted. Closes with the scan serialized per study and a test of two overlapping summaries. — fixed in896f281(red re-executed).unavailableMemoreturn nothing, sosummarizeforgets a listed history and Saved studies loses its row until a later refresh. Closes with the earlier memo kept as transient and a test. — fixed in896f281(red re-executed).stopRecord) is stored and thrown unsanitized, reachingcodebook_stopand the run resource with private paths. Closes with the cause sanitized and a test. — fixed ind381277(red re-executed).admitStudy's library-read error,codebook_status's missing and reason lines, thecauseDetailofactionandcontinue,recordingReceipt's reason, and a browser run's own error. Closes with each sanitized and a test per surface. — fixed in67d8e6b(red re-executed).b26d5b1(red re-executed).4520f05(red re-executed).refused-at-admissionwithstopped-before-history. Closes with the admission refusal kept and a test. — fixed inf206505(red re-executed).TRANSIENT_FILE_ERROR_CODESandTRANSIENT_SEAL_ERROR_CODESrepeat one list. Closes with one source and evidence. — evidence:2457eb5derives the seal list from the file list, without EIO, and says why.sealRetryDelayis a public mutable field of the service set by tests. Closes with an injected delay and evidence. — evidence:f1d2cc1injects the retry delay through the constructor.37208cf(red re-executed).463d902(red re-executed).environmentNodeTestCheck.test.ts's passing case succeeds whencheckNodeTestFilesis absent. Closes with the member asserted first and a mutation proof. — fixed in161f738(mutation re-executed).extension/README.md"Codebook: Save Learning Replay run then does nothing" is not a sentence. Closes with the sentence fixed. — evidence:11c0068rewords the sentence.63c672crewords AGENTS.md.63c672crewords AGENTS.md.studyWorkspace.test.ts"saved Node history is selectable in the reader without entering browser playback" waits one second for each of the reader's results (here "a new history store restores the saved stop and its native snapshot") and times out on a loaded machine. Closes as F4 does, with its waits given a hang bound. — fixed inf799758,d8790e5and9d5c51b(a reopen through a new store waits for the chosen position on disk); evidence: 20 of 20 beside four background suites (load 9 to 31), the sibling reopen test 20 of 20 alone at load 28.studyWorkspace.test.jsat load ~40; the F4 family): "live entry preserves a learner document sharing the former explanation group" reads the focused editor right after the open resolves, before the entry hands the keyboard back to the learner's draft. Closes as F4 does, with the test waiting for that result. — fixed inf799758; evidence: 20 of 20 beside four background suites (load 9 to 31).terminalReason(throughruntimeFailure) with the raw storage path until the study removal is known. Closes with the cause sanitized where it is assigned and a test that fails without it. — fixed in5444158(red re-executed).571d1bd): "stop moves skip outputs…" fails about half the time withENOTEMPTY, because the harness's close removes the temporary storage while the reader's position write, made after the commit, still creates its file. Closes with the pending write awaited at close (in the reader or the harness, where the cause is) and a test that fails without it. — fixed in07d0909(red re-executed).37885d2(red re-executed).loadPlaybackwas awaited also with no test replay selected, beforerecordingActivewas set, so closing the reader right after opening a recording left the tab on Live ("a selection made on a closed reader whose recording was closed while it was loading…" failed alone). Closes with the retire only for a selected test replay and that test. — fixed inf7738f1(red re-executed).retireReplayDebuggerlets another event or a Retry be selected; the old call still reports its failure and selects and saves its event. Closes with the request's currency checked after each await on that path and a test that holds the disposal. — fixed in125ad3c(red re-executed).21f3a68rewords both rules.studyWorkspaceTestReplay.test.tsbound the reader's results by a literal 2,000 ms, unlike the rest of PR-1. Closes withREADER_RESULT_BOUND_MS. — evidence:3beb381gives the nine waits READER_RESULT_BOUND_MS.studyWorkspaceEntry.test.ts"live entry waits for retired Study tabs before measurement…" no longer reaches the wait it is named for: the fake editor closes the retired tab by itself before the final arrangement starts, so a reader without the wait passes it, also onec213b9. Closes with the tab's close held until that arrangement began and a mutation proof (the wait removed fails both variants). — fixed in46f1340(mutation re-executed: without the wait both variants fail).5f71329rewords both paragraphs.5f71329(red re-executed: the old wording indescribeCitedStopMismatch.test.ts).codebook_read_resourceof a test replay whose history folder is gone answered thelstaterror with the absolute storage path (every MCP answer passedString(error)throughdomainError), and a broken journal line's reason (recording scan and history read) kept the raw parse or schema failure, unbounded, so a long one made the read itself fail on the index's 1,024-character bound. Closes with every MCP answer's unexpected cause sanitized by the service's roots, both reasons worded by the store's describer and cut to the bound, and tests that fail without each. — fixed ina96ada1(four mutations re-executed: raw MCP cause, raw scan reason, raw read reason, bound removed (ZodError)).a96ada1(mutation re-executed: inode check removed).isTransientFileErrorhad no direct test: only EMFILE was reached, through a summary test, and no false case was asserted (requireOwnedVitestis covered at its boundary byprepareNodeTestLaunch.test.tsand the environment tests, F29 and F57). Closes with a table test and a mutation proof. — fixed ina96ada1(two mutations re-executed: codes cut to EMFILE, ENOENT counted transient).NodeTestHistoryStore.holdsHistoryFolderchecks a folder with the synchronousexistsSyncon the extension host. — evidence: one existence check of the editor's local storage per agentcodebook_playbackcommand, 0.61 µs mean over 10,000 calls on the Mac;playbackanswers synchronously at 35 call sites; the docstring says why it stays synchronous (a96ada1).isSealedEmptyHistoryrepeated the error-code shape checksystemErrorCodeprovides. — evidence:a96ada1usessystemErrorCode;isSealedEmptyHistory.test.tspasses.OwnedRepositoryBreakpoint's'declared-column'mode has had no production caller since D16 (both Node test call sites and the configured run pass'declared-line'), so its acknowledgement branch, its bound-column refusal and their tests inpendingRepositoryBreakpoint.test.tskeep dead behavior. Closes with the mode, its branches and their tests removed, or a caller that F155's second half gives it (D47). — fixed inf50a48f(mutation re-executed; PR-3 closing notes)study-bootstrap-qa.mjs(F125, F147) still set and read webview state (savedState.testOutputHistory,testOutputFollow) that D22 removed from the Application document, soownHistoryandfollowKeptread nothing and the third case ("a document loaded again never shows the newer view that another replay left in the kept state") cannot fail through the path its name gives. Closes with the cases written for D22 (the host's reading in the document's options), the dead state reads removed, and a mutation proof per case. — fixed in1135bbd(Reader DOM mutations M1, M2, M3a and M3b re-executed RED).f7738f1): sixstudyWorkspaceTestReplayCells.test.tscases ("a overtaken before its stop is shown leaves the moment and the step the learner chose") andstudyWorkspaceTestReplayOpens.test.ts"a browser study overtaken by choosing the test replay again leaves the replay selected" stay green with the guards they were written for removed (P2B's own mutations, re-run at the integrated head), although they failed on P2B's branch. Closes with each case given a break it catches at the integrated head (or corrected so it does), with the mutation proof. — fixed in648e034and97e1a6f(P2B's own mutations re-executed RED at the integrated head).isSealedEmptyHistorytook a sealed history whose seal records entries but whose journal is gone or empty for an empty one, socodebook_status→admission()→dropSealedEmpty()removed the whole folder with its learning material and header. Closes with the seal's ownentryCountandjournalBytesdeciding, and tests. — fixed in0d336e5(two mutations re-executed: the unit test and the capacity check that kept the folder).nodeTest.captureMissingwas read once at the seal, so a transient summary failure (EMFILE) left it unknown for the run's life and the agent could never claim saved learning. Closes with the next learning-material save reading it again, and a test. — fixed in0d336e5(mutation re-executed).read-historyand named ahistoryUri. Closes with neither offered and a test. — fixed in0d336e5(mutation re-executed).dropSealedEmpty(neither listed nor counted, removed once it can be) were untested. Closes with both tests and mutation proofs. — fixed in0d336e5(two mutations re-executed).0d336e5(mutation re-executed: 2 of 2 red).EVIDENCE_UNAVAILABLEcause and message ofcodebook_explain, the run error and the journaledrun.failed, since aStudyErrorpasses the MCP answer unchanged. Closes withwriteFailureErrorsanitizing the cause, and a test. — fixed in0d336e5(mutation re-executed; three expectations that pinned the raw path or the error name now read the sanitized cause).codebook_statussanitized only a failed prerequisite read (F219); the missing sentences of a read that resolves (anlstatrefused on the repository's build folder) kept their paths. Closes with every missing sentence, common and per profile, sanitized, and a test. — fixed in0d336e5(mutation re-executed).sanitizedCausecut UTF-16 code units at 8,192, which can leave a lone surrogate, without a marker. Closes with the cut between characters with the cut marker, and a test. — fixed in0d336e5(mutation re-executed; the runtime-failure limit test now expects the marker).0d336e5); (2) the cause redaction is root-based — evidence: it hides the extension's private roots by design (F49, F219); V8 quotes at most about ten characters of a bad JSON line and Zod 4 quotes no received value; (3) POSIX root matching is case-sensitive and not normalized — evidence: causes quote the path strings Codebook passed, and the roots are those strings and their real paths (F58); (4) a recording's scan keeps its citable map outside the memo bound — evidence: only histories this window writes keep a scan, bounded by the 8 MiB journal limit, and a sealed history's summary keeps none; (5)Buffer.allocof the appended region — evidence: bounded by the same 8 MiB limit checked first; (6)holdsHistoryFolderas an existence oracle — evidence: the agent already reads every listed history incodebook://node-history; (7)summarizequeues per study — evidence: each queued call reuses the memo the earlier one made; (8) a Save receipt kept unless a greater store revision appears — evidence: the store's material revision only grows, and a removed history removes its item (F225); (9) a preparation failure racing the learner's stop reads stopped — evidence: D12, the learner's stop decides the run's end.interrupted("no verified final seal") and reads its whole journal at every 250 ms refresh while it grows, because only the recording window knows the history is active. Closes with a recording that another window can tell (or a status that says so) and a bounded read of a growing journal there, and tests (D48). — fixed in72c5688andc41bc98(two reverts and three mutations re-executed RED), the clock in9bce411(F284).unexpectedFailurepassed aStudyErrorthrough unchanged, so domain errors built from raw file or Git errors (a stored book, a reveal's stale-pause cause, a playback refusal's message, the repository's index) named private paths in MCP answers. Closes with every StudyError's message and cause sanitized at the boundary, and a test. — fixed in763bf0e(mutation re-executed).causeRootscalled a synchronousrealpathtwice at every access, and three places built cause roots inline. Closes with onecauseRootsForhelper and each real path resolved once, and a test. — fixed in763bf0e(mutation re-executed).messageNamingCausecut the joined words beforesanitizeCausehid the roots, so a cut inside a root left its first characters, and it cut UTF-16 units. Closes with the roots hidden first and the cut between characters, and a test. — fixed in763bf0e(mutation re-executed).String(error). Closes with both sanitized, and tests. — fixed in763bf0e(two mutations re-executed).cutReasonbetween characters with the cut marker, and a test. — fixed in763bf0e(mutation re-executed; two reason-bound tests now expect the marker).763bf0e(mutation re-executed).763bf0e(mutation re-executed).763bf0e(mutation re-executed by hand).codebook_statusremoves sealed-empty folders without the storage lock — evidence: D28, only folders whose seal records nothing and that hold no learner file, which no window writes; (5) a recording scan's citable map — evidence: matched to F259 (4).VITEST_PACKAGE_PATHandVITEST_PROGRAM_PATHinconstants.tsand onecitedsentence. — evidence:763bf0e; the path refusal's test reads the unified sentence..theninisSealedEmptyHistory, and anisSymbolicLinkcheck afterlstatthat cannot be true. — evidence:763bf0esimplifies both.763bf0e(two mutations re-executed).763bf0e(six mutations re-executed).763bf0e(two mutations re-executed).763bf0e(two mutations re-executed).… [cut]", which reads as if the Output entry were cut too, whilecutCauseForDisplaykeeps the whole cause there (the packaged README already says so). Closes with the bullet worded as the README (the surfaces that cut, the Output entry kept whole) and a one-line evidence note (D50). — evidence:d966577words the 0.2.36.0 bullet as the packaged README: the surfaces that cut, the Output › Codebook entry kept whole.extension.test.ts"a failed Save Learning Replay whose error quotes a command link shows no clickable link" failed in the full suite, because its StudyWorkspace stand-in had nodescribeFailure, which F264's fix (763bf0e) made the Save notice call; the fixing cycle had run only focused tests. Closes with the stand-in describing a failure as the real workspace does and a mutation proof. — fixed ind10f77d(red: the gate run onb8cf9f1; two mutations re-executed: the notice built fromString(error), the notice unescaped).extension/package.jsonand the package test's expected version but notEXTENSION_VERSIONinextension/src/constants.ts, so every package test failed with "Runtime and package versions differ" (32 of 1,071). Closes with the constant raised in the release commit. — fixed in94aba4c; evidence: the package lane on the final tree.Widenings recorded in #107
These notes widened or re-found tasks above; each widening is one more part of the task it names (closure rule 5).
F161 widened by pass 1's red team: the reveal at every activation of the slot tab scrolls the learner back to the stopped line. F162 found again by pass 1's performance review.
Pass 2 also found again: F161 (a slot shown without becoming active loses its line and label), F162 (the timeline recomputed per publish, confidence 4), F165 (a refused selection supersedes one that stripped the slot), F167 widened (Retry storage / refresh and Repair saved study also re-select the moment and restart a stopped debugger), F168 widened (a slot inside a diff input is never closed; a locked group can be chosen), F169 widened (a restored slot tab stays when no replay is ever opened), F175 widened (the
tab-titlekind and three one-caller wrappers), F135 (Reader DOMwiki-reader-dom720 px case failed once in pass 2's QA, passed on replay; PR-B2 changes no Wiki file) and F4 (failed once in a focused run, passes alone 3 of 3).Pass 3 also found again: F166 and F179 widened (open failure at an unverified stop, an output and the result; unverified stop and result × return to Live), F167, F173, F174 widened (a selection overtaken after its open still shows and sweeps), F176, F181, F185.
Step 11 also found again: F161, F167 (Retry for other rows restarts a stopped debugger), F171 (
awaitDocumentSettled), F169 and F185.N49 VS Code also widened: F155 (met again:
Declared breakpoint 151:7 is bound at 151:8; following the advice paused this time, at the cost of one launched run) and F156 (the Study pane's top shows the Repository article's red "Current source unavailable" lines and anunderstandcheckbox reading "Understanding storage unavailable" above the test replay); and confirmed F157 and F85.N49 Cursor also widened F203 and F204 to both hosts (reproduced in Cursor's take
ffbe0a76…); F207 does not reproduce in Cursor's wider group; F156, F157 and F85 confirmed again.ryota-murakami commentedon Oct 22, 2026
Entry (2026-10-23)
Reads in this working context:
Image. Identity of
docs/designs/assets/codebook-product-spec-v9.png: 1024 × 1536, 1,878,402 bytes, SHA-256f189ee82541a72ed981e3f7a0e21bd35a19b6601df1c7208671117a335caf2aa(matches the Design target).Correction to #107's last re-entry comment: that comment says the image was opened, but in that context the image read returned no picture. The PNG was viewed with the image viewer only now, at this entry, through a copy scaled to 800 × 1200; the original's identity is the one above.
Regions found:
actions.ts, paused atawait db.insert. Chat with/codebook. Bottom bar:Recording explanation · Save learning replay.Replay: Creating an invoice, with VARIABLES and CALL STACK marked(recorded state).Recorded application · 00:42aboveactions.ts (recorded source). A Learning summary with the sequence Invoice form → createInvoice → PostgreSQL, the step "Before database insert" with its source link, andI understand this step. One transport:Jump back,00:42 / 02:18,Unrecorded interval,?andRecorded state · Before database insert, with the caption that across a gap the video continues and missing source and debugger state reads Not recorded at this moment.Source changed · Update availablewith Update LLM Wiki, On this page, Open in VS Code, andOutput: project folder · Change location.Keyboard shortcuts ?and the searchable dialog.State.
origin/mainisc0487de(0.2.35.0). The local checkout is clean oncodex/cycle-0049-pr-b2-recorded-source-and-transitionsat9bc5b8b, whose tree equalsc0487de. No open pull request.extension/),ghasryota-murakami.local:codebook-qais running, with VS Code 1.142.0 (profileCodebook QA 0049), Cursor 3.26.16 and OBS 32.2.2, all on the 0.2.35 candidate.Gap audit. No product source has changed since #107's closing comment. Its section "Acceptance rows reassessed" is this cycle's audit, with every other row unchanged. This bug-fix cycle selects no increment; its 184 tasks are the carried defects.
Spec record.
/specfiled this Issue under D1 to D4. The dedupe check found nothing./Users/ada/…is a fixture string.Next. PR-1 on
codex/cycle-0050-pr1-run-contracts-and-testsfromorigin/main.ryota-murakami commentedon Oct 22, 2026
PR-1 design decisions (recommended options; the owner cannot answer)
These settle the choices that PR-1's task texts leave open, so that each fix has one target.
replayAvailable: false.codebook_status.profiles['node-test']readsready: false, with amissingsentence naming the count and the limit.PREREQUISITE_MISSING, worded through the existingfullLibraryMessage(Settings of this editor profile, or delete a saved study from Saved studies; only the learner can do either, an editor agent cannot).nodeTest.captureMissing(structured capture parts fromlistMissingNodeLearning) is exposed in the run resource and in the node-history resource. The skill (1.0.47) claims saved learning only whenstudyOutcomeisdemonstrated,learningCoverageiscompleteandcaptureMissingis empty.refused-at-preparation, its start key not freed for a retry under the same key.replay-debuggerrow with its restart hint. The pane stays open and a retry presents the debugger again.EMFILE,ENFILE,EBUSY,EAGAIN,EPERM), then fails as today. Cycle 0049: a Vitest test run the editor chat explained is saved and replayed as a learning replay in both editors #107's X1 decided only that a repeatedcodebook_stopmakes no second attempt.node_modules/vitestthat resolves outside the opened repository is not run. Its status sentence names that case instead of "none": "node-test needs Vitest 4 or later inside the repository; node_modules/vitest at the repository root links outside it, which Codebook does not run. Ask the learner to install Vitest in the repository, then call codebook_status again."sourceoradditionalStops[n]), itsanchorIndex, the anchor's path and line range, and which condition failed: the anchor missing, the hash, the path, the line outside the range, or the column past the line's end. Each condition gets its own sentence and test.stopinnextActions, has nocontinueArguments, and refusescodebook_continuewithSTALE_PAUSE.The driving agent integrates them, runs the load-dependent failures (F4, F5, F6, F82, F112, F113, F135, F154) itself, owns every gate and the native trials, and re-executes each claimed red run before a task is checked.
ryota-murakami commentedon Oct 22, 2026
Re-entry after compaction (2026-10-23)
docs/designs/assets/codebook-product-spec-v9.png, 1,878,402 bytes, SHA-256f189ee82…caf2aa(matches the Design target), viewed through a copy scaled to 800 × 1200. All four regions were found: live explanation, learning replay, LLM Wiki, shortcut discovery.codex/cycle-0050-pr1-run-contracts-and-tests, 5 commits onc0487de(F4, F5, F6, F82, F112, F113, F210), clean. Group C finished oncodex/c50-pr1-c(90ee892); A1, A2 and B are still running. No pull request is open.ryota-murakami commentedon Oct 22, 2026
PR-2 design decisions (recommended options; the owner cannot answer)
These settle the choices that PR-2's task texts leave open, so that each fix has one target.
D20, F132, F146 and F153. A browser recording that loads while a test replay is selected retires the test replay, as choosing a browser study in Saved studies already does (
studyWorkspace.ts, "Browser selection retires the separate Node journal"). The recording's own pages then show in the Application pane: its loading page, or "Recorded playback unavailable" with its recovery. F146's test opens a browser recording over a selected test replay. F153's block cannot be drawn while a browser replay is active, and a Reader DOM case pins that. Considered: keeping the test replay selected but suppressed, which keeps two replays' state behind one transport.D21, F137. A rebuilt Application pane is placed by the Study arrangement once the three panes exist, with the arrangement's receipt cleared so that
arrangeruns again. The arrangement stays the one place that knows the layout. Considered: a group of its own at a fixed column, which would repeat the arrangement's rules. The driving agent runs the native check in VS Code and Cursor.D22, F120, F138, F141 and F151. The host keeps the learner's follow choice and scroll anchor per replay (by study id) and passes them in the Application document's options. A new document of the same replay (a presentation change, a Retry, a browser study's page, a reload) takes the host's values, not webview state left by an earlier document, so F151's inheritance cannot occur. The document reports its follow choice and anchor to the host when they change. F141's ready message lets the host post its current view when the document's is older. Considered: keying the webview state by the written document's identity, which still loses the choice when a presentation change replaces the panel (F138).
D23, F110.
nodeHistoryLearningMaterialleaves the Study message if no Study reader reads it, shown by a search of the client and its tests.D24, F206. Sequence labels and participant names wrap at word boundaries inside their boxes, with no ellipsis. The diagram grows taller as needed. When participants do not fit the Study pane's width, the diagram region scrolls horizontally and keeps every participant reachable by keyboard. The browser summary's golden DOM is updated with this reason.
D25, F142. No code change unless the native check reproduces it. The driving agent runs the check in VS Code at the result: scroll 6 px above the end, then step to an output.
D26, F211. The refusal reads "Test replays cannot be deleted here yet.", in the String catalog's words (DS14), with its pinning test.
D27, PR-2 execution. Two implementation subagents work in separate worktrees from PR-1's integrated head:
They run focused tests and their Reader DOM cases, not the full suite. The driving agent integrates them, re-executes each claimed red run, owns every gate, and runs the native checks F137 and F142.
ryota-murakami commentedon Oct 22, 2026
D28 (recommended, F213; the owner cannot answer). An already-sealed test history with no entry, written before D6, is treated as D6 treats one at its seal: the store removes its folder when a read finds it, and the saved-study count does not count it, so Saved studies and the limit follow one rule. Considered: listing it again (
0 of 0 stops explained), which F85 removed because it opens nothing; counting it while hidden, which takes a place the learner cannot see or free.ryota-murakami commentedon Oct 22, 2026
PR-3 design decisions (recommended options; the owner cannot answer)
From a read-only analysis of the code at
c0487de; line numbers are that revision's. Each decision names the test that fails without the fix.D29, F203 and F3: one transition design for both replays. The content of a surface (the slot's bytes, the browser frame's pixels) may arrive when the old moment is left. Every identity changes in one host turn after the debugger, at the commit: the stopped line, the label, the Study position, the explanation, the Application header or phase, and the debugger thread.
0. Prepare, with nothing visible changed: the browser reads the next frame's bytes; the test replay works out the slot's target text. A newer selection discards the preparation; it is bounded by
NODE_HISTORY_TRANSITION_BOUND_MS.#pageis hidden only when no frame exists or the read passes its bound.Tests:
resetwithclear: truewhile the read is held.playbackController.test.ts:invalidateonly after the frame resolves.Changes stated in the PR:
studyWorkspaceTestReplaySource.test.tspins the old order (positionDuringLoad === 2) and changes.Rejected:
D30, F208. Inferred from the code; the native check confirms it.
studyWorkspace.ts:7821-7829). The Study pane is disposed and never created, and Open replay does not re-enteropen()while the reader is open (:11144).codebook_return_current, the kept Application record makespreparedApplicationPanelrefuse "The Application group changed…" (:16982), also for an explicit open.openNodeHistoryFromHostcallsopen()when no Study pane exists;D31, F209. Pending: what VS Code and Cursor allow for a view's default container is to be checked in their documentation before PR-3 starts. A placement that keeps VS Code's summary beside the chat (the PNG's region 2) and gives Cursor a supported container without a contribution error is preferred over moving both hosts to the primary side bar.
D32, F156. While a test replay is selected or opening, the Study selection does no source work: no article source tab and no captured-source warning. The Study message carries a scroll-to-section intent once per open. Rejected: closing the article's tab after it opened, which still flashes.
D33, F158. The foreign-preview refusal becomes a modal warning in both hosts, naming the file, with Keep Tab Open and Close Tab, each of which retries the open. Rejected: a shorter toast, which Cursor still cuts for a long name.
D34, F165. The selection request is taken after the refusal checks.
D35, F176. One helper gives an escaped
MarkdownStringfor the slot's and the browser's labels. Rejected: evidence that a recorded path cannot carry Markdown; the schema allows any string.D36, F183. The
/node-history/preview clean-up is removed and the docstring fixed: nothing has created those URIs since the slot replaced them, and a cold entry closes hidden owned captured-source tabs.D37, F185 and F198. Closure rule 7's bounds:
NODE_HISTORY_SLOT_DEADLINE_MSand a small deadline utility wrap open, show, the text wait and the close.history-sourcewarning and one Output entry, retried at the next show.D38, F196. A show waits, inside its deadline, only for an in-flight close of its own URI. Rejected: one serial lane, which a stalled close would hold.
D39, F197. The position write is not awaited by Play or seeks: a per-study writer keeps only the latest position, and failures go to
history-position.D40, F200. The slot path tells files apart by a short hash of the directory:
/node-history-slot/<studyId>/<12 hex>/Captured-<basename>. Rejected: raw directory segments.D41, F204. A slot without a stop is revealed from line 1 at every show.
D42, F207. A CodeLens above the stopped line carries the whole
Recorded: <path>:<line> · <t> s; the end-of-line label and the hover stay. Rejected: a shorter end-of-line form, which fits about 26 characters at N49's default layout. The native check covers whether both hosts draw it.D43, others.
history-sourcerow; other rows keeprenderSelection(true, true); a debugger the learner stopped is not restarted.try.D44, PR-3 execution. Three implementation groups from PR-2's integrated head:
MarkdownString, CodeLens). It lands first.The driving agent runs the native checks and N50.
ryota-murakami commentedon Oct 22, 2026
D45 (recommended, F155; the owner cannot answer). F155 closes in two parts.
app/lib/utils.test.ts, a call) never paused. This needs the editor's js-debug and a Vite-transformed test module, so it is investigated natively in the Space before N50. Codebook still requests the breakpoint at the declared column (ownedRepositoryBreakpoint.ts,Position(line - 1, column - 1)), so the cause is either the exact-column request in a transformed module or Codebook's acknowledgement wait. It closes with its root cause, a fix and a test that fails without it.Considered: holding PR-1 for a native investigation that PR-3's native round has to set up anyway. The part moves to a later pull request of the same cycle; it is not carried out of the cycle.
ryota-murakami commentedon Oct 23, 2026
D46 (recommended; the owner cannot answer). Closure rule 3 runs each named test under a deliberate overload: four full-suite runs in the background, plus the evidence runs themselves, so the load average on this 16-CPU Mac is 20 to 60. Under that load each background suite fails 22 to 30 of its 5,806 tests, mostly tests with real product deadlines (continuation waits, watch bounds).
pnpm testalone, an agent's focused run, or CI. F215, F231, F232 and F234 were taken this way.Considered: taking every overload failure as a task. The load comes from the check itself, so the cycle could not close, and real deadlines would have to be loosened to pass it.
ryota-murakami commentedon Oct 23, 2026
Re-entry after compaction (2026-10-23, /ship of PR-1)
5f71329's ship-limit wording), this Issue's body and its nine comments.docs/designs/assets/codebook-product-spec-v9.png, 1024 × 1536, 1,878,402 bytes, SHA-256f189ee82…caf2aa(matches the Design target), viewed through a copy scaled to 800 × 1200: live explanation, learning replay, LLM Wiki and shortcut discovery found.codex/cycle-0050-pr1-run-contracts-and-testsat870b713, 71 commits onc0487de, clean; no open pull request; no subagent running./shipfor PR-1 resumes at Step 7 (coverage audit).ryota-murakami commentedon Oct 23, 2026
D47 (recommended; the owner cannot answer). Three dispositions from PR-1's
/shipStep 9 (pass 1):holdsHistoryFolder's one synchronous existence check costs about a microsecond per agentcodebook_playbackcommand, and makingplaybackasynchronous would change its 35 synchronous call sites for no measurable gain. Considered: an asynchronousplayback, or a folder list primed at start, which would refuse an earlier session's replay only after the list arrived (F9).'declared-column'mode also removes the bound-column refusal and its tests, the code F155's second half investigates; PR-3 settles both together. It is not carried out of this cycle.Step 9 pass 1 also ran a forced probe for F6's test-only change (Gate Integrity, the checklist's "test-only flake fix"): a consistent 2 s slowdown of one crafted page fails the min-of-2 test (RED), the unmutated test passes, so P(fail | regression) stays 1 while P(fail | no regression, load) went from 7 of 9 to 0 of 20.
ryota-murakami commentedon Oct 23, 2026
D48 (recommended; the owner cannot answer). Dispositions from PR-1's
/shipcycle 2 (Step 9 pass 2 and Step 11):PR-2's re-execution so far:
ryota-murakami commentedon Oct 23, 2026
D49 (the owner's ship review limit of 2026-10-23, applied; the owner cannot answer). PR-1's
/shipran its three fixing cycles. The third review round still had findings, so the review did not converge (converged:false).763bf0e, as F261 to F275, Minor and below included. Each fix has its test and a re-executed mutation proof, 23 in all.converged:false), required CI, the exact-HEAD gate and the squash merge.One fix in the third round went wrong first and was corrected before its commit. The retirement wait that F275 added had also replaced an owner the learner had stopped. The fix waits only for a retirement in progress, and a test now pins that a stopped owner stays stopped.
64 remaining items
ryota-murakami commentedon Oct 24, 2026
F459, F474 and F485 native recheck on candidate
65b5e353(VSIX2cda7f81…,dist/extension.js856ffd4b…in both hosts). Frozen before it runs.This is not a chat submission. It follows the learner's path through saved studies already in the window, and needs no new request:
Pass when:
Recorded with OBS Window Capture after a new preflight.
ryota-murakami commentedon Oct 24, 2026
R8, frozen 2026-10-24 before its submission. VS Code, Copilot Chat GPT-6 Luna, candidate
65b5e353, VSIX2cda7f81…. For F459, F474 and F485 on the final reader-independent candidate.R26 changes only the
devscript reader, its tests and its docs, so this check stands for the candidate that includes R26.Setup: the R2 browser replay is shown at stop 2, with its captured-source tab
Captured-source.mts, beside the learner's file tabs. The request asks about a process no earlier round asked about:Required causal links (judged by the driver):
app/lib/data.test.ts.fetchFilteredInvoices(app/lib/data.ts) shows the computed offset,(currentPage - 1) * ITEMS_PER_PAGE, from captured values.limitandoffsetare the mocked builder's calls, named as source-derived.Observation: after Save, the first Open replay. Pass when:
Captured-source.mtscloses;ryota-murakami commentedon Oct 24, 2026
R8 observed: F459, F474 and F485 on candidate
65b5e353(VS Code 1.142.0, GPT-6 Luna, take0c6df2a1…, 2026-10-24 JST)Candidate.
65b5e353: gate 18 passed 16 of 16 (tests 6,614, 0 failed; package 1,071, 0 failed;pnpm healthexit 0). VSIX2cda7f81…; installeddist/extension.js856ffd4b…in both hosts. The window's extension host restarted after the install. OBS was relaunched, and preflight ticks 3 to 6 painted while Safari was in front. Request SHA-2562b8ab5fe…. R26 (2bcd9145) changes only thedev-script reader, its tests and its docs, notstudyWorkspace.ts, so this result stands for the merged head.auth.config.ts:12,isLoggedIn = true, in the source viewCaptured-source.mts.codebook_return_current. The browser replay was left, and its source view closed at that leave. The Study then showed the R2 study's article source,Captured-auth.config.ts.data.ts:152(.offset(offset)) infetchFilteredInvoices, withquery = 'Ada',currentPage = 3,ITEMS_PER_PAGE = 6andoffset = 12. The chat derived(3 − 1) × 6 = 12, rows 13 to 18.limit/offsetnamed as the mocked builder's calls.utils.test.ts,data.test.ts,Captured-auth.config.ts,data.ts,auth.tsandactions.ts, and group 3 heldutils.ts.Captured-data.ts:152with line and label, the replay debugger (fetchFilteredInvoices) and the Study, Stop 1 of 1. There was no refusal.Captured-auth.config.ts, which the Study opened after the leave, stays beside the test replay.ryota-murakami commentedon Oct 24, 2026
Re-entry after compaction (2026-10-24, PR-3 before
/ship)docs/designs/assets/codebook-product-spec-v9.pngis 1024 × 1536, 1,878,402 bytes, SHA-256f189ee82…caf2aa, which matches the Design target. I viewed it through a copy scaled to 800 × 1200 and found all four regions: live explanation, learning replay, LLM Wiki and shortcut discovery.codex/cycle-0050-pr3-slot-transitions-and-entryis at5ab5cca4(R27, F524, merged) and clean. Its last pushed commit is7139a69e. No pull request is open.2bcd9145and passed 16 of 16: tests 6,629, 0 failed; package 1,071, 0 failed;pnpm healthexit 0. R27 was merged while its package lane ran, so its result stands for2bcd9145only.2bcd9145..5ab5cca4:extension/README.mdand the test file are default exclusions, and both were read by hand. No code defect. One test gap, confirmed by mutation: it becomes F525.ryota-murakami commentedon Oct 24, 2026
D78 and D79 (recommended; the owner cannot answer). PR-3's
/shipStep 9, pass 1 (fixing cycle 1 of 3).Coverage.
UnreadReason's four values are handled by every consumer. No approval classes are declared.mainare thedeclared-columntests (F248, D47) and three renamed or replaced tests (F172, D29, D37).-pis read, a busy port is refused with its recovery, and an unread script quotes structure only. Evidence is in the Mac's privateartifacts/cycle-0050/work/ship-pr3/qa/.D78, F527 (the recorded Chrome's resolver flag).
--host-resolver-rules=MAP localhost 127.0.0.1.localhostport. A learner's own API on another port that listens only on::1would fail in the recording while it works in their browser; on macOS this is common (Vite, or Node bindinglocalhost). The app's own port stays owned: the[::1]forwarder holds[::1]:<port>for the run's whole life, from before the browser navigates. Cursor relies on the forwarder already.D79, the maintainability and simplification findings F528 to F533.
bundleOfEvaluatedModuletakes the bundle identity as oneBundleSource-shaped object instead of six positional strings. With that,sealRuntimeModuleInstancewould only pass its arguments through, so it is removed, and its contract moves intobundleOfEvaluatedModule's docstring.isModuleInAnotherLayergets a file of its own name.startSlotDeadlinereads its expiry from the abort signal. The timer seam stays, because tests drive the clock by hand.showDevelopmentScriptSegment;DEVELOPMENT_SERVER_MAX_PORThas no doc comment;innarrowing inprojectNodeTestSection;beginReleaseon a stopping claim;Execution. Three implementation groups work in separate worktrees from
82c1281a:studyWorkspace, F536 to F541.The driving agent re-executes every claimed red run and mutation, then runs the gate.
ryota-murakami commentedon Oct 24, 2026
D80 (the owner's ship review limit of 2026-10-23, applied; the owner cannot answer). PR-3's
/shipthird round.PR-3's
/shiphas run its three fixing cycles:The third round's review still had findings, so the review did not converge (
converged:false).Step 11 ran as part of the third round, as PR-1's did (D49) and PR-2's (D57).
codex review --basecannot be narrowed by path, and the diff is 19,691 lines.[::1]forwarder starts afterready()'s entry-page fetch. Node's fetch tries both loopback families, so before the forwarder exists a refused::1falls back to127.0.0.1.Every finding of the last round is fixed or closed with evidence (F550 to F560), Minor and below included.
devscript reader's breadth budget (F550, the High finding);package.jsonread only as a regular file within the limit (F556);setNoDelay, with the diff and its tests) and F553, F554, F557, F558 and F560 (by design or bounded, each with one line in its task).package.json, is now fixed anyway as F556.Two gate-found test failures are tasks of this cycle (D46):
health.test.mjs's fixture teardown meeting ENOTEMPTY in gate 23. Its teardown now retries.Both close as F4 does. Their 20-run evidence under four background suites is running.
No fourth review cycle runs. No Critical or Major defect stays open, so the limit records none in an Issue.
Step 11.5 can no longer bind the reviews to the final tree, because the third round's fixes changed the tree after them. The owner's limit governs that point: the release steps follow on the fixed tree, and its gate and required CI verify it. The release steps are the version (0.2.38.0), the CHANGELOG, the documentation audit, the verification gate on the final tree, the PR (reporting
converged:false), required CI, hosted CodeRabbit until it approves the exact head, the exact-HEAD gate and the squash merge.ryota-murakami commentedon Oct 24, 2026
PR-3 open as #121 (2026-10-24 JST)
0293a8b7(v0.2.38.0). Every task of this Issue is closed: 537 tasks, F526 to F562 added by PR-3's/ship.converged:falseunder the owner's ship review limit (D80), with no Critical or Major defect open.pnpm test: 6,663 tests, 0 failed.pnpm test:package: 1,071 tests, 0 failed.pnpm health: exit 0./coderabbit-resolveruntil it approves the exact head, the exact-HEAD gate, andgh pr merge 121 --squash --match-head-commit <sha>.ryota-murakami commentedon Oct 24, 2026
Re-entry after compaction (2026-10-24, PR-3 open as #121, hosted CodeRabbit)
docs/designs/assets/codebook-product-spec-v9.png, 1,878,402 bytes, SHA-256f189ee82…caf2aa, matching the Design target. Viewed through a copy scaled to 800 × 1200; all four regions found (live explanation, learning replay, LLM Wiki, shortcut discovery).0293a8b7, clean. Gate 24 on it passed 16 of 16. Required CI is green. Hosted CodeRabbit review5636850934reads CHANGES_REQUESTED with 5 open threads; they become tasks F563 on, through/coderabbit-resolver.fix: resolve the hosted CodeRabbit review of #121 (F563 to F568)
test: read F565's recorded module through its resources; F567's case …
test: pin the instance map's mappings in F565's test (F572)
v0.2.38.0 fix: a test replay's recorded-source tab and moves, opening…
ryota-murakami commentedon Oct 24, 2026
Cycle 0050 closed: every carried defect is fixed or closed with evidence, and nothing is carried
Outcome: demonstrated. All 184 defects that Cycle 0049 carried (#107's closing comment), and every defect this cycle found (F210 to F572), are closed: each is fixed with a test that fails without the fix (its red run or mutation re-executed by the driving agent) or closed with recorded evidence. The tasks are in the body and the four task comments, 547 in all.
Delivery: merged.
5267030), PR-2 v0.2.37.0 fix: a test replay's Application pane and Study section (Cycle 0050, PR-2 of 3) #120 (62f6aa9), PR-3 v0.2.38.0 fix: a test replay's recorded-source tab and moves, opening a replay, and the project's own port (Cycle 0050, PR-3 of 3) #121 (8dd675b), each a squash merge with--match-head-commitafter required CI and the exact-HEAD gate./shipendedconverged:falseunder the owner's ship review limit (D80) with no Critical or Major defect open, so the limit recorded none.0293a8b7) became F563 to F568, fixed or closed in1fe52359; the local CodeRabbit CLI on that fix became F569 to F571 (f9f5a944), and CodeRabbit's second review became F572 (055f8190). CodeRabbit approved the exact head055f8190(review5637024330), with no thread open and every outside-diff finding closed (F568).055f8190: 16 of 16 passed (pnpm test6,665 tests, 0 failed;test:package1,071, 0 failed;pnpm healthexit 0; the five Reader DOM checks).local:codebook-qa(VS Code 1.142.0 with Copilot Chat GPT-6 Luna, Cursor 3.26.16 with Agent Grok 4.6 High), recorded in this Issue's comments. Windows and Linux were not run.Carried defects: none. No TODOS file, backlog or ledger holds any.
Next cycle: a feature cycle, planned with
/specand/autoplanfrom PRODUCT_GOAL.md and a fresh gap audit. Candidate increment (one, after a clean bug-fix cycle): the region-2 composition of the learning replay (D8 of #107).ryota-murakami commentedon Oct 24, 2026
Correction (2026-10-24). The exact-tree gate that this Issue's comments, PR-3's body and the closing comment call "16 checks" runs 15:
format:check,typecheck,lint,health:static,dupes,dead-code,pnpm test, the five Reader DOM checks,test:package,healthand the compaction hook's test (artifacts/cycle-0050/work/tools/gate.sh). Every gate cited as "16 of 16" passed all 15; no check was skipped. Found by the Codex quality gate of Cycle 0051's/spec.