Skip to content

Cycle 0055: Codebook's Activity Bar generates, opens and updates the LLM Wiki, re-proven natively in both hosts #132

Closed

Description

@ryota-murakami

Outcome

From Codebook's Activity Bar entry, a learner in a repository that has no LLM Wiki can generate one, follow its progress and open the finished Wiki in the browser. In a repository that has one, the same entry opens it and updates it. The whole Wiki feature area is then proven natively again, in VS Code and in Cursor:

  • generation through the bundled skill;
  • the reader's chapters and outline;
  • repository Q&A;
  • citations into the active editor;
  • update and freshness;
  • the ? shortcut list.

This is a feature cycle. It follows bug-fix Cycle 0054 (#130, PR #131, 601f3827, v0.2.44.0), which closed with nothing carried.

  • Learner. Today, in a repository with no Wiki, Codebook: Open DeepWiki in Browser and Codebook: Update LLM Wiki only say Codebook found no LLM Wiki in <folder>. Ask the editor chat "/codebook Generate the LLM Wiki for this project", then update it. (extension/src/extension.ts:1476). The Activity Bar's codebook container has no item for the generated Wiki at all. After this cycle, an LLM Wiki view in that container shows the Wiki's state and offers Generate LLM Wiki, Open in Browser, Update LLM Wiki and the output folder's Change location.

  • Agent. A generation started from the entry reaches the editor agent the way an update does: a chat session of its own in VS Code, the Cursor Agent CLI in Cursor. It carries a project-bound request that runs the bundled skill's DeepWiki procedure (extension/skills/codebook/SKILL.md:51), and needs no runtime MCP connection.

  • Engineering. One run lifecycle covers generate and update:

    • start checks;
    • the marker that keeps a second window from starting a run;
    • progress, Cancel and the time bound;
    • the end classification.

    Generation is a new kind of run in it, not a second pipeline.

Gap audit (all 13 rows, baseline 601f3827)

The previous full audit is #128's (baseline 83a07385). Since then:

  • Cycle 0053 changed node-test's Vitest root;
  • Cycle 0054 changed node-test's early-exit wording, help and skill (1.0.48), the root-claim re-check and the native-trial bootstrap.

No other row's code changed. Native evidence comes only from the macOS Space local:codebook-qa, on nextjs-dashboard 1936e41, in VS Code (Copilot Chat, GPT-6 Luna) and Cursor (Agent, Grok 4.6 High). It is development evidence and fills no final row.

Row (a) Implementation (b) Proof (c) Next action
AC-LIVE Match, narrow. Two profiles: repository-browser (Next App Router at the root) and node-test (Vitest 4+, root or package). N54 PASS in both hosts on 82753fcf (#130); later commits change wording and seams only (#130's closing comment). Later: other execution forms (Node server first).
AC-SAVE Match. N54 in both hosts (#130). Regression in N55.
AC-REPLAY Match. N52 pt1 and pt2 (#124); N54 node-test replay stepping (#130). Regression in N55.
AC-GAPS Match. N50 F204 in both hosts. Regression only.
AC-LEARNING Minor mismatch: the PNG's per-step I understand this step is absent (E8, #122). N49, N50. Later candidate.
AC-WIKI Match, with limits. Generation is skill-only (skills/codebook/SKILL.md:51-116); the reader has Q&A (deepWikiReader.ts). Stale. The last fidelity trial was in Cycles 0044–45 (#85). N48 (#105) only opened the reader. This cycle: native fidelity trial N55 in both hosts.
AC-WIKI-UPDATE Mismatch: Codebook's entry cannot generate a first Wiki (extension.ts:1476, refuseStart with site: 'missing'). PRODUCT_GOAL's Generate row requires "From normal chat or Codebook's Wiki entry". Update and freshness exist. No recent native proof. This cycle: generation from the entry, then native proof of generate, update and freshness.
AC-SOURCE-LINKS Match: links rebind to the active host, with containment and drift checks. Stale (N48-2). This cycle: in N55, follow a citation into each host.
AC-ENTRY Mismatch (both parts close this cycle). The codebook container's views are codebook.repositoryWiki (repository articles, repositoryReader.ts:196) and codebook.learningOutline. Neither reaches the generated DeepWiki site, which only Command Palette commands open. Two Activity Bar containers share one icon (package.json viewsContainers.activitybar: codebook and codebookLearning, both src/assets/book.svg). N50 F208/F209. This cycle: an LLM Wiki view in the codebook container, and a distinct icon for the codebookLearning container (CEO decision 15).
AC-DESKTOP Match at D034 on macOS, both hosts. macOS only. The per-system cycle that goal v10 owes.
AC-SHORTCUTS Partial: no contributes.keybindings (0 entries). The ? list exists in the Study pane and in the served Wiki. No native video since Cycle 0049. This cycle: N55 checks the Wiki's ? list natively. Later: assigned keybindings.
AC-SKILL Match after Cycle 0054 (skill 1.0.48). Loaded-versus-bundled identity never recorded. This cycle: N55 records the loaded skill identity in each host for the Wiki route.
AC-REAL-PROJECTS Large mismatch. No profile for a Node server (P07 Express, P08 Hono), Chrome MV3 (P06, P07), a Vite or Expo web UI (P02/P03/P05 Examples, P07, P08), the Pages Router (P01), or Node Examples. Development target only; package node-test is headless on pinned clones (#128). Next cycle: Node server profile (O2).

Largest gaps, ranked.

  1. Execution-form coverage (AC-REAL-PROJECTS, AC-LIVE). Seven or more projects have a form that cannot run, and each new form unlocks 2–6 project-host rows. No such form has a native development trial: nextjs-dashboard has no standalone server, extension or Vite UI, and AGENTS.md keeps editor trials on it.
  2. The Wiki feature area. It has an implementation mismatch (no generation from the entry, no Activity Bar route to the site) and its proof has been stale for about ten cycles. The area covers G02 in all 18 project-host Wiki assessments of final acceptance.
  3. Per-system and install evidence (AC-DESKTOP, AC-SKILL).

Selected increment (Working loop, step 2)

  • AC IDs.

    • Primary: AC-WIKI-UPDATE (Generate from Codebook's entry) and AC-ENTRY (the Activity Bar reaches the Wiki).
    • Proof refresh: AC-WIKI, AC-SOURCE-LINKS, AC-SHORTCUTS (Wiki ?), AC-SKILL (Wiki route identity).
    • Regression: N54's saved replays (history unchanged, open and step) after a Wiki generation and update (AC-SAVE, AC-REPLAY, limited to task 6 step 7).
  • Value hypothesis. After the code changes, a learner can check again, quickly and with correct citations, how the project is built and what a code path does, without starting the application or a debugger. N55 step 5 tests the "after a change" part.

  • Why now, ahead of the Node server form (O1).

    • It closes two implementation mismatches in a feature the PNG's region 3 fixes.
    • Its proof is the most stale of any active row.
    • Unlike any new execution form, it can be proven natively on the development target in both hosts this cycle.
    • It settles the largest unknown that could invalidate later work: whether the Wiki still generates, reads, answers and links natively after ten cycles of other changes. A regression found here is fixed while it is cheap. Execution forms can only be proven headless until Stage 1.
  • Starting action. Bounded experiment E1, before product code moves. In the Space's VS Code and Cursor, on the QA-owned clone of nextjs-dashboard (O4), run the routes the entry will use, with the generate request drafted for buildWikiGeneratePrompt (the implementation uses that text) (Eng decision 87):

    • VS Code: the request in a new Copilot Chat session, as the hand-over sends it;
    • Cursor: the cursor-agent CLI with the runner's own flags (runCursorWikiUpdate.ts:90-102) and the request on stdin. Cursor Agent chat (Grok 4.6 High) runs /codebook Generate the LLM Wiki for this project as a comparison.

    Record:

    • how long generation takes: from the submission (the chat's send, or the agent CLI's start) to the publisher's published answer, with Space clock timestamps. The 30-minute rule uses this same duration;
    • which model ran:
      • VS Code: the chat's model picker label in a frame of the take at submission;
      • Cursor Agent chat: the model picker label;
      • Cursor CLI: the model field of cursor-agent's JSON output, or "not reported";
    • whether the publisher publishes: its JSON answer reads published, and codebook-wiki.json exists afterwards;
    • whether Open DeepWiki in Browser serves the result: the reader's overview page answers in the browser.

    In Cursor, also run the existing Update LLM Wiki browser button once to see which model the CLI agent uses.

  • Expected result. Both hosts publish a navigable Wiki with a manifest (codebook-wiki.json) in under 30 minutes, and the reader serves it.

  • E1's own limit. Each host is observed for at most 60 minutes. A generation that has not published by then is stopped (VS Code: the chat's Stop; Cursor: the Agent's Stop) and recorded as "did not publish".

  • E1 thresholds, set before E1 runs.

    • PASS: both hosts publish within 30 minutes, and the published Wiki passes N55's step-3 content bar (6 of 6 claims correct, the diagram correct).
    • ADJUST: a publication at 30–40 minutes follows the 30-minute rule below.
    • TOO SLOW: a publication after more than 40 minutes, or none within 60 minutes, switches the entry to the hand-off design fixed now:
      • The button is labelled Generate in chat. After the same confirmation (D2), it opens a new chat with the generate request submitted: VS Code's chat through handWikiRequestToChat, or Cursor's Agent chat.
      • Codebook owns no run: no marker, no bound, no Cancel, no row 2.
      • The welcome's third line reads It runs in a new chat session and uses your plan. This view shows the Wiki once it is published.
      • The view shows the Wiki when it next refreshes, through the manifest watcher, and the late-publication notice tells the learner.
      • Rows 2, 2b and 2c keep serving the Update run only.
      • AC 1's hand-over and AC 4's run endings then apply to Update only.
      • The switch is a re-plan, not a pre-approved substitution (Eng decision 83):
        • this Issue records it as an Owner decision, with the changed AC and N55 steps;
        • the hand-off keeps a pending hand-off record per output (the publication identity at the hand-off), so the late-publication notice can fire with no run, marker or Cancel.
      • A mixed result is decided by the slower host, for both hosts, so the entry keeps one design.
  • E1b: a headless sample on a larger repository, in the Space. It runs the same Cursor agent CLI path the entry uses, on laststance/nsx at 0897231 (P07), and records only the duration and whether it published. It informs the bound as a risk and gates nothing.

  • Same quality bar in both hosts. A Cursor Wiki that fails the step-3 bar while Cursor Agent chat (Grok 4.6 High) passes it with the same skill points at the CLI's model. CEO X6 (choosing the CLI's model) then becomes a task of this cycle. Any other failure follows the closure rule.

  • The 30-minute rule.

    • When a generation publishes but takes longer than 30 minutes, the generate bound becomes the longest successful duration across both hosts × 1.5, rounded up to whole 5 minutes, and capped at 60 minutes. That bound is recorded as an Owner decision, and E1 is not run again.
    • A generation that publishes after more than 40 minutes (× 1.5 > 60) is TOO SLOW: the entry switches to the hand-off design (E1 thresholds above).
    • When a generation does not publish, the bound does not change: the generation path is fixed first, as a task of this Issue, and E1 runs again.
  • Falsifying observation. If any of these occurs, this Issue re-plans before the entry change (fix the generation path first):

    • the skill's generation fails or the publisher refuses;
    • the reader cannot serve the output;
    • the Cursor CLI agent cannot run the skill (a missing agent, refused trust, an unusable model).

Alternatives considered (CEO dual voices)

Alternative Gap it closes Cost Why not chosen
Node server profile first (Codex F2) AC-REAL-PROJECTS for P07 and P08 server rows (4 project-host rows) Spike plus a new profile, multi-PR Next cycle (O2). This cycle closes two implementation mismatches in a required feature (G02 in all 18 Wiki assessments), which only a native trial on the development target can prove. Execution forms stay headless until Stage 1 either way.
Two title-bar buttons on an existing view, no new view (Claude F6) Generate and Open entry S No place for state (running, reserved, blocked, outdated), so the learner would press buttons that refuse
Show the DeepWiki site inside codebook.repositoryWiki Entry M That view lists repository articles, a different artifact and lifecycle (PRODUCT_GOAL: replay and Wiki have distinct lifecycles), so mixing them blurs both
Generation in a terminal task instead of a chat (VS Code) No chat dependency M PRODUCT_GOAL makes the editor's agent with the skill the generator (D033), and VS Code has no agent CLI of its own
Lazy or progressive generation, chapters on demand (Claude F7, Codex F3) Time to first useful content L The publisher publishes a whole site atomically, with its journal and lock, by design (Cycles 0046–0048). Progressive publication changes that contract. It is a later candidate.
Hand-off only: the entry fills a chat request and owns no run Simplicity S Loses progress, Cancel and the generated notice. It is kept as the fallback if E1 measures TOO SLOW.

Proposed change

The reviewed Proposed change (1. LLM Wiki view; 2. Generate run; 3. no-Wiki notices; 3b. Names; 4. Documentation) is the pinned comment #132 (comment), because the full plan passes GitHub's body limit (AGENTS.md Where things live). It is part of this body.

Tasks

  1. E1: native generation baseline (the starting action above), in both hosts, before product code. Record the duration, the model, the publish result and the reader result in this Issue. Evidence: E1 result: ADJUST. VS Code published in 34 min 33 s and Cursor CLI in 4 min 14 s, both 6 of 6 claims correct with correct diagrams, and both readers served the result. Bound 55 minutes (O9).

  2. LLM Wiki view (proposed change 1) — delivered in pt2 (ba8fe45a..62f61d86; 74 + 9 tests; N55 steps 1–5b native in both hosts): utils/readLlmWikiViewState.ts, utils/llmWikiView.ts, the viewsWelcome empty state and the X1 tooltip. With host tests:

    • each row, its presence condition, its row click and its inline actions (proposed change 1's tables);
    • row 1 beside a run;
    • each attention cause;
    • the folder and trust rows;
    • loading and error;
    • each refresh trigger, including the trailing debounce and the 30-second poll for rows 2, 2b and 2c;
    • an output outside the workspace, a missing output parent and an output folder deleted while the view is open;
    • the state matrix through the one row function (Eng decision 82);
    • no tree change on an unchanged refresh;
    • each X1 tooltip form;
    • the late-publication notice;
    • the Last generation stopped row;
    • the confirmation (D2);
    • the VS Code status-bar text Watching for the LLM Wiki · Stop watching (D4).
  3. Generate run (proposed change 2) — delivered in pt1, PR v0.2.45.0 feat: Cycle 0055 pt1: Codebook: Generate LLM Wiki writes a project's first LLM Wiki through the editor agent #133 (squash 293ded81, v0.2.45.0): utils/startWikiRun.ts, the runKind marker field, WIKI_GENERATE_TIMEOUT_MS, classifyWikiUpdateEnd's generate end (the new publication identity, then the owner and entry-page checks; freshness reported, not gating) and generate sentences, the run-kind bounds wherever a bound is read, the output's parent folder, Cursor's skill check, the Output record, and codebook.cancelWikiRun. With host tests:

    • a no-Wiki start hands a generate request to VS Code chat, and to the Cursor agent with the generate bound;
    • an existing manifest answers with Update;
    • a start block refuses with its sentence;
    • a second window's marker refuses;
    • Cancel and the bound end the run with nothing claimed;
    • a publication of another checkout fails the run;
    • success shows the notice and refreshes the view;
    • a manifest appearing between the check and the claim gives the offer and releases the marker;
    • a dismissed offer leaves no marker;
    • no chat commands (VS Code) and no agent CLI (Cursor) fail the start with no marker;
    • an older-format marker without runKind reads as update;
    • a generate marker stays live past the update's 15-minute bounds and up to the generate bound, and its reservation lasts the generate bound;
    • codebook.cancelWikiRun during the VS Code chat's first-sign wait aborts the run, with no watch entry shown yet;
    • each generate end sentence;
    • a manifest written without a new publication receipt, a publication whose entry page is missing, and an interrupted publication never report generated;
    • the Output record holds only its allowlisted fields and no seeded secret from the agent's stderr, reply or a chat error reply;
    • a source edited during the run ends generated with the changed-sources notice.
  4. No-Wiki notices (proposed change 3), with host tests for both commands — delivered in pt1, PR v0.2.45.0 feat: Cycle 0055 pt1: Codebook: Generate LLM Wiki writes a project's first LLM Wiki through the editor agent #133 (293ded81).

  5. Docs (proposed change 4) — pt2 adds the LLM Wiki view section, the welcome, rows and attention rows to extension/README.md (b2b9212e); the CHANGELOG entry is written at /ship. pt1 delivered the First LLM Wiki quickstart, the Generate LLM Wiki section, the troubleshooting section, the Cursor model policy, the mixed-version note and the names (PR v0.2.45.0 feat: Cycle 0055 pt1: Codebook: Generate LLM Wiki writes a project's first LLM Wiki through the editor agent #133); the LLM Wiki view's rows and attention rows follow in pt2.
    5b. [x] Activity Bar icon — learning.svg (75ff62e8), package test (ebe47c22), N55 icons in four themes per host. codebookLearning gets its own icon, src/assets/learning.svg: an open notebook with a check mark, a monochrome 24 × 24 SVG with currentColor, like book.svg. A package test pins that the two containers use different icon files, and N55 step 1 compares both icons natively.
    5c. [x] E1b (Selected increment): a headless duration sample on laststance/nsx 0897231, recorded here. Evidence: published in 5 min 27 s (13 pages, 53 sources), E1b comment.

  6. N55: native Wiki trial in both hosts — evidence: N55 result: steps 1–6 PASS in both hosts, step 7 PASS with N55-F4., on the second PR's candidate VSIX (O6). Space local:codebook-qa, in the QA-owned clone of nextjs-dashboard 1936e41 (O4). Order:

    • VS Code runs steps 1–6. Its Wiki and evidence are copied to the Mac and hashed (O4).
    • Its output is then renamed within the clone to .codebook/wiki-vscode.
    • Cursor runs steps 1–6 into a fresh .codebook/wiki, and its evidence is copied and hashed.
    • Step 7 runs.
    • The clone is removed.

    Each host gets its own natural repository question, never asked before (#85, #105, #124, #128, #130). OBS takes are recorded and their frames inspected. Record:

    1. The LLM Wiki view shows the empty state: its welcome text, with the output line and its Change location link. Generate LLM Wiki shows the confirmation, which names the resolved folder and the runner, and then starts generation through the editor agent.

      • Row 2 shows progress with elapsed minutes, and the run ends generated with row 1.
      • Steps to start. The steps from the newly opened folder to the started run are counted and recorded, with any sign-in or CLI setup listed apart. This is the TTHW record; the generation duration is recorded as in E1.
      • A screenshot of the view is taken at the normal sidebar width and at a narrowed one (about 220 px). Every label stays readable and every action reachable.
      • Icons. In each of the four supported editor themes, a screenshot of the Activity Bar shows the codebook icon (book.svg) and the codebookLearning icon (learning.svg) as two different, legible icons.
    2. Open in Browser serves the site. A side-by-side image with the PNG's region 3 is recorded, marking each of these present or absent:

      • repository header;
      • chapter navigation;
      • an article with Relevant source files and inline citations;
      • the on-page outline;
      • at least one diagram;
      • the question composer;
      • Update LLM Wiki beside the freshness state;
      • the output folder with Change location.

      Every element is present. A missing one is a failure (closure rule below).

    3. At least three chapters are opened, including the overview and one module or code-path page.

      • Outline. On one page, clicking two outline entries scrolls to their headings.
      • Content check. Two factual claims per chapter (six in all) are each checked against the cited source by reading it. Each is recorded correct or wrong.
      • Diagram. One diagram is checked: each named participant exists in the source, and each arrow matches a call or data flow read in the source.
      • Not checked. A claim or diagram outside these samples. Any wrong is a failure (closure rule below).
      • Question. A real repository question gets an answer that cites at least one file:line. For that citation:
        • the file exists in the clone;
        • its cited lines contain the code the answer describes (checked by reading the file);
        • clicking it opens that file at that line in the same host, never the other.
    4. ? opens Keyboard shortcuts in the reader. Typing ? in the question box inserts text.

    5. Update and freshness, both ways.

      • Update LLM Wiki on an unchanged source answers that the Wiki is already current.
      • Before the edit, a page that already cites app/lib/data.ts is chosen. If no page cites it, the first file the overview page cites is used instead, and recorded. The SHA-256 of app/lib/data.ts in the manifest's includedSources (.codebook/wiki/codebook-wiki.json) is recorded; it equals shasum -a 256 app/lib/data.ts.
      • A change of meaning, not only of bytes. In the clone, a fact the chosen page states is changed in app/lib/data.ts, for example the page size ITEMS_PER_PAGE or a returned field. The page's sentence that states the old value is recorded before the edit.
      • The browser freshness state, and row 1 after Refresh, both say Source changed · Update available.
      • Update LLM Wiki in the browser (3A) hands off to the agent, which publishes again. The browser freshness state and row 1 then read Wiki source current. The manifest's SHA-256 for app/lib/data.ts equals the edited file's shasum -a 256.
      • The chosen page, and any diagram or answer that states the fact, now state the new value with a citation to the edited lines. A page that still states the old value fails this step (closure rule).
      • The edit is then reverted in the clone.
        5b. Interruption and recovery. In each host a second generation starts in a scratch output folder (codebook.wikiOutputDirectory set to .codebook/wiki-interrupt, restored afterwards) and is interrupted:
      • Cursor: Cancel before publication (no publish lock or journal present when it is pressed) ends the agent, the marker is removed, and a new Generate starts at once. A host test covers an interruption during publication, which leaves a lock or journal: the attention row with Copy recovery request, the refused restart, and a start after recovery (Eng decision 88).
      • VS Code: Stop watching turns the marker into the reservation. The view shows row 2c (Waiting for chat · retry time) with Open Chat, and a new Generate is refused with today's reservation sentence. The learner finds the session in the chat history and stops it there, and the step records what the view and the refusal say.
      • Waiting out the whole reservation is not required.
    6. The loaded skill's identity (path and SHA-256) is recorded for the Wiki route and compared with the skill the candidate VSIX ships, whatever its version.

    7. Regression of saved replays, outside the clone.

      • Saved learning is per workspace, so this check reads the window of the Space's designated checkout, where N54 ran, not the clone. In each host, before N55 and after it, codebook://node-history is read through that window's connection descriptor, with the N54 helper (read-all.mjs).
      • Precondition, checked by the driving agent while preparing N55: the "before" list contains N54's c762e4ea…_273f4157… (VS Code) or fbd584e0…_6cf9fd04… (Cursor). Otherwise the step is BLOCKED, not passed.
      • The two lists compare equal in studyId, status, stopCount, explainedStopCount and materialRevision.
      • Each of the two N54 replays still opens (Open replay) and steps one event (Next event) in its host.
      • The claim is limited to this: the replays' history and their opening and stepping are unchanged. Replay content beyond it is not re-verified.
    • Closure rule for E1 and N55 findings.
      • A failure of steps 1–5 is a failure of this increment's own outcome: a missing element, a wrong claim, a broken citation, a failed generation or update. It is fixed in this cycle, and the failed step runs again in both hosts on the new candidate before merge.
      • A wrong claim records its cause (Eng decision 80):
        • a gap in the skill's procedure (no check that would catch the claim) is fixed in the skill;
        • a model error where the procedure was followed is retried once on the same candidate, and a repeat counts as a procedure gap.
      • Any other defect E1 or N55 finds becomes a task here and follows the feature-cycle rule: a critical one is fixed before merge, the others are carried to the next bug-fix cycle.
  7. E1-F1 (defect, renderer, carried). Two conditional edges between the same pair of nodes in one column draw their labels over each other in a flow diagram (skills/codebook/render-wiki-diagrams.mjs flowSvg, a vertical lane offset of 34 px against ~22-character labels). Source: E1, the VS Code agent's preview at 05:05Z (screenshot SHA-256 fdc11f75…290d). Closes with a renderer fix and a test that fails without it: two branch edges A→B with B below A give non-overlapping label boxes. Not critical, so it is carried to the next bug-fix cycle (feature-cycle rule).

  8. E1-F3 (closed in pt1). The Cursor CLI agent made the empty output folder itself and the publisher's preparation refused it. Evidence: --prepare on an empty pre-existing output folder exits 1 with The prior Wiki has no publication record. Inspect it, then use --prepare with --adopt-existing.; --adopt-existing exits 1 (no manifest); without the folder --prepare exits 0 (publish-wiki.mjs inspectOutput, line 387). Fixed in e30e468: Generate refuses an existing folder without a Wiki before any agent starts (startWikiRun and wikiGenerateFlow tests, red without the fix), and the request tells the agent not to create the folder (ef2498b).

  9. pt1 OCR finding 7 (defect, carried). A Generate pressed while an Update's start checks run (or the reverse) is coalesced into the running attempt and nothing is said (runWikiAttempt, extension.ts). Closes with a sentence for the coalesced press and a host test that fails without it. Low: the modal confirmation blocks the editor's own commands, so only the sub-second start checks are exposed there; the browser reader's Update button can still be pressed during a generation's modal confirmation (/ship pass 1, red team), and joins it silently. Carried (feature-cycle rule).

Carried from /ship review of pt1 (informational defects, feature-cycle rule; the next bug-fix cycle fixes each with a test that fails without it). Records: /ship Step 9 passes 1–2 (see the pt1 PR).

  1. One utility per file (pass 1 M1–M3, pass 2 M6). startWikiRun.ts also holds describeMissingWiki; wikiRunBoundMs.ts also holds longestWikiRunMs and LONGEST_WIKI_RUN_MS; wikiRunRecord.ts also holds agentExitOf; the sentence An LLM Wiki already exists in <folder>. Update it instead? is inline in extension.ts. Closes with one utility per file and the sentence beside describeMissingWiki.
  2. Commands never executed by a test (pass 1 T1, pass 2). codebook.showWikiOutput and the "nothing running" branch of codebook.cancelWikiRun. Closes with host tests (the harness's createOutputChannel stub records show).
  3. Cursor generation's stop and bound have no host test (pass 1 T2). The run's stop and its 55-minute end are covered by unit tests and /ship QA probes only (the VS Code bound got a host test in pass 3). Closes with two host tests.
  4. A test races a 200 ms timer (pass 1 T3, pass 2). wikiGenerateFlow.test.ts "a second Generate while a Cursor generation runs" reads the refusal after a fixed race. Closes by awaiting the refusal.
  5. wikiRunRecord rows (pass 1 T4). No row for already-current, a failed end with site: 'replaced', or an output folder equal to the home folder. Closes with those rows.
  6. Stale "press Cancel" (pass 1 D2). describeWikiUpdate.ts doc comments and its @example still say Cancel for the VS Code watch, which is Stop watching (D4). Closes with the docs corrected.
  7. "cancelled" and "stopped" for one stop (pass 2 D7). wikiGenerateNotice.ts says cancelled in one notice and stopped in its sibling. Closes with one verb per host and a wording test.
  8. A raw cause id in a sentence (pass 2 D8). describeWikiGenerateBlock.ts's fallback shows (<cause>: <path>) to the learner. Closes with a learner sentence and the cause in the Output record.
  9. A failed release is not retried (pass 1 state machines). A release of a generation's claimed marker that fails (startWikiRun.ts after the claim, extension.ts closing-window path) is not retried, so the marker can stand until its bound. Closes by routing it through the marker change's retry.
  10. A taken-over reservation is lost after a skill conflict (pass 2 red team). After Update or Generate anyway took over a stopped watch's reservation, a Cursor skill conflict releases the marker, so the reservation's protection is gone. Closes by keeping or restoring the reservation, with a host test.
  11. The skill step has no bound (pass 2 red team). The managed Cursor skill's verify and deploy run with the marker claimed and no time bound; Stop LLM Wiki Run now says the run is starting but cannot stop it. Closes with a bound (or an abort) and a host test.

Carried from N55 (feature-cycle rule; the next bug-fix cycle fixes each with a test that fails without it). Source: N55 result.

  1. N55-F2 (medium, reader Q&A, VS Code). The first question raises VS Code's language-model consent modal in the editor while the browser reader only says Asking the editor model…. Closes when the reader tells the learner the editor may be asking for permission, with a test.
  2. N55-F3 (low, LLM Wiki view, VS Code). At a watched run's end the TreeView.message disappears ~233 ms (7 frames) before the rows change, so row 2 shows without its message. Closes when the message and the rows change in one render, with a test.
  3. N55-F4 (major, test-replay open, Cursor). Opening a saved test replay from Saved studies was refused twice with Native pane, group or focus changed while presentation waited (the second with no armed events); later selections did nothing at all (no notice, no Output entry) until a window reload. Root cause unknown; closes with the cause, a fix and a test that fails without it.

Carried from /ship review of pt2 (informational defects passes 1–2 answered Skip, and one test defect of the full lane; feature-cycle rule: the next bug-fix cycle fixes each with a test that fails without it). Records: the pt2 PR's review section. Every finding of the third (last) round was fixed in 076ac9f3.

  1. Fixed negative waits (pass 1, pass 2 testing). Two llmWikiView.test.ts tests prove an absence by a fixed sleep (an unrelated file's event reads nothing; no second read after a burst). Closes with a wait on an observable signal of the fake watcher or the debounce.
  2. Sequential fact reads (pass 1 performance). readLlmWikiViewFacts reads the start block, the token, the generation, the owner and the marker one after another. Closes with the independent reads in parallel and a test that the order-dependent ones keep their order.
  3. The poll stops at the error row (pass 1, pass 2 state machines). A read that throws shows the error row, which is no run row, so the 30-second poll stops; with no watcher it was the only trigger. Closes with polling while the error row follows a run row, and a host test.
  4. Reveal Wiki Folder on a remote or missing folder (pass 1 red team). revealFileInOS on a remote workspace or a folder deleted meanwhile does nothing visible. Closes with a sentence for both cases and a host test.
  5. Background work while the view is hidden (pass 1 performance). The poll and freshness checks run while the LLM Wiki view is collapsed or hidden. Closes with no poll while hidden (a read when shown again) and a host test.
  6. Manage-trust lookup (pass 1 simplification). MANAGE_WORKSPACE_TRUST_COMMAND_IDS holds two candidate ids and resolveManageTrustCommand.ts (one caller) probes getCommands. N55 showed VS Code's id works; closes when Cursor's id is recorded, one id kept and the lookup dropped, or the two kept with that evidence.
  7. Naming and repetition (pass 2 maintainability). describeWikiGeneration.ts names the 7-character revision fullRevision; isCursorHost ? 'cursor' : 'vscode' is written seven times in extension.ts; two learner sentences are inline in registerLlmWikiCommands.ts (lines 81, 113). Closes with shortRevision, one host value, and the sentences in constants.ts.
  8. View copy and icons (pass 2 design). Try again uses $(play), and Stop watching and Cancel share $(debug-stop); inline-action titles mix sentence case (Stop watching, Change location) with Title Case; the welcome's fourth line names the setting id in running text; Change location reads as text, not as an action. Closes with a decision per item against the v9 PNG and VS Code's guidelines, and the package test pinning it.
  9. studyWorkspaceRemoval fails under full-lane load (full lane on b36df054 and earlier). It failed once with EACCES while all files ran; alone it passed 10 of 10. Closes with the cause, a fix and a run of the full lane, or evidence that the fault is outside the product's tests.

Dispositioned with evidence, not carried: the freshness check runs at every refresh (pass 1 performance, pass 2 state machines). The plan's Refresh section reads freshness at each refresh on purpose, because source files are not watched; since 076ac9f3 one check runs at a time and requests meanwhile become one re-run (llmWikiViewReadLoop.test.ts).

Acceptance criteria

  1. In a folder with no Wiki, the LLM Wiki view shows the Generate LLM Wiki button, and invoking it starts a run of kind generate that hands a generate request to the host's agent. Proof:

    • a host test: the tree returns no rows, sets no TreeView.message and sets the context key codebook.llmWiki.state to none;
    • a package test: the manifest's viewsWelcome entry for codebook.llmWiki has when: codebook.llmWiki.state == none, a command:codebook.generateDeepWiki link on its own line and the inline Change location settings link;
    • a host test: both hosts' hand-over, which fails without the change;
    • N55 step 1: the rendered button natively.

    The button is a native VS Code welcome button, and its label is its accessible name.

  2. The view shows each row (1, 2, 2b, 2c, 3, 4, 5, the folder and trust rows, the loading and error rows) exactly when its fact holds, in the fixed order, and refreshes on each listed trigger. Each case is pinned by a host test:

    • row 1 stays present, and opens the Wiki, beside row 2, 2b or 2c, so a published Wiki can be read during an update;
    • row 2 carries Stop watching (VS Code) or Cancel (Cursor), Open Chat (VS Code only) and Show Output as inline actions, never as its row click;
    • each of the ten WikiUpdateConflictCause values and a foreign manifest shows its label, its row-click sentence and its actions;
    • row 1's description takes each of the reader's freshness labels, and Checking freshness…;
    • a valid publication during a reservation shows row 1 at once and ends row 2c, as the existing reservation contract ends the wait;
    • a refresh with nothing new fires no tree change;
    • the context key codebook.llmWiki.state takes loading, then none or other.
  3. Generate on a folder that holds a manifest never overwrites it, and offers Update, also when the manifest appears between the check and the marker claim. A dismissed offer leaves no marker. A host test pins each case.

  4. Each of these ends the run without a generated notice and leaves the view in the state it lists, pinned by a host test:

    • Cancel and the bound in Cursor: the agent's process group ends, and the marker is removed;
    • Cancel and the bound in VS Code, also during the chat's first-sign wait: the run ends, the marker becomes the reservation, the view shows row 2c with its retry time, and a new start is refused until the reservation's bound (the generate bound for a generate marker) or until a publication after the watch's end;
    • a late publication: the view shows it as published, and no run claims it;
    • a foreign or unreadable manifest: the run fails, and the view shows row 4 with that cause;
    • every ending other than generated shows row 3, with its cause and Try again;
    • a manifest written without a new publication receipt, or a publication whose entry page cannot be read: the run fails with its sentence.
      5b. Generate always shows the confirmation (D2), which names the resolved output folder and the runner. Change location and dismissing it start nothing and leave no marker. A host test pins this.
  5. Both no-Wiki notices offer Generate LLM Wiki. A host test pins this.

  6. N55 records, in both hosts:

    • items 1–7 and 5b of task 6;
    • each take's SHA-256;
    • the candidate's VSIX SHA-256 and the skill identity;
    • the generation duration and the model.
  7. Each new or changed test states protects=…; fails_when=…; no_claim=…. Changes to existing tests are reported with their reason in the PR.

  8. The 15-check exact-HEAD gate passes on each PR's final tree (AGENTS.md, Commands and checks), in this order:

    • from extension/: pnpm format:check, typecheck, lint, health:static, dupes, dead-code, test;
    • the five Reader DOM checks, each node extension/scripts/<check>-qa.mjs verify <new folder>: study-bootstrap, wiki-reader-dom, study-reading-pose, understanding-focus and repository-return;
    • from extension/: pnpm test:package, then pnpm health;
    • from the repository root: node --test .codex/restore-product-context.test.mjs.

    Required CI passes, and hosted CodeRabbit approves the exact head.

  9. Every user-visible change has a CHANGELOG entry and its sentence in extension/README.md.

  10. The published row's tooltip shows the generation identity in each of its four forms, pinned by a host test (accepted X1).

  11. pnpm --dir extension health:static and pnpm --dir extension health pass against their unchanged baselines. The new logic is in the named utils/ modules.

  12. Every generate or update end writes one allowlisted record to Output › Codebook, never the agent's stdout, stderr, reply or error text, with the home folder shown as ~. Each generate sentence names what was left and the next action. Host tests pin both, the record with a seeded fake secret.

  13. The README has the First LLM Wiki quickstart, the troubleshooting entries and the two titles of 3b. A package test pins the titles.

  14. A first Generate works in a project without .codebook/ and in Cursor without the managed skill. Every bound follows its run kind wherever it is read, a reload included. Generate success does not depend on freshness. Host tests pin each (Eng decisions 72–75).

Testing plan

Layer What Count
Host LLM Wiki view: rows 1–5 with their conditions, clicks and inline actions; row 1 beside a run; attention causes (11: the ten conflict causes and a foreign manifest); folder and trust rows; loading and error; refresh triggers (run, watched files, setting, visibility, poll for rows 2–2c, debounce, silent unchanged refresh); X1 tooltip (4 forms); host-specific welcome; late-publication notice; last-attempt row; confirmation (D2, with the hand-over sentence by run kind); status-bar text (D4); empty tree with no message in the none state; the state matrix through the one row function; an output outside the workspace, a missing parent and a deleted output folder ≥ +40
Package viewsWelcome entries by codebook.host, with the settings link; the two Activity Bar containers' icons differ; the 3b titles +3
Host Generate run: VS Code hand-over, Cursor hand-over and bound, existing Wiki → Update (and the race between check and claim, and a dismissed offer), start block, second window, Cancel (VS Code watch, Cursor process), timeout, late publication, foreign or unreadable manifest, publish lock left behind, no chat commands, no agent CLI, runKind marker compatibility, success notice, a manifest without a receipt, a missing entry page, an interrupted publication, the Output record with seeded secrets (Cursor output, chat error reply before and after the first sign), no .codebook folder (3), Cursor's skill (4), a claim race after the confirmation, a source edited during the run ≥ +36
Unit Generate end sentences of classifyWikiUpdateEnd (6) ≥ +6
Unit/Host Bounds by run kind wherever read: marker expiry and reservation, unreadable-marker grace (the largest bound), the release timer, the last-run record across a reload, the leftover admission, an unknown runKind ≥ +12
Page script The emitted page installer with the shared freshness label: current, changed, unknown +3
Host No-Wiki notices (Open, Update) +2
Unit buildWikiGeneratePrompt (bounded size, matching-manifest rule, no-Git variant, a hostile folder name) +4
Native E1 (both hosts), N55 (both hosts): at least one OBS take per host per run, and more when one take cannot hold a step ≥ 4 takes

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 driving agent re-executes it.

Rollback

Revert the PRs, the second first.

  • Unchanged: the learner's stored data, the MCP API (it stays 1.8) and the Wiki's published format.

  • The run marker gains an optional runKind field. An older Codebook drops the unknown key when it parses the marker, so a marker written by this version still reads as an update run after a revert, with the update's bounds. Two effects follow:

    • Admission timing changes. An older window treats a running generation's marker as expired after the update bound with its grace (readLiveWikiUpdateMarker.ts:112-123), and its reservation after the update watch bound (lines 227–234). It may then start a run while the generation still works. The publish lock serializes publication, not the agents' work, so two agents may use the learner's plan at once.
    • An older window's refusals name an update where a generation runs.

    The README tells learners to update every window of a project to this version before generating, and to stop a running generation before going back to an older Codebook.

  • Renamed: the title of codebook.openDeepWiki (3b). Its id is unchanged.

  • Additive: the view and the commands. The notices change their button.

Effort

Part Estimate
E1 native baseline (both hosts, up to 60 minutes of generation each) 4 h
LLM Wiki view + tests 3 h
Generate run (startWikiRun, the marker's runKind, the bound, classifyWikiUpdateEnd's generate branch and sentences, cancel command) + tests 7 h
Notices + docs 1.5 h
N55 native (both hosts: two generations, an update, content and diagram checks, the replay regression) 6 h
Reviews, gate, CI, CodeRabbit 3 h
Marker bounds by run kind, WikiRunDependencies, the new commands 2 h
Contingency for the closure rule (a failed N55 step re-run in both hosts on a new candidate) 6 h
DX: generate success checks, the attention mapping, the Output record, end-sentence next actions, the quickstart and troubleshooting docs, the renames 3 h
Eng: bounds by run kind wherever read, the output's parent folder, Cursor's skill check, the watcher base, the one row function, the shared label through the page settings 5 h
A second PR's reviews, CI, gate and CodeRabbit round (O6) 3 h

Files

File Change
extension/package.json codebook.llmWiki view in the codebook container, its two host viewsWelcome entries, Refresh title action, inline and context-menu actions (view/item/context); commands codebook.generateDeepWiki, codebook.cancelWikiRun, codebook.refreshLlmWiki, codebook.showLlmWikiAttention, codebook.showWikiOutput, codebook.copyWikiRecoveryRequest and codebook.revealWikiFolder; the 3b titles
extension/src/constants.ts:908-909 (WIKI_CHAT_WATCH_STATUS_TEXT) · Stop watching in place of · Cancel (D4)
extension/src/utils/installWikiUpdateStatus.ts:351-361, extension/src/deepWikiReader.ts:107 The freshness label shared with the view: one exported pure function, passed to the served page through WikiUpdatePageSettings as describeUpdate is. The page installer is serialized with toString() (installWikiUpdateStatus.ts:55-59), so it cannot import the function. A test runs the emitted page script for current, changed and unknown (Eng decision 86)
extension/src/extension.ts (assertWikiOwner 975, inspectPublishedWiki 1002, inspectWikiToUpdate 1453, lookAtWikiStart 1545, updateDeepWiki 1679, command registrations ~2164) Generate run kind; notices with the Generate button
extension/src/utils/wikiUpdateRun.ts (WikiUpdateRun) Run kind generate
extension/src/utils/claimWikiUpdateMarker.ts, extension/src/utils/readLiveWikiUpdateMarker.ts, extension/src/utils/findUnacknowledgedWikiLeftover.ts, the last-run record (rememberLastWikiRun) and the release timer in extension.ts Optional runKind; every bound by run kind (lines 115–116, 234, 341–353; extension.ts:1162-1167, 1584-1592); the output's parent folder before the claim
extension/src/cursorSkillDeployment.ts (verifyManagedCursorSkill, deployCursorSkill) Called before a Cursor run, without the MCP start
extension/src/utils/classifyWikiUpdateEnd.ts Generate end: the new publication identity, then the owner and entry-page checks, with freshness reported but not gating; generate sentences with what was left and the next action
extension/src/utils/describeWikiChatHandOver.ts Its sentence generalized by run kind, for the generate confirmation
extension/src/utils/startWikiRun.ts (new) Kind, bound, existing-Wiki offer, hand-over
extension/src/utils/readLlmWikiViewState.ts (new) The view's state, priority and X1 tooltip
extension/src/utils/buildWikiGeneratePrompt.ts (new) Generate request
extension/src/utils/runCursorWikiUpdate.ts Generalized to runCursorWikiAgent, generate bound
extension/src/utils/llmWikiView.ts (new) Tree data provider; sets the context keys codebook.llmWiki.state and codebook.host
extension/src/assets/learning.svg (new), extension/package.json viewsContainers.activitybar A distinct icon for the codebookLearning container (AC-ENTRY)
extension/src/constants.ts WIKI_GENERATE_TIMEOUT_MS, view and command ids, debounce and poll intervals
extension/README.md, CHANGELOG.md, README.md Docs
extension/src/tests/* Host and unit tests

Out of scope

  • New execution forms: Node server, Chrome MV3, Vite or Expo web, Pages Router, Node Examples (the next cycle, O2).
  • Assigned keyboard shortcuts (contributes.keybindings), a later candidate.
  • Lazy or progressive Wiki generation (the publisher's atomic publish), a later candidate.
  • Per-step understanding (E8).
  • Changing the skill's generation procedure or the publisher, unless E1 or N55 finds a defect. Such a defect becomes a task here.
  • Automatic background regeneration (not required by PRODUCT_GOAL).
  • Native Windows and Ubuntu use (goal v10's per-system cycle).

Owner decisions

  • Standing:

    • The owner's goal of 2026-10-24 and the direction of 2026-10-22: every resource goes to the product; never spend money or break the law.
    • The owner cannot answer, so each decision takes the recommended option, named here.
  • O1 (recommended): this cycle's increment is generation from Codebook's entry plus the native Wiki re-proof.

  • O2 (recommended): the next feature cycle plans the Node server profile (P07 Express, P08 Hono), with a headless spike on pinned clones as in Cycle 0053: a test inside a workspace package runs with that package's Vitest and config #128 (O4 there).

  • O3 (recommended): generation is a run kind inside the existing update lifecycle, not a second pipeline.

    • Why: one marker, one Cancel, one classification, and no duplicated start checks.
    • Considered: a separate generate pipeline, which would duplicate the measured 1,402 lines of lifecycle utils (wikiUpdateRun.ts 332, startWikiChatUpdate.ts 123, runCursorWikiUpdate.ts 195, findWikiUpdateStartBlock.ts 340, classifyWikiUpdateEnd.ts 412).
  • O4 (recommended): E1 and N55 run in a QA-owned clone of nextjs-dashboard at 1936e41 inside the Space: ~/qa/n55/nextjs-dashboard, cloned from the Space's designated checkout.

    • It is the same repository and revision, so no easier target.

    • The Wiki goes to the default .codebook/wiki inside that clone.

    • The freshness edit (task 6, step 5) is made only there.

    • The designated checkout (AGENTS.md, Development target) is not changed.

    • Evidence before cleanup. These are copied to the Mac's ignored artifacts/cycle-0055/:

      • each host's generated Wiki folder (tar), with codebook-wiki.json;
      • the diff of the freshness edit;
      • the agent's reply (the chat transcript export, or the Cursor CLI JSON output);
      • the reader screenshots.

      Each copy's SHA-256 matches on both sides. Only then is the clone removed.

    • Change location is checked by reaching the setting, not by moving the output.

  • O5 (recommended): Generate never overwrites an existing Wiki and offers Update. Regeneration from scratch stays the chat's (/codebook Generate the LLM Wiki …), whose publisher keeps the prior output.

  • O6 (recommended): two PRs, merged in order, each passing its own reviews, CI and gate (AGENTS.md Delivery); the Issue closes after the second. E1 runs before either.

    • codex/cycle-0055-pt1: the run kind with its bounds wherever they are read, the output's parent folder, Cursor's skill check, startWikiRun, buildWikiGeneratePrompt, the generate end and sentences, the Output record, the commands, the confirmation, the no-Wiki notices, the 3b titles and their docs.
    • codex/cycle-0055-pt2: the LLM Wiki view (rows, welcome, the one row function, the watcher), the icon, the remaining docs and N55.
    • Why: the DX and Eng phases grew the cycle well past the CEO phase's estimate, and a smaller PR converges faster through /ship's three rounds and CodeRabbit. This reopens taste decision 18 (Eng decision 77, taste, for the final gate).
  • O7 (recommended): the CEO dual-voice outcome, recorded in the Review record's CEO section (decisions 11–22):

    • E1 thresholds and the hand-off fallback;
    • E1b on nsx;
    • one quality bar in both hosts;
    • Stop watching with guidance in VS Code;
    • host-specific welcome text naming the runner and the plan usage;
    • N55 tests a change of meaning and an interruption;
    • an alternatives section;
    • the value hypothesis;
    • the Activity Bar icon pulled in;
    • the visible-save trigger and the watcher-failure poll cut (taste);
    • the Wiki first, then the Node server (taste);
    • one PR (taste; reopened by Eng decision 77, see O6).
  • O8 (recommended; the owner's standing instruction 「返事ができないので、選択肢はReccomendをpickしてください🙇」): the /autoplan final gate (run codex-cycle-0055-20261026-114235, gate_rev 1) resolved with rec. The plan is approved as-is, and each taste decision takes its recommended option:

    • d6: viewsWelcome on an empty tree;
    • d19: no save trigger and no idle poll;
    • d20: the Wiki entry first, the Node server next;
    • d40: keep the "Repository Wiki" name;
    • d47: keep the modal confirmation;
    • d51: the TTHW target is the current trajectory, measured by E1;
    • d57: keep auto-submission with its disclosure;
    • d59: no generate-bound setting this cycle;
    • d76: mixed Codebook versions stay a documented limitation;
    • d77: two PRs (O6).

    The review record is the /autoplan comment on this Issue.

  • O9 (recommended; the plan's 30-minute rule, E1): E1 ended ADJUST: VS Code published in 34 min 33 s.

    • The generate bound is 34.55 × 1.5 = 51.8, rounded up to whole 5 minutes: 55 minutes, WIKI_GENERATE_TIMEOUT_MS = 3_300_000. Every "of 30", "30 min" and "1_800_000" of the generate run in the Proposed change reads 55.
    • E1-F2 amends the VS Code welcome line 3 and the D2 confirmation: the chat asks to approve its commands and may ask to Continue, so they no longer say "You can keep working". The Cursor text is unchanged.
    • E1 is not run again.
  • O10 (owner, 2026-10-26: 「Agents.mdに関しては読まなくても自動的にコンテキストに入るはずだから、Agents.mdに関しては再度読む必要ないんじゃないかな」): AGENTS.md is not re-read after a compaction unless its text is not in context or it changed on disk. The rule is written into AGENTS.md Mandatory entry 2 and the restore hook.

  • O11 (withdrawn, 2026-10-26): a first /goal text began with 「PRには@coderabbitai ignoreをbodyに記載してGithubのCoderabbitレビューをトリガーさせないでください」. Minutes later the owner set the goal again without that clause, so the clause is read as withdrawn. AGENTS.md stands unchanged: PR bodies carry no @coderabbitai ignore (2026-10-05), and a PR the hosted CodeRabbit reviewed merges only after CodeRabbit approves its exact head (2026-10-23). The goal set again holds: complete Codebook, design increments with /autoplan, merge after CI, the /ship three-round limit, GPT-6 Luna in VS Code, Grok 4.6 High in Cursor, the Codex extension after credit exhaustion, and recommended options.

Later candidates (a short list; no carried defect):

  • The Node server profile (O2).
  • Chrome MV3.
  • Assigned keybindings.
  • Lazy or progressive Wiki generation: time to first useful content (CEO Claude F7, Codex F3).
  • E8.
  • A status bar item for Wiki freshness (CEO X3).
  • A Cursor setting for the model of the Wiki agent CLI, once E1 shows which model the CLI runs (CEO X6).
  • Recovering a stuck publish from the LLM Wiki view (CEO 10x).
  • A setting for the generate bound, if E1b shows that larger repositories need more than the bound (DX decision 59).
  • Live progress of cursor-agent in Cursor's row 2, through a streaming output format (DX decision 61).
  • A command that releases a VS Code reservation on explicit confirmation, warning that two agents may then run (Eng decision 89).

Next action

Pinned by ryota-murakami

Activity

  1. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    Entry (2026-10-26, planning)

  2. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    Re-entry after compaction (2026-10-26, planning: /autoplan Design close)

    • Reads, from disk after this compaction: PRODUCT_GOAL.md in full (goal version 10, all 444 lines); AGENTS.md in full (411 lines); this Issue's body and comments.
    • Image. docs/designs/assets/codebook-product-spec-v9.png, opened with an image tool: 1024 × 1536, 1,878,402 bytes, SHA-256 f189ee82…caf2aa. Regions: 1 (live), 2 (replay), 3 (DeepWiki, with Update LLM Wiki beside freshness and Output Change location) and the shortcut strip.
    • State. Branch codex/cycle-0055 at 601f3827, clean tree, no PR. /autoplan: CEO phase closed; Design phase closing (review input amended with the design accepted block); DX and Eng next. The body still shows the pre-review plan; the reviewed plan is applied when /autoplan finishes.
  3. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    Cycle 0055 plan: Proposed change (reviewed by /autoplan, CEO → Design → DX → Eng, 2026-10-26). This is part of the Issue body, kept here because the full plan passes GitHub's body limit (AGENTS.md Where things live). Edit it as the body is edited.

    Proposed change

    1. LLM Wiki view in the Activity Bar

    A tree view codebook.llmWiki, titled LLM Wiki, in the codebook Activity Bar container, after codebook.repositoryWiki. Its rows come from the same facts the update start reads: readWikiPublishToken (utils/readWikiPublishToken.ts:25), the inspectPublishedWiki closure (extension.ts:1002), wikiLocation() with wikiOutputLabel, and the window's WikiUpdateRun state (utils/wikiUpdateRun.ts).

    Two axes, not one state (Design decision D1). The view shows rows that are each present when their fact holds, in a fixed order. Reading the published Wiki stays possible while a run, a reservation or another window works on it. utils/readLlmWikiViewState.ts computes the ordered rows in one pure function from one state record (folder and trust, this window's run, another window's run, reservation, attention, manifest, last attempt). A table-driven host test covers that state matrix, and the one function keeps the complexity limits met (Eng decision 82).

    Row (order) Present when Label · description Icon Row click Inline actions (also in the row's context menu, for keyboard use)
    1. Wiki readWikiPublishToken and inspectPublishedWiki both answer, and no attention cause makes the manifest unusable (foreign or unreadable) <repository folder name> Wiki · the reader's own freshness label (installWikiUpdateStatus.ts:351-361, through one shared function): Wiki source current; Wiki source current (no Git revision recorded, so added files are not checked); Source changed · Update available; or Wiki freshness unknown: <reason>. While the check runs, the label is Checking freshness…, and the row can still be opened. book codebook.openDeepWiki Update LLM Wiki (refresh) → codebook.updateDeepWiki, hidden while a run row is present
    2. Run this window's generate or update run Generating… or Updating… · Waiting for the chat to start (VS Code, before the first sign), In chat · 12 min of 55 (VS Code watch), cursor-agent · 12 min of 55 (Cursor); the description refreshes each 30 seconds while the row is shown sync~spin none Stop watching (VS Code) or Cancel (Cursor) (debug-stop) → codebook.cancelWikiRun; Open Chat (comment-discussion, VS Code only) → workbench.action.chat.open, so a chat that waits for an approval or never started the skill is one click away; Show Output (output) → codebook.showWikiOutput (Output › Codebook)
    2b. Elsewhere a live run marker of another window Updating in another window or Generating in another window · its start time sync~spin none none
    2c. Waiting for chat a reservation of a stopped VS Code watch (watchEndedAtMs), from any window Waiting for chat · retry after HH:MM (about N min), with the run's start time and host (from the marker) in the tooltip clock none Open Chat (comment-discussion) → workbench.action.chat.open. Its tooltip: Opens the chat view. Find the generation's session in the chat history to stop it. Codebook allows a new start after HH:MM even if the chat stopped earlier.
    3. Last attempt a generate run of this window ended without generated during this session, until the next publication or the next run Last generation stopped · its short cause (stopped watching, stopped after 55 min, no Wiki published, agent exit 1) info codebook.showLlmWikiAttention (shows the full sentence) Try again (play) → codebook.generateDeepWiki, hidden while rows 2–2c or 4 are present
    4. Attention a start block or a manifest that cannot be used cause-specific label (below) · the short cause warning codebook.showLlmWikiAttention (the block's full sentence, and Copy details) cause-specific (below)
    5. Output whenever another row is present, once a folder is open and trusted (in the empty state the welcome's fourth line takes its place) Output: <folder label> · Change location folder none Change location (edit) → workbench.action.openSettings with the argument "codebook.wikiOutputDirectory"
    • Attention causes and their actions.
    Cause (every WikiUpdateConflictCause, utils/wikiUpdateRun.ts:11-21, and the owner check) Label Inline actions
    held-publish-lock, unfinished-publish Publish in progress or stopped Copy recovery request, Refresh
    edited-manifest, unreadable-manifest Wiki manifest needs recovery Copy recovery request, Refresh
    not-a-folder, linked-parent, or a manifest of another checkout (assertWikiOwner) Wiki folder belongs elsewhere Change location
    learner-file, special-file, edited-page, missing-page Wiki files changed by hand Reveal Wiki Folder → codebook.revealWikiFolder, Refresh
    • The row click shows the cause's existing sentence from describeWikiUpdate (utils/describeWikiUpdate.ts), with the paths it names and its remedy, so the view and the browser page say the same.

    • Copy recovery request copies the existing chat request WIKI_UPDATE_RECOVERY_REQUEST (constants.ts:862), which the editor chat runs through the bundled skill. Codebook copies no shell command, so nothing is quoted by hand and the publisher's recovery stays the agent's step, as the update's sentences already say.

    • A host test pins each of the ten causes and the foreign manifest. A cause added later without a row falls back to Wiki needs attention with its own sentence.

    • Start actions are refused, not hidden, when they cannot run. Generate and Update stay available as commands. While rows 2, 2b, 2c or 4 are present, they answer with today's refusal sentences, so the Command Palette behaves as the view does.

    • No folder, or untrusted.

      • No folder: one row, Open a folder to use the LLM Wiki, with the inline action Open Folder → vscode.openFolder with no argument, a documented built-in command that shows the folder dialog.
      • Untrusted: one row, Trust this folder to use the LLM Wiki, with Manage Workspace Trust → the host's manage-trust command. Its id is unverified (workbench.trust.manage; vscode-go calls workbench.action.manageTrust), so implementation confirms it with vscode.commands.getCommands() in both hosts, and a host test pins the id used.
    • Empty state (no manifest, no rows 2–4). The context key codebook.llmWiki.state is none, the tree returns no rows and the view sets no TreeView.message: VS Code shows welcome content only in an empty view, one with no message and an empty tree (VS Code Tree View guide, Welcome content). The viewsWelcome content is static text in package.json, chosen by codebook.host (vscode or cursor), in this order:

      1. Explore this project through source-linked chapters, diagrams and questions, written by your editor's AI.
      2. a Generate LLM Wiki button (command:codebook.generateDeepWiki);
      3. VS Code: It runs in a new Copilot Chat session and uses your chat plan. The chat asks you to approve its commands and may ask you to Continue; keep the Chat view open. (E1-F2) Cursor: It runs through Cursor's agent CLI (cursor-agent), uses your Cursor plan and can take several minutes. You can keep working.
      4. The Wiki is written to the folder the setting codebook.wikiOutputDirectory names (default .codebook/wiki). followed by an inline Change location link (command:workbench.action.openSettings with the setting's id). It is a link, not a button: only the primary action is a button (VS Code Welcome views guideline). The resolved folder itself shows in the confirmation (D2) before anything starts.
    • Loading and error.

      • Until the first read finishes, codebook.llmWiki.state is loading, no welcome shows, and the tree shows Reading the LLM Wiki state….
      • A read that throws shows one row, Could not read the LLM Wiki state · Refresh to retry, which opens Output › Codebook, where the cause is written. The title bar's Refresh is the retry.
      • codebook.llmWiki.state takes the values loading, none and other.
    • Late publication. When the view first sees a new publication (a new publisher receipt, as Success reads it) while row 2c or 3 is present, it shows one information notice: An LLM Wiki was published in <folder>., with Open in Browser.

      • Row 1 appears at once.
      • Row 2c goes away. A publication after the watch's end ends the wait, as the existing reservation contract does (findUnacknowledgedWikiLeftover.ts:37-60), so a new start is admitted again (Eng decision 74).
      • Row 3 goes away.
    • Refresh. The view reads its state again after each of these, with a trailing 1-second debounce: events inside one second coalesce, and the last one always refreshes.

      • a change of this window's run state;
      • a create, change or delete of <output>/codebook-wiki.json, <output>.update-run.json, <output>.publish-lock.json or <output>.publish-journal.json, through a FileSystemWatcher (a RelativePattern on the nearest existing ancestor of the output folder, which may lie outside the workspace). In a fresh project the output's parent does not exist yet, so the watcher is made again once a run creates that parent and when the setting changes (Eng decision 78);
      • a change of the codebook.wikiOutputDirectory setting or of workspace trust;
      • the view becoming visible;
      • every 30 seconds while row 2, 2b or 2c is shown. A marker whose window died leaves no file event, and liveness is read as the update start reads it today (readLiveWikiUpdateMarker: pid and process start);
      • its title bar Refresh action, command codebook.refreshLlmWiki.

      If the watcher cannot be created, the view refreshes on visibility and its Refresh action only; the Output row's tooltip says so, and Output › Codebook records it once with the cause. Freshness (row 1's description) is read again at each refresh, so a source edit shows as Source changed when the view is next shown or refreshed, not at the save. utils/llmWikiView.ts fires a tree change only when the rows or their texts actually change, so a refresh with nothing new is silent for screen readers.

    • Folder and trust.

      • The project is the one wikiLocation() resolves today: the first workspace folder (requireWorkspace, environment.ts:69-70).
      • The editor grants workspace trust during a session but revokes it only by reloading the window, so the trust rows never interrupt a run.
      • A window reloaded during its own run loses that run's state. Its marker's liveness is read by process start, as today (readLiveWikiUpdateMarker), so the view shows the run as another window's until it ends.
      • The bound is wall-clock time, as the update's is, so time asleep counts toward it (stated in the README).
      • Only the first workspace folder is read; another folder's Wiki is not shown.
    • Essential explanations wrap. While row 2 or 2c is present in VS Code, the view's TreeView.message, which wraps, reads Codebook is watching the chat. Stop watching does not stop the chat; stop it in the chat.

    • Narrow sidebars. Labels stay at most four words. Times, causes and paths go into the description, which may truncate, and the full text is in the tooltip. Long paths are shortened by wikiOutputLabel, as today.

    • Accessibility.

      • Every action is a command, reachable by keyboard: the row's Enter for its click, and the context menu (Shift+F10) for its inline actions.
      • Each row's accessible name is its label plus its description.
      • A refresh never moves focus.
      • Each row has a stable TreeItem.id (wiki, run, elsewhere, reservation, last-attempt, attention, output), so a selection survives a change of label.
      • When a selected row goes away, the editor's own tree behavior moves the selection, and Codebook does not call reveal.
      • The meaning of Stop watching and of the retry time is in the row's text, not only its tooltip.
      • The icons are theme icons, so the four supported themes color them.
      • No motion other than the native sync~spin, which the editor's reduce-motion setting stops.
    • Assigned shortcuts: none (D035, no invented bindings).

    Generation identity (accepted X1). Row 1's tooltip names the Wiki's generation identity:

    • the revision is the first 7 characters of the manifest's generated.revision, kept only when it is a full commit hash (as inspectDeepWikiFreshness.ts:176-187 keeps it);
    • the date is the manifest file's modification time, in the editor's locale. The publisher writes a new manifest at each publish (readWikiPublishToken.ts).

    The tooltip takes one of these forms:

    • Generated from <short revision> on <local date>;
    • Generated on <local date> (no Git revision) in a folder without Git, or when the manifest has no revision;
    • Generated from <short revision> when the date cannot be read;
    • no generation line when neither can be read.

    A host test pins each form.

    2. Generate run

    • New command. codebook.generateDeepWiki, titled Codebook: Generate LLM Wiki.

    • Confirmation before the hand-over (Design decision D2). Every Generate, from the view, a notice button or the Command Palette, first shows one modal confirmation. PRODUCT_GOAL requires the resolved destination to show before generation, and the run uses the learner's plan for minutes.

      • Title: Generate the LLM Wiki of <repository folder name>?
      • Detail: It is written to <resolved output folder>., then where the request goes:
        • VS Code: the sentence of describeWikiChatHandOver (utils/describeWikiChatHandOver.ts), generalized by run kind so a generate request is not called an update request. As for the update's confirmation today, it names the new chat, the case where the Chat view restores its last chat instead, and the draft an empty chat's request replaces. It always adds that the chat asks to approve its commands and may ask to Continue (E1-F2: the E1 run needed about 38 approvals and one Continue).
        • Cursor: the welcome's runner sentence, and The model is the one cursor-agent is set to use; Codebook does not choose it. (until CEO X6).
      • Buttons: Generate, Change location (opens the setting and starts nothing), and Cancel.
      • The confirmation comes after the existing-Wiki check and before the marker is claimed, so dismissing it leaves no marker.
      • Another window may claim between this window's confirmation and its claim. The claim then fails, and the learner sees that window's refusal (Generating in another window), never an error. A host test pins this (Eng decision 79).
    • The output's parent folder. In a project without the folder that holds the output and its marker (.codebook/ by default), the claim would fail with ENOENT, because placeStorageLock.ts:30 creates the marker file exclusively, without its folder. After the confirmation and before the claim, Generate creates that parent folder, after the existing link checks on the output's path (assertNoLinkOnWikiPath). Host tests (Eng decision 72):

      • a project without .codebook;
      • a nested custom output whose parents are missing;
      • an unwritable parent, which refuses with its sentence and leaves no marker.
    • The first 10 seconds (Design decision D3).

      • VS Code, as an update today (handWikiRequestToChat.ts): the chat view is revealed and focused, a new chat session starts, and the request is submitted automatically (isPartialQuery: false). The LLM Wiki view's row 2 reads Waiting for the chat to start until the first sign, then In chat · N min of 55. No notification appears, because notifications would cover the chat's approval buttons (README).
      • Cursor: the progress notification Generating the LLM Wiki in cursor-agent… with Cancel (today's withProgress, extension.ts:1249-1253), and row 2.
    • One word for VS Code's stop (Design decision D4). The VS Code watch's status-bar entry reads $(sync~spin) Watching for the LLM Wiki · Stop watching, for update and generate alike. It was · Cancel (WIKI_CHAT_WATCH_STATUS_TEXT, constants.ts:908-909). Cursor keeps Cancel, because there it stops the agent.

    • One wording table (D5). constants.ts holds each surface's text for each host and each run kind, and host tests pin the table:

      • the tree action and its accessible name;
      • the status-bar text, tooltip and accessible name;
      • the browser status line;
      • the generated, timeout, stop and failure notices.

      A generate run never says "update", and VS Code never says "Cancel" for a watch.

    • Where the logic lives (accepted). The generate run kind, the LLM Wiki view state reader and the notice changes live in extension/src/utils/ modules with their own unit or host tests:

      • utils/startWikiRun.ts chooses the kind, the bound, the existing-Wiki offer and the hand-over;

      • utils/readLlmWikiViewState.ts gives the view's state;

      • utils/llmWikiView.ts is the tree data provider.

      • No decision branches in extension.ts. Command callbacks pass their closures to these modules and act on the module's answer. The no-Wiki sentence at extension.ts:1476 moves into startWikiRun.ts, so inspectWikiToUpdate and lookAtWikiStart keep their branches unchanged.

      • Health. pnpm --dir extension health:static and pnpm --dir extension health stay clean against their baselines, with no baseline re-saved to absorb a finding (prior learning wiki-open-notice-branch-consumes-health-baseline).

      • Dependencies. The closures live inside activate(), so startWikiRun.ts takes one explicit dependency object, WikiRunDependencies, typed from the closures' own signatures:

        • { wikiLocation, inspectPublishedWiki, assertWikiOwner, assertNoLinkOnWikiPath, readWikiPublishToken, readWikiPublicationIdentity, findWikiUpdateStartBlock, wikiUpdateRun, setActiveWikiRun, handWikiRequestToChat, runCursorWikiAgent, verifyManagedCursorSkill, deployCursorSkill, writeRunRecord, withProgress, showNotice, host } (the Eng additions: decisions 72, 73, 74, 81).
        • Host tests pass stand-ins for these.
    • One lifecycle. It runs in the existing update run (WikiUpdateRun, utils/wikiUpdateRun.ts), with a run kind generate beside update. The kind is also written into the run marker as an optional field, runKind: 'generate' | 'update':

      • a marker without the field reads as update;
      • an older window's parser (readLiveWikiUpdateMarker.ts:25, a non-strict z.object) drops the unknown key, so older windows keep reading newer markers.
    • Bounds by run kind, wherever a bound is read (Eng decision 74). A run's bound follows its kind in every place that reads one today:

      • in readLiveWikiUpdateMarker.ts, isRunMarkerExpired (lines 115–116) and the reservation window (line 234), from the marker's runKind;
      • the unreadable-marker grace (lines 341–353): its contents cannot be read, so it uses the largest bound across run kinds, never the update's;
      • this window's reservation release timer (extension.ts:1162-1167, which today uses WIKI_UPDATE_WATCH_TIMEOUT_MS);
      • the last-run record (WikiLastRun, through rememberLastWikiRun), which gains the run kind, so a reload keeps the bound;
      • the leftover admission (findUnacknowledgedWikiLeftover, called at extension.ts:1584-1592 with the update's bound), which takes each record's bound.

      A generate marker expires after WIKI_GENERATE_TIMEOUT_MS, plus WIKI_CHAT_OPEN_TIMEOUT_MS in VS Code. Its reservation lasts WIKI_GENERATE_TIMEOUT_MS after watchEndedAtMs. An update record keeps today's bounds.

      The reservation contract stays today's: a publication after the watch's end ends the wait, and the refusal keeps its override, worded by run kind (Generate anyway or Update anyway). runKind is parsed as an enum, an unknown value reads as update, and no bound is ever longer than the generate maximum.

      Host tests pin:

      • both kinds at each place;
      • a stopped generation between 15 and 55 minutes, which refuses a new Generate and Update in the originating window, after a reload and in a second window;
      • a publication during cancellation and during the reservation;
      • the override after the view changed.
      • Accepted limitation: a window of an older Codebook reads a generate marker with the update's 15-minute bounds. After 15 minutes it may start an update beside a running generation. The publisher's publish lock (<output>.publish-lock.json) still refuses a second publish while one runs, so two Wikis are never written at once. Mixed Codebook versions on one project are the only case.

      The run shares:

      • the start-block checks (findWikiUpdateStartBlock);
      • the update marker (<output>.update-run.json), so a second window cannot start beside it;
      • progress and Cancel in the status bar;
      • the end classification.
    • An existing Wiki. If the resolved folder already holds a manifest, Generate does not overwrite it. It shows An LLM Wiki already exists in <folder>. Update it instead? with Update LLM Wiki.

      • The check runs before the marker is claimed, and again right after the claim and before the hand-over. A manifest that appeared between the two releases the marker and gives the same offer.
      • Dismissing the offer starts nothing and leaves no marker.
      • A release after the claim uses the existing marker release, which removes the file.
    • No agent to hand over to. The start fails as an update's does today, with no marker left:

      • a VS Code without the chat commands: describeWikiChatHandOver's sentence;
      • a Cursor without the agent CLI: resolveCursorAgentExecutable's error, which names where Codebook looks for it (~/.local/bin/cursor-agent or the editor's PATH, resolveCursorAgentExecutable.ts:6-11).

      Each of these sentences ends with the chat route: Or ask the editor chat "/codebook Generate the LLM Wiki for this project".

    • Request. buildWikiGeneratePrompt(projectRoot, outputDirectory, hasGitRepository) puts these into one bounded request, as buildWikiUpdatePrompt does:

      • the project root and the resolved output;
      • the instruction to follow the bundled skill's DeepWiki generation procedure;
      • the matching-manifest rule.

      Paths are quoted as buildWikiUpdatePrompt quotes them (quotePromptPath, buildWikiUpdatePrompt.ts:30-36), and a unit test uses a folder name with a newline and backticks. The output setting goes through the existing resolver and link checks (resolveDeepWikiDirectory, assertNoLinkOnWikiPath) (Eng decision 84).

    • Hand-over.

      • VS Code: handWikiRequestToChat (a new chat session, the same first-sign wait).
      • Cursor: runCursorWikiUpdate, generalized as runCursorWikiAgent(projectRoot, prompt, signal, timeoutMs).
      • Cursor's skill (Eng decision 73). The request names the bundled skill's procedure, but today only AI-chat setup deploys that skill (extension.ts:815-820). So before the agent starts, the run checks the managed skill (verifyManagedCursorSkill, cursorSkillDeployment.ts:1828).
        • A missing or outdated managed skill is deployed alone, through deployCursorSkill, which keeps a learner's own or edited same-name skill and reports the conflict. No runtime MCP start or registration happens.
        • A conflict refuses the start with its sentence and leaves no marker.
        • This holds for both run kinds.
        • Host tests: a missing, an outdated, an edited and a concurrently removed skill.
    • Bound (constants.ts). One constant, WIKI_GENERATE_TIMEOUT_MS = 3_300_000 (55 minutes, set by E1's 30-minute rule, O9), bounds both the VS Code watch and the Cursor agent of a generate run. The update's bounds (WIKI_CURSOR_UPDATE_TIMEOUT_MS, WIKI_UPDATE_WATCH_TIMEOUT_MS, both 900,000) do not change.

    • Success. The start records the publish token and the publication identity (readWikiPublicationIdentity: the publisher's receipt that names the manifest's hash), both undefined with no Wiki. The run's end reads the new publication identity as the update's verifiedPublication does (classifyWikiUpdateEnd.ts:240-247, which already counts an identity that was undefined at the start as new), without its freshness condition, and then two checks of the generate run. All three hold at the run's end:

      • a new publication identity: the publisher's receipt names the manifest now on disk. A manifest written or edited without a publish has no such receipt, so it never counts. A Wiki that the learner's own chat publishes at the same time does count, since the claim "an LLM Wiki was generated" stays true;
      • the assertWikiOwner closure (extension.ts:975) accepts the manifest as this project's;
      • the entry page reads as a file of the Wiki folder (readWikiFileToOpen of index.html, as currentDeepWiki checks it before the browser opens it, extension.ts:991-999).

      A new publication that fails one of these ends the run with that check's sentence and row 4 or row 3, never generated. On success the notice reads LLM Wiki generated in <folder>. with Open in Browser, and the view shows row 1. Serving the other pages in the browser is not part of the run's success; N55 checks it.

      Freshness does not decide success (Eng decision 75). A first generation runs up to 55 minutes, and a learner's edit meanwhile does not make a usable Wiki a failure.

      • When the published manifest no longer matches the source, the notice reads LLM Wiki generated in <folder>. <N> source files changed while it was written., with Update LLM Wiki beside Open in Browser, and row 1 shows Source changed · Update available.
      • An unknown freshness shows the reader's unknown label.
      • A host test edits a source file during the run.
    • Cancel (in VS Code labelled Stop watching), exactly as an update's today.

      • VS Code: Cancel stops Codebook's watch, not the chat. The chat agent may go on and publish later.

      • Cursor: Cancel stops the agent's process group (runCursorWikiUpdate's existing stop).

      • Cursor. The run marker is released when the agent's process has closed, through the existing marker release, which removes the file. No generated notice is shown.

      • VS Code. As an update's stopped watch does today (readLiveWikiUpdateMarker.ts:33), Cancel and the bound turn the marker into a reservation: the same marker with watchEndedAtMs. It stands until its run kind's bound after watchEndedAtMs, because the chat may still publish, or until a publication after the watch's end, which ends the wait (Eng decision 74). During the reservation:

        • a new Generate or Update from any window is refused with today's reservation sentence;
        • the view shows row 2c (Waiting for chat).

        No generated notice is shown. If the chat publishes anyway, that publication ends the reservation; while it publishes, the publisher's own publish lock (<output>.publish-lock.json) keeps a second publish from running beside it.

    • A late publication. A Wiki the chat publishes after a cancel or a timeout is an ordinary published Wiki. The view shows it as row 1 on its next refresh, with the late-publication notice. No run claims it.

    • When the run ends. It follows the update run's classification (classifyWikiUpdateEnd):

      • VS Code. The watch ends at the first publication that meets Success, at Cancel, or at the bound. A publish lock or journal that appears while the watch runs is a publication in progress, so the watch keeps going until the bound.
      • Cursor. The run ends when the agent's process closes:
        • success when the folder then meets Success;
        • otherwise a failure. An exit code 0 with no Wiki reads Cursor Agent finished without publishing an LLM Wiki in <folder>., and a non-zero exit keeps today's unfinishedExitError sentence.
    • The bound. It ends the run as Cancel does and shows Codebook stopped waiting for the LLM Wiki generation after <N> minutes. In Cursor the agent is also stopped.

    • End states other than success.

      • A manifest of another checkout, or one that cannot be read: the run fails with that sentence, and the view shows row 4 with that cause and row 3.
      • A publish lock or journal left by the agent's publisher: the view shows row 4 (Publish in progress or stopped) with Copy recovery request.
      • Nothing published and nothing left: the view shows the empty state with row 3 (Last generation stopped) and its cause.
      • The run never shows generated in these cases.
    • Wording. The update's end sentences in classifyWikiUpdateEnd.ts (412 lines) name an update ("Press Update LLM Wiki again"). A generate run gets its own sentences, each pinned by a wording test:

      • generated;
      • stopped at Cancel;
      • stopped at the bound;
      • failed with no Wiki;
      • a foreign or unreadable manifest;
      • a publish lock left behind.

      Each generate sentence ends with what was left and the next action:

      • after Stop watching or the bound in VS Code: The chat may still publish; the LLM Wiki view shows the Wiki when it does. To stop it, stop the request in the chat.;
      • after Cancel or the bound in Cursor: that Cursor Agent was stopped and, if a publish was in progress, that the LLM Wiki view shows its recovery;
      • after a failure: Try again, or the chat route /codebook Generate the LLM Wiki for this project.

      Codebook keeps no error-code scheme. Each sentence's entry in the README's troubleshooting section is its stable anchor (DX decision 53).

    • Output record (Eng decision 81). At every generate or update end, Output › Codebook gets one record built from an allowlist of fields:

      • run kind, host, start and end time, and end state;
      • a Codebook-authored summary of the end. It is never the displayed sentence when that sentence carries agent text (describeWikiChatErrorReply.ts:14-17 puts a chat's error message into it);
      • the agent's exit code or signal (Cursor), or the refused start's cause.

      It never holds the agent's stdout, stderr, reply or error text, which may carry private source or credentials (runCursorWikiUpdate.ts:157-159 discards stderr for that reason). Paths in the record and in Copy details show the home folder as ~. Show Output opens the record, and Copy details copies the summary with it.

      Host tests seed a fake secret into the Cursor agent's stderr and reply, and into a VS Code chat error reply before the first sign and during the watch. They find it in no logged or copied field.

    3. The no-Wiki notices offer generation

    Open LLM Wiki in Browser (the renamed title, 3b) and Update LLM Wiki on a folder with no Wiki show Codebook found no LLM Wiki in <folder>. with a Generate LLM Wiki button, instead of telling the learner to ask the chat. The chat route stays documented in the README.

    3b. Names

    • The title of codebook.openDeepWiki becomes Codebook: Open LLM Wiki in Browser; its id stays, so keybindings and scripts keep working.
    • codebook.cancelWikiRun is titled Codebook: Stop LLM Wiki Run in both hosts. The row's label stays Stop watching (VS Code) or Cancel (Cursor), per D4.
    • The README says in one sentence that the Repository Wiki view lists repository articles and the LLM Wiki is the generated site.

    4. Documentation

    • extension/README.md, LLM Wiki: open and update:
      • the LLM Wiki view and its rows;
      • Generate from the entry, with its confirmation;
      • its bound;
      • the existing-Wiki answer, and how to regenerate from scratch through the chat;
      • the notices;
      • the VS Code status-bar wording Stop watching (D4);
      • the attention rows and their recovery requests.
    • extension/README.md, a First LLM Wiki quickstart near the top. It covers:
      • the prerequisites per host: VS Code needs Copilot Chat signed in. Cursor needs the cursor-agent CLI installed and signed in, with a version check whose exact command implementation verifies;
      • that no runtime MCP connection or debugger is needed;
      • the Generate path and its expected result;
      • the chat route as a copy-paste fallback;
      • a codebook.wikiOutputDirectory settings snippet.
    • extension/README.md, Troubleshooting the LLM Wiki: one anchored entry per attention cause and per generate end sentence, each with the cause, what was kept and the next action.
    • extension/README.md also states:
      • the Cursor model policy: the model cursor-agent is set to use;
      • the mixed-version note: update every window of a project before generating, and stop a running generation before going back to an older Codebook;
      • the Repository Wiki and LLM Wiki distinction (3b).
    • CHANGELOG.md, README.md (status), and the bundled skill only if its Wiki section must name the entry: decided in implementation. A skill change moves its version.
  4. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    /autoplan Review Complete

    URGENT, outside this plan

    None.

    Plan Summary

    Cycle 0055 adds an LLM Wiki view to Codebook's Activity Bar so a learner can generate, open and update the repository's LLM Wiki from the entry. Generation is a new run kind inside the existing update lifecycle. The cycle then proves the Wiki area natively again in VS Code and Cursor (N55). The review grounded the plan in source:

    • success needs the publisher's receipt;
    • a fresh project's .codebook/ is created before the claim;
    • Cursor's skill is deployed first;
    • every bound follows the run kind.

    It also splits the work into two PRs, with E1 measuring real generation before any code.

    Decisions Made: 91 total (79 auto-decided, 12 taste choices, 0 user challenges)

    Auto-decided: see the plan file's Decision Audit Trail. The rest are the brief's decisions: 10 gate items, with taste 9 merged into d76 and taste 18 into d77.

    Review Scores

    • CEO:
      • voices: Claude completed (8 findings: 2 High, 6 Medium); Codex completed (7 findings: 6 High, 1 Medium);
      • consensus: 5/6 confirmed, 1 disagreement (taste 20: the Wiki first).
    • Design:
      • voices: Claude completed (21 issues: 1 critical, 6 high, 14 medium); Codex completed on attempt 2 (13 concerns; attempt 1 was unverified because it was untagged);
      • consensus: 8/8 litmus rows confirmed;
      • taste: 40, 47.
    • DX:
      • voices: Claude completed (21 issues); Codex completed on attempt 2 (9 concerns; attempt 1 was killed by an interrupted turn and got no credit);
      • consensus: 4/6 confirmed, 1 disagreement (taste 51: TTHW), 1 single voice (upgrade path);
      • DX overall 5 → 7/10.
    • Eng:
      • voices: Claude completed (12 issues: 3 High); Codex completed (10 concerns: 3 P1 verified in source);
      • consensus: 5/6 confirmed, 0 disagreements, 1 single voice (performance);
      • 0 critical gaps; taste 76, 77.
    • CYCLE (this run, from gstack-autoplan-timing summary): ceo 7h34 (outside 5m) | design 12m (outside 15m) | dx 48m (outside 3m) | eng 15m (outside 4m).

    Cross-Phase Themes

    • The run lifecycle's bounds and reservation:
      • CEO taste 9 accepted the older-window limit;
      • Eng 74 found the bound read in five places and the existing reservation contract;
      • Eng 76 kept the limit.
    • Truthful success:
      • DX 54 required the publisher's receipt;
      • Eng 75 removed freshness from gating.
    • Errors, redaction and recovery:
      • DX 53, 58, 60 and 62 cover the attention mapping, the chat recovery request and the Output record;
      • Eng 81 adds an allowlist that drops agent text.
    • Time to the first Wiki:
      • the CEO alternatives listed progressive generation as a later candidate;
      • DX taste 51 kept the E1-measured target.
    • PR size:
      • CEO taste 18 chose one PR;
      • Eng taste 77 reopens it as two PRs.

    Deferred to TODOS.md

    None: the owner forbids a TODOS file (AGENTS.md). Deferred work is in the plan's Later candidates:

    • the Node server profile;
    • Chrome MV3;
    • keybindings;
    • progressive generation;
    • E8;
    • a freshness status bar item;
    • the Cursor CLI model setting;
    • stuck-publish recovery;
    • a generate-bound setting;
    • live cursor-agent progress;
    • a release-reservation command.

    Implementation Tasks (aggregated across phases)

    • T1 (P1, human: ~4h / CC: ~1h) — E1 — Run E1 with pre-set thresholds and E1b on nsx
      • Surfaced by: ceo-review — Decisions 11, 12
      • Files:
    • T6 (P1, human: ~1d / CC: ~6h) — N55 — N55 incl. meaning-change update (step 5) and interruption (5b)
      • Surfaced by: ceo-review — Decisions 14, 16
      • Files:
    • T3 (P1, human: ~1d / CC: ~1.5h) — generate — startWikiRun with WikiRunDependencies, generate kind, classifyWikiUpdateEnd branch
      • Surfaced by: ceo-review — Decisions 3, 4
      • Files: extension/src/utils/startWikiRun.ts, extension/src/utils/classifyWikiUpdateEnd.ts, extension/src/utils/wikiUpdateRun.ts
    • T2 (P1, human: ~4h / CC: ~30min) — marker — Marker bounds by run kind + runKind field
      • Surfaced by: ceo-review — Spec launch 3 C1
      • Files: extension/src/utils/readLiveWikiUpdateMarker.ts, extension/src/utils/claimWikiUpdateMarker.ts
    • T4 (P1, human: ~1d / CC: ~1h) — view — LLM Wiki view: 8 states, welcome by host, Stop watching, X1 tooltip
      • Surfaced by: ceo-review — Decisions 5, 14, 17, 19
      • Files: extension/src/utils/llmWikiView.ts, extension/src/utils/readLlmWikiViewState.ts, extension/package.json
    • T1 (P1, human: ~3h / CC: ~20min) — LLM Wiki view — Two-axis rows 1, 2, 2b, 2c, 3, 4, 5 with labels, descriptions, icons, row clicks and inline/context actions
      • Surfaced by: design-review — Design decisions 24, 25, 29, 30
      • Files: extension/src/utils/readLlmWikiViewState.ts, extension/src/utils/llmWikiView.ts, extension/package.json
    • T2 (P1, human: ~1h / CC: ~10min) — confirmation — Modal confirmation before every Generate naming the folder, runner and plan use (D2)
      • Surfaced by: design-review — Design decisions 26, 46, 47
      • Files: extension/src/utils/startWikiRun.ts
    • T3 (P1, human: ~1h / CC: ~10min) — first 10 seconds — Per-host first 10 seconds: VS Code chat revealed with a new session; Cursor progress notification (D3)
      • Surfaced by: design-review — Design decision 27
      • Files: extension/src/utils/startWikiRun.ts, extension/src/extension.ts
    • T6 (P1, human: ~2h / CC: ~15min) — states — Folder, trust, loading and error rows; the welcome order; the late-publication notice; row 1 freshness labels
      • Surfaced by: design-review — Design decisions 32, 33, 34, 36, 42, 43
      • Files: extension/src/utils/llmWikiView.ts, extension/package.json, extension/src/utils/installWikiUpdateStatus.ts
    • T4 (P1, human: ~30min / CC: ~5min) — status bar — VS Code watch status bar reads Stop watching for update and generate (D4)
      • Surfaced by: design-review — Design decision 28
      • Files: extension/src/constants.ts
    • T5 (P1, human: ~1h / CC: ~10min) — wording — One wording table per host and run kind across every surface, pinned by host tests (D5)
      • Surfaced by: design-review — Design decision 45
      • Files: extension/src/constants.ts
    • T2 (P1, human: ~2h / CC: ~15min) — Cursor skill — Verify the managed Cursor skill and deploy it alone before the agent
      • Surfaced by: eng-review — Section 1, Codex P1 extension.ts:815-820 (decision 73)
      • Files: extension/src/utils/startWikiRun.ts, extension/src/cursorSkillDeployment.ts
    • T5 (P1, human: ~2h / CC: ~15min) — Output record — Allowlisted Output record with ~ paths and seeded-secret tests
      • Surfaced by: eng-review — Section 1/2, Codex P2 and Claude Medium 7 (decision 81)
      • Files: extension/src/utils/startWikiRun.ts, extension/src/extension.ts
    • T3 (P1, human: ~4h / CC: ~30min) — bounds — Bounds by run kind wherever read; keep the existing reservation contract
      • Surfaced by: eng-review — Section 1, Codex P1/P2 (decision 74)
      • Files: extension/src/utils/readLiveWikiUpdateMarker.ts, extension/src/utils/findUnacknowledgedWikiLeftover.ts, extension/src/extension.ts
    • T4 (P1, human: ~1h / CC: ~10min) — generate end — Freshness reported, not gating; changed-sources notice
      • Surfaced by: eng-review — Dual voices, Claude High 1 (decision 75)
      • Files: extension/src/utils/classifyWikiUpdateEnd.ts
    • T1 (P1, human: ~2h / CC: ~15min) — marker — Create the output's parent folder after the link checks, before the claim
      • Surfaced by: eng-review — Section 1, Codex P1 placeStorageLock.ts:30 (decision 72)
      • Files: extension/src/utils/startWikiRun.ts
    • T2 (P1, human: ~1h / CC: ~10min) — LLM Wiki view — Empty tree with no message in the none state; welcome fourth line with the settings link
      • Surfaced by: devex-review — Pass 1, Codex P1 empty-state contradiction (decision 55)
      • Files: extension/src/utils/llmWikiView.ts, extension/package.json
    • T5 (P1, human: ~2h / CC: ~15min) — Output record — Fixed-field Output record per run end, never agent stdout or stderr, seeded-secret test
      • Surfaced by: devex-review — Pass 3, native CAP6 redaction/trace and Codex P1 Cursor trace (decision 60)
      • Files: extension/src/extension.ts, extension/src/utils/startWikiRun.ts
    • T4 (P1, human: ~3h / CC: ~20min) — attention rows — Map every WikiUpdateConflictCause and a foreign manifest; Copy recovery request; Reveal Wiki Folder
      • Surfaced by: devex-review — Pass 3, Codex P1 exhaustiveness and native CAP6 recovery command (decision 58)
      • Files: extension/src/utils/readLlmWikiViewState.ts, extension/src/utils/llmWikiView.ts, extension/package.json
    • T3 (P1, human: ~1h / CC: ~10min) — confirmation — D2 detail reuses describeWikiChatHandOver by run kind
      • Surfaced by: devex-review — Pass 3, Codex P1 hand-over disclosure (decision 56)
      • Files: extension/src/utils/describeWikiChatHandOver.ts, extension/src/utils/startWikiRun.ts
    • T1 (P1, human: ~3h / CC: ~20min) — generate end — Generate success through verifiedPublication plus owner and entry-page checks; negative tests
      • Surfaced by: devex-review — Pass 3, Codex P0 CAP4:generate-success (decision 54)
      • Files: extension/src/utils/classifyWikiUpdateEnd.ts, extension/src/utils/startWikiRun.ts
    • T6 (P1, human: ~2h / CC: ~15min) — sentences — End sentences with what was left and the next action; no-agent sentences with location and chat route; Open Chat on VS Code row 2; Refresh to retry; watcher failure in Output
      • Surfaced by: devex-review — Pass 3, native CAP6 findings (decision 62)
      • Files: extension/src/constants.ts, extension/src/utils/classifyWikiUpdateEnd.ts, extension/src/utils/llmWikiView.ts
    • T5 (P2, human: ~1h / CC: ~10min) — entry — codebookLearning icon
      • Surfaced by: ceo-review — Decision 15
      • Files: extension/src/assets/learning.svg, extension/package.json
    • T9 (P2, human: ~30min / CC: ~5min) — N55 — N55 step 1 confirmation, progress row, narrow-width and four-theme icon screenshots; step 5 wording; step 5b row 2c
      • Surfaced by: design-review — Design decisions 35, 37, 48
      • Files:
    • T7 (P2, human: ~1h / CC: ~10min) — accessibility — Narrow-sidebar labels, keyboard reach, stable ids, silent unchanged refresh, theme icons, reduce motion
      • Surfaced by: design-review — Design decisions 37, 38, 44
      • Files: extension/src/utils/llmWikiView.ts
    • T8 (P2, human: ~30min / CC: ~5min) — icon — learning.svg: an open notebook with a check mark, compared natively in four themes
      • Surfaced by: design-review — Design decisions 41, 48
      • Files: extension/src/assets/learning.svg, extension/package.json
    • T10 (P2, human: ~15min / CC: ~3min) — commands — Open Folder via vscode.openFolder; confirm the manage-trust id in both hosts
      • Surfaced by: eng-review — Reality surface-check
      • Files: extension/src/utils/llmWikiView.ts, extension/package.json
    • T7 (P2, human: ~1h / CC: ~10min) — page label — Shared freshness label through WikiUpdatePageSettings; emitted-script test
      • Surfaced by: eng-review — Section 2, Codex P2 installWikiUpdateStatus.ts:55-59 (decision 86)
      • Files: extension/src/utils/installWikiUpdateStatus.ts, extension/src/deepWikiReader.ts
    • T9 (P2, human: ~30min / CC: ~5min) — procedure — E1 on the entry's routes; N55 5b by phase; wrong-claim cause rule; TOO SLOW re-plan
      • Surfaced by: eng-review — Section 3, Codex P2 and Claude Medium 6, 9 (decisions 80, 83, 87, 88)
      • Files:
    • T8 (P2, human: ~30min / CC: ~5min) — start safety — Claim race test; quoted request paths; runKind as an enum
      • Surfaced by: eng-review — Section 1, Claude Medium 5 and Low 10 (decisions 79, 84)
      • Files: extension/src/utils/startWikiRun.ts, extension/src/utils/buildWikiGeneratePrompt.ts
    • T6 (P2, human: ~2h / CC: ~15min) — view — One pure row function with a state-matrix test; watcher on the nearest existing ancestor
      • Surfaced by: eng-review — Section 2/4, Claude Medium 8 and Medium-high 4 (decisions 78, 82)
      • Files: extension/src/utils/readLlmWikiViewState.ts, extension/src/utils/llmWikiView.ts
    • T10 (P2, human: ~15min / CC: ~3min) — N55 — N55 step 1 records the steps to start (TTHW)
      • Surfaced by: devex-review — Pass 8, Codex P1 (decision 66)
      • Files:
    • T8 (P2, human: ~2h / CC: ~15min) — README — First LLM Wiki quickstart, troubleshooting section, Cursor model policy, mixed-version note
      • Surfaced by: devex-review — Pass 4, both voices (decision 64)
      • Files: extension/README.md, CHANGELOG.md
    • T9 (P2, human: ~15min / CC: ~3min) — Rollback — Rollback states the admission-timing effect of older windows
      • Surfaced by: devex-review — Pass 5, Codex P1 (decision 65)
      • Files:
    • T7 (P2, human: ~30min / CC: ~5min) — names — Titles Open LLM Wiki in Browser and Stop LLM Wiki Run; README view distinction
      • Surfaced by: devex-review — Pass 2, both voices (decision 63)
      • Files: extension/package.json, extension/README.md

    Phase coverage

    Phase Host Outside (provider / status) Native Findings (native / outside) Partial coverage
    CEO claude codex / completed completed 8 / 7 —
    Design claude codex / completed (attempt 2) completed 21 / 13 attempt 1 unverified (untagged), no credit
    DX claude codex / completed (attempt 2) completed 21 / 9 attempt 1 killed by an interrupted turn, no credit
    Eng claude codex / completed completed 12 / 10 —

    Final gate

    • The gate was resolved with rec, under the owner's standing instruction. The plan is approved as-is, and the 10 taste decisions take their recommended options (O8 in the body).
    • Reality rows: CEO rows=7/7 verdict=complete; Eng rows=7/7 unverified=2 verdict=complete.
    • Review logs: the four phases and six voice records (including the two failed attempts).
    • The Eng test plan artifact and the four phase task lists are kept in the local gstack project store, outside the repository.
  5. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    Re-entry after compaction (2026-10-26, implementing: E1 in progress)

    • Reads, from disk after this compaction: PRODUCT_GOAL.md in full (goal version 10, 444 lines); AGENTS.md in full; this Issue's body (45,804 characters) and its four comments, the pinned Proposed change and the /autoplan review record included.
    • Image. docs/designs/assets/codebook-product-spec-v9.png, opened with an image tool: 1024 × 1536, 1,878,402 bytes, SHA-256 f189ee82…caf2aa. Regions: 1 (live), 2 (replay), 3 (DeepWiki, with Update LLM Wiki beside the freshness state and Output Change location) and the shortcut strip.
    • State. Branch codex/cycle-0055 at 601f3827, clean tree, no PR. E1 is running in the Space local:codebook-qa: the Cursor CLI route and the Cursor Agent chat comparison have published; the VS Code route (Copilot Chat, GPT-6 Luna) is still working, with each tool step approved by hand. Results follow in one E1 comment.
  6. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    E1 result (Task 1): ADJUST, generate bound 55 minutes

    Setup.

    • Space local:codebook-qa (macOS 26 VM). Codebook 0.2.44 is installed in both hosts, and its skill is the bundled skills/codebook/SKILL.md.
    • The QA-owned clones of nextjs-dashboard 1936e41 are ~/qa/n55/e1-vscode, e1-cursor and e1-cursorchat, one per route, so no route reads another's Wiki.
    • The request is the drafted generate request; the Cursor text is 817 characters.
    • Durations run from the submission to the publication files on disk, as seen by a watcher that lists the output every second (Space clock, UTC).
    Route Model Start Published Duration Publish result Reader
    VS Code: Copilot Chat, a new session (the entry's VS Code route) GPT-6 Luna: the picker at submission, and copilot/gpt-6-luna in the session's records 04:32:03Z 05:06:36Z 34 min 33 s published: manifest, receipt, index.html; 9 pages, 88 sources, generated.revision = full HEAD Open DeepWiki in Browser from VS Code at 05:10:08Z served the overview at 127.0.0.1:<port>/w/…/index.html, reading Wiki source current and Connected to Codebook reader
    Cursor: cursor-agent CLI with the runner's flags, request on stdin (the entry's Cursor route) Grok 4.6 High Fast: set as the CLI's model in ~/.cursor/cli-config.json before the run, because the CLI had no model chosen (hasChangedDefaultModel: false). --output-format json reports no model. 04:30:04Z 04:34:18Z (exit 0 at 04:34:49Z) 4 min 14 s published; 12 pages, 71 sources, full HEAD The reader in Cursor served the overview (04:38:29Z)
    Cursor Agent chat, /codebook Generate … (comparison) Grok 4.6 High: the picker at submission 04:44:34Z 04:56:14Z 11 min 40 s published; 12 pages, 71 sources, full HEAD not opened (comparison only)

    Content bar (N55 step 3, applied to E1). Each claim was checked by reading its cited source in nextjs-dashboard 1936e41.

    • VS Code Wiki: 6 of 6 correct.
      • Overview: the dashboard routes are overview, customers and invoices (app/dashboard/).
      • Overview: auth.ts, auth.config.ts and proxy.ts configure credential auth and route authorization.
      • Dashboard Data Reads: fetchCardData runs three aggregates in Promise.all and turns nullish results into 0.
      • Dashboard Data Reads: fetchLatestInvoices inner-joins, orders by date descending and limits to 5, and fetchRevenue waits 3 s.
      • Invoice Server Actions: delete logs its error and returns no message.
      • Invoice Server Actions: create multiplies dollars by 100 for the integer amount column (db/schema.ts:36) and dates with toISOString().split('T')[0].
      • Diagram (invoices/actions.html): createInvoice → validate and insert → error (validation failure or insert throws) or revalidate and redirect. Correct against app/lib/actions.ts:65-103.
    • Cursor CLI Wiki: 6 of 6 correct.
      • Overview: app/page.tsx renders a welcome panel and a /login link and loads no data.
      • Overview: the seed falls back to a local URL, while db/index.ts requires POSTGRES_URL.
      • Data fetching: ITEMS_PER_PAGE is 6, with offset (currentPage - 1) * 6 and ilike filters.
      • Data fetching: fetchInvoiceById returns undefined or amount / 100, and the edit page calls notFound().
      • Server actions: the create form renders only customerId errors.
      • Server actions: an update's database failure returns its message without a redirect.
      • Diagrams: server-actions.html (form → safeParse → errors or insert → database error or revalidate and redirect) and data-layer.html (overview → three components → their three queries). Both are correct.
    • One quality bar holds in both hosts, so CEO X6 does not become a task.

    Verdict: ADJUST. Both entry routes published, and both readers served the result. VS Code took 34 min 33 s, inside 30–40 minutes, so the 30-minute rule applies.

    • The bound is the longest successful duration × 1.5, rounded up to whole 5 minutes: 34.55 × 1.5 = 51.8, giving 55 minutes. WIKI_GENERATE_TIMEOUT_MS = 3_300_000, recorded as O9.
    • E1 is not run again.
    • The hand-off design is not needed: no route exceeded 40 minutes.

    What the VS Code duration contains (honest limits).

    • The chat asked for approval before most terminal and browser-tool steps. The session records 34 terminal commands, and about 38 tool confirmations were made by a click on Allow. Each one waited for the driving agent's next look, usually 20–30 seconds.
    • At 04:54:37Z the chat stopped at its maximum number of requests and needed Continue.
    • From about 04:59Z to 05:06Z, GPT-6 Luna iterated on one flow diagram through several preview rounds, working around finding E1-F1 below.
    • A learner who approves at once would see less time. The bound uses the measured duration anyway.

    Findings.

    • E1-F1 (defect, renderer). Two conditional edges between the same pair of nodes stacked in one column draw their labels over each other in a flow diagram (skills/codebook/render-wiki-diagrams.mjs, flowSvg, where the vertical lane offset is laneGap 34 px against ~22-character labels).
      • Seen on the VS Code agent's preview at 05:05Z. Screenshot artifacts/cycle-0055/e1/x/e1/vscode-diagram-overlap.png, SHA-256 fdc11f75…290d.
      • The agent merged nodes to avoid it, and the published diagram is correct but coarser.
      • Not critical: carried under the feature-cycle rule (task 7).
    • E1-F2 (plan amendment, applied in implementation). The VS Code route needs the learner's approvals and may stop at the chat's request limit. So the VS Code welcome line 3 and the D2 confirmation say that the chat asks to approve its commands and may ask to Continue, instead of "You can keep working". The Cursor text stays.
    • E1-F3 (unknown, carried as task 8). The Cursor CLI agent created the empty output folder .codebook/wiki itself before staging. It reported that the publisher's preparation treated that empty folder as "an existing Wiki without a record", inspected it and went on, publishing at 4 min 14 s.
      • Root cause unverified. Next inspection: run the publisher's preparation against an empty pre-existing output folder.
      • The entry is unaffected: Generate creates only the output's parent (Eng decision 72), never the output folder, and a host test pins that.
    • E1-F4 (observation, no product change). The CLI model is whatever cursor-agent is set to. With no model chosen, the CLI uses its default. The Cursor confirmation already says Codebook does not choose it, and CEO X6 stays a later candidate.
    • Deviations.
      • Screenshots and the session records stand in for an OBS take for E1, as these are durations and publish results, not motion.
      • The Cursor Update LLM Wiki button was not run, because the source was unchanged: it answers "already current" and starts no agent. The CLI's model is recorded from its config instead.
      • Each route had its own clone.

    Evidence (Mac, ignored): artifacts/cycle-0055/e1/e1-evidence.tgz, SHA-256 7596dba1b3cc821f9e01a54f5535eea7a588a29aa126384f967b4fd4d0cfcbe3 (same on both sides). It holds:

    • the three Wikis: wiki-e1-vscode.tgz 8625d898…8a5c, wiki-e1-cursor.tgz 9aa5dff2…2599 and wiki-e1-cursorchat.tgz 8720df1e…6d3d;
    • the CLI JSON output, the VS Code chat session file and the watcher logs;
    • the times files and the screenshots (picker at submission, readers, final chat).

    E1b (nsx 0897231, the same CLI path, the request with the 55-minute bound) started at 05:13:23Z. Its result follows here.

  7. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    E1b result (Task 5c): published in 5 min 27 s

    Run.

    • Repository: laststance/nsx at 0897231 (P07), 409 tracked files, cloned in the Space.
    • Path: the entry's Cursor path, cursor-agent with the runner's flags and the generate request (with the 55-minute bound) on stdin.
    • Model: Grok 4.6 High Fast, the CLI's configured model.

    Result. Published.

    • Started 05:13:23Z; the manifest was written at 05:18:50Z, 5 min 27 s after the start.
    • The agent exited 0 at 05:19:01Z (duration_ms 332,743).
    • The Wiki has 13 pages over 53 indexed sources, with generated.revision the full HEAD.

    Effect on the plan.

    • The 55-minute bound holds a larger repository with a wide margin. It informs the bound as a risk and gates nothing.
    • The later candidate "a setting for the generate bound" (DX decision 59) gets no evidence for it from this run.

    Evidence (Mac, ignored): artifacts/cycle-0055/e1b/e1b-evidence.tgz, SHA-256 63b2256749c3e603959ea2917e533bc7f98147834d3a52509e8fb975a9314ef6, the same on both sides. It holds the times, the request, the CLI JSON output and the Wiki.

    Space. The Space VM was found stopped at about 05:58Z, after E1b had ended, and was started again. No run was in flight then.

  8. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    pt1: local delegated review (open-code-review delegation) and fixes

    Coverage.

    • The review ran on the working tree of codex/cycle-0055-pt1 against origin/main 601f3827.
    • OCR's preview selected 32 reviewable files. A separate reviewer reviewed all 32 by their diffs, under OCR's rule groups (100 % coverage; no file skipped).
    • OCR's default exclusions are reported apart: the 26 changed or new test files under extension/src/tests, plus README.md, extension/README.md and extension/skills/codebook/SKILL.md. These are checked by the test runs and the docs review instead.

    Findings: no critical, no high; 8 medium or low. Seven are fixed on the branch:

    # Severity Finding Disposition
    1 medium The VS Code chat-start failures of a generation still said "update": the chat that cannot open, the error reply, the missing first sign, the broken watch and the error reply at the reply's end. Fixed. Each sentence takes the run kind (D5) and names the generate request, Generate LLM Wiki or Generate anyway.
    2 medium Cursor's managed-skill check ran only before a generation; the plan says both run kinds (Eng decision 73). Fixed. An update in Cursor readies the skill first. The three existing Cursor update tests now stub the skill, so no test touches ~/.cursor.
    3 medium The start block and the other-run check went stale while the confirmation was open. A reservation another window left meanwhile would have been taken over by the claim. Fixed. Both checks run again right before the claim. A host test writes a reservation during the confirmation.
    4 medium–low Refusals for a marker that names no run yet ("starting an update", "may be updating", a candidate "updating this Wiki") were shown to a generation's start. Fixed. They are worded by the refused start's kind.
    5 low The timeout notice ignored a Wiki published before the bound. Fixed. It now names that Wiki, with Open in Browser.
    6 low "The opened repository changed during the Wiki update" was shown for a generation. Fixed. The sentence follows the run kind.
    7 low Cross-kind coalescing is silent. A Generate pressed while an Update's start checks run, or the reverse, returns the running attempt and says nothing (the modal confirmation blocks the editor, so only the sub-second start checks are exposed). Carried to the next bug-fix cycle (feature-cycle rule): task 9.
    8 low An OCR rule hit: a nested ternary in wikiRunRecord.ts. Fixed.

    Also fixed:

    • workflowPins.test.mjs found that the Windows job's path filter missed extension/src/utils/wikiRunBoundMs.ts and wikiUpdateRun.ts, which its marker tests now load. Both are added to .github/workflows/storage-locks-windows.yml and to the pin.
    • A first pnpm health run refused because the suite failed under this Mac's en_NZ locale: the lowercase "pm" fails the CI-locale time patterns, and the same happens on main. The gate runs with LANG=en_US.UTF-8, as CI does.

    Owner direction (2026-10-26). AGENTS.md is loaded into context automatically as project instructions, in Claude Code and in Codex. After a compaction it is read from disk again only when its text is not in context or it changed on disk. PRODUCT_GOAL.md, the PNG and the Issue are still read in full.

    • The rule is written into AGENTS.md Mandatory entry 2 and into the restore hook's rule (.codex/restore-product-context.mjs; its 9 tests pass).
    • The change rides on the pt1 branch, as docs unrelated to the application do.

    Next: the full gate on the final tree, then local CodeRabbit, the commit and /ship.

  9. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    pt1: local CodeRabbit CLI review

    Run.

    • CodeRabbit CLI 0.9.1: coderabbit review --agent --committed --base origin/main -c .coderabbit.yaml --fresh.
    • Included reviews were used; no credits.
    • Reviewed: ef2498bd, all 77 changed files. The review completed.
    • Coverage limit: coderabbit config validate .coderabbit.yaml stopped on the CLI's own schema handling (strict mode: unknown keyword: "x-undocumented"). The configuration still passed to the review through -c.

    Findings: 2, both minor. Both verified against the code and fixed in 5f35228b.

    1. wikiRunRecord.ts (CWE-532, minor): on Windows, the home-folder comparison was case-sensitive. A drive letter or folder written in another case than homedir() kept the account name in the Output record.
      • Fix: the comparison folds case on Windows only, and the rest of the path keeps its case.
      • Test: wikiRunRecord.test.ts, a Windows path with a lowercase drive letter.
    2. findGeneratedWikiProblem.ts (minor): a published manifest that cannot be read was told as another checkout's Wiki.
      • Before, the learner was sent to the output setting instead of the recovery request.
      • Fix: the owner check (isWikiOwnedBy) tells an unreadable manifest apart and leaves it to the end's recovery sentence.
      • Tests: findGeneratedWikiProblem.test.ts, and a host test with a receipt that names a broken manifest.

    Checks. After the fixes, typecheck, lint and health:static pass, and the 197 affected tests pass. Next: /ship.

  10. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    Re-entry after compaction (2026-10-26, implementing → delivery: /ship pt1)

    • Reads, from disk after this compaction: PRODUCT_GOAL.md in full (goal version 10, 444 lines); this Issue's body and its nine comments, the pinned Proposed change included. AGENTS.md was not read again from disk: its text is in context, and its only change on disk since the session began is O10's two lines (checked with git diff origin/main -- AGENTS.md).
    • Image. docs/designs/assets/codebook-product-spec-v9.png, opened with an image tool (a 1200 px copy; identity checked on the original): 1024 × 1536, 1,878,402 bytes, SHA-256 f189ee82…caf2aa. Regions: 1 (live), 2 (replay), 3 (DeepWiki, with Update LLM Wiki beside the freshness state and Output Change location) and the shortcut strip.
    • State. Branch codex/cycle-0055-pt1 at 5f35228b, no PR yet. /ship is at Steps 5–8: the test lane passed (exit 0) but ran while the coverage audit added 3 tests, so it is run again on the final tree. Plan completion audit: 19 DONE, 3 CHANGED, 1 PARTIAL (host tests), 1 NOT DONE (CHANGELOG, written at /ship Step 13).
  11. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    pt1: /ship done — PR #133 open (0.2.45.0)

    • PR: v0.2.45.0 feat: Cycle 0055 pt1: Codebook: Generate LLM Wiki writes a project's first LLM Wiki through the editor agent #133, head 55ef3bce (v0.2.45.0). Delivery: PR-open.
    • Review: /ship Step 9 reached its three fixing cycles (converged:false); every last-round finding (pass 3 and Step 11: Claude adversarial, Codex adversarial, Codex structured review with P2 only) was fixed. No Critical/Major defect stays open, so no next-cycle Issue records one. Informational findings answered Skip in passes 1–2 are tasks 10–20 here. Task 8 (E1-F3) is closed with its root cause (the publisher refuses an existing folder without a publication record) and the fix.
    • Exact-HEAD gate on 55ef3bce: 15/15 checks and the pre-gate secrets scan exit 0: pnpm test 7045 (7039 pass, 6 skipped, 0 fail), test:package 1071 (1061 pass, 0 fail), Reader DOM 5/5 (387 cases), health 0, restore hook 9/9.
    • Exploratory QA (/ship Step 9.2.1, editor stand-in): pass 1 found a defect (a Cursor Update with no Wiki and a learner's own skill), fixed; passes 2 and 3 6/6.
    • Next: required CI and hosted CodeRabbit on v0.2.45.0 feat: Cycle 0055 pt1: Codebook: Generate LLM Wiki writes a project's first LLM Wiki through the editor agent #133 → /coderabbit-resolver until CodeRabbit APPROVED on the exact head → merge with --match-head-commit. Then pt2.
  12. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    Entry (2026-10-26, new session, implementing: pt2)

    • Reads, from disk in this session: PRODUCT_GOAL.md in full except ## Final acceptance protocol (goal version 10, lines 1–356 of 444); this Issue's body and its eleven comments, including the pinned Proposed change (6408188822) and the /autoplan review record. AGENTS.md is in context as project instructions (O10).
    • Image. docs/designs/assets/codebook-product-spec-v9.png, opened with an image tool: 1024 × 1536, 1,878,402 bytes, SHA-256 f189ee82…caf2aa. Its regions are 1 (live), 2 (replay), 3 (DeepWiki, with Update LLM Wiki beside the freshness state and Output Change location) and the shortcut strip.
    • State. Branch codex/cycle-0055-pt2 at 293ded81 (= origin/main, v0.2.45.0), no PR. The one dirty file is extension/src/constants.ts: 59 lines of view constants left uncommitted by the earlier pt2 subagent, which stopped on an authentication error. A retry launched at 09:23Z ended with its parent session and left no change or commit. No Codebook test process runs.
    • Decision (recommended option, the owner cannot answer). The draft is kept as the starting point. The pt2 implementation subagent was launched again with the same brief: section 1 of the pinned plan, tasks 2, 5 and 5b, AC 1, 2, 10 and 13. N55 (task 6) stays with the driving agent.
    • Next: review the subagent's commits, then run the checks and build the candidate VSIX. N55 then runs in the Space local:codebook-qa.
  13. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    pt2: implementation, local reviews and fixes

    Implementation (subagent, re-executed by the driving agent). Eight commits, ba8fe45a..d4150d3b, on codex/cycle-0055-pt2:

    • the LLM Wiki view (readLlmWikiViewState, readLlmWikiViewFacts, llmWikiView, registerLlmWikiCommands);
    • the shared freshness label (describeWikiFreshness, passed to the page through WikiUpdatePageSettings);
    • learning.svg, the manifest entries, the README section, and 74 new tests.

    Driving agent's re-run on d4150d3b, from extension/ with LANG=en_US.UTF-8: format:check, typecheck, lint, health:static, dupes and dead-code each exit 0. pnpm test gave 7122 tests: 7116 pass, 0 fail, 6 skipped.

    Local CodeRabbit CLI. coderabbit review --agent --committed --base origin/main -c .coderabbit.yaml --fresh on d4150d3b completed with 30 files reviewed and 0 findings.

    open-code-review delegation. OCR range mode origin/main..codex/cycle-0055-pt2 gave 30 files: 19 reviewable, all reviewed (100 %, none skipped). The default exclusions (11) are reported apart: 9 test files, extension/README.md and learning.svg. Findings: no critical. All nine are fixed in 8836c142 and 62f61d86 (fixer subagent). Each behavior fix has a test that fails without it.

    # Severity Finding Fix
    1 medium-high The watcher filtered events by exact fsPath equality. VS Code lowercases a Windows drive letter, so on Windows every event was dropped. Both sides are compared through comparableFilePath (case-folded on win32/darwin). Test: an event spelled with another case still refreshes.
    2 low-medium A read that finished after dispose() created a watcher, a poll and a notice. Early returns after each await; show, keepPoll and keepWatcher do nothing once disposed. Test included.
    3 medium Each row's accessible name was its tooltip, not its label and description. accessibilityInformation.label = label, description. Test per row kind.
    4 low One failed read lost the reservation/last-attempt memory, so a later publication gave no notice. A failed read keeps the remembered rows. Test included.
    5 low The freshness check ran while an attention cause hid row 1. It runs only when row 1 shows. Test included.
    6 low Glob characters in the output path broke the watcher's pattern. escapeGlobCharacters (e.g. wiki[1] → wiki[[]1]). Test included.
    7 low fullCommitHash was duplicated. One utils/fullCommitHash.ts.
    8 low Copy details replaced the home folder by split/join, which corrupts text when the home folder is / or empty. withHomeFolderShown. Unit test included.
    9 low Magic strings were outside constants.ts. Moved: OPEN_DEEP_WIKI_COMMAND, LLM_WIKI_VIEW_WINDOW_ID, LLM_WIKI_WATCHING_MESSAGE.

    Kept by decision: Update's inline icon stays $(cloud-download) rather than the plan's refresh, so it does not clash with the title bar's Refresh.

    N55. It runs on the candidate built from d4150d3b: codebook-pt2-d4150d3b.vsix, SHA-256 68488dc071f63030023e2d3c31e3e3d2ec0b5b83209ce7d61a8986c78de7a11e, 2,080,966 bytes, with skill 1.0.49 30c43967….

    • The fixes above change no visible pixel on macOS. Rows 1–5, the welcome, the confirmation and the reader are unchanged. They change watcher matching (Windows), disposal, screen-reader names and the glob of unusual folder names.
    • So the N55 evidence keeps its impact reason for the final head, which the PR states.
  14. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    N55 result (Task 6): PASS for steps 1–6 in both hosts; step 7 PASS with finding N55-F4

    Identity

    • Candidate. codebook-pt2-d4150d3b.vsix (0.2.45, built from d4150d3b), SHA-256 68488dc071f63030023e2d3c31e3e3d2ec0b5b83209ce7d61a8986c78de7a11e, the same on both sides. Installed in the Space's VS Code profile "Codebook QA 0049" and in Cursor.
    • Space. local:codebook-qa, macOS 26.5.2, display 1920 × 1080, editor and Chrome windows at 1920 × 1050.
    • Hosts.
      • VS Code 1.142.0, chat Copilot Chat with GPT-6 Luna (picker checked before Generate).
      • Cursor 3.27.12 (VS Code base 1.128.0), with cursor-agent 2026.10.22-27dcf5f. Its model is Grok 4.6 High Fast (~/.cursor/cli-config.json).
    • Target. QA clone ~/qa/n55/nextjs-dashboard at 1936e41, which had no .codebook before the trial. It was removed after the evidence was copied.
    • Takes. OBS Window Capture, 30 fps, 1920 × 1050, silent tracks (−91 dB).
      • Preflight takes are in the evidence; each was checked with a reversible change behind the other app.
      • Take 1, VS Code, 2296.9 s: 72ee7160…
      • Take 2, Chrome reader for VS Code, 1590.1 s: 10823101…
      • Take 3, Cursor, 390.7 s: 33c85162…
      • Take 4, Chrome reader for Cursor, 786.2 s: e1fe7864…

    Step 1: empty state, Generate, row 2 and the icons. PASS in both hosts.

    • Welcome. It shows the host's text from the plan (VS Code: the E1-F2 approvals line; Cursor: cursor-agent), the Generate LLM Wiki button and the inline Change location link. The confirmation names /Users/lume/qa/n55/nextjs-dashboard/.codebook/wiki and the runner.
    • VS Code. Row 2 read Generating… In chat · N min of 55, with the wrapped watching message. The status bar read Watching for the LLM Wiki · Stop watching (D4).
      • Generate was pressed at 10:22:12Z and the Wiki published at 10:54:17Z: 32 min 05 s.
      • The learner approved 27 tool steps. At 10:51Z the chat answered Sorry, the response hit the length limit. The watch kept going, and the learner typed Continue in the same session.
      • The run ended generated, with the notice LLM Wiki generated in .codebook/wiki. and Open in Browser, and row 1 Wiki source current.
    • Cursor. Row 2 read Generating… cursor-agent · N min of 55.
      • Generate was pressed at 11:30:10Z and the Wiki published at 11:34:37Z: 4 min 27 s. The agent exited at 11:35:17Z.
      • The Output record reads end=succeeded summary="published" output=~/qa/n55/….
    • Steps to start (TTHW).
      • VS Code: 3 clicks (Codebook icon, Generate LLM Wiki, Generate), plus workspace trust as setup. The trust row's Manage Workspace Trust opened the host's trust editor, so the command-id resolution worked in VS Code.
      • Cursor: 4 clicks (Activity Bar overflow, codebook, Generate LLM Wiki, Generate). There was no trust prompt.
    • Narrow sidebar (~220 px). Labels stay readable, and descriptions and actions truncate with an ellipsis and stay reachable through selection and the context menu. Seen in both hosts.
    • Icons. In Default Dark Modern, Light Modern, High Contrast and High Contrast Light, codebook (book.svg, a page) and codebookLearning (learning.svg, an open notebook with a check mark) are two different, legible icons in both hosts (n55-icons.tgz).
      • First, each host's earlier QA layout had moved the Learning summary view out of its container, so View: Reset View Locations was run once per host. That is a host setting, not product state.

    Step 2: the reader against region 3. PASS. Every element is present in both hosts (compare/region3-vs-vscode.png, compare/region3-vs-cursor.png):

    • repository header and indexing context;
    • chapter navigation;
    • an article with Relevant source files and inline citations;
    • the on-page outline;
    • diagrams;
    • the question composer;
    • Update LLM Wiki beside the freshness state;
    • Output: Project folder · Change location;
    • the Open in VS Code / Open in Cursor rail.

    Step 3: content, outline, diagram and question. PASS: 6 of 6 claims correct per host, each checked against the source at 1936e41, and the diagrams are correct.

    • VS Code, Architecture.
      • The dashboard layout places the side nav beside a scrollable content region (app/dashboard/layout.tsx:5-9).
      • The overview composes three Suspense regions with skeleton fallbacks ((overview)/page.tsx:18-28).
    • VS Code, Dashboard and Data Reads.
      • fetchLatestInvoices inner-joins customers, orders by date descending, limits to 5 and formats cents (data.ts:53-59).
      • The page size is six, with the offset taken from the one-based page (data.ts:112,125).
    • VS Code, Invoice Lifecycle.
      • Zod parses customerId, amount and status, and invalid fields return errors before any write (actions.ts:65-77).
      • Valid amounts become cents with a generated date, a failed insert returns a database error, and success revalidates and redirects (actions.ts:79-97).
      • Its diagram (createInvoice → safeParse → field errors / attempt insert) matches actions.ts:65-89.
      • Outline: Delete and money units and Create path scrolled to their headings.
    • Cursor, Database and Money Units.
      • POSTGRES_URL, the postgres-js client with max: 1 and SSL in production (db/index.ts:6-15).
      • Drizzle Kit's schema path, db/migrations, .env.local loading and the gitignored migrations (drizzle.config.ts:4-9, .gitignore:42).
    • Cursor, Authentication.
      • The proxy matcher excludes API, static and image paths and PNG files (proxy.ts:5,9).
      • The authorized callback's three branches (auth.config.ts:8-17). Its diagram (authorized() → return false / return true / redirect /dashboard / return true) matches lines 11–17.
      • Outline: Credential verification and Request gate scrolled to their headings.
    • Cursor, Dashboard and Data Reads.
      • The page size of six drives limit, offset and the page count (data.ts:112,125,151,189).
      • The tests assert a six-row limit and offsets 0 and 6 (data.test.ts:144-169).
    • Questions. Each host got its own question, not asked before.
      • VS Code: "How does the customers table compute each customer's total pending and total paid amounts?" The answer cites app/lib/data.ts:271/274/279/296, and the code there matches. Clicking data.ts:271 opened VS Code at Ln 271 in the clone window.
      • Cursor: "What happens when deleting an invoice fails in the database, and does the user see an error message?" The answer cites actions.ts:151/155/156 and buttons.tsx:32, which match. Clicking actions.ts:151 opened Cursor (scheme cursor://) at Ln 151 in the clone window.

    Step 4: ? and typing. PASS in both hosts. ? opened Keyboard shortcuts (focus in search, Esc closes it). The question text ended in ?, which was inserted as text.

    Step 5: update and freshness, both ways. PASS in both hosts.

    • Unchanged source. Update LLM Wiki answered already current (Cursor: Already current (checked 04:40 AM); VS Code: the confirmation and then a current check).
    • The edit changed a fact, not only bytes. Before it, the manifest's app/lib/data.ts SHA-256 1ddf2dc4… equals shasum.
    • VS Code. ITEMS_PER_PAGE was changed from 6 to 8.
      • Row 1 (after Refresh) and the page read Source changed · Update available.
      • The browser's Update handed off to the chat (Chrome protocol prompt, then the editor confirmation). It published at 11:14:41Z, about 6 min later.
      • The manifest SHA a2494094… equals the edited file's. dashboard-data.html now states "the source currently sets the page size to eight" with its citation at data.ts:112 (sha a2494094…), where it read "six" before.
      • The browser and row 1 then read Wiki source current.
    • Cursor. ITEMS_PER_PAGE was changed from 6 to 10. Both surfaces read Source changed · Update available.
      • The update published at 11:44:59Z, about 3 min later. The manifest SHA bab60427… equals the edited file's.
      • The page states "the page size to ten" with its citation at data.ts:112 (sha bab60427…), and adds that the tests still assert six. The browser read Wiki source current · Updated at 04:45 AM.
    • Revert. Both edits were reverted in the clone. After the learner's revert, the VS Code chat, still verifying, published once more to match the reverted source. The "eight" Wiki is kept in the evidence.

    Step 5b: interruption and recovery. PASS, with codebook.wikiOutputDirectory set to .codebook/wiki-interrupt and restored afterwards.

    • VS Code.
      • Row 2's inline Stop watching turned the marker into the reservation (watchEndedAtMs). The view showed Waiting for chat · retry after … and Last generation stopped · stopped watching.
      • A new Generate was refused: Codebook did not start the LLM Wiki generation: The VS Code chat this window asked at 04:25 AM PDT may still be generating this Wiki. Codebook stopped watching it at 04:25 AM PDT and waits for it until 05:21 AM PDT. If that chat was stopped, choose Generate anyway…, with Generate anyway.
      • The learner stopped the request in the chat. The reservation was not waited out (the plan allows this).
    • Cursor.
      • Row 2's inline Cancel, pressed with no publish lock or journal present, ended the agent within a second. The marker was removed.
      • The view showed Last generation stopped · cancelled with the notice LLM Wiki generation cancelled at 04:48 AM.
      • Try again started a new generation at once. Codebook: Stop LLM Wiki Run from the Command Palette stopped it.

    Step 6: loaded skill identity.

    • VS Code reads /Users/lume/.vscode/extensions/laststance.codebook-0.2.45/skills/codebook/SKILL.md (skill 1.0.49, SHA-256 30c43967…). The session records name this path 14 times, and it equals the VSIX's extension/skills/codebook/SKILL.md.
    • Cursor's managed skill ~/.cursor/skills/codebook/SKILL.md is 1.0.49, SHA-256 e9d45901…. It is the VSIX skill with its one placeholder {{CODEBOOK_PUBLISHER_PATH}} rendered to the 0.2.45 publisher path (diff: that line only), and it was deployed at 04:30 PDT, at the generation's start.

    Step 7: regression of saved replays, outside the clone.

    • History lists. Unchanged in both hosts. codebook://node-history before and after equals in studyId, status, stopCount, explainedStopCount and materialRevision: VS Code 21 = 21 (with N54's c762e4ea…_273f4157…), Cursor 14 = 14 (with fbd584e0…_6cf9fd04…).
    • VS Code. N54's replay opened from Saved studies (Test passed, capture complete, 2 of 2) at 92.66 s, and Next event moved it to 159.81 s / 159.85 s.
    • Cursor. N54's replay opened (Test passed, capture complete, 7 of 7, Step 1 of 7 at 20.41 s, with recorded debugger variables), and Next event moved it to 48.91 s. It opened only after a window reload: see N55-F4.

    Findings (feature-cycle rule: none is critical, all carried as tasks)

    • N55-F2 (medium, reader Q&A, VS Code). The first question in a VS Code window raises VS Code's modal "The extension codebook wants to access the language models provided by GitHub Copilot" in the editor. Meanwhile the browser reader says only Asking the editor model….
      • A learner reading in the browser waits without knowing that the editor asks for consent. It took 75 s here, until the driving agent looked at the editor.
      • It closes when the reader says that the editor may be asking for permission, with a test.
    • N55-F3 (low, LLM Wiki view, VS Code). At the end of a watched run, the view's TreeView.message goes before the rows change. For 7 frames (~233 ms) row 2 Generating… In chat · 32 min of 55 shows without its message, then row 1 appears (take 1, frames 54–60 after 1977 s).
      • show() sets the message synchronously, while the tree re-renders after getChildren.
      • It closes when the message and the rows change in one render, with a test.
    • N55-F4 (major, test-replay open, Cursor). Opening N54's test replay from Saved studies in Cursor's designated window was refused twice with Codebook could not open the test replay … Native pane, group or focus changed while presentation waited; the learner arrangement was preserved.
      • Output records presentation:placement-refused (guard retainPresentationPlacement). The first refusal had a group-change event 0 ms after arming. The second had "Events while armed: none".
      • Later selections, after Close Study Workspace and closing the tabs, did nothing at all: no notice and no Output entry.
      • After Developer: Reload Window and View: Close All Editor Groups, the same selection opened the replay.
      • The saved history is unchanged. Root cause unknown; next inspection: the guard's refusal with no armed events, and the silent no-op after it.
      • It is a step-7 regression check, not one of the increment's own steps 1–5. It is not caused by pt2's changed modules, which leave the Study workspace untouched.
    • Observations, no product change.
      • GPT-6 Luna hit the chat's length limit once, and the learner's Continue resumed the session.
      • Chrome and Cursor protocol prompts appear on each hand-off. That is the host's behaviour, and the README covers it.

    Evidence (Mac, ignored, SHA-256 the same on both sides): artifacts/cycle-0055/n55/

    • n55-vscode-evidence.tgz 155fca94…: takes 1–2, chat session and transcripts, the .codebook folder with the three publications, the "eight" Wiki, the edit diff, screenshots and the action log.
    • n55-cursor-evidence.tgz c2816461…: take 3, the .codebook folder, the deployed skill, cli-config.json, the edit diff, screenshots and the action log. Take 4's finished file is cursor/take4-chrome-cursor-reader-2026-10-26T113625Z.mp4 e1fe7864….
    • n55-step7-evidence.tgz 5e2c5bf1…: the before and after lists, Cursor's Output log and screenshots.
    • n55-icons.tgz 43fb5114….
    • compare/region3-vs-vscode.png 1f9ee2e8…, compare/region3-vs-cursor.png b4e0ae11…, compare/welcome-both.png c9f8354f….

    Impact reason for the final head. OCR's fixes (8836c142, 62f61d86) came after the candidate. They change:

    • watcher-path matching (both sides case-folded on macOS, so events still match);
    • disposal;
    • each row's screen-reader name;
    • glob escaping of unusual folder names;
    • the home folder in Copy details.

    None changes a row, label, notice, welcome, confirmation or reader pixel seen in N55, so N55's evidence stands for that head. Later /ship fixes state their own impact in the PR.

  15. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    Re-entry after compaction (2026-10-26, delivery: pt2 /ship fixing cycle 3)

    • Reads, from disk after this compaction: PRODUCT_GOAL.md in full (goal version 10, all 444 lines); this Issue's body and its 14 comments, the pinned Proposed change and the N55 result included. AGENTS.md is in context as project instructions and was not read again (O10).
    • Image. docs/designs/assets/codebook-product-spec-v9.png, opened with an image tool: 1024 × 1536, 1,878,402 bytes, SHA-256 f189ee82…caf2aa. Regions: 1 (live), 2 (replay), 3 (DeepWiki, with Update LLM Wiki beside the freshness state and Output Change location) and the shortcut strip.
    • State. Branch codex/cycle-0055-pt2 at b36df054, clean tree, no PR. /ship Step 9 pass 3 and Step 11 (Claude adversarial, Codex adversarial, Codex structured) are done; this is the third and last fixing cycle, so every last-round finding is fixed (owner rule, 2026-10-23). No Critical finding is open.
  16. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    pt2: /ship done — PR #134 open (0.2.46.0)

    • PR: v0.2.46.0 feat: Cycle 0055 pt2: the LLM Wiki view in the Activity Bar shows, opens and updates the generated Wiki #134, head e3d1721a (v0.2.46.0). Delivery: PR-open.
    • Review: /ship Step 9 reached its three fixing cycles (converged:false). Every finding of the last round (pass 3, Step 11 Claude adversarial, Codex adversarial with three Medium, Codex structured with one P2, and the local CodeRabbit CLI's publication-read order) is fixed in 076ac9f3; the full lane then showed one harness interaction (the view's follow-up read took a hold meant for a run), fixed in 7a02e59d. No Critical or Major defect stays open, so no next-cycle Issue records one. Passes 1–2's skipped informational findings are tasks 24–32.
    • Exact-HEAD gate on e3d1721a (tree e7ab5594): 15/15 checks and the pre-gate secrets scan exit 0: pnpm test 7195 (7189 pass, 6 skipped, 0 fail), test:package 1073 (1063 pass, 0 fail), Reader DOM 5/5 (387 cases), health 0, restore hook 9/9.
    • Documentation audit: updated (root README status); extension/README.md covers every behaviour of the 0.2.46.0 CHANGELOG entry.
    • Next: required CI and hosted CodeRabbit on v0.2.46.0 feat: Cycle 0055 pt2: the LLM Wiki view in the Activity Bar shows, opens and updates the generated Wiki #134 → /coderabbit-resolver until CodeRabbit APPROVED on the exact head → merge with --match-head-commit → closing comment.
  17. ryota-murakami commented on Oct 26, 2026

    @ryota-murakami
    ContributorAuthor

    Closing: Cycle 0055 delivered (pt1 #133 v0.2.45.0, pt2 #134 v0.2.46.0)

    Outcome: demonstrated. From Codebook's Activity Bar entry, a learner in a repository without an LLM Wiki generates one (the confirmation, then the editor's agent: Copilot Chat in VS Code, cursor-agent in Cursor), follows its progress in the LLM Wiki view, opens it in the browser and updates it; in a repository with one, the same view opens and updates it. N55 proved the Wiki area natively in both hosts on the development target (steps 1–6 PASS; step 7 PASS with N55-F4): generation, the reader against region 3, chapters and outline, 6/6 sampled claims per host, repository Q&A with citations into the same host, update after a meaning change, freshness both ways, interruption and recovery, the ? list, and the loaded skill's identity.

    Delivery.

    Gaps after this cycle (rows this cycle touched; the others keep #132's audit).

    • AC-WIKI: native fidelity proven again (N55); carried N55-F2 (reader Q&A consent notice) and E1-F1 (renderer label overlap).
    • AC-WIKI-UPDATE: Generate from Codebook's entry now matches; update and freshness proven natively both ways.
    • AC-ENTRY: the Activity Bar reaches the generated Wiki (LLM Wiki view), and the two containers have distinct icons; proven natively in four themes per host.
    • AC-SOURCE-LINKS: a citation opened the cited line in the same host, both hosts.
    • AC-SHORTCUTS: the Wiki's ? list proven natively; assigned keybindings remain a later candidate.
    • AC-SKILL: the loaded Wiki-route skill identity recorded per host (VS Code bundled path; Cursor managed copy with the publisher path rendered).
    • AC-REPLAY / AC-SAVE regression: saved histories unchanged in both hosts; N55-F4 (Cursor test-replay open refused, then silent) is carried.
    • Largest remaining gap: execution-form coverage (AC-REAL-PROJECTS): the Node server profile (O2) is the next feature candidate.

    Carried defects (every open task; the next cycle is a bug-fix cycle that fixes each with a test that fails without it, or closes it with evidence).

    • Task 7: E1-F1 (defect, renderer, carried). Two conditional edges between the same pair of nodes in one column draw their labels over each other in a flow diagram (skills/codebook/render-wiki-diagrams.mjs flowSvg, a vertical lane offset of 34 px against ~22-character labels). Source: E1, the VS Code agent's preview at 05:05Z (screenshot SHA-256 fdc11f75…290d). Closes with a renderer fix and a test that fails without it: two branch edges A→B with B below A give non-overlapping label boxes. Not critical, so it is carried to the next bug-fix cycle (feature-cycle rule).
    • Task 9: pt1 OCR finding 7 (defect, carried). A Generate pressed while an Update's start checks run (or the reverse) is coalesced into the running attempt and nothing is said (runWikiAttempt, extension.ts). Closes with a sentence for the coalesced press and a host test that fails without it. Low: the modal confirmation blocks the editor's own commands, so only the sub-second start checks are exposed there; the browser reader's Update button can still be pressed during a generation's modal confirmation (/ship pass 1, red team), and joins it silently. Carried (feature-cycle rule).
    • Task 10: One utility per file (pass 1 M1–M3, pass 2 M6). startWikiRun.ts also holds describeMissingWiki; wikiRunBoundMs.ts also holds longestWikiRunMs and LONGEST_WIKI_RUN_MS; wikiRunRecord.ts also holds agentExitOf; the sentence An LLM Wiki already exists in <folder>. Update it instead? is inline in extension.ts. Closes with one utility per file and the sentence beside describeMissingWiki.
    • Task 11: Commands never executed by a test (pass 1 T1, pass 2). codebook.showWikiOutput and the "nothing running" branch of codebook.cancelWikiRun. Closes with host tests (the harness's createOutputChannel stub records show).
    • Task 12: Cursor generation's stop and bound have no host test (pass 1 T2). The run's stop and its 55-minute end are covered by unit tests and /ship QA probes only (the VS Code bound got a host test in pass 3). Closes with two host tests.
    • Task 13: A test races a 200 ms timer (pass 1 T3, pass 2). wikiGenerateFlow.test.ts "a second Generate while a Cursor generation runs" reads the refusal after a fixed race. Closes by awaiting the refusal.
    • Task 14: wikiRunRecord rows (pass 1 T4). No row for already-current, a failed end with site: 'replaced', or an output folder equal to the home folder. Closes with those rows.
    • Task 15: Stale "press Cancel" (pass 1 D2). describeWikiUpdate.ts doc comments and its @example still say Cancel for the VS Code watch, which is Stop watching (D4). Closes with the docs corrected.
    • Task 16: "cancelled" and "stopped" for one stop (pass 2 D7). wikiGenerateNotice.ts says cancelled in one notice and stopped in its sibling. Closes with one verb per host and a wording test.
    • Task 17: A raw cause id in a sentence (pass 2 D8). describeWikiGenerateBlock.ts's fallback shows (<cause>: <path>) to the learner. Closes with a learner sentence and the cause in the Output record.
    • Task 18: A failed release is not retried (pass 1 state machines). A release of a generation's claimed marker that fails (startWikiRun.ts after the claim, extension.ts closing-window path) is not retried, so the marker can stand until its bound. Closes by routing it through the marker change's retry.
    • Task 19: A taken-over reservation is lost after a skill conflict (pass 2 red team). After Update or Generate anyway took over a stopped watch's reservation, a Cursor skill conflict releases the marker, so the reservation's protection is gone. Closes by keeping or restoring the reservation, with a host test.
    • Task 20: The skill step has no bound (pass 2 red team). The managed Cursor skill's verify and deploy run with the marker claimed and no time bound; Stop LLM Wiki Run now says the run is starting but cannot stop it. Closes with a bound (or an abort) and a host test.
    • Task 21: N55-F2 (medium, reader Q&A, VS Code). The first question raises VS Code's language-model consent modal in the editor while the browser reader only says Asking the editor model…. Closes when the reader tells the learner the editor may be asking for permission, with a test.
    • Task 22: N55-F3 (low, LLM Wiki view, VS Code). At a watched run's end the TreeView.message disappears ~233 ms (7 frames) before the rows change, so row 2 shows without its message. Closes when the message and the rows change in one render, with a test.
    • Task 23: N55-F4 (major, test-replay open, Cursor). Opening a saved test replay from Saved studies was refused twice with Native pane, group or focus changed while presentation waited (the second with no armed events); later selections did nothing at all (no notice, no Output entry) until a window reload. Root cause unknown; closes with the cause, a fix and a test that fails without it.
    • Task 24: Fixed negative waits (pass 1, pass 2 testing). Two llmWikiView.test.ts tests prove an absence by a fixed sleep (an unrelated file's event reads nothing; no second read after a burst). Closes with a wait on an observable signal of the fake watcher or the debounce.
    • Task 25: Sequential fact reads (pass 1 performance). readLlmWikiViewFacts reads the start block, the token, the generation, the owner and the marker one after another. Closes with the independent reads in parallel and a test that the order-dependent ones keep their order.
    • Task 26: The poll stops at the error row (pass 1, pass 2 state machines). A read that throws shows the error row, which is no run row, so the 30-second poll stops; with no watcher it was the only trigger. Closes with polling while the error row follows a run row, and a host test.
    • Task 27: Reveal Wiki Folder on a remote or missing folder (pass 1 red team). revealFileInOS on a remote workspace or a folder deleted meanwhile does nothing visible. Closes with a sentence for both cases and a host test.
    • Task 28: Background work while the view is hidden (pass 1 performance). The poll and freshness checks run while the LLM Wiki view is collapsed or hidden. Closes with no poll while hidden (a read when shown again) and a host test.
    • Task 29: Manage-trust lookup (pass 1 simplification). MANAGE_WORKSPACE_TRUST_COMMAND_IDS holds two candidate ids and resolveManageTrustCommand.ts (one caller) probes getCommands. N55 showed VS Code's id works; closes when Cursor's id is recorded, one id kept and the lookup dropped, or the two kept with that evidence.
    • Task 30: Naming and repetition (pass 2 maintainability). describeWikiGeneration.ts names the 7-character revision fullRevision; isCursorHost ? 'cursor' : 'vscode' is written seven times in extension.ts; two learner sentences are inline in registerLlmWikiCommands.ts (lines 81, 113). Closes with shortRevision, one host value, and the sentences in constants.ts.
    • Task 31: View copy and icons (pass 2 design). Try again uses $(play), and Stop watching and Cancel share $(debug-stop); inline-action titles mix sentence case (Stop watching, Change location) with Title Case; the welcome's fourth line names the setting id in running text; Change location reads as text, not as an action. Closes with a decision per item against the v9 PNG and VS Code's guidelines, and the package test pinning it.
    • Task 32: studyWorkspaceRemoval fails under full-lane load (full lane on b36df054 and earlier). It failed once with EACCES while all files ran; alone it passed 10 of 10. Closes with the cause, a fix and a run of the full lane, or evidence that the fault is outside the product's tests.

    Next cycle: bug-fix (Cycle 0056): /spec writes its Issue from this list, one task and acceptance criterion per carried defect, nothing ranked or selected. After it closes clean, the next feature cycle plans the Node server profile (O2).

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