Skip to content

v0.2.35.0 feat: a test replay's recorded-source tab with the debugger at the same moment, the slider's unrecorded span and Play's bounded wait (Cycle 0049, PR-B2 of 3) - #117

Merged
ryota-murakami merged 14 commits into
mainfrom
codex/cycle-0049-pr-b2-recorded-source-and-transitions
Oct 22, 2026
Merged

ryota-murakami merged 14 commits into
mainfrom
codex/cycle-0049-pr-b2-recorded-source-and-transitions

Conversation

@ryota-murakami

@ryota-murakami ryota-murakami commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor
{
  "schema_version": 1,
  "pr": 117,
  "head": "9bc5b8b0e6430bc18230ea0c9cff1e2b8a9841c0",
  "version": "0.2.35.0",
  "base": "main",
  "gate": {
    "tests": {
      "pass": 5694,
      "fail": 0,
      "skip": 6
    },
    "package": {
      "pass": 1059,
      "fail": 0,
      "skip": 10
    }
  },
  "session_kind": "interactive",
  "pregate": "warn @b9a6b26b4ae8 (6 checks, current for 9bc5b8b0e643)",
  "issues": {
    "fixes": [],
    "refs": [],
    "flakes": []
  }
}

Summary

Cycle 0049's third and last pull request (Refs #107; PR-A #113 and PR-B1 #116 merged before it). A test replay now shows the source that executed at the selected moment, with the native debugger at that same moment, and no move ever puts two moments on the screen.

  • Recorded-source tab (Design 4, DS5). One Codebook-owned document per test replay, Captured-<file name>, holds a verified stop's sealed source with the stopped line highlighted and labelled Recorded: <path>:<line> · <t> s. The replay debugger's thread reads Recorded test stop <n> · <path>:<line> and its frames open the tab. At an output, at the result and at an unverified stop the tab holds the 4A placeholder, written as comments so the editor reports no problem for it. A stop in a file with another name renames the tab; every other slot tab closes after a slot shows, and returning to Live or opening another saved study closes it. A tab that cannot open shows a Study row with Retry and writes an Output entry.
  • Selection order (EN8, EN9). Each move leaves the earlier moment on the debugger and the tab first, confirms the new bytes in the tab, presents the debugger at the tab, then commits the line, label, Study position and Application output together; the reader position is written after the commit. A moment without a stop always empties a running debugger, so a stop an overtaken selection presented never stays beside it (Step 11's P1).
  • Timeline and pacing (E1, DS11). The slider marks the range from the first to the last event as unrecorded with a tick per verified stop (one drawing shared with the browser transport, its golden DOM identical), and Play waits at most 1.5 s per event without pausing or asking across an unrecorded interval.
  • Fixes found while shipping: orphan slot tabs after an overtaken or failed rename (F163), two pnpm health findings in the Study client (F177), the slot's failure row after Live (F164), the stale debugger stack after a quick reversal (F193), Retry during a browser replay (F194), and a test's teardown race (F195).
  • Documents: the extension README's recorded-source tab, slider and Play paragraphs; the root README's status; AGENTS.md's Stage-1-only pre-gate rule (owner, 2026-10-22).

Screenshots

From the source-slot spike in the macOS Space (candidate c66e3f6, before the later review fixes; saved test replays recorded through Codebook's tools without a chat). Motion and the region-2 comparison are N49's, after this merge.

VS Code 1.142.0: stop 2 in Captured-utils.test.ts with its label, the debugger thread Recorded test stop 2 and the recorded values

Cursor 3.26.13: stop 1 in Captured-utils.ts with its label, the debugger thread Recorded test stop 1 and amount = 1575

VS Code: an output moment, the tab holding the placeholder comments and the Call Stack reading Not recorded at this moment

Test Coverage

CODE PATHS (slot, selection, timeline)                       USER FLOWS
[+] showNodeSourceSlot / closeNodeSourceSlotTabs             [TESTED] stop -> slot + debugger frames
  ├── slot name/uri (stop, placeholder, rename)  TESTED      [TESTED] output and result placeholder
  ├── sweep: rename, overtaken, failed, retire,              [TESTED] rename + earlier tab closes, group kept
  │   another replay's tab                       TESTED      [TESTED] overtaken selections, quick reversal (F193)
  ├── nodeSourceSlotColumn leftover-tab group    GAP         [TESTED] open failure + Retry, bound timeout
  └── retire clears the failure row (F164)       TESTED      [TESTED] Live closes the slot (stop, placeholder)
[+] presentNodeHistoryDebugger                               [TESTED] Retry during a browser replay (F194)
  └── non-stop moment empties the debugger       TESTED      [GAP] verified stop x Retry; placeholder x Retry,
[+] projectNodeHistoryTimeline / Play dwell      TESTED            rename, overtaken; failed open x overtaken
[+] studyHtml coverage strip helpers             Reader DOM  [GAP] provideSource for an unowned slot URI
COVERAGE: 27/30 paths with a test (90 %) | value-weighted 27/30 (90 %)

Tests: 5,700 suite tests at the final head (pnpm test; the base's count was not measured in this invocation).
Coverage: 90% value-weighted (90% including 0 weakly covered paths).
Test value: 8 tests written, 1 rejected by the authoring gate, 0 existing tests extended, 0 paths weakly covered.
Regression proof — fails at HEAD · passes after fix: F163 (3 tests), F164, F193, F194 (each shown red before its fix).
Tests ran: tests count unavailable (runner summary: 5,700 tests, 5,694 passed, 0 failed, 6 skipped)
Tests ran: package count unavailable (runner summary: 1,069 tests, 1,059 passed, 0 failed, 10 skipped)

Pre-Landing Review

/ship ran three fixing cycles and stopped with converged:false (the owner's order: the open Critical and Major defects are recorded in Issue #107's comment, the last review's critical findings are fixed, and the pull request merges after required CI).

Pass Reviewers Fixed Carried
1 core, 6 specialists, red team, QA F163 (critical, orphan slot tab), F177 (pnpm health) F164 to F176
2 core, 6 specialists (four dispatched again to read the whole diff), red team, QA F164 (Step 7's red test) F178 to F185
3 6 specialists and red team, each reading the whole diff; QA through the recorder none (converged) F186 to F192
4 (Step 11's fixes) reuses pass 3's review of the identical tree; QA on the fixed tree F193, F194, F195 F196 to F202

Gate edits: none detected (38 listed, 26 read; patterns: RH-1,RH-3,RH-4,RH-12,RH-13,RH-14,RH-15,RH-16; unlisted idioms: none)

Outside review: Codex adversarial (gpt-6-astra) completed with one High (the stale debugger stack, fixed as F193) and three Medium (carried F196 to F198); Codex structured review completed, GATE: PASS (two P2, fixed as F193 and F194); Claude adversarial completed (nine findings, its recommendation F193). Step 11.5's binding is mismatched by design: the tree changed after Step 11 with these fixes, and Step 16 and required CI verify the final tree.

Exploratory QA

Functional surface (the workspace and utilities through Node's runner; Reader DOM through its CLI), smoke 5 probes plus the plan checks, in each pass:

  • Pass 1: pnpm health failed with two findings beyond its baseline (F177), fixed and rerun green.
  • Pass 2: the F164 red test reproduced and fixed; the Reader DOM wiki-reader-dom 720 px case failed once (F135, a known flake; this pull request changes no Wiki file) and passed on replay.
  • Pass 3 (1d6c14c): every capture passed through the recorder (verdict pass).
  • Pass 4 (c22dc14, cae9b10): smoke, static gates, pnpm test, Reader DOM pass; pnpm health's coverage run failed one PR-B2 test's teardown (F195), fixed; pnpm health exit 0.

No native editor surface here: native slot placement passed in the spike (Issue comment 6343288678); motion and the chat-driven round are N49's.

Design Review

No frontend files changed by the design lens's scope — design review skipped (the Study webview's coverage-strip drawing moved into shared helpers with its golden DOM identical; Reader DOM checks cover it).

Eval Results

No prompt-related files changed — evals skipped.

Scope Drift

Scope Check: CLEAN

Plan Completion

Plan version 7, PR-B2 items (re-audited after the fixes): 21 items, 14 done, 1 changed (the placeholder and loading text are line comments after the spike), 3 partial, 0 not done, 3 unverifiable.

  • Partial, carried: EN8 step 1's Application loading header at a move; AC6's ownership tests (1 of 2); no unverified-stop placeholder test on the slot and real waits instead of an injected clock for the 1,000 ms bound.
  • Unverifiable here: the spike (PASS in both hosts, Issue comment 6343288678); the documents and version, now in this pull request; N49, which runs after the merge and does not gate it.

Verification Results

Step 8.1 obligations executed in Step 9 and Step 16: format:check, typecheck, lint, health:static, dupes, dead-code PASS; pnpm test PASS (5,700 tests, 0 failed); pnpm test:package PASS (1,069 tests, 0 failed); pnpm health alone PASS (exit 0, score 85 A); Reader DOM five checks PASS; build, package and check-package PASS (VSIX 1,924,738 bytes, SHA-256 4848bda85ebc9c4587db784d69106b888c154229ed462e1e74a0630b6fb7dc1a); pre-gate Stage 1 PASS with one warning (a 10-digit process id in a test title read as a phone number). NOT RUN: N49 (after the merge); Windows and Linux.

Documentation

Scope: reviewed committed, unstaged and selected docs for Cycle 0049 PR B2 (base 60aff4b, head cae9b10), plus the release-metadata edits in the working tree. The kept documents are AGENTS.md, CHANGELOG.md, PRODUCT_GOAL.md, README.md, extension/README.md and the bundled SKILL.md. I also read docs/agents/*.

Result: the 0.2.35.0 CHANGELOG entry covers the recorded-source tab, the native debugger at the selected moment, one moment at a time, the slider's unrecorded span and ticks, and Play's 1.5 s bounded wait. Every user-visible behavior it names has a matching sentence in extension/README.md. Those sentences were already updated, including the numbered walkthrough. The root README.md implementation status already carries 0.2.35.0 and describes the third pull request. AGENTS.md gained the owner's pre-gate rule and has no stale content. The bundled SKILL.md (1.0.46) and the API (1.8) are unchanged, and nothing in the diff affects them. I corrected one stale line, the package:check example filename in extension/README.md (0.2.34 to 0.2.35).

Debt: none found. The CHANGELOG's Not observed section already records what remains unverified: a chat-driven run of this version, motion between moments, and Windows and Linux.

Test plan

  • pnpm test (from extension/): 5,700 tests, 5,694 passed, 0 failed, 6 skipped
  • pnpm test:package: 1,069 tests, 1,059 passed, 0 failed, 10 skipped
  • pnpm health alone: exit 0, score 85 A
  • format:check, typecheck, lint, health:static, dupes, dead-code: exit 0
  • Reader DOM: study-bootstrap, wiki-reader-dom, study-reading-pose, understanding-focus, repository-return pass
  • node extension/scripts/package.mjs and check-package.mjs: pass
  • Required CI on the exact head
  • N49 in VS Code (Copilot Chat, GPT6 Luna) and Cursor (Agent, Grok 4.6 high), after the merge

🤖 Generated with Claude Code

ryota-murakami and others added 14 commits October 22, 2026 22:59
…browser replay's selection order (Cycle 0049, PR-B2, Design 4)

- A test replay's verified stop shows its sealed source in one Codebook-owned
  slot document named after the stop's file (Captured-<basename>); the replay
  debugger's frames open that slot, so no tab per stop is left.
- An output, the result and an unverified stop show the 4A placeholder in the
  same slot; the debugger thread reads 'Not recorded at this moment' and starts
  on it when a replay opens on such a moment.
- Each selection leaves the earlier moment first, confirms the slot's bytes
  before the debugger is presented, then commits the slot's line and label,
  the Study position and the Application view together; the reader position is
  written after the commit.
- A stop in another file renames the slot and closes the earlier tab; leaving
  the replay closes the slot.
- A slot that cannot open is told in the Study pane (String catalog) with Retry
  and one Output › Codebook entry; Retry re-shows the selected moment instead of
  rendering a saved study's source (EN9).
- The debugger thread reads 'Recorded test stop <n> · <path>:<line>' (DS14).
- Existing node-history tests count recorded-stop presentations and invalidation
  deltas, as the debugger now also starts on the 'Not recorded' thread.
…bound for test replays (Cycle 0049, PR-B2 timeline part)
…source views and the recorded-source slot (dupes)
…text are line comments, so the editor reports no problems for them (source-slot spike, VS Code)
…st replay (extension README); the owner's Stage-1-only pre-gate (AGENTS.md)
… slot's group before that tab closes, so a group the slot alone filled is never removed (OCR review); removal tests wait for the open's own publish
…e that a newer selection overtook or whose slot could not open, or a retire during a rename, leaves no orphan slot tab

/ship Step 9 pass 1 (state-machines review, critical): showNodeSourceSlot
overwrote the slot with the renamed URI before it closed the earlier tab,
so a rename overtaken before its open, a rename whose open failed, and a
retire while a rename still opened left the earlier file's slot tab open
with no replay behind it. The slot now closes every unpinned, unchanged
slot tab of this workspace but the current one after it shows, and a
retire closes them all; the renamed slot opens in a group that shows a
leftover slot tab, so closing that tab empties no group.

Tests: three studyWorkspaceTestReplaySource cases fail on the earlier code
(2, 2 and 1 slot tabs) and pass now; isNodeSourceSlotPath's unit test.
Also Step 7's coverage tests: awaitDocumentSettled.test.ts and the slot's
bound case.
…es (EN20, F115)

test:shard --record on 3ed3a39 recorded 5,695 tests (the whole suite passed
under the record's concurrency of 4).
…are drawn by helpers within the CRAP limit

/ship Step 9 pass 1 QA (pnpm health, a CI gate): the shared
renderTimelineCoverage (cyclomatic 11, CRAP 37.1) and
renderTestReplayTransport (10, 31.6) added two crap_moderate findings to
src/ui/studyHtml.ts beyond the measured baseline (the webview client has no
Node coverage, so Fallow's estimate applies). The strip's accessible name
and its drawing move into describeCoverageMarks and drawCoverageMarks, and
the test replay's marks into renderTestReplayTimeline; the file's findings
equal main's (10). Reader DOM study-bootstrap (205, the transport's golden
DOM included), study-reading-pose and understanding-focus pass.
…slot's row with it

/ship Step 9 pass 2 (Step 7 pass 2's red test; F164): after a slot that
could not open, a return to Live closed the slot tab but kept the Study
pane's history-source row and its Retry, which named the replay the
learner had left. retireNodeHistorySelection now deletes that row.

Tests (Step 7 pass 2, committed with the fix): returning to Live after a
failed slot open leaves no failure row (fails on the earlier code with one
row left), a slot tab of another replay closes when the open replay shows
its slot, and returning to Live from a placeholder moment closes its slot.
…ebugger, and Retry during a browser replay keeps that replay's own path

/ship Step 11 (Codex adversarial P1 with the Claude adversarial review and
the Codex structured review): returning to the committed moment without a
stop while a newer selection was still presenting a stop skipped the leave,
and the non-stop branch presented nothing to a running debugger, so the
overtaken stop's stack and values stayed beside a moment that recorded none
(4A). That branch now invalidates a running debugger. Codex structured P2:
Retry while a browser replay held the reader re-selected the test replay
chosen before it and put its stop on the shared debugger; Retry re-selects
a test replay's moment only when no browser replay is active.

Tests: "returning to the shown output while a stop still presents leaves the
debugger on no stop" (1 invalidation instead of 2 before the fix) and
"Retry during a browser replay presents no stop of the test replay selected
before it" (a second stop presentation before the fix).
…s before the harness removes its folders

pnpm health's coverage run (pass 4 QA) failed this PR-B2 test with ENOTEMPTY:
the held reader-position write was released at the end of the test body and
never awaited, so harness.close() removed the history folder while the
write still landed in it. The write is now released in finally and every
held write settles before close; the test's assertions are unchanged.
Cycle 0049 PR-B2: the recorded-source tab, the debugger at the selected
moment, moves that never show two moments, the slider's unrecorded span and
Play's bounded wait. The README states the delivered version and the third
pull request; the extension README narrows the tab's rename and close to what
the slot does (a file with another name; Live or another saved study) and
names the package:check file of 0.2.35.

Co-Authored-By: Claude <noreply@anthropic.com>
@ryota-murakami
ryota-murakami merged commit c0487de into main Oct 22, 2026
24 checks passed
@ryota-murakami
ryota-murakami deleted the codex/cycle-0049-pr-b2-recorded-source-and-transitions branch October 22, 2026 17:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant