Skip to content

Cycle 0050: every defect Cycle 0049 carried is fixed or closed with evidence #118

Closed

Description

@ryota-murakami

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.

  1. 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.
  2. A closed task ends with "fixed in " and its tests, or with "evidence: ", by the closure rules below.
  3. 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-code and pnpm health. The five Reader DOM checks also pass, and required CI passes on the exact head.
  4. Every test a task adds or changes states protects=…; fails_when=…; no_claim=….
  5. Every host-dependent task passes its native check (table below) before the merge of the pull request that closes it.
  6. The closing comment states that nothing is carried.
  7. 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.

  1. A behavior defect closes with a fix and a test whose red run against the unfixed code is shown in the pull request.
  2. 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.
  3. 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 test in separate checkouts) keep running in the background, each restarted when it ends.
      For F135 the unit is node 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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 in constants.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-source row 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-source warning 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.
  8. References.

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:

Rules for the implementing agent.

  1. Acceptance criteria are each test's protects / fails_when / no_claim. Never "make the tests pass".
  2. Real code and real tests land together.
  3. Any change to a test, validator, CI step, timeout, tolerance, threshold, snapshot or suppression is reported on its own line with its reason.
  4. A reported command names the command and its observed result.
  5. 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.

  1. [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, candidate 073f6ae, R2 take 2b91c5e2…: 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
  2. [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, on main 99993f3 as 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 in 8952d2e; 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.
  3. [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 in 226cc9a and a751f57 (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).
  4. [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 in 05ec3a1; evidence: its tests 20 of 20 beside four background suites (load 14 to 39).
  5. [PR-1] F9 (C49 · OCR on PR-A, low): codebook_playback refuses a test replay of an earlier session with PLAYBACK_PROFILE_UNSUPPORTED only after this window's store listed it (extension/src/service.ts:791-799). Closes as F8 does. — fixed in 0d74ba5 (red re-executed).
  6. [PR-1] F10 (C49 · OCR on PR-A, low): the root-Vitest read failure's reason in codebook_status is not sanitized (extension/src/environment.ts:274-277). Closes as F8 does. — fixed in 7430235 (mutation re-executed).
  7. [PR-1] F11 (C49 · OCR on PR-A, low): two as [string, string] casts in extension/src/utils/sanitizeCause.ts:91-95. Closes with the casts replaced by typed values. — evidence: 94aa030 replaces both casts with typed values.
  8. [PR-1] F13 (C49 · CodeRabbit on PR-A, trivial): the comment at extension/src/tests/nodeTestRunLifecycle.test.ts:562 says one read where the assertion expects two. Closes with the comment naming both reads. — evidence: 1cc746c words the comment and the cards without stale positions.
  9. [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 in e8b9205 (mutation re-executed).
  10. [PR-1] F15 (C49 · CodeRabbit on PR-A, minor): an unavailable history's reason is not passed through sanitizeCause (extension/src/nodeTestHistoryStore.ts:536-545). Closes as F8 does. — fixed in a8c9f98 (mutation re-executed).
  11. [PR-1] F16 (C49 · Step 8 plan audit on PR-A): the Open replay tests Open during Play (EN19) and Previous reaches the start (DS1) are missing. Closes with both tests. — fixed in c96a238 (mutation re-executed).
  12. [PR-1] F17 (C49 · Step 8 plan audit): 31 changed existing tests carry no protects / fails_when / no_claim card (AC13; studyWorkspace.test.ts 23, configuredService 2, currentStorageOwner 2, readBootIdentity, recordingProtocol, repositoryProtocol, package.test.mjs). Closes with the cards. — evidence: 14dc905 gives the 42 changed tests their cards (the task counted 31).
  13. [PR-1] F18 (C49 · Step 7 coverage gap E1): checkNodeTestFiles has no test for an additional stop (its number, the additionalStops[n].path field, the source refusal before the test-hash refusal). Closes with that test. — fixed in 27b87f5 (mutation re-executed).
  14. [PR-1] F19 (C49 · Step 7 gap E2 and Step 9 testing): NodeLearningSave guards 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 in c96a238 (mutation re-executed).
  15. [PR-1] F20 (C49 · Step 7 gap E3 and Step 9 testing): a run refused at preparation: its historyExclusionReason, the two recording.reason fallbacks and its nextActions are asserted nowhere. Closes with those assertions. — fixed in 0913678 (mutation re-executed).
  16. [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).
  17. [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).
  18. [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 mirroring studyWorkspace.test.ts:2513. — fixed in c96a238 (mutation re-executed).
  19. [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).
  20. [PR-1] F25 (C49 · Step 7 gap E8): a completed run at the whole-run deadline (hasRunEnded with nodePhase completed) needs an injected clock to be tested. Closes with that test. — fixed in 0913678 (mutation re-executed).
  21. [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).
  22. [PR-1] F27 (C49 · Step 7 gap E10 and Step 9 testing): the other INVALID_REFERENCE kinds (another source hash with its expected-hash hint, no event, the other output channel) are untested. Closes with those cases. — fixed in e8b9205 (mutation re-executed).
  23. [PR-1] F28 (C49 · Step 9 testing): repositoryProtocol.test.ts:816 is still titled "API 1.7" (and its card) while it asserts 1.8. Closes with the title and card naming 1.8. — evidence: 57a495e titles the test and its card 1.8.
  24. [PR-1] F29 (C49 · Step 9 testing): prepareNodeTestLaunch's refusal of a missing or escaping node_modules/vitest/vitest.mjs (PREREQUISITE_MISSING) is untested. Closes with both cases. — fixed in 08a06aa (mutation re-executed).
  25. [PR-1] F30 (C49 · Step 9 testing): the real environment.checkNodeTestFiles wiring is untested (the member is optional and service tests use fakes). Closes with an environment test (and, if chosen, a required member). — fixed in 7430235 (mutation re-executed).
  26. [PR-1] F31 (C49 · Step 9 testing): sanitizeCause leaves 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 in 94aa030 (mutation re-executed).
  27. [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).
  28. [PR-1] F33 (C49 · Step 9 testing): codebook_status's node-test recording member (available, reason) is asserted nowhere. Closes with that assertion. — fixed in 1f129c1 (mutation re-executed).
  29. [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 in 24bed1e (mutation re-executed).
  30. [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).
  31. [PR-1] F36 (C49 · Step 9 testing): codebook_stop's failure answer through MCP (an unknown run) is untested since its own stopToolResult. Closes with that test. — fixed in 0913678 (mutation re-executed).
  32. [PR-1] F37 (C49 · Step 9 testing): four low-value assertions: studyWorkspace.test.ts:244 repeats an exact equality, NODE_TEST_HELP_EXAMPLE is exported only for an identity assertion, nodeTestService.test.ts repeats three help assertions, nodeTestRunLifecycle.test.ts:613 pins an incidental read count. Closes with each removed or rewritten at its boundary. — fixed in 1cc746c (mutation re-executed).
  33. [PR-1] F38 (C49 · Step 9 testing): timing-dependent tests: nodeTestHistorySummary.test.ts:156 holds reads for a fixed 10 ms and asserts exactly 4, ownedNodeTestRun.test.ts:1264 sleeps 20 ms before an absence assertion. Closes with gates instead of timers. — fixed in 57a495e (mutation re-executed).
  34. [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's Cancel is never read. Closes with one exported set of labels. — fixed in c96a238 (mutation re-executed).
  35. [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 in c96a238 and ebfb2f0 (bounded waits; mutation re-executed).
  36. [PR-1] F41 (C49 · Step 9 maintainability): docstrings name callers that do not exist (listMissingNodeLearning, describeNodeTestResult, describeNodeLearningPart, summarize; the sanitize helpers omit StudyWorkspace). Closes with the real callers. — evidence: a8c9f98 and e8b9205 name the real callers.
  37. [PR-1] F42 (C49 · Step 9 maintainability): prepareNodeTestLaunch's new paragraph sits under its @param listTestFiles. Closes with it moved to the description. — evidence: 08a06aa moves the paragraph into the description.
  38. [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 in e8b9205 (mutation re-executed).
  39. [PR-1] F44 (C49 · Step 9 maintainability): explainNodeHistory still maps a conflict by finding revision changed in the error text, which now can hold a file path (a stop in src/revision changed.ts turns INVALID_REFERENCE into IDEMPOTENCY_CONFLICT). Closes with a typed error. — fixed in 92d66ba (red re-executed).
  40. [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 in e8b9205 (mutation re-executed).
  41. [PR-1] F46 (C49 · Step 9 maintainability): the Save and Open command ids are repeated as literals in nodeLearningSave.ts, studyWorkspace.ts and extension.ts. Closes with shared constants. — evidence: c96a238 shares the command ids as constants.
  42. [PR-1] F47 (C49 · Step 9 security): PRINTABLE_VITEST_VERSION bounds no numeric segment, so a repository's Vitest package can pad codebook_status with about 64 KiB of digits. Closes with bounded segments and a test. — fixed in 24bed1e (mutation re-executed).
  43. [PR-1] F48 (C49 · Step 9 security; sibling found by Step 9 pass 2: service.ts:3231 Recording unavailable before input: ${String(error)}): a browser recording's finish failure stays raw in recordingFailure (served as state.recording.reason) beside the new sanitized seal cause, so one codebook_stop answer can carry the storage path. Closes with one sanitized value at both assignments. — fixed in 92d66ba (red re-executed).
  44. [PR-1] F49 (C49 · Step 9 security): a test run's own error is not sanitized (the domain error's cause, the new STALE_PAUSE cause, the new reportFailure text). Closes with sanitizing at assignment. — fixed in 92d66ba (red re-executed).
  45. [PR-1] F50 (C49 · Step 9 performance, low): checkNodeTestFiles reads and hashes files one at a time and a file cited twice twice. Closes with one concurrent read per file. — fixed in 27b87f5 (mutation re-executed).
  46. [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, and nodeHistoryFailure lost its 8,192-character bound. Closes with the bound and the display cut. — fixed in 92d66ba (red re-executed).
  47. [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).
  48. [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).
  49. [PR-1] F55 (C49 · Step 9 state-machines): historyExclusionState's ended doc and test do not name refused-at-preparation. Closes with both. — fixed in ef184c9 (red re-executed).
  50. [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-history in nextActions, and, its historyExcluded left unset, never frees its retained-run slot. Closes with an exclusion that reads ended for such a run, read-history left out, and a test. — fixed in ef184c9 (red re-executed).
  51. [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 in ce7df10 (red re-executed).
  52. [PR-1] F58 (C49 · Step 9 red team): causeRoots names the workspace and home as reported, not their real paths (a symlinked workspace or home stays in causes), and os.homedir() can throw inside catch blocks. Closes with real paths added and a guarded home. — fixed in 94aa030 (mutation re-executed).
  53. [PR-1] F59 (C49 · Step 9 simplification, advisory): CAPTURE_WORDS in describeNodeTestReplay.ts is an identity map. Closes with it removed. — evidence: e8b9205 removes CAPTURE_WORDS.
  54. [PR-1] F60 (C49 · found by this ship's EN20 recording): test:shard --record refuses a run with failed tests without naming them (2 tests failed; timings were not recorded.). Closes with the names printed. — fixed in 83b1e16 (red re-executed).
  55. [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 keeps unavailable, and coverage reads none. Closes with I/O errors not memoized (or Retry bypassing the memo) and a test. — fixed in a8c9f98 (mutation re-executed).
  56. [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).
  57. [PR-1] F65 (C49 · Step 9 pass 2 maintainability): NodeTestHistorySummary.hasResult is computed and never read. Closes with it removed or used. — evidence: a8c9f98 removes hasResult.
  58. [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: c96a238 documents the test-replay branch.
  59. [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 in 7430235 (mutation re-executed).
  60. [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 in c96a238 (mutation re-executed).
  61. [PR-1] F69 (C49 · Step 9 pass 2 testing): partialHistoryReason's interrupted fallback and signal sentence are untested. Closes with those assertions. — fixed in e8b9205 (mutation re-executed).
  62. [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).
  63. [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 in 92d66ba (red re-executed).
  64. [PR-1] F72 (C49 · Step 9 pass 2 red team): the agent's claim rule (studyOutcome demonstrated and learningCoverage complete) ignores capture gaps that make Save read partially saved (captureMissing is not exposed). Closes with the capture gaps exposed in nodeTest and the history resource, the claim rule updated, and a test. — fixed in 92d66ba (red re-executed).
  65. [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).
  66. [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 in 3de0642 (red re-executed).
  67. [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 in c96a238 (mutation re-executed).
  68. [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).
  69. [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: continueNodeTest sets the phase after its awaits without checking a deadline expiry meanwhile (service.ts:1415); recordingSealFailure is 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 in 7cf60e5: 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.
  70. [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).
  71. [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-debugging before the check ends. — fixed in 57a495e (mutation re-executed).
  72. [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 (isReservedForOtherWindows true) 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 in 226cc9a; evidence: its test passed 20 of 20 file runs under four background suites (load 21 to 52).
  73. [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).
  74. [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 in 3de0642 (red re-executed).
  75. [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 reads replayAvailable false. Closes with one decided rule and its test. — fixed in a8c9f98 (mutation re-executed).
  76. [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).
  77. [PR-1] F87 (C49 · Step 9 pass 3 maintainability): value cards of new tests cite file:line positions that no longer hold that code. Closes with the positions replaced by words or task ids. — evidence: 1cc746c words the comment and the cards without stale positions.
  78. [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 in c96a238 and ebfb2f0 (bounded waits; mutation re-executed).
  79. [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).
  80. [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).
  81. [PR-1] F91 (C49 · Step 9 pass 3 red team): after a stop whose release failed, the run resource still offers the agent continue-server and current continueArguments, 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 in 0d74ba5 (red re-executed).
  82. [PR-1] F92 (C49 · pilot C49-11 submission 1, Major): codebook_status reports node-test ready with no missing entry while the saved-study capacity is exhausted (capacity.savedStudies 77 of limit 64), so the agent spends its preparation (sources, article) and the start is refused at preparation as an untyped RUNTIME_FAILED ("Saved study storage is full…"). Closes with the profile not ready, its missing sentence naming the limit and the count, a typed refusal, and tests. — fixed in 1f129c1 (red re-executed).
  83. [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 running Codebook QA 0049 profile 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 in 1f129c1 (red re-executed).
  84. [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).
  85. [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, no refused-at-preparation) and a test. — fixed in ef184c9 (red re-executed).
  86. [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-debugger and the replay kept open (or a fallback to the first event), and a test. — fixed in c96a238 (mutation re-executed).
  87. [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 escapes stopRecord and leaves the run unreleased (also the browser path, service.ts:3422). Closes with a sink that cannot throw and a test. — fixed in 0d74ba5 (red re-executed).
  88. [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 in b16ced3 (red re-executed).
  89. [PR-1] F101 (C49 · /ship Step 11 Claude adversarial finding 7, Low, to verify): a root node_modules/vitest symlinked outside the repository (pnpm's global virtual store) is reported as "none" and makes codebook_status read node-test not ready. Closes with the wording or the containment rule decided and a test. — fixed in 24bed1e (mutation re-executed).
  90. [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 listed verified that cannot open. Closes with the header in the memo's change signals and a test. — fixed in a8c9f98 (mutation re-executed).
  91. [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 three nodeTest fields; the start's checks and that a refusal frees the run's slot and key; codebook_status names a missing or older root Vitest; no stored format changed), its recovery table has no row for HISTORY_SEAL_FAILED or PLAYBACK_PROFILE_UNSUPPORTED, and Output › Codebook has no how-to. Closes with those sentences and rows. — evidence: 90ee892 and 0d90c22 add the README sentences and the two recovery rows.
  92. [PR-2] F105 (C49 · PR-B1 CodeRabbit CLI, minor): the Application pane's muted lines read … 1 earlier characters not shown and 1 Node inspector lines hidden for one character or line. Closes with the singular forms in the String catalog and a test. — fixed in 9c3a4e0 (red re-executed).
  93. [PR-2] F106 (C49 · PR-B1 CodeRabbit CLI, minor): the Application document's scrolledByDocument stays 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 in 2d427dc (Reader DOM; mutation M106, the defect's flag restored, re-executed RED).
  94. [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 in 07f748a (red re-executed).
  95. [PR-2] F110 (C49 · PR-B1 local OCR review, low): the Study message still carries nodeHistoryLearningMaterial, which the Study client no longer reads since nodeHistoryLearningSummary replaced it. Closes with the field left out of the Study message, or evidence that a reader needs it. — fixed in 18f4ab2 (red re-executed).
  96. [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" and listWikiCandidates.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 in 7fa975d and e23b61d; evidence: both files 20 of 20 under four background suites.
  97. [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 (bodyIsTheImage false) in a full macOS lane run, and passes alone. Closes as F4 does. — fixed in 8bf7188; evidence: 20 of 20 under four background suites.
  98. [PR-2] F114 (C49 · PR-B1 /ship Step 7 coverage audit, low): accumulateNodeTestOutput counts a cut first line as characters plus its line feed although cutTextToTail may 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 shown undercounts by up to 8 (limit 15 over first line, stderr warn one, last: 19 shown, 20 left out). Closes with the count taken from the kept text and a test. — fixed in 8e9f3ed (red re-executed).
  99. [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 output shown there without a time, and a test. — fixed in 8fa356a (red re-executed).
  100. [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 in aff00c8 (red re-executed).
  101. [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: 6d77f68 gives the Reader DOM cases their value cards and the single-event focus case a name that says Events (1).
  102. [PR-2] F119 (C49 · Step 8, partial item 43): studyWorkspace.test.ts:1326 still 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 in da02a8a (mutation re-executed).
  103. [PR-2] F120 (C49 · Step 8, partial item 4): the Application document keeps its follow state in setState but 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 in 2d427dc (D22; Reader DOM mutation M120 re-executed RED).
  104. [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).
  105. [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).
  106. [PR-2] F123 (C49 · Step 8, partial item 36): the Study-pane pins of study-bootstrap-qa.mjs are not marked as moving with D8 (plan Design 8). Closes with the marks. — evidence: 6d77f68 marks the Study-pane pins of study-bootstrap-qa.mjs as moving with D8.
  107. [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).
  108. [PR-2] F125 (C49 · PR-B1 /ship Step 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 in 65d8a58, 68b4162 and 37885d2, the overtaken cells in 648e034 and 97e1a6f (F250); each cell's mutation re-executed RED.
  109. [PR-2] F126 (C49 · pass 1b testing): the harness records each node-history-output post 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 in da02a8a (mutation re-executed).
  110. [PR-2] F127 (C49 · pass 1b simplification, advisory): NodeTestReplayMessageSummary repeats the saved-row variant's inline Pick; projectNodeTestApplication copies testFile and testTitles into a new object; NodeLearningStepPosition.elapsedMs is never read; usableTransportControl checks the instanceof pair twice (matches with :disabled says it once). Closes with each simplified. — evidence: da02a8a simplifies the four: the Pick, the copied fields, elapsedMs, the instanceof pair.
  111. [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-height measures .live-strip only), so Shift+Tab into Step details or Events scrolls the focused control under it (focus obscured); it has no flowing fallback above maxStickyFraction, 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 in 6d77f68 (Reader DOM red re-executed); the live-strip state's clearance by F294 (mutation M294 RED).
  112. [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 in 65d8a58 (red and mutation re-executed).
  113. [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 for interrupted and partial, and a test. — fixed in 88e91f0 (red re-executed).
  114. [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's outputTail, stop facts' fact.display) and the Application header's test titles (also its title and 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 in 07f748a and 6d77f68 (red re-executed); widened and closed with F286, F287 and F288.
  115. [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: loadPlayback does not retire the test replay and capturedAppHtml gives 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 in 8b1c542 and f7738f1 (D20; red re-executed).
  116. [PR-2] F133 (C49 · pass 1b red team, low confidence): publish() now calls presentNodeHistoryApplication, whose viewport.showHistory throws "Viewport lease is released" when the lease's panel was disposed before released() ran; publish() was non-throwing and runs inside catch and finally blocks. Closes with the write guarded as showRecordingLoadingOnLiveViewport guards it, and a test. — fixed in 2d427dc (red re-executed).
  117. [PR-1] F135 (C49 · PR-B1 /ship Step 9 pass 1b checks; the F5 family): wiki-reader-dom-qa.mjs failed 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 in 1a124cb (stills compared once settled; 9 of 20 runs needed a retake); evidence: 20 of 20 under four background suites, against 12 of 20 before.
  118. [PR-2] F136 (C49 · PR-B1 /ship Step 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) and installNodeTestOutput (lineNode, apply), each repeating the [stderr] mark rule and the line attributes. Closes with the first view passed in the script options and drawn by apply alone. — evidence: 2d427dc draws the first view through apply alone, its lines passed in the script's options; testOutputHtml.test.ts pins it.
  119. [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: under workbench.editor.closeEmptyGroups the closed pane's group is gone, the new pane opens at the fixed Application column, now the source's group, and the re-entry's arrange returns at once (receipt mode already study), 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 in ff9da7a (D53: D21's re-arrangement was falsified natively; the rebuilt pane takes prepareApplicationGroup, 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 (take 79c4e049…) and Cursor 3.26.16 (take bcb65b13…), Space local:codebook-qa, candidate ff9da7a VSIX 462b0128…, 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 to Captured-overview.mts is F156's, PR-3).
  120. [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).
  121. [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) and 97e1a6f (F250); mutations re-executed RED.
  122. [PR-2] F140 (C49 · PR-B1 /ship Step 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 in 2d427dc (Reader DOM mutation M140 re-executed RED).
  123. [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 pagehide write, 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 in 2d427dc (red re-executed; Reader DOM mutation M141 RED).
  124. [PR-2] F142 (C49 · pass 3 red team; not reproduced): apply reads 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 (take 59c78aac…, candidate ff9da7a): 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.
  125. [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.
  • D2 (recommended, /spec Phase 5): no spawned agent (--no-execute). The driving agent implements under the delivery chain, and subagents may implement within it (AGENTS.md). Considered: spawning claude -p in 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 /autoplan and 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:
    1. This Issue's three pull requests.
    2. /spec and /autoplan for the next feature cycle, from PRODUCT_GOAL.md and a fresh gap audit.
    3. 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).

Pinned by ryota-murakami

Activity

  1. ryota-murakami commented on Oct 22, 2026

    @ryota-murakami
    ContributorAuthor

    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.

    1. [PR-2] F144 (C49 · pass 3 maintainability): the test replay's learning title (#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 in 6d77f68 (Reader DOM mutation re-executed); the stop decided again on blur by F297 (3e25f2f).
    2. [PR-2] F145 (C49 · pass 3 simplification, advisory): nodeHistoryPosition's type, index and elapsedMs are no longer read by product code; .test-output-header p{margin:0} never applies (body.test-output p outranks it); testReplayLineTexts writes its map twice and section.pointer ?? '' is a dead fallback; the client's stopFrameNamesItsSource repeats the verdict the host sends as nodeHistoryUnverifiedStops. Closes with each simplified. — evidence: da02a8a simplifies each: the unread position fields, the rule that never applied, the double write and dead fallback, the client's repeated verdict.
    3. [PR-2] F146 (C49 · pass 3 testing): the !this.recordingActive arm of focusApplication'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 in 8b1c542 (mutation re-executed).
    4. [PR-2] F147 (C49 · pass 3 state-machines, untested cells): another replay's newer kept view not used by a document (Reader DOM); Select event, Next or Previous stop, Next or Previous event, a seek, Play and Inspect whose debugger presentation fails (only a step action's is tested); Play away from a chosen step and back; Play at the result; Inspect on the selected stop keeping the chosen step; a render that settles while another or the same test replay opens (only a first open is tested); the shown test replay opened again (its document kept, loading then the saved moment). Closes with those tests. — fixed in 68b4162 and 37885d2, the overtaken cells in 648e034 (F250); mutations re-executed RED.
    5. [PR-2] F148 (C49 · pass 3 red team; widened by Step 11's Claude adversarial review): the C1 string forms other than OSC (DCS, SOS, PM, APC, 7-bit and 8-bit) keep their payload as output text: only their introducers are removed; and a stray U+009D (an 8-bit OSC introducer, recognized since 5359c28) in output that is not a terminal string removes the rest of its entry. Closes with those strings removed up to their terminator, a stray introducer bounded, and tests. — fixed in 07f748a (red re-executed).
    6. [PR-2] F149 (C49 · PR-B1 /ship Step 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 in 8e9f3ed (red re-executed).
    7. [PR-2] F150 (C49 · Step 11 Claude adversarial; sibling of F143): opening another test replay posts the loading view into the replay still shown, which empties its lines, scrolls it to the top and drops a text selection; when that open fails or is superseded, the shown replay comes back at the top. Closes with the opening marker tied to the replay being opened and a test. — fixed in 8fa356a (red re-executed).
    8. [PR-2] F151 (C49 · Step 11 Claude adversarial, to verify): a new document for the same replay inherits a saved testOutputFollow: false from 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 in 2d427dc (D22; red re-executed; Reader DOM mutation M120 RED).
    9. [PR-2] F152 (C49 · Step 11 Claude adversarial): presentNodeHistoryApplication records a view's generation as shown before postMessage settles 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 on false or a rejection, and a test. — fixed in 2d427dc (red re-executed); its test made independent of the reader's own publishes in c7dd476 (F300).
    10. [PR-2] F153 (C49 · Step 11 Claude adversarial; sibling of F132): while a browser replay holds the bottom panel the test replay's section is suppressed but its learning block is drawn again with every step reading 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 in 8b1c542 (Reader DOM mutation re-executed).
    11. [PR-1] F154 (C49 · PR-B1 /ship final 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 in 46f1340 (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.
    12. [PR-3] F155 (C49 · PR-B2 source-slot spike preparation, Major): a node-test start declared at 16:5 is refused with "Declared breakpoint 16:5 is bound at 16:29; … declare 16:29 or another statement", and a start that follows that advice (16:29, a call on the cited line of 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 in b047a76 (red re-executed); the second half moved to PR-3 (D45). — second half fixed in 0920870 (red re-executed); native: PASS in VS Code 1.142.0 (experiment X1, take 99d5c27e…, candidate c83a786): 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.
    13. [PR-3] F156 (C49 · PR-B2 spike, both hosts): opening a test replay (Open replay or Saved studies) renders the Study's article selection first, so a Captured-overview.mts tab ("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 in cfc0eb7 and 7acf9ef (red re-executed; PR-3 closing notes)
    14. [PR-2] F157 (C49 · PR-B2 spike; DS14): Saved studies rows of test replays start with "Node test history · ·" before the String catalog's Test replay · …, a learner string that says "Node". Closes with the row in the catalog's words and its test. — fixed in aff00c8 (red re-executed).
    15. [PR-3] F158 (C49 · PR-B2 spike, Cursor 3.26.13): Open replay is refused with "A destination group contains a foreign preview: "uti…" while the learner's test file is open as a preview tab; Cursor cuts the notification to one line, so the learner sees neither the file nor the way out (pin or close the preview). Closes with the refusal naming the file and its recovery in a form both hosts show whole, and a test. — fixed in 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, candidate 3773701), 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's 7d14cb7, F394's a7c3535).
    16. [PR-3] F160 (C49 · PR-B2 local CodeRabbit CLI, trivial): the Reader DOM case "a history without a span shows no mark" sends the four-event replay with only its timeline removed (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 in 7acf9ef (red re-executed; PR-3 closing notes)
    17. [PR-3] F161 (C49 · PR-B2 local CodeRabbit CLI, minor): the recorded-source slot's stopped line and label are drawn again only when its editor becomes the active one, so a slot shown again without focus (another group's action) has neither; and every redraw reveals the stopped line, so returning to the slot tab scrolls the learner back to it. Closes with a redraw on onDidChangeVisibleTextEditors, the reveal only at a selection's commit, and tests. — fixed in f371587 (red re-executed); native check pending (N50); native: VS Code PASS (N50 second submission, candidate 073f6ae, R4 take 80198168…: with utils.ts in front, Focus source showed the slot again with its stopped line and label, and returning did not scroll); native: Cursor PASS (N50 second submission, candidate 3773701, take 4b03c574…: Focus source showed the slot again with its line and label, and returning did not scroll).
    18. [PR-3] F162 (C49 · PR-B2 OCR review, low): projectNodeTestSection maps 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 in 13c5ae1 (red re-executed; PR-3 closing notes)
    19. [PR-3] F165 (C49 · pass 1 state-machines, informational): a selection refused after ++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 in f512dfc (red re-executed; PR-3 closing notes)
    20. [PR-3] F166 (C49 · pass 1 state-machines, untested cells): verified stop × Retry; placeholder × rename, × overtaken during a rename, × retire, × Retry; failed open × overtaken during a rename, × retire. Closes with those tests. — fixed in ce57b0a (mutation re-executed; PR-3 closing notes)
    21. [PR-3] F167 (C49 · pass 1 red team, informational, confidence 6): while a test replay is selected, Retry re-selects its moment for every error kind (selectNodeHistoryEvent with publish: true): the layout, application and reader rows lose the renderSelection(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, renderSelection kept for the others, the failure reported, and tests. — fixed in c31d031 (red re-executed; PR-3 closing notes)
    22. [PR-3] F168 (C49 · pass 1 red team, informational): a slot tab the learner pinned keeps the last stop's bytes, stopped line and 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 in f371587 (red re-executed; PR-3 closing notes)
    23. [PR-3] F169 (C49 · pass 1 red team, informational; to verify against F163's sweep): a slot tab the editor restores after a restart is served the placeholder and has no owner; F163's sweep closes it at the next slot a test replay shows, untested. Closes with a test of a restored slot tab of another replay closed at the next slot, or a fix. — fixed in f371587 (mutation re-executed; PR-3 closing notes)
    24. [PR-3] F170 (C49 · pass 1 red team, informational): Retry or Inspect on the moment already shown whose slot fails keeps the debugger on that stop (the failed branch 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 the failed branch, the slot's text reset, and a test. — fixed in c31d031 (red re-executed; PR-3 closing notes)
    25. [PR-3] F171 (C49 · pass 1 red team, low): awaitDocumentSettled leaves its change subscription and bounded poll running when afterSubscribe throws. Closes with the throw ending the wait and a test. — fixed in 9035c03 (red re-executed; PR-3 closing notes)
    26. [PR-3] F172 (C49 · pass 1 testing): the slot-bound test asserts that no stop was presented before the late bytes land (it does not release them first), and awaitDocumentSettled's "ignores another document" test relies on the poll's timing. Closes with both tests made order-independent. — fixed in 9035c03 and f371587 (mutation re-executed; PR-3 closing notes)
    27. [PR-3] F173 (C49 · pass 1 maintainability): describeNodeRecordedSource writes Captured- instead of CAPTURED_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 in e002603 and f371587; evidence: PR-3 closing notes
    28. [PR-3] F174 (C49 · pass 1 performance; with F162): every Play event runs the slot's whole cycle (provider event, open, show, settle) also when the placeholder does not change, a stop-to-output move fires the provider twice, and Play awaits the reader position write per event. Closes with an unchanged slot left as it is, one provider event per move, the position write not awaited by Play, and a test counting them. — fixed in 13c5ae1 and f512dfc (red re-executed; PR-3 closing notes)
    29. [PR-3] F175 (C49 · pass 1 simplification, advisory): nodeSourceSlotPath and formatEventSeconds each 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)
    30. [PR-3] F176 (C49 · pass 1 security, appendix, confidence 4): the slot label's hoverMessage is a plain string, which VS Code renders as Markdown, built from a recorded path (the browser's label does the same). Closes with a MarkdownString whose text is escaped, or evidence that a recorded path cannot carry Markdown links, and a test. — fixed in f371587 (red re-executed; PR-3 closing notes)
    31. [PR-3] F178 (C49 · PR-B2 /ship Step 9 pass 2 core review, sideways sweep of F164; present on main): the retired replay's history-position and history-learning rows also survive a return to Live. Closes with the retired replay's rows cleared at the retire and a test per row. — fixed in cfc0eb7 (red re-executed; PR-3 closing notes)
    32. [PR-3] F179 (C49 · pass 2 state-machines, untested cells; with F166): verified stop × reselect of the shown moment (with F170), unverified stop × select another moment, × reselect, × retire; output × reselect; result × reselect. Closes with those tests. — fixed in ce57b0a (mutation re-executed; PR-3 closing notes)
    33. [PR-3] F180 (C49 · pass 2 testing): no test covers the slot's re-decoration when its tab becomes active again, the provider's placeholder for a slot URI no replay holds (a restored tab), or a reselect of the shown moment keeping every surface. Closes with those tests. — fixed in f371587 (mutation re-executed; PR-3 closing notes)
    34. [PR-3] F181 (C49 · pass 2 testing; sibling of F172): the slot-bound test waits the real 1,000 ms bound and releases its held update only after its wait, the slow position-write test releases after its assertions, and the overtaken-selection tests settle with one setImmediate. Closes with an injected bound or clock, releases in finally, and waits on an observable state. — fixed in f371587 (mutation re-executed; PR-3 closing notes)
    35. [PR-3] F182 (C49 · pass 2 testing): the placeholder parse test reads the TypeScript compiler's private parseDiagnostics through a cast. Closes with the public syntactic diagnostics API. — fixed in f371587 (mutation re-executed; PR-3 closing notes)
    36. [PR-3] F183 (C49 · pass 2 maintainability): retireNodeHistorySelection still 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 in f371587 (red re-executed; PR-3 closing notes)
    37. [PR-3] F184 (C49 · pass 2 red team, confidence 6): the slot is not retired when the Study reader closes or a browser recording opens (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 in f371587 (red re-executed; PR-3 closing notes)
    38. [PR-3] F185 (C49 · pass 2 red team): during Play a slot that cannot open fails again at every later event (the row and an Output entry each time; Play does not pause), a refused close of an earlier slot tab marks a slot that shows its bytes as failed, and the 1,000 ms bound can be short on a loaded host. Closes with Play paused at a failed slot, the close failure told apart from the text wait, and tests. — fixed in f371587 (red re-executed; PR-3 closing notes)
    39. [PR-3] F186 (C49 · PR-B2 /ship Step 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 in f371587 (mutation re-executed; PR-3 closing notes)
    40. [PR-3] F187 (C49 · pass 3 testing): studyWorkspace.test.ts replaced the exact replay-debugger invalidation counts with > before when 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 in ce57b0a (mutation re-executed; PR-3 closing notes)
    41. [PR-3] F188 (C49 · pass 3 testing): no test checks that a seek or a selection during Play restarts the dwell, or a tick at the range's first or last time. Closes with those tests. — fixed in ce57b0a (mutation re-executed; PR-3 closing notes)
    42. [PR-3] F189 (C49 · pass 3 red team, confidence 4; a residue of F163's fix): a selection overtaken while inside showTextDocument still 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 under closeEmptyGroups that group can vanish and the slot moves group. Closes with the sweep run only by the current selection, and a test. — fixed in f371587 (red re-executed; PR-3 closing notes)
    43. [PR-3] F190 (C49 · pass 3 red team, confidence 4; with F162): the timeline verifies every stop's sealed source (SHA-256 over its text) at a replay's first publish, synchronously on the extension host. Closes with the timeline computed once per opened history from cached verdicts, and a test. — fixed in 13c5ae1 (red re-executed; PR-3 closing notes)
    44. [PR-3] F191 (C49 · pass 3 red team, confidence 4): the same-moment test compares with the last committed moment, not what the surfaces show after a failed or overtaken selection left it, and showNodeSourceSlot publishes 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 in c31d031 (red re-executed; PR-3 closing notes)
    45. [PR-3] F192 (C49 · pass 3 red team, confidence 3; with F169): the retire deletes the failure row without publishing on every path, and closes slot tabs only when a slot object exists. Closes with a publish after the retire's changes (or callers shown to publish) and slot tabs closed for any retired replay, and tests. — fixed in f371587 (red re-executed; PR-3 closing notes)
    46. [PR-3] F196 (C49 · Step 11 Codex adversarial, Medium): a close of earlier slot tabs that an older selection already issued completes after a newer selection reselected that tab, so the current slot tab can close (tabGroups.close is 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 in f371587 (red re-executed; PR-3 closing notes)
    47. [PR-3] F197 (C49 · Step 11 Codex adversarial, Medium; widens F174): Play and seeks (publish: false) await the reader position write before the controller's changed() 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 in f512dfc and c26472a (red re-executed; PR-3 closing notes)
    48. [PR-3] F198 (C49 · Step 11 Claude and Codex adversarial, Medium): NODE_HISTORY_TRANSITION_BOUND_MS covers only the slot's text wait; openTextDocument, showTextDocument and the tab close are unbounded, so a stalled editor call holds the selection, Play's pending and every later seek. Closes with one deadline over the slot's whole show, late completions cleaned up, and a test. — fixed in f371587 (red re-executed; PR-3 closing notes)
    49. [PR-3] F199 (C49 · Step 11 Claude adversarial, Low): nodeSourceSlotUri reads this.library! before the slot's try, so a missing library throws a TypeError after the leave instead of the history-source row; a debugger presentation that throws leaves the slot and debugger moved and the Study position not. Closes with both told and a test. — fixed in f371587 (red re-executed; PR-3 closing notes)
    50. [PR-3] F200 (C49 · Step 11 Claude adversarial, Low): two files with the same base name share one slot URI (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 in f371587 (red re-executed; PR-3 closing notes)
    51. [PR-3] F201 (C49 · Step 11 Claude adversarial, Low): the slot label's column counts a CRLF source's \r, one column off. Closes with the line's length taken without its line ending and a test. — fixed in f371587 (red re-executed; PR-3 closing notes)
    52. [PR-3] F202 (C49 · Step 11 Claude adversarial, Low): the Reader DOM golden transport check compares exact outerHTML with computed percentage widths, which a harmless rounding change breaks. Closes with the widths normalized in the comparison. — fixed in 7acf9ef (mutation re-executed; PR-3 closing notes)
    53. [PR-3] F203 (C49 · N49 VS Code part 7, Major): during a stop selection the recorded-source slot and the debugger show the new stop while the Study position, its explanation and the Application header keep the previous moment for 0.1 to 0.6 s (frames of the take 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 in f512dfc and 8c4e154 (red re-executed); native check pending (N50); native: VS Code PASS (N50 second submission, candidate 073f6ae, R4 take 80198168…: 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, candidate 3773701, take 4b03c574…: 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).
    54. [PR-3] F204 (C49 · N49 VS Code part 7, Major, 4A): after a stop scrolled the slot to its line, an output or the result keeps that scroll, so the three-line placeholder is out of view (an empty editor showing line 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 in f371587 (red re-executed); native check pending (N50); native: VS Code PASS (N50 second submission, candidate 073f6ae, R4: at the output the placeholder shows from line 1, with no earlier source in sticky scroll); native: Cursor PASS (N50 second submission, candidate 3773701, take 4b03c574…: at the output the placeholder shows from line 1, and the Call Stack reads Not recorded at this moment).
    55. [PR-1] F205 (C49 · N49 VS Code part 3, Minor): the node-test citation-position refusal at preparation, 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 in d23456d (red re-executed, 5 of 5).
    56. [PR-2] F206 (C49 · N49 VS Code, Minor, AC-LEARNING): at the Study pane's default width the shared sequence renderer breaks participant names mid-word (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 in 6d77f68 and 3e25f2f (Reader DOM reds and mutations re-executed; F293, F296).
    57. [PR-3] F207 (C49 · N49 VS Code part 7, Minor): the slot's end-of-line label Recorded: <path>:<line> · <t> s is 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 in f371587 (red re-executed); native check pending (N50); native: VS Code PASS (N50 second submission, candidate 073f6ae, R4: the CodeLens carries the whole Recorded: app/lib/data.test.ts:307 · 91.82 s); native: Cursor PASS (N50 second submission, candidate 3773701, take 4b03c574…: Recorded: app/lib/data.ts:218 · 20.71 s whole on the line and on the CodeLens).
    58. [PR-3] F208 (C49 · N49 Cursor part 7, Major): after a live run beside Cursor's agent chat (whose codebook_presentation calls had failed with PRESENTATION_UNAVAILABLE and codebook_return_current with "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 Workspace refuses with "The Application group changed. Use Codebook: Focus Application or Restore layout explicitly." (also with the chat closed), Codebook: Arrange Study Workspace ends 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 in 2ef87fd (red re-executed); native check pending (N50); native: Cursor PASS (N50 second submission, candidate 3773701, take 4b03c574…: the first Open replay after the Agent's live run opened the Study pane with its transport, the slot and the debugger; X3 on c83a786 likewise).
    59. [PR-3] F209 (C49 · N49 Cursor, Minor): Cursor rejects the codebookLearning view 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 the Learning summary view falls into Explorer. Closes with a supported placement in Cursor (and the D8 composition's plan using it) and a native check. — fixed in 3f0453a (red re-executed); native: PASS in Cursor 3.26.16 (N50 first submission, take 18093050…, candidate 77538e0, and experiment X3, take 4ab6eab2…, candidate c83a786): 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.
    60. [PR-1] F210 (C50 · found by this cycle's sweep of F112's family): eight more named-pipe tests bound their whole body, folder, pipe and fixture included, by the runner's 2 s limit, as F112's two did, so a loaded machine stops them although their act answers: 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.ts and refreshCursorMcpCatalogFileIdentity.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 in 7fa975d, 8bf7188 and e23b61d; evidence: all eight files 20 of 20 under four background suites.
    61. [PR-2] F211 (C50 · found by the integration review of PR-1's group C; DS14, a sibling of F117 and F157): the refusal of Delete saved study… for a test replay reads "Node test histories cannot be deleted here yet." (constants.ts, removalRefusals.nodeHistory), a learner string that says "Node". Closes with the sentence in test-replay words and its pinning test. — fixed in aff00c8 (red re-executed).
    62. [PR-1] F212 (C50 · found by the re-execution of F60's red run): test:shard --record reports one failed test as "1 tests failed; …". Closes with the singular form for one test and a test. — fixed in 38805a3 (red re-executed).
    63. [PR-1] F213 (C50 · found by the driving agent's review of F85's fix): an already-sealed history with no entry, written before D6, is hidden from Saved studies by F85's fix but still counted by the saved-study limit (listedHistoryCount reads 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 in c792f75 (mutation re-executed).
    64. [PR-1] F214 (C50 · found by integrating F58's real paths with F49's test): sanitizeCause orders 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 in 691cd53 (red re-executed).
    65. [PR-1] F215 (C50 · found by PR-1's full gate run, load ~20; the F4 family): 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 in 47ef72d; evidence: 20 of 20 beside four background suites (load 11 to 35).
    66. [PR-1] F216 (C50 · PR-1 OCR review, high): two overlapping summaries of a recording (the 250 ms refresh and a codebook://node-history read) 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 in 896f281 (red re-executed).
    67. [PR-1] F217 (C50 · PR-1 OCR review, medium; CodeRabbit minor): a transient error on the header read makes unavailableMemo return nothing, so summarize forgets 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 in 896f281 (red re-executed).
    68. [PR-1] F218 (C50 · PR-1 OCR review, medium, security): a test run's release failure (stopRecord) is stored and thrown unsanitized, reaching codebook_stop and the run resource with private paths. Closes with the cause sanitized and a test. — fixed in d381277 (red re-executed).
    69. [PR-1] F219 (C50 · PR-1 OCR review, medium, security): causes shown unsanitized outside F48/F49: admitStudy's library-read error, codebook_status's missing and reason lines, the causeDetail of action and continue, recordingReceipt's reason, and a browser run's own error. Closes with each sanitized and a test per surface. — fixed in 67d8e6b (red re-executed).
    70. [PR-1] F220 (C50 · PR-1 OCR review, medium): since D16 a pause on the declared line is checked at the owned breakpoint's bound column, so a learner's own breakpoint that pauses at the declared column is refused. Closes with the declared column tried first (the bound column for the owned hit) and a test. — fixed in b26d5b1 (red re-executed).
    71. [PR-1] F221 (C50 · PR-1 OCR review, low): Save on a run that ended before its first stop (a failed phase, a failed release, a refusal at preparation) answers "Nothing to save yet", which names no way forward. Closes with those runs refused as recording nothing, or stopped without asking, and a test. — fixed in 4520f05 (red re-executed).
    72. [PR-1] F222 (C50 · PR-1 OCR review, low): a stop during preparation overwrites refused-at-admission with stopped-before-history. Closes with the admission refusal kept and a test. — fixed in f206505 (red re-executed).
    73. [PR-1] F223 (C50 · PR-1 OCR review, low): TRANSIENT_FILE_ERROR_CODES and TRANSIENT_SEAL_ERROR_CODES repeat one list. Closes with one source and evidence. — evidence: 2457eb5 derives the seal list from the file list, without EIO, and says why.
    74. [PR-1] F224 (C50 · PR-1 OCR review, low): sealRetryDelay is a public mutable field of the service set by tests. Closes with an injected delay and evidence. — evidence: f1d2cc1 injects the retry delay through the constructor.
    75. [PR-1] F225 (C50 · PR-1 OCR review, to verify): after a Save, the catalog's material revision can trail the receipt's for up to one refresh, so the item may flash back to Save. Closes with a later revision alone returning the item to Save, and a test, or evidence that it cannot happen. — fixed in 37208cf (red re-executed).
    76. [PR-1] F226 (C50 · PR-1 CodeRabbit, minor): after a first open whose replay debugger failed (D13), Retry on the same moment finds the old debugger object, invalidates it and reports success, so the failure row goes without a restart. Closes with the debugger recreated and the row kept until it starts, and a test. — fixed in 463d902 (red re-executed).
    77. [PR-1] F227 (C50 · PR-1 CodeRabbit, trivial): environmentNodeTestCheck.test.ts's passing case succeeds when checkNodeTestFiles is absent. Closes with the member asserted first and a mutation proof. — fixed in 161f738 (mutation re-executed).
    78. [PR-1] F228 (C50 · PR-1 CodeRabbit, minor): extension/README.md "Codebook: Save Learning Replay run then does nothing" is not a sentence. Closes with the sentence fixed. — evidence: 11c0068 rewords the sentence.
    79. [PR-1] F229 (C50 · PR-1 CodeRabbit, trivial): AGENTS.md's hook paragraph says a missing section exits 0 and that errors exit nonzero, without separating them. Closes with the two cases worded apart. — evidence: 63c672c rewords AGENTS.md.
    80. [PR-1] F230 (C50 · PR-1 CodeRabbit, trivial): AGENTS.md's Cycle rule and bug-fix delivery rule do not name the owner's Ship review limit exception of 2026-10-23, nor what happens to Minor findings there. Closes with the exception referenced and its Minor handling stated. — evidence: 63c672c rewords AGENTS.md.
    81. [PR-1] F231 (C50 · found by group B's run of the Study workspace partition at load ~30, also on 47ef72d; the F5 family): 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 in f799758, d8790e5 and 9d5c51b (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.
    82. [PR-1] F232 (C50 · found by the driving agent's run of studyWorkspace.test.js at 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 in f799758; evidence: 20 of 20 beside four background suites (load 9 to 31).
    83. [PR-1] F233 (C50 · found by group A1 while fixing F219): a runtime's own evidence failure reaches terminalReason (through runtimeFailure) 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 in 5444158 (red re-executed).
    84. [PR-2] F234 (C50 · found by group P2B, present on 571d1bd): "stop moves skip outputs…" fails about half the time with ENOTEMPTY, 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 in 07d0909 (red re-executed).
    85. [PR-2] F235 (C50 · found by group P2B's F139 work): a seek or a Play step whose debugger presentation had already started still committed its moment after a newer seek overtook it, so the Study and Application panes showed the overtaken moment while the newer seek loaded. Closes with an overtaken presentation committing nothing and tests holding both presentations. — fixed in 37885d2 (red re-executed).
    86. [PR-2] F236 (C50 · found by PR-2's integration of P2A and P2B): D20's retire of a test replay in loadPlayback was awaited also with no test replay selected, before recordingActive was 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 in f7738f1 (red re-executed).
    87. [PR-1] F237 (C50 · PR-1 CodeRabbit round 2, major): after a first open's debugger start fails, the wait for retireReplayDebugger lets 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 in 125ad3c (red re-executed).
    88. [PR-1] F238 (C50 · PR-1 CodeRabbit round 2, minor): AGENTS.md's bug-fix rule and closing rule said a bug-fix cycle carries nothing, against the ship review limit's recorded defects. Closes with both rules naming the exception and the bug-fix cycle that follows. — evidence: 21f3a68 rewords both rules.
    89. [PR-1] F239 (C50 · PR-1 CodeRabbit round 2, trivial): waits added in this pull request in studyWorkspaceTestReplay.test.ts bound the reader's results by a literal 2,000 ms, unlike the rest of PR-1. Closes with READER_RESULT_BOUND_MS. — evidence: 3beb381 gives the nine waits READER_RESULT_BOUND_MS.
    90. [PR-1] F240 (C50 · found by F154's mutation proof): 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 on ec213b9. Closes with the tab's close held until that arrangement began and a mutation proof (the wait removed fails both variants). — fixed in 46f1340 (mutation re-executed: without the wait both variants fail).
    91. [PR-1] F241 (C50 · PR-1 CodeRabbit round 3, trivial): AGENTS.md left unclear whether the ship review limit applies to a feature cycle and how it meets the rule that a Critical finding is fixed before the merge, and called the cycle rule absolute beside its exception. Closes with the limit's scope and the exception worded. — evidence: 5f71329 rewords both paragraphs.
    92. [PR-1] F242 (C50 · PR-1 CodeRabbit round 3, minor): the anchorIndex refusal named one citation "1 source ranges (anchorIndex 0 to 0)". Closes with the singular and a test that fails without it. — fixed in 5f71329 (red re-executed: the old wording in describeCitedStopMismatch.test.ts).
    93. [PR-1] F243 (C50 · PR-1 /ship Step 9 red team, critical, and security specialist): an unexpected failure reached the agent with its raw cause: codebook_read_resource of a test replay whose history folder is gone answered the lstat error with the absolute storage path (every MCP answer passed String(error) through domainError), 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 in a96ada1 (four mutations re-executed: raw MCP cause, raw scan reason, raw read reason, bound removed (ZodError)).
    94. [PR-1] F244 (C50 · PR-1 /ship Step 9 testing specialist): no test replaced a recording's journal by another file at least as long as what the scan consumed, so removing the scan's inode check passed every test. Closes with that test and a mutation proof. — fixed in a96ada1 (mutation re-executed: inode check removed).
    95. [PR-1] F245 (C50 · PR-1 /ship Step 9 testing specialist): isTransientFileError had no direct test: only EMFILE was reached, through a summary test, and no false case was asserted (requireOwnedVitest is covered at its boundary by prepareNodeTestLaunch.test.ts and the environment tests, F29 and F57). Closes with a table test and a mutation proof. — fixed in a96ada1 (two mutations re-executed: codes cut to EMFILE, ENOENT counted transient).
    96. [PR-1] F246 (C50 · PR-1 /ship Step 9 performance specialist, confidence 6): NodeTestHistoryStore.holdsHistoryFolder checks a folder with the synchronous existsSync on the extension host. — evidence: one existence check of the editor's local storage per agent codebook_playback command, 0.61 µs mean over 10,000 calls on the Mac; playback answers synchronously at 35 call sites; the docstring says why it stays synchronous (a96ada1).
    97. [PR-1] F247 (C50 · PR-1 /ship Step 9 simplification, advisory): isSealedEmptyHistory repeated the error-code shape check systemErrorCode provides. — evidence: a96ada1 uses systemErrorCode; isSealedEmptyHistory.test.ts passes.
    98. [PR-3] F248 (C50 · PR-1 /ship Step 9 maintainability, advisory): 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 in pendingRepositoryBreakpoint.test.ts keep dead behavior. Closes with the mode, its branches and their tests removed, or a caller that F155's second half gives it (D47). — fixed in f50a48f (mutation re-executed; PR-3 closing notes)
    99. [PR-2] F249 (C50 · found by the driving agent's re-execution of P2B's Reader DOM proofs): the three DS20 cases of study-bootstrap-qa.mjs (F125, F147) still set and read webview state (savedState.testOutputHistory, testOutputFollow) that D22 removed from the Application document, so ownHistory and followKept read 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 in 1135bbd (Reader DOM mutations M1, M2, M3a and M3b re-executed RED).
    100. [PR-2] F250 (C50 · found by the driving agent's re-execution of P2B's mutation proofs on PR-2's integrated head f7738f1): six studyWorkspaceTestReplayCells.test.ts cases ("a overtaken before its stop is shown leaves the moment and the step the learner chose") and studyWorkspaceTestReplayOpens.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 in 648e034 and 97e1a6f (P2B's own mutations re-executed RED at the integrated head).
    101. [PR-1] F251 (C50 · PR-1 /ship cycle 2: Codex structured review P1, Codex adversarial High, Claude adversarial): isSealedEmptyHistory took a sealed history whose seal records entries but whose journal is gone or empty for an empty one, so codebook_status → admission() → dropSealedEmpty() removed the whole folder with its learning material and header. Closes with the seal's own entryCount and journalBytes deciding, and tests. — fixed in 0d336e5 (two mutations re-executed: the unit test and the capacity check that kept the folder).
    102. [PR-1] F252 (C50 · PR-1 /ship cycle 2: Codex adversarial, Medium): the run's nodeTest.captureMissing was 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 in 0d336e5 (mutation re-executed).
    103. [PR-1] F253 (C50 · PR-1 /ship cycle 2: state-machines specialist): a test run whose history sealed with no entry (folder removed at the seal, D6) still offered read-history and named a historyUri. Closes with neither offered and a test. — fixed in 0d336e5 (mutation re-executed).
    104. [PR-1] F254 (C50 · PR-1 /ship cycle 2: state-machines specialist; Claude adversarial): the failed removal of an empty history at the seal (sealed as any other, removed by the next check) and in dropSealedEmpty (neither listed nor counted, removed once it can be) were untested. Closes with both tests and mutation proofs. — fixed in 0d336e5 (two mutations re-executed).
    105. [PR-1] F255 (C50 · PR-1 /ship cycle 2: state-machines specialist): a summary after a recording's folder was removed by its empty seal, or after a sealed history's folder was removed by hand, was untested. Closes with both tests and a mutation proof. — fixed in 0d336e5 (mutation re-executed: 2 of 2 red).
    106. [PR-1] F256 (C50 · PR-1 /ship cycle 2: red team, critical): a failed evidence write's raw cause (the evidence file under the storage folder) became the EVIDENCE_UNAVAILABLE cause and message of codebook_explain, the run error and the journaled run.failed, since a StudyError passes the MCP answer unchanged. Closes with writeFailureError sanitizing the cause, and a test. — fixed in 0d336e5 (mutation re-executed; three expectations that pinned the raw path or the error name now read the sanitized cause).
    107. [PR-1] F257 (C50 · PR-1 /ship cycle 2: red team): codebook_status sanitized only a failed prerequisite read (F219); the missing sentences of a read that resolves (an lstat refused on the repository's build folder) kept their paths. Closes with every missing sentence, common and per profile, sanitized, and a test. — fixed in 0d336e5 (mutation re-executed).
    108. [PR-1] F258 (C50 · PR-1 /ship cycle 2: Claude adversarial): sanitizedCause cut 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 in 0d336e5 (mutation re-executed; the runtime-failure limit test now expects the marker).
    109. [PR-1] F259 (C50 · PR-1 /ship cycle 2: Claude adversarial, Codex adversarial, state-machines and red team findings closed with evidence; closure rule 5, one line each): (1) a same-inode rewrite of a recording's journal is not seen by the incremental scan — evidence: only this window's append-only writer changes an active journal, inside the extension's private storage; the sealed read checks every entry against the seal; the scan's docstring states the assumption (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.alloc of the appended region — evidence: bounded by the same 8 MiB limit checked first; (6) holdsHistoryFolder as an existence oracle — evidence: the agent already reads every listed history in codebook://node-history; (7) summarize queues 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.
    110. [PR-2] F260 (C50 · PR-1 /ship cycle 2: red team): another window of the same workspace reads a history this window records as 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 in 72c5688 and c41bc98 (two reverts and three mutations re-executed RED), the clock in 9bce411 (F284).
    111. [PR-1] F261 (C50 · PR-1 /ship cycle 3: Claude adversarial, red team ×2, Codex adversarial): unexpectedFailure passed a StudyError through 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 in 763bf0e (mutation re-executed).
    112. [PR-1] F262 (C50 · PR-1 /ship cycle 3: Claude adversarial; maintainability): causeRoots called a synchronous realpath twice at every access, and three places built cause roots inline. Closes with one causeRootsFor helper and each real path resolved once, and a test. — fixed in 763bf0e (mutation re-executed).
    113. [PR-1] F263 (C50 · PR-1 /ship cycle 3: Claude adversarial): messageNamingCause cut the joined words before sanitizeCause hid 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 in 763bf0e (mutation re-executed).
    114. [PR-1] F264 (C50 · PR-1 /ship cycle 3: Claude adversarial): the Save Learning Replay notice and the book catalog's unavailable reason were String(error). Closes with both sanitized, and tests. — fixed in 763bf0e (two mutations re-executed).
    115. [PR-1] F265 (C50 · PR-1 /ship cycle 3: Claude adversarial): the store cut its reasons at UTF-16 units. Closes with cutReason between characters with the cut marker, and a test. — fixed in 763bf0e (mutation re-executed; two reason-bound tests now expect the marker).
    116. [PR-1] F266 (C50 · PR-1 /ship cycle 3: Claude adversarial): a removal at an empty history's seal that failed partway could leave a sealed folder without its header, which the count never removed. Closes with the count removing sealed-empty folders named like a study id whatever their header, and a test. — fixed in 763bf0e (mutation re-executed).
    117. [PR-1] F267 (C50 · PR-1 /ship cycle 3: Claude adversarial): the Study workspace lists histories before it attaches the service, and the memo kept reasons worded without the workspace root until a file changed. Closes with a describer replacement forgetting the memos, and a test. — fixed in 763bf0e (mutation re-executed).
    118. [PR-1] F268 (C50 · PR-1 /ship cycle 3: Claude adversarial): the restore hook trimmed every section line, so it did not restore them verbatim. Closes with only the headings compared without trailing spaces, and a test. — fixed in 763bf0e (mutation re-executed by hand).
    119. [PR-1] F269 (C50 · PR-1 /ship cycle 3 findings closed with evidence; closure rule 5): (1) a preparation failure racing a stop reads stopped — evidence: D12, matched to F259 (9); (2) a stop accepted at the bound column when the adapter omits hitBreakpointIds — evidence: D16, the compared column is the owned breakpoint's verified one, so a pause there is at the cited statement whoever's breakpoint it is; (3) a transient EPERM keeps a recording's summary unremembered — evidence: the window's own writer holds that journal, so a lasting denial fails the recording itself and its seal; (4) codebook_status removes 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).
    120. [PR-1] F270 (C50 · PR-1 /ship cycle 3: maintainability): the Vitest program path was a bare string beside a module-local package path, and the cited-stop path refusal repeated its sentence. Closes with VITEST_PACKAGE_PATH and VITEST_PROGRAM_PATH in constants.ts and one cited sentence. — evidence: 763bf0e; the path refusal's test reads the unified sentence.
    121. [PR-1] F271 (C50 · PR-1 /ship cycle 3: simplification, advisory): an identity .then in isSealedEmptyHistory, and an isSymbolicLink check after lstat that cannot be true. — evidence: 763bf0e simplifies both.
    122. [PR-1] F272 (C50 · PR-1 /ship cycle 3: state-machines): untested cells: the run resource after an empty history's removal failed at the seal, and a status item hidden and then shown again. Closes with both tests. — fixed in 763bf0e (two mutations re-executed).
    123. [PR-1] F273 (C50 · PR-1 /ship cycle 3: coverage audit): untested: an oversized seal, a seal whose read fails, a material save before the seal, a capture-gap re-read that still fails, a failed seal keeping read-history, an absent profile in the prerequisites report. Closes with those tests. — fixed in 763bf0e (six mutations re-executed).
    124. [PR-1] F274 (C50 · PR-1 /ship cycle 3: Codex adversarial, High): a learning material saved before a history's first entry was deleted with the folder when the run ended with no entry, and a legacy sealed-empty history's material too. Closes with a folder that holds learning material or understanding marks never removed as empty, the run resource offering its history, and tests. — fixed in 763bf0e (two mutations re-executed).
    125. [PR-1] F275 (C50 · PR-1 /ship cycle 3: Codex structured review, P2): after a first replay-debugger start failed, selecting an output or the result while the failed owner was still being disposed made a second owner whose descriptor factory registration was refused. Closes with such a moment waiting for the retirement, an owner the learner stopped left stopped, and two tests. — fixed in 763bf0e (two mutations re-executed).
    126. [PR-2] F276 (C50 · PR-1 /ship Step 14.5 documentation audit, attempt 2, decision; trivial): CHANGELOG 0.2.36.0's bullet "Causes name no private path" lists Output › Codebook among the surfaces and then says "A long cause is cut between characters and ends with … [cut]", which reads as if the Output entry were cut too, while cutCauseForDisplay keeps 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: d966577 words the 0.2.36.0 bullet as the packaged README: the surfaces that cut, the Output › Codebook entry kept whole.
    127. [PR-1] F277 (C50 · found by PR-1's /ship Step 16 gate on the final tree): 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 no describeFailure, 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 in d10f77d (red: the gate run on b8cf9f1; two mutations re-executed: the notice built from String(error), the notice unescaped).
    128. [PR-1] F278 (C50 · found by PR-1's /ship Step 16 gate): the release commit raised VERSION, extension/package.json and the package test's expected version but not EXTENSION_VERSION in extension/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 in 94aba4c; 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-title kind and three one-caller wrappers), F135 (Reader DOM wiki-reader-dom 720 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 an understand checkbox 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.

  2. ryota-murakami commented on Oct 22, 2026

    @ryota-murakami
    ContributorAuthor

    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-256 f189ee82541a72ed981e3f7a0e21bd35a19b6601df1c7208671117a335caf2aa (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:

    1. Live explanation. Run and Debug with recorded locals (amount, amountInCents, status), Watch, Call Stack and Breakpoints. The app's Create Invoice form sits above actions.ts, paused at await db.insert. Chat with /codebook. Bottom bar: Recording explanation · Save learning replay.
    2. Learning replay · Time-travel debugging. Replay: Creating an invoice, with VARIABLES and CALL STACK marked (recorded state). Recorded application · 00:42 above actions.ts (recorded source). A Learning summary with the sequence Invoice form → createInvoice → PostgreSQL, the step "Before database insert" with its source link, and I understand this step. One transport: Jump back, 00:42 / 02:18, Unrecorded interval, ? and Recorded 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.
    3. LLM Wiki — Reproduce DeepWiki. Chapter navigation, the article with Relevant source files, a flow diagram, source references and the question composer. Source changed · Update available with Update LLM Wiki, On this page, Open in VS Code, and Output: project folder · Change location.
    4. Shortcut discovery. Keyboard shortcuts ? and the searchable dialog.

    State.

    • origin/main is c0487de (0.2.35.0). The local checkout is clean on codex/cycle-0049-pr-b2-recorded-source-and-transitions at 9bc5b8b, whose tree equals c0487de. No open pull request.
    • Node 24.21.0, pnpm 12.4.2 (from extension/), gh as ryota-murakami.
    • The Space local:codebook-qa is running, with VS Code 1.142.0 (profile Codebook 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.

    • /spec filed this Issue under D1 to D4. The dedupe check found nothing.
    • Codex quality gate: the first draft scored 7 of 10, but its marker check read it as unavailable. The revision scored 8 of 10, a pass. Both scorings' ambiguities are answered in the body.
    • Redaction: clean, apart from the false positive of GitHub comment ids, which were rewritten. One LOW note: F31's example path /Users/ada/… is a fixture string.

    Next. PR-1 on codex/cycle-0050-pr1-run-contracts-and-tests from origin/main.

  3. ryota-murakami commented on Oct 22, 2026

    @ryota-murakami
    ContributorAuthor

    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.

    • D6, F85 and F57's leftover. A test history sealed with no entry holds nothing to replay. The store removes its folder when it seals, so it is not listed in Saved studies, takes no capacity and agrees with replayAvailable: false.
    • D7, F92 and F93. While saved-study capacity is exhausted:
      • codebook_status.profiles['node-test'] reads ready: false, with a missing sentence naming the count and the limit.
      • The node-test start's refusal at preparation becomes typed PREREQUISITE_MISSING, worded through the existing fullLibraryMessage (Settings of this editor profile, or delete a saved study from Saved studies; only the learner can do either, an editor agent cannot).
      • The README says test replays cannot be deleted from Saved studies yet (Cycle 0049: a Vitest test run the editor chat explained is saved and replayed as a learning replay in both editors #107's EN17 is a later candidate).
    • D8, F72. nodeTest.captureMissing (structured capture parts from listMissingNodeLearning) is exposed in the run resource and in the node-history resource. The skill (1.0.47) claims saved learning only when studyOutcome is demonstrated, learningCoverage is complete and captureMissing is empty.
    • D9, F89. Save Learning Replay before a test run's first stop does nothing and shows "Nothing to save yet: the test run has not reached its first stop.", and the preparing run continues.
    • D10, F52. A Save receipt is compared with the store's material revision (the summary projection), not with this window's cache.
    • D11, F94. The skill's missing-connection rule says that in a Copilot-harness chat (VS Code's default new chat) the learner opens a Local chat session, as Set Up AI Chat's message says.
    • D12, F97. A learner's stop before the first stop reads as stopped: no error, not refused-at-preparation, its start key not freed for a retry under the same key.
    • D13, F98. When the replay debugger cannot start on the first open, the open completes on its landing moment and reports the failure in the replay-debugger row with its restart hint. The pane stays open and a retry presents the debugger again.
    • D14, F100. The seal retries once after 200 ms for a transient code (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 repeated codebook_stop makes no second attempt.
    • D15, F101. Containment stays: a root node_modules/vitest that 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."
    • D16, F155. A declared stop whose line binds at another column of the same line is accepted and captured at the bound column (the refusal stays for a binding on another line). The second half, a start at the advised column that never pauses, is investigated to its root cause and fixed with a test that fails without the fix.
    • D17, F205. The citation-position refusal names the stop (source or additionalStops[n]), its anchorIndex, 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.
    • D18, F91. After a stop whose release failed, the run offers only stop in nextActions, has no continueArguments, and refuses codebook_continue with STALE_PAUSE.
    • D19, PR-1 execution. Four implementation subagents work in separate worktrees on disjoint file groups and commit per task:
      • A1: the service run lifecycle and contracts.
      • A2: the store, environment and utilities.
      • B: the save and open wiring.
      • C: scripts, hook, skill and documents.
        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.
  4. ryota-murakami commented on Oct 22, 2026

    @ryota-murakami
    ContributorAuthor

    Re-entry after compaction (2026-10-23)

    • Read again in full: PRODUCT_GOAL.md (444 lines, goal version 10, unchanged), AGENTS.md (173 lines), this Issue's body and its three comments.
    • Image: docs/designs/assets/codebook-product-spec-v9.png, 1,878,402 bytes, SHA-256 f189ee82…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.
    • State: branch codex/cycle-0050-pr1-run-contracts-and-tests, 5 commits on c0487de (F4, F5, F6, F82, F112, F113, F210), clean. Group C finished on codex/c50-pr1-c (90ee892); A1, A2 and B are still running. No pull request is open.
  5. ryota-murakami commented on Oct 22, 2026

    @ryota-murakami
    ContributorAuthor

    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 arrange runs 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. nodeHistoryLearningMaterial leaves 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:

      • P2A: the Application pane's document and output (19 tasks).
      • P2B: the Study section, Saved studies, the Reader DOM pins and cards (25 tasks, F211 included).

      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.

  6. ryota-murakami commented on Oct 22, 2026

    @ryota-murakami
    ContributorAuthor

    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.

  7. ryota-murakami commented on Oct 22, 2026

    @ryota-murakami
    ContributorAuthor

    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.

      1. Leave, in one host turn and one publish:
        • debugger invalidated;
        • slot line and label cleared;
        • Study position pending on the requested sequence (PR-2's F129 field), with step and explanation cleared;
        • the test replay's Application header becomes the loading line;
        • the browser posts the prepared frame as a non-required frame. The webview decodes off-screen before it swaps, so #page is hidden only when no frame exists or the read passes its bound.
      2. Content: the slot's show (F198's deadline) or the browser's source render.
      3. The debugger presentation.
      4. Commit.
      5. The position write, never awaited by Play (F197).

      Tests:

      • A held debugger presentation reads every surface at the intermediate point.
      • A held frame read shows no reset with clear: true while the read is held.
      • playbackController.test.ts: invalidate only after the frame resolves.

      Changes stated in the PR:

      • studyWorkspaceTestReplaySource.test.ts pins the old order (positionDuringLoad === 2) and changes.
      • Explicit seeks no longer blank the pixels.

      Rejected:

      • Hiding every surface until the commit, which doubles the dark frames.
      • Caching adjacent frames, which costs memory and still needs the decode.
    • D30, F208. Inferred from the code; the native check confirms it.

      • Cause (a): the live composition sustains itself while a test replay is selected (studyWorkspace.ts:7821-7829). The Study pane is disposed and never created, and Open replay does not re-enter open() while the reader is open (:11144).
      • Cause (b): after a failed codebook_return_current, the kept Application record makes preparedApplicationPanel refuse "The Application group changed…" (:16982), also for an explicit open.
      • Fix:
        • a selected or opening test replay forces the Study composition, and openNodeHistoryFromHost calls open() when no Study pane exists;
        • an explicit open reconciles a pane that left its group, while a background acquisition keeps the refusal;
        • the refusal names Open Study Workspace;
        • Focus Explanation opens the Study pane when none exists.
      • Test: a Cursor-host harness with a failed return, then Open replay creates the Study pane with its test replay section.
    • 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 MarkdownString for 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_MS and a small deadline utility wrap open, show, the text wait and the close.
      • Play pauses at a failed slot, and a late completion that is no longer current has its tab closed.
      • A failed close commits with a history-source warning and one Output entry, retried at the next show.
      • StudyWorkspace takes an injected clock, as the playback controller already does.
    • 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.

      • F161: redraw on visible-editor changes, and reveal only at the commit.
      • F167: Retry re-selects only for a history-source row; other rows keep renderSelection(true, true); a debugger the learner stopped is not restarted.
      • F170: the failed branch also invalidates the debugger and resets the slot's text.
      • F191: track the shown moment, and leave publishing to the commit.
      • F199: build the URI inside the try.
      • F201: lines split on CRLF.
      • F190: the timeline is kept per history, and the verdicts are already cached.
    • D44, PR-3 execution. Three implementation groups from PR-2's integrated head:

      • S2, the slot's editor effects, with every new harness seam (clock, held show, held close effect, MarkdownString, CodeLens). It lands first.
      • S1, selection and transition.
      • B, entry, arrangement, Cursor and the browser frames.

      The driving agent runs the native checks and N50.

  8. ryota-murakami commented on Oct 22, 2026

    @ryota-murakami
    ContributorAuthor

    D45 (recommended, F155; the owner cannot answer). F155 closes in two parts.

    • First half: PR-1. A declared stop that the debugger binds at another column of its line is accepted and captured at the bound column (D16). Group A1 fixed it, with tests whose red run is recorded.
    • Second half: PR-3. A start declared at the advised column (16:29 of 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.

  9. ryota-murakami commented on Oct 23, 2026

    @ryota-murakami
    ContributorAuthor

    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).

    • Not a new task: a failure seen only under that overload, in a background suite or in another test of an evidence file. It is recorded in the closing note of the task whose evidence run met it.
    • A new task, fixed in this cycle: a failure that also happens in a gate run without that overload: the full pnpm test alone, 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.

  10. ryota-murakami commented on Oct 23, 2026

    @ryota-murakami
    ContributorAuthor

    Re-entry after compaction (2026-10-23, /ship of PR-1)

    • Read again in full: PRODUCT_GOAL.md (444 lines, goal version 10, unchanged), AGENTS.md from disk (173 lines, with 5f71329's ship-limit wording), this Issue's body and its nine comments.
    • Image: docs/designs/assets/codebook-product-spec-v9.png, 1024 × 1536, 1,878,402 bytes, SHA-256 f189ee82…caf2aa (matches the Design target), viewed through a copy scaled to 800 × 1200: live explanation, learning replay, LLM Wiki and shortcut discovery found.
    • State: branch codex/cycle-0050-pr1-run-contracts-and-tests at 870b713, 71 commits on c0487de, clean; no open pull request; no subagent running. /ship for PR-1 resumes at Step 7 (coverage audit).
  11. ryota-murakami commented on Oct 23, 2026

    @ryota-murakami
    ContributorAuthor

    D47 (recommended; the owner cannot answer). Three dispositions from PR-1's /ship Step 9 (pass 1):

    • F246 closes with evidence, not a change. holdsHistoryFolder's one synchronous existence check costs about a microsecond per agent codebook_playback command, and making playback asynchronous would change its 35 synchronous call sites for no measurable gain. Considered: an asynchronous playback, or a folder list primed at start, which would refuse an earlier session's replay only after the list arrived (F9).
    • F248 moves to PR-3. Removing the unused '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.
    • F249 (PR-2) is taken as a task. P2B's DS20 Reader DOM cases were written against the webview state that P2A's D22 replaced; the merge kept them green, so a re-execution, not a gate, found it.

    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.

  12. ryota-murakami commented on Oct 23, 2026

    @ryota-murakami
    ContributorAuthor

    D48 (recommended; the owner cannot answer). Dispositions from PR-1's /ship cycle 2 (Step 9 pass 2 and Step 11):

    • F260 (another window reading this window's recording as interrupted) goes to PR-2. It changes how Saved studies, the Study section's list, shows a history another window records, and it needs a recording marker that both windows read. That is PR-2's area. It is not carried out of this cycle.
    • F259 closes nine findings with evidence, one line each. Each line names why the finding is not a defect under the store's and the redaction's stated contracts. The scan's trust in its own append-only writer is now written in its docstring.
    • Two red-team findings at confidence 4 stay in the appendix. They are the 53-bit inode precision on NTFS and URI-encoded roots. The review's calibration suppresses that confidence from the report, and neither has a reproduction here.
    • Step 11 ran beside Step 9 pass 2, so its findings joined fixing cycle 2 instead of opening a third. The passes were Claude adversarial, Codex adversarial and the Codex structured review, whose gate failed on the P1 that F251 fixes.

    PR-2's re-execution so far:

    • P2B's ten unit red runs are re-executed RED.
    • P2B's mutation proofs: F146, F129, F126, F119, F147, F125, F139, F153, F124 and F122 are re-executed RED. F121's red is re-executed: the flow stopped at its case.
    • Two kinds of proof stay green at the integrated head even with P2B's own mutations: the overtaken-move cells and the overtaken browser study. They are F250.
  13. ryota-murakami commented on Oct 23, 2026

    @ryota-murakami
    ContributorAuthor

    D49 (the owner's ship review limit of 2026-10-23, applied; the owner cannot answer). PR-1's /ship ran its three fixing cycles. The third review round still had findings, so the review did not converge (converged:false).

    • The third round's findings:
      • Step 9 pass 3: maintainability ×3, simplification ×2 (advisory), performance ×1 (matched to F259), state-machines ×2, red team ×2, and the coverage audit's six gaps.
      • Step 11 pass 3: Claude adversarial ×12, Codex adversarial (High, Medium), and the Codex structured review (P2; its gate passed).
    • Every one is fixed or closed with evidence in 763bf0e, as F261 to F275, Minor and below included. Each fix has its test and a re-executed mutation proof, 23 in all.
    • No fourth review cycle runs. That cycle would also have to fix whatever it found.
    • No Critical or Major defect stays open, so the limit records none in an Issue.
    • The release steps follow: the binding of the reviews, the version and CHANGELOG, the documentation audit, the verification gate on the final tree, the PR (reporting 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.

  14. 64 remaining items

  15. ryota-murakami commented on Oct 24, 2026

    @ryota-murakami
    ContributorAuthor

    F459, F474 and F485 native recheck on candidate 65b5e353 (VSIX 2cda7f81…, dist/extension.js 856ffd4b… 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:

    1. Reload the window. Open Study Workspace → Saved studies → the R2 browser replay ("フォームから dashboard 認可まで", 10/23/2026 3:23 PM).
    2. Seek to a stop so its captured-source tab opens. Record the tabs.
    3. Open a file of the learner's own at the same captured-source address the browser replay used. If the address cannot be opened by hand, record that, and open a different learner file instead.
    4. Saved studies → the R7 test replay ("latest invoices", 3 of 3 stops).

    Pass when:

    • the browser replay's captured-source tabs close;
    • the learner's tabs stay;
    • after Next stop, nothing else closes.

    Recorded with OBS Window Capture after a new preflight.

  16. ryota-murakami commented on Oct 24, 2026

    @ryota-murakami
    ContributorAuthor

    R8, frozen 2026-10-24 before its submission. VS Code, Copilot Chat GPT-6 Luna, candidate 65b5e353, VSIX 2cda7f81…. For F459, F474 and F485 on the final reader-independent candidate.

    R26 changes only the dev script 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:

    /codebook 請求書の一覧画面で検索キーワードとページ番号から、何件目から何件目までをデータベースに問い合わせるのか、その範囲がどう計算されるのかを、テストを実際に動かして、止めた時点の実際の値を見ながら解説して

    Required causal links (judged by the driver):

    • P1: the run executes "applies the requested filter and page before returning invoice rows" in app/lib/data.test.ts.
    • P2: a stop in fetchFilteredInvoices (app/lib/data.ts) shows the computed offset, (currentPage - 1) * ITEMS_PER_PAGE, from captured values.
    • P3: the query's limit and offset are the mocked builder's calls, named as source-derived.
    • P4: the test passes.

    Observation: after Save, the first Open replay. Pass when:

    • the browser replay's Captured-source.mts closes;
    • every learner tab stays;
    • after Next stop, nothing else closes.
  17. ryota-murakami commented on Oct 24, 2026

    @ryota-murakami
    ContributorAuthor

    R8 observed: F459, F474 and F485 on candidate 65b5e353 (VS Code 1.142.0, GPT-6 Luna, take 0c6df2a1…, 2026-10-24 JST)

    Candidate. 65b5e353: gate 18 passed 16 of 16 (tests 6,614, 0 failed; package 1,071, 0 failed; pnpm health exit 0). VSIX 2cda7f81…; installed dist/extension.js 856ffd4b… 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-256 2b8ab5fe…. R26 (2bcd9145) changes only the dev-script reader, its tests and its docs, not studyWorkspace.ts, so this result stands for the merged head.

    • Setup. Open Study Workspace showed the R2 study. Its Recording opened the browser replay, and Previous stop showed stop 2: auth.config.ts:12, isLoggedIn = true, in the source view Captured-source.mts.
    • The run.
      • The agent called 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.
      • P1: the run executed "applies the requested filter and page before returning invoice rows".
      • P2: stop 1 of 1 at data.ts:152 (.offset(offset)) in fetchFilteredInvoices, with query = 'Ada', currentPage = 3, ITEMS_PER_PAGE = 6 and offset = 12. The chat derived (3 − 1) × 6 = 12, rows 13 to 18.
      • P3: limit/offset named as the mocked builder's calls.
      • P4: the test passed with exit 0, 1 of 1 stops explained.
      • Assistance: Allow in this Session per new tool, Allow Without Review on two results, and Continue on "Continue to iterate?".
    • F459, F474 and F485: PASS.
      • Before Save and Open replay, group 2 held utils.test.ts, data.test.ts, Captured-auth.config.ts, data.ts, auth.ts and actions.ts, and group 3 held utils.ts.
      • After the first Open replay: the Application ("Recorded test output · 20.71 s"), the slot Captured-data.ts:152 with line and label, the replay debugger (fetchFilteredInvoices) and the Study, Stop 1 of 1. There was no refusal.
      • No browser replay tab stayed. Every learner tab stayed. The slot's title is unique.
      • Next stop then closed nothing.
    • D77 (recommended; the owner cannot answer). The R2 study's article source Captured-auth.config.ts, which the Study opened after the leave, stays beside the test replay.
      • Under F466, F474 and F485 a captured-source tab opened after the leave is kept, as the learner may have opened it from the Study reader. Codebook cannot tell a tab it opened for the article from one the learner opened at the same address, so closing it would risk the learner's tab.
      • Its title differs from the slot's, so F459's same-title confusion does not arise.
      • Considered: closing every owned article-source tab at a test replay's open. That reverses F466's learner-tab protection.
    • Preservation: the target is clean, and no app or test process is left.
  18. ryota-murakami commented on Oct 24, 2026

    @ryota-murakami
    ContributorAuthor

    Re-entry after compaction (2026-10-24, PR-3 before /ship)

    • Read again in full:
      • PRODUCT_GOAL.md: 444 lines, goal version 10, unchanged.
      • AGENTS.md from disk on PR-3's branch: 411 lines.
      • This Issue's body and all its comments, the four task comments included.
    • Image: docs/designs/assets/codebook-product-spec-v9.png is 1024 × 1536, 1,878,402 bytes, SHA-256 f189ee82…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.
    • State:
      • PR-3's integration branch codex/cycle-0050-pr3-slot-transitions-and-entry is at 5ab5cca4 (R27, F524, merged) and clean. Its last pushed commit is 7139a69e. No pull request is open.
      • Gate 19 ran on 2bcd9145 and passed 16 of 16: tests 6,629, 0 failed; package 1,071, 0 failed; pnpm health exit 0. R27 was merged while its package lane ran, so its result stands for 2bcd9145 only.
      • Local reviews of 2bcd9145..5ab5cca4:
        • CodeRabbit CLI: completed, 0 findings, 4 files reviewed.
        • OCR delegate: 2 of 4 files reviewed. extension/README.md and the test file are default exclusions, and both were read by hand. No code defect. One test gap, confirmed by mutation: it becomes F525.
  19. ryota-murakami commented on Oct 24, 2026

    @ryota-murakami
    ContributorAuthor

    D78 and D79 (recommended; the owner cannot answer). PR-3's /ship Step 9, pass 1 (fixing cycle 1 of 3).

    Coverage.

    • The core checklist found nothing. SQL does not apply. The webview gains no HTML sink, and no command runs in a shell. UnreadReason's four values are handled by every consumer. No approval classes are declared.
    • Gate integrity: no finding. All 121 eligible hunks were read: 50 from the scan's listing and 71 from its artifact. The 8 test names that leave main are the declared-column tests (F248, D47) and three renamed or replaced tests (F172, D29, D37).
    • Specialists: Testing and Performance found nothing; Security found 1, Maintainability 6, Simplification 3 advisories and State Machines 11 untested cells (matrix check: ok, 4 machines). The Red Team found 1 more.
    • Smoke QA (functional): 3 of 3 pass. The declared -p is read, a busy port is refused with its recovery, and an unread script quotes structure only. Evidence is in the Mac's private artifacts/cycle-0050/work/ship-pr3/qa/.
    • Step 7 coverage: 100% value-weighted, with 2 new test files. Step 8: 50 of 214 plan items sampled, all DONE.

    D78, F527 (the recorded Chrome's resolver flag).

    • Decision: VS Code's recorded Chrome no longer gets --host-resolver-rules=MAP localhost 127.0.0.1.
    • Why: the flag maps every localhost port. A learner's own API on another port that listens only on ::1 would fail in the recording while it works in their browser; on macOS this is common (Vite, or Node binding localhost). 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.
    • Reverses: D66's flag only. D66's forwarder rule stays.
    • Considered: mapping only the owned port, which Chrome's resolver rules cannot scope by port.

    D79, the maintainability and simplification findings F528 to F533.

    • F530 and F531, done together. bundleOfEvaluatedModule takes the bundle identity as one BundleSource-shaped object instead of six positional strings. With that, sealRuntimeModuleInstance would only pass its arguments through, so it is removed, and its contract moves into bundleOfEvaluatedModule's docstring.
    • F529. isModuleInAnotherLayer gets a file of its own name.
    • F532. startSlotDeadline reads its expiry from the abort signal. The timer seam stays, because tests drive the clock by hand.
    • F533, kept with a reason. Each port's inner map lets a release drop the port when its last claim goes, and each reader looks at one port's claims only. A flat map would scan every claim of every port for no gain.
    • Appendix (confidence 4, as D48 and D54 kept such items):
      • the regex's 32-character limit in showDevelopmentScriptSegment;
      • DEVELOPMENT_SERVER_MAX_PORT has no doc comment;
      • the in narrowing in projectNodeTestSection;
      • a second beginRelease on a stopping claim;
      • two of the browser-replay record cells with rebuilt tab objects.
    • F526 is closed with evidence, below the tasks.

    Execution. Three implementation groups work in separate worktrees from 82c1281a:

    • R29: the state-machine cells of studyWorkspace, F536 to F541.
    • R30: F527, F532, F534 and F535.
    • R31: F528 to F531.

    The driving agent re-executes every claimed red run and mutation, then runs the gate.

  20. ryota-murakami commented on Oct 24, 2026

    @ryota-murakami
    ContributorAuthor

    D80 (the owner's ship review limit of 2026-10-23, applied; the owner cannot answer). PR-3's /ship third round.

    PR-3's /ship has run its three fixing cycles:

    Pass Findings Where they went
    1 16 F526 to F541 (D78, D79)
    2 2 F542 and F543
    3 6 F544 to F549

    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).

    • Claude adversarial: completed, 9 findings.
    • Codex adversarial (gpt-6-astra):
      • The first attempt timed out at 9 minutes, so it is missing coverage.
      • The retry, scoped to the product source, completed with 2 findings: one High and one Medium.
    • Codex structured review: timed out at 9 minutes, so its gate reads MISSING COVERAGE. codex review --base cannot be narrowed by path, and the diff is 19,691 lines.
    • The partial note of the timed-out adversarial attempt is closed by evidence. It said the [::1] forwarder starts after ready()'s entry-page fetch. Node's fetch tries both loopback families, so before the forwarder exists a refused ::1 falls back to 127.0.0.1.

    Every finding of the last round is fixed or closed with evidence (F550 to F560), Minor and below included.

    • Fixes, each with a re-executed red run:
      • the dev script reader's breadth budget (F550, the High finding);
      • the slot's held text dropped before a text change (F551);
      • readiness read at the declared port only (F552);
      • package.json read only as a regular file within the limit (F556);
      • a typed refusal for an unexpected bind failure (F559).
    • Evidence closures: F555 (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).
    • Appendix, confidence 4, as D48 kept such items: two Red Team notes of pass 3. One is that superseded module instances are matched by exact address. The other, an unreadable package.json, is now fixed anyway as F556.

    Two gate-found test failures are tasks of this cycle (D46):

    • F561, health.test.mjs's fixture teardown meeting ENOTEMPTY in gate 23. Its teardown now retries.
    • F562, a port-release test that failed once in a fix group's run.

    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.

  21. ryota-murakami commented on Oct 24, 2026

    @ryota-murakami
    ContributorAuthor

    PR-3 open as #121 (2026-10-24 JST)

    • Head: 0293a8b7 (v0.2.38.0). Every task of this Issue is closed: 537 tasks, F526 to F562 added by PR-3's /ship.
    • Review: converged:false under the owner's ship review limit (D80), with no Critical or Major defect open.
    • Gate 24 on the head: 16 of 16 passed.
      • pnpm test: 6,663 tests, 0 failed.
      • pnpm test:package: 1,071 tests, 0 failed.
      • pnpm health: exit 0.
    • Waiting on: required CI, then hosted CodeRabbit through /coderabbit-resolver until it approves the exact head, the exact-HEAD gate, and gh pr merge 121 --squash --match-head-commit <sha>.
  22. ryota-murakami commented on Oct 24, 2026

    @ryota-murakami
    ContributorAuthor

    Re-entry after compaction (2026-10-24, PR-3 open as #121, hosted CodeRabbit)

    • Read again in full: PRODUCT_GOAL.md (444 lines, goal version 10, unchanged); AGENTS.md from disk on PR-3's branch (411 lines); this Issue's body, the latest comments in full and the fourth task comment.
    • Image: docs/designs/assets/codebook-product-spec-v9.png, 1,878,402 bytes, SHA-256 f189ee82…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).
    • State: 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's head is 0293a8b7, clean. Gate 24 on it passed 16 of 16. Required CI is green. Hosted CodeRabbit review 5636850934 reads CHANGES_REQUESTED with 5 open threads; they become tasks F563 on, through /coderabbit-resolver.
  23. ryota-murakami commented on Oct 24, 2026

    @ryota-murakami
    ContributorAuthor

    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.

    Carried defects: none. No TODOS file, backlog or ledger holds any.

    Next cycle: a feature cycle, planned with /spec and /autoplan from 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).

  24. ryota-murakami commented on Oct 24, 2026

    @ryota-murakami
    ContributorAuthor

    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, health and 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    cycleOne bounded experiment or product increment

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions