Skip to content

v0.2.34.0 feat: the recorded test output in the Application pane and the rebuilt test replay section (Cycle 0049, PR-B1 of 3) - #116

Merged
ryota-murakami merged 15 commits into
mainfrom
codex/cycle-0049-pr-b1-test-replay-output-and-summary
Oct 22, 2026
Merged

ryota-murakami merged 15 commits into
mainfrom
codex/cycle-0049-pr-b1-test-replay-output-and-summary

Conversation

@ryota-murakami

Copy link
Copy Markdown
Contributor

Summary

Cycle 0049's second pull request (PR-B1 of 3, Issue #107): a saved Vitest test replay shows its recorded test output in the Application pane, and the Study pane's Test replay section is rebuilt around the selected moment.

  • Application pane (Design 3, E2, EN3, EN10, DS20). One document per replay, updated in place by posted moments with a generation: header Recorded test output · <t> s over the test's file and title path, [stderr] marks, terminal, C1 and bidirectional controls removed, the Node inspector's own lines folded into one muted count (Node 24's included), the last 65,536 code points with the count of what was left out, the verdict or the ended-early line. It follows the latest output until the learner scrolls up (Jump to latest), keeps scroll position, selection and focus across moments, and keeps the follow choice and latest moment in webview state, written at most once per 500 ms. Moving through a long output costs about its kept tail: the index keeps an unfinished line once, assembles the tail linearly and is projected once per shown moment.
  • Study section (Design 5, DS3, DS12, DS16, DS21). Status, the selected moment with its saved explanation, the not-recorded lines, a sticky transport with Previous stop / Next stop first, the learning material drawn by the browser replay's shared sequence renderer with the selected step (aria-current="true") and Same recorded moment, events in a collapsed list, and The Application pane is closed. with Show recorded output, which opens the pane again at the selected moment.
  • Version 0.2.34.0. MCP API 1.8 and skill 1.0.46 unchanged; no stored format change.

Delivery state: /ship did not converge. Its three fixing cycles each found and fixed real defects (pass 1b: 3029b7d, 602a0fc; pass 2: 9bed4ac; pass 3: 5359c28), so it stopped with converged:false. Under the owner's order this pull request merges after required CI, with the open Critical and Major defects recorded in the Issue (comment "/ship for PR-B1 stopped unconverged") and every other finding carried there as a task (F105 to F154). Step 11's adversarial reviews found a P1 (F134, memory exhaustion on output without line feeds, measured 25 to 331 MiB), fixed with F107, F108 and F111 and two Medium findings in ef39b3e; Steps 9 to 11 were not repeated (the fixing cycles are spent), and the review records do not bind to one tree (Step 11.5 mismatch). The final tree is verified below and by required CI.

Not observed natively. No native run of this version yet: the recorded-source slot, the transitions and the native round N49 in VS Code and Cursor come with PR-B2. Browser QA (Reader DOM) proves no native pixels.

The Study pane's Test replay section at a stop: status, locator, saved explanation, transport with Previous stop and Next stop first, and the learning summary's sequence

The Application pane's recorded test output at the result: header, test path, the output region and the verdict, with Jump to latest

Both from the Reader DOM check's fixture (a neutral job scheduler test), in Chromium.

Test Coverage

  • Step 7 coverage audit: value-weighted coverage 80 % (69 of 86 paths, target 80 %), after its second generation pass (D22, D23).
  • Each fix of the three Step 9 passes and of Step 11 has a test that fails before the fix (red runs recorded in the Issue and the ship record): 26 unit and workspace tests and 11 Reader DOM cases since pass 1b.

Pre-Landing Review

Pass Findings Fixed Carried
1b (6 specialists, red team, QA) 69 34, with the QA critical (Show recorded output) and 5 state-machine wrong rows F125 to F135
2 32 22, with pnpm health's 15 findings beyond its baseline (a CI gate) and a wrong row F136 to F139
3 61 9 (an opening state ended by a background render, an OSC ended by U+009C, the state-write interval test) F140 to F148; most of the rest are untested state-machine cells
Step 11 (Claude, Codex adversarial, Codex structured) 2 Medium, 6 Low; 4 Medium; 1 P1, 2 P2, 1 P3 P1 F134 with F108, F107, F111 (measured), the Medium marker regression and Node 24's inspector lines F149 to F153; F106, F109, F114 already carried

Gate edits: 31 listed, 11 read, 0 findings (the RH-1 hunk is added test cases; the other read hunks move assertions to the Application pane's output or replace an interim-sentence test with stronger String-catalog tests).

Exploratory QA

Functional QA per pass: the Show recorded output and Focus application probes (failing in pass 1b, passing since 3029b7d), the PR-B1 unit files, the static checks; pnpm health exit 0 on 5359c28 (5,657 tests, 0 failed, no finding beyond the measured baseline).

Plan Completion

Plan version 7 (Issue #107): C49-3 (recorded test output, AC5), C49-5 (one summary renderer with the selected step, AC7), C49-8 (the Reader DOM cases, red first) and the Study-section half of C49-6 are delivered here; C49-4 (recorded source, 4A and gap marks) and C49-9 (N49) come with PR-B2. Partial and not-done items of the audit are tasks F115 to F124.

Issues

Refs #107

Verification Results

On the final head 000e566 (tree 70621f47bf6f), macOS 26.7.1 arm64, Node 24.21.0, pnpm 12.4.2, from extension/:

Check Result
pnpm test 5,662 tests, 5,656 pass, 0 fail, 6 skipped
pnpm test:package 1,069 tests, 1,059 pass, 0 fail, 10 skipped
pnpm health (alone) exit 0; measured suite 5,662 tests, no finding beyond the measured baseline
format:check, typecheck, lint, health:static, dupes, dead-code exit 0
Reader DOM, five checks pass on ef39b3e (study-bootstrap 203 cases with this PR's red-first cases); the later commits change documents, versions and one comment
node --test .codex/restore-product-context.test.mjs 6 of 6
pre-gate Stage 1 (--stage preflight) pass, secrets clean over 6,984 added lines; Stage 2's tests are left to the local run above and required CI (the owner's direction of 2026-10-22)

Load-dependent failures met on the Mac while the load average was 15 to 118, in files this PR does not change, each passing alone: F4, F5, F6, F135, F154 (Issue tasks).

Documentation

Status: updated. Three factual corrections in extension/README.md; no blockers.

Audited scope: base 068fec6b to HEAD 3cbde22 on codex/cycle-0049-pr-b1-test-replay-output-and-summary (14 commits, 49 files; candidate c49-prb1-docs-220222, all 54 recorded hashes matched, nothing staged, unstaged or untracked). Docs: AGENTS.md, CHANGELOG.md (0.2.34.0 entry, read only), PRODUCT_GOAL.md (learning replay contract, read only), README.md, docs/agents/domain.md, docs/agents/issue-tracker.md, docs/agents/triage-labels.md, extension/README.md, extension/skills/codebook/SKILL.md. The changed source was read where needed to check the claims: the Study section and Application pane wording and the transport markup.

Documentation health:

  • extension/README.md: Updated. The package check example now names codebook-0.2.34.vsix; it said 0.2.33, while the package command writes codebook-<manifest version>.vsix. The Recorded walkthroughs section now names the line Recorded source unavailable for this stop., because the captured source unavailable label this PR removed is gone. The Test replay paragraph now says Previous stop and Next stop come first in the transport, and adds the 0.2.34.0 entry's limit that a pane Show recorded output opens again can open beside the source.
  • README.md: Current. It names 0.2.34.0, PR v0.2.33.0 feat: a Vitest test run the chat explained becomes a saved test replay (Cycle 0049, PR-A of 3) #113 as the delivered 0.2.33.0, and the three-PR plan.
  • AGENTS.md: Current. The new owner rule and the Agent skills section match docs/agents; all five triage labels exist on GitHub.
  • docs/agents/*.md: Current. They are new, reached from AGENTS.md, and gh 2.103.0 has --parent and --add-sub-issue.
  • CHANGELOG.md: Current, not edited. The 0.2.34.0 entry matches VERSION, extension/package.json, EXTENSION_VERSION and the package test. Each behavior the entry names now has a sentence in the packaged README, and every quoted string matches the source.
  • PRODUCT_GOAL.md: Current, not edited. The recorded test output is labeled as recorded, and Source and debugger not recorded at this moment. matches 4A.
  • extension/skills/codebook/SKILL.md: Current. Skill 1.0.46 is unchanged and holds no Application or Study pane claim.
  • TODOS.md: Skipped (no file).

Documentation coverage (debt, not filled):

  • Application pane recorded test output: reference yes (extension/README Test replays), how-to yes (Quick start step 5), tutorial no, explanation no.
  • Study pane Test replay section and Show recorded output: reference yes, how-to partial (Quick start step 5), tutorial no, explanation no.
  • Common gaps the CHANGELOG entry does not name: No saved explanation for the result., Output up to this moment is in the Application pane., No learning summary was saved for this test replay., the Application pane's Loading recorded test output…, No test output recorded up to this moment., No test output recorded. and its footer, the cut line's ; the first line below is cut ending, and the transport that stays in view while the summary scrolls.

Diagram drift: none. No architecture diagram names a changed module; the file tree in docs/agents/domain.md is a generic example.

Banned terms: none (the repository keeps no list). Closing keywords: none in the added doc lines.

Test plan

  • pnpm test, pnpm test:package and pnpm health on the final head (above)
  • Reader DOM five checks, with the new cases failing first under red
  • Required CI on the exact head
  • N49 native round in VS Code (Copilot Chat, GPT-6 Luna) and Cursor (Agent, Grok 4.6 high), with PR-B2

…y's selected step (Cycle 0049, PR-B1)

The Application pane is now a test replay's one output surface (Design 3):
one document per history, updated in place for each later moment, with
the header `Recorded test output · <t> s` over the test's file and title
path, `[stderr] ` marks, terminal and bidirectional controls removed, the
Node inspector's lines folded into one muted line, the last 65,536 code
points kept with the count of what is left out, the verdict at the result
and the ended-early line otherwise. It follows the latest output until the
learner scrolls up, and Jump to latest follows again.

The Study pane's test replay section is reordered (DS16): status, the
selected moment with its explanation in one polite live region, the
not-recorded and unavailable-source lines, the sticky transport with
Previous stop and Next stop first (DS12), the learning material drawn by
the browser replay's sequence renderer with the selected step marked and
the other steps of its moment reading `Same recorded moment` (Design 5,
DS21), and the events in a collapsed list with humanized rows.

Tests: output utilities, the Application document and its hostile markup,
the section projection, stop moves, the workspace's in-place updates and
stop navigation, the viewport's restore copy, and the Reader DOM case over
both documents (keyboard path, three widths, an in-place update keeping
scroll, selection and focus), red first on main's build. The browser
replay's Learning summary markup is identical to its golden copy taken
before the renderer was shared.

Refs #107
…zes the Application pane (Cycle 0049, PR-B1)

The document looked up each kept line with a query over the whole output,
so an update of a replay whose kept tail held 32,768 short lines took
3.5 s in Chrome (local OCR review, critical: the pane hangs at every step).
It now lists the kept lines by number once per update (61 ms for the same
update). The Reader DOM case of a 32,768-line update fails on the earlier
document (over 1 s) and passes on this one.

Refs #107
…e (Cycle 0049, PR-B1)

The script test that keeps every file the Reader DOM check reads beside
the script did not list the golden markup fixture this pull request reads
the same way (new URL relative to the script), so /ship's pre-gate failed
on it. The list now names it, and the test carries its value card. The
32,768-line update case states why its time bound is no speed claim.

Refs #107
…e Study section (Cycle 0049 PR-B1)

- Show recorded output and Focus application open a closed Application pane
  again at the selected moment (was Restore, which failed with "The three
  retained Study panes are unavailable."; QA critical).
- A learning step id `__proto__` keeps its action label (own data properties;
  the client reads own labels only).
- The chosen step commits with the selection: a refused or failed selection
  keeps the learner's step, and a seek, Play or Inspect onto another event
  shows that event's first step.
- The Application document keeps its follow choice and its latest view with
  the replay they belong to: another replay starts following, and a document
  the editor loads again shows the latest moment.
- The retired replay's output index is released; the restore copy is written
  only when a replacement panel needs it; step labels use one Map.
- Dead `state` field, unreachable status branch and stale docs removed; the
  end tolerance is a named constant.
…rly line (Cycle 0049 PR-B1, Step 9 red team)

The Application pane read the last event of a history this window is
still recording as an early end. projectNodeTestApplication now takes
the history's status and gives the ended-early line only to a history
that has stopped recording.
…le 0049 PR-B1)

- pnpm health failed with 15 findings beyond the measured baseline: the
  test replay's client renderers (transport, playhead, lines, events,
  event row, Inspect) and installNodeTestOutput are split into small
  helpers, each at most cyclomatic 9 (installNodeTestOutput itself 4).
- The Application document wrote its whole view into webview state at
  every moment (20 a second during Play); writes are now joined, at most
  one per TEST_OUTPUT_STATE_WRITE_INTERVAL_MS, the learner's own follow
  choice at once, and the last moment when the document is left.
- A move back to a shorter moment no longer turns following on: the
  scroll clamp is the document's own.
- stripTerminalControls removes DEL, the C1 controls and the 8-bit CSI.
- selectNodeHistoryEvent takes the step choice as an argument; dead
  inputs and stale docs removed; projectNodeTestApplication uses the
  selected entry.
- Tests: restore copy cleared by another history, Focus application in a
  browser replay, a failed or overtaken step action, a background render,
  another replay's document, and five Reader DOM cases (closed pane row,
  older kept view, state writes, shorter moment, reload not following);
  each fails before its fix.
- A test replay that is opening reads as loading by its own marker, not
  by the loading flag a background render shares: a render that settled
  in the middle of an open made the Application pane say "No test output
  recorded up to this moment." of a replay whose first moment was still
  being shown. The open ends its marker before its last publish and
  publishes once more when a render already ended the loading state.
- stripTerminalControls recognizes the 8-bit OSC (U+009D) and the 8-bit
  string terminator (U+009C): an OSC ended by U+009C swallowed the text
  and line feeds printed after it.
- seconds() reads MILLISECONDS_PER_SECOND; two docstrings name their
  real meaning and callers.
- Tests: a render that settles while a test replay opens, an OSC ended by
  U+009C and an 8-bit OSC, and a Reader DOM case for the state-write
  interval with held timers; each fails before its fix.
… cost and memory (Cycle 0049 PR-B1)

- F134 (Codex structured review, P1, measured: 25 to 331 MiB): an
  unfinished output line is kept once, as chunks shared by the entries
  that continue it, not as one growing copy per entry.
- F107, F108: the kept tail is assembled linearly from the end with each
  line's cost read from the index, and a long line is cut from its end
  only (cutTextToTail and the unfinished line's chunks).
- F111: the Application view is projected once per shown moment; every
  250 ms refresh assembled the tail again (about 0.5 s for 65,536 short
  lines, measured).
- The opening marker of a test replay open is set inside its try, so a
  first publish that throws no longer leaves every later moment loading
  (a regression of 5359c28).
- Node 24's inspector help line and its "Debugger ending on" line are
  folded with the other inspector lines.
- Tests: one copy of an unfinished line, the tail's cost for 262,144
  short lines and an 8 MiB line, the view reused for an unchanged moment,
  a failed first publish, Node 24's inspector lines; each fails before
  its fix.
…rreversible steps for the owner; installed skill names (Step 11 review)
…on pane and the rebuilt test replay section (Cycle 0049, PR-B1 of 3)
…unverified-stop line, the transport order and the reopened pane's limit)
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