Repository navigation
Cycle 0055: Codebook's Activity Bar generates, opens and updates the LLM Wiki, re-proven natively in both hosts #132
Description
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'scodebookcontainer 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.
- 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-dashboardhas no standalone server, extension or Vite UI, and AGENTS.md keeps editor trials on it. - 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.
- 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 forbuildWikiGeneratePrompt(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-agentCLI 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 projectas a comparison.
Record:
- how long generation takes: from the submission (the chat's send, or the agent CLI's start) to the publisher's
publishedanswer, 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
modelfield ofcursor-agent's JSON output, or "not reported";
- whether the publisher publishes: its JSON answer reads
published, andcodebook-wiki.jsonexists 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.
- 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
-
E1b: a headless sample on a larger repository, in the Space. It runs the same Cursor agent CLI path the entry uses, on
laststance/nsxat0897231(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
-
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).
-
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, theviewsWelcomeempty 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 stoppedrow; - the confirmation (D2);
- the VS Code status-bar text
Watching for the LLM Wiki · Stop watching(D4).
-
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, therunKindmarker 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, andcodebook.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
runKindreads asupdate; - a
generatemarker stays live past the update's 15-minute bounds and up to the generate bound, and its reservation lasts the generate bound; codebook.cancelWikiRunduring 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
generatedwith the changed-sources notice.
-
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). -
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.codebookLearninggets its own icon,src/assets/learning.svg: an open notebook with a check mark, a monochrome 24 × 24 SVG withcurrentColor, likebook.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 onlaststance/nsx0897231, recorded here. Evidence: published in 5 min 27 s (13 pages, 53 sources), E1b comment. -
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 ofnextjs-dashboard1936e41(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:-
The LLM Wiki view shows the empty state: its welcome text, with the output line and its
Change locationlink. 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
generatedwith 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
codebookicon (book.svg) and thecodebookLearningicon (learning.svg) as two different, legible icons.
- Row 2 shows progress with elapsed minutes, and the run ends
-
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).
-
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
correctorwrong. - 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
wrongis 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.
-
? opens Keyboard shortcuts in the reader. Typing
?in the question box inserts text. -
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.tsis chosen. If no page cites it, the first file the overview page cites is used instead, and recorded. The SHA-256 ofapp/lib/data.tsin the manifest'sincludedSources(.codebook/wiki/codebook-wiki.json) is recorded; it equalsshasum -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 sizeITEMS_PER_PAGEor 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 forapp/lib/data.tsequals the edited file'sshasum -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.wikiOutputDirectoryset 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) withOpen 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.
-
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.
-
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-historyis 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) orfbd584e0…_6cf9fd04…(Cursor). Otherwise the step is BLOCKED, not passed. - The two lists compare equal in
studyId,status,stopCount,explainedStopCountandmaterialRevision. - 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.
- 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,
- 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
wrongclaim, 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
wrongclaim 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.
- A failure of steps 1–5 is a failure of this increment's own outcome: a missing element, a
-
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.mjsflowSvg, a vertical lane offset of 34 px against ~22-character labels). Source: E1, the VS Code agent's preview at 05:05Z (screenshot SHA-256fdc11f75…290d). Closes with a renderer fix and a test that fails without it: twobranchedges 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). -
E1-F3 (closed in pt1). The Cursor CLI agent made the empty output folder itself and the publisher's preparation refused it. Evidence:
--prepareon an empty pre-existing output folder exits 1 withThe prior Wiki has no publication record. Inspect it, then use --prepare with --adopt-existing.;--adopt-existingexits 1 (no manifest); without the folder--prepareexits 0 (publish-wiki.mjsinspectOutput, 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). -
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).
- One utility per file (pass 1 M1–M3, pass 2 M6).
startWikiRun.tsalso holdsdescribeMissingWiki;wikiRunBoundMs.tsalso holdslongestWikiRunMsandLONGEST_WIKI_RUN_MS;wikiRunRecord.tsalso holdsagentExitOf; the sentenceAn LLM Wiki already exists in <folder>. Update it instead?is inline inextension.ts. Closes with one utility per file and the sentence besidedescribeMissingWiki. - Commands never executed by a test (pass 1 T1, pass 2).
codebook.showWikiOutputand the "nothing running" branch ofcodebook.cancelWikiRun. Closes with host tests (the harness'screateOutputChannelstub recordsshow). - 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
/shipQA probes only (the VS Code bound got a host test in pass 3). Closes with two host tests. - 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. -
wikiRunRecordrows (pass 1 T4). No row foralready-current, a failed end withsite: 'replaced', or an output folder equal to the home folder. Closes with those rows. - Stale "press Cancel" (pass 1 D2).
describeWikiUpdate.tsdoc comments and its@examplestill say Cancel for the VS Code watch, which is Stop watching (D4). Closes with the docs corrected. - "cancelled" and "stopped" for one stop (pass 2 D7).
wikiGenerateNotice.tssayscancelledin one notice andstoppedin its sibling. Closes with one verb per host and a wording test. - 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. - A failed release is not retried (pass 1 state machines). A release of a generation's claimed marker that fails (
startWikiRun.tsafter the claim,extension.tsclosing-window path) is not retried, so the marker can stand until its bound. Closes by routing it through the marker change's retry. - 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.
- 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.
- 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. - N55-F3 (low, LLM Wiki view, VS Code). At a watched run's end the
TreeView.messagedisappears ~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. - 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.
- Fixed negative waits (pass 1, pass 2 testing). Two
llmWikiView.test.tstests 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. - Sequential fact reads (pass 1 performance).
readLlmWikiViewFactsreads 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. - 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.
- Reveal Wiki Folder on a remote or missing folder (pass 1 red team).
revealFileInOSon a remote workspace or a folder deleted meanwhile does nothing visible. Closes with a sentence for both cases and a host test. - 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.
- Manage-trust lookup (pass 1 simplification).
MANAGE_WORKSPACE_TRUST_COMMAND_IDSholds two candidate ids andresolveManageTrustCommand.ts(one caller) probesgetCommands. 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. - Naming and repetition (pass 2 maintainability).
describeWikiGeneration.tsnames the 7-character revisionfullRevision;isCursorHost ? 'cursor' : 'vscode'is written seven times inextension.ts; two learner sentences are inline inregisterLlmWikiCommands.ts(lines 81, 113). Closes withshortRevision, one host value, and the sentences inconstants.ts. - View copy and icons (pass 2 design).
Try againuses$(play), andStop watchingandCancelshare$(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 locationreads 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. -
studyWorkspaceRemovalfails under full-lane load (full lane onb36df054and earlier). It failed once withEACCESwhile 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
-
In a folder with no Wiki, the LLM Wiki view shows the Generate LLM Wiki button, and invoking it starts a run of kind
generatethat hands a generate request to the host's agent. Proof:- a host test: the tree returns no rows, sets no
TreeView.messageand sets the context keycodebook.llmWiki.statetonone; - a package test: the manifest's
viewsWelcomeentry forcodebook.llmWikihaswhen: codebook.llmWiki.state == none, acommand:codebook.generateDeepWikilink on its own line and the inlineChange locationsettings 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.
- a host test: the tree returns no rows, sets no
-
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) orCancel(Cursor),Open Chat(VS Code only) andShow Outputas inline actions, never as its row click; - each of the ten
WikiUpdateConflictCausevalues 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.statetakesloading, thennoneorother.
-
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.
-
Each of these ends the run without a
generatednotice 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
generatemarker) 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
generatedshows row 3, with its cause andTry 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.
-
Both no-Wiki notices offer Generate LLM Wiki. A host test pins this.
-
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.
-
Each new or changed test states
protects=…; fails_when=…; no_claim=…. Changes to existing tests are reported with their reason in the PR. -
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, thenpnpm health; - from the repository root:
node --test .codex/restore-product-context.test.mjs.
Required CI passes, and hosted CodeRabbit approves the exact head.
- from
-
Every user-visible change has a CHANGELOG entry and its sentence in
extension/README.md. -
The published row's tooltip shows the generation identity in each of its four forms, pinned by a host test (accepted X1).
-
pnpm --dir extension health:staticandpnpm --dir extension healthpass against their unchanged baselines. The new logic is in the namedutils/modules. -
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. -
The README has the First LLM Wiki quickstart, the troubleshooting entries and the two titles of 3b. A package test pins the titles.
-
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
- Acceptance criteria are each test's
protects / fails_when / no_claim. Never "make the tests pass". - Real code and real tests land together.
- Any change to a test, validator, CI step, timeout, tolerance, threshold, snapshot or suppression is reported on its own line with its reason.
- A reported command names the command and its observed result.
- A report is a claim until the 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
runKindfield. 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.
- Admission timing changes. An older window treats a running generation's marker as expired after the update bound with its grace (
-
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.
- Why: two implementation mismatches (AC-WIKI-UPDATE Generate, AC-ENTRY), the stalest proof, and native provability on the development target. Execution forms cannot be proven natively before Stage 1.
- Considered: the Node server profile, which Cycle 0054: an unreached declared stop explains itself, a launch re-asks a changed root claim, and the native trial keeps unreleased listings #130's closing comment named as the likely candidate before this audit. It stays the next candidate (O2).
-
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.ts332,startWikiChatUpdate.ts123,runCursorWikiUpdate.ts195,findWikiUpdateStartBlock.ts340,classifyWikiUpdateEnd.ts412).
-
O4 (recommended): E1 and N55 run in a QA-owned clone of
nextjs-dashboardat1936e41inside 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/wikiinside 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), withcodebook-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.
- each host's generated Wiki folder (
-
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 watchingwith 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
/autoplanfinal gate (runcodex-cycle-0055-20261026-114235, gate_rev 1) resolved withrec. The plan is approved as-is, and each taste decision takes its recommended option:- d6:
viewsWelcomeon 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
/autoplancomment on this Issue. - d6:
-
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.
- The generate bound is 34.55 × 1.5 = 51.8, rounded up to whole 5 minutes: 55 minutes,
-
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
/goaltext 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/shipthree-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-agentin 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
- Status: closed. Result: demonstrated. Delivery: merged: 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), pt2 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 (squash298e90bd, v0.2.46.0, 2026-10-26T14:31:43Z). - pt2 delivery record:
/shipthree fixing cycles (converged:false; every last-round finding fixed; no open Critical/Major), exact-HEAD gate 15/15 one3d1721aand on the final head35d481e3, required CI green, hosted CodeRabbit APPROVED on35d481e3(2 Minor findings fixed, 1 outside-diff finding kept with evidence). - Next: bug-fix Cycle 0056 for every open task above (the closing comment lists them), via
/spec; then the Node server profile (O2).
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,…
Activity
ryota-murakami commentedon Oct 26, 2026
Entry (2026-10-26, planning)
83a07385).docs/designs/assets/codebook-product-spec-v9.png, opened with an image tool: 1024 × 1536, 1,878,402 bytes, SHA-256f189ee82…caf2aa. Its regions are 1 (live), 2 (replay), 3 (DeepWiki) and the shortcut strip.codex/cycle-0055atorigin/main601f3827(v0.2.44.0), with a clean working tree and no PR./specwrote this Issue from PRODUCT_GOAL.md and a gap audit of all 13 rows. The Codex quality gate scored it 8/10 twice, and both rounds' ambiguities are folded into the body./autoplannext, then E1.ryota-murakami commentedon Oct 26, 2026
Re-entry after compaction (2026-10-26, planning: /autoplan Design close)
docs/designs/assets/codebook-product-spec-v9.png, opened with an image tool: 1024 × 1536, 1,878,402 bytes, SHA-256f189ee82…caf2aa. Regions: 1 (live), 2 (replay), 3 (DeepWiki, with Update LLM Wiki beside freshness and Output Change location) and the shortcut strip.codex/cycle-0055at601f3827, 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/autoplanfinishes.ryota-murakami commentedon Oct 26, 2026
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 thecodebookActivity Bar container, aftercodebook.repositoryWiki. Its rows come from the same facts the update start reads:readWikiPublishToken(utils/readWikiPublishToken.ts:25), theinspectPublishedWikiclosure (extension.ts:1002),wikiLocation()withwikiOutputLabel, and the window'sWikiUpdateRunstate (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.tscomputes 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).readWikiPublishTokenandinspectPublishedWikiboth 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; orWiki freshness unknown: <reason>. While the check runs, the label isChecking freshness…, and the row can still be opened.bookcodebook.openDeepWikiUpdate LLM Wiki(refresh) →codebook.updateDeepWiki, hidden while a run row is presentGenerating…orUpdating…·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 shownsync~spinStop watching(VS Code) orCancel(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)Updating in another windoworGenerating in another window· its start timesync~spinwatchEndedAtMs), from any windowWaiting for chat·retry after HH:MM (about N min), with the run's start time and host (from the marker) in the tooltipclockOpen 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.generatedduring this session, until the next publication or the next runLast generation stopped· its short cause (stopped watching,stopped after 55 min,no Wiki published,agent exit 1)infocodebook.showLlmWikiAttention(shows the full sentence)Try again(play) →codebook.generateDeepWiki, hidden while rows 2–2c or 4 are presentwarningcodebook.showLlmWikiAttention(the block's full sentence, andCopy details)Output: <folder label>·Change locationfolderChange location(edit) →workbench.action.openSettingswith the argument"codebook.wikiOutputDirectory"WikiUpdateConflictCause,utils/wikiUpdateRun.ts:11-21, and the owner check)held-publish-lock,unfinished-publishPublish in progress or stoppedCopy recovery request,Refreshedited-manifest,unreadable-manifestWiki manifest needs recoveryCopy recovery request,Refreshnot-a-folder,linked-parent, or a manifest of another checkout (assertWikiOwner)Wiki folder belongs elsewhereChange locationlearner-file,special-file,edited-page,missing-pageWiki files changed by handReveal Wiki Folder→codebook.revealWikiFolder,RefreshThe 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 requestcopies the existing chat requestWIKI_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 attentionwith 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.
Open a folder to use the LLM Wiki, with the inline actionOpen Folder→vscode.openFolderwith no argument, a documented built-in command that shows the folder dialog.Trust this folder to use the LLM Wiki, withManage Workspace Trust→ the host's manage-trust command. Its id is unverified (workbench.trust.manage; vscode-go callsworkbench.action.manageTrust), so implementation confirms it withvscode.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.stateisnone, the tree returns no rows and the view sets noTreeView.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). TheviewsWelcomecontent is static text inpackage.json, chosen bycodebook.host(vscodeorcursor), in this order:Explore this project through source-linked chapters, diagrams and questions, written by your editor's AI.command:codebook.generateDeepWiki);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.The Wiki is written to the folder the setting codebook.wikiOutputDirectory names (default .codebook/wiki).followed by an inlineChange locationlink (command:workbench.action.openSettingswith 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.
codebook.llmWiki.stateisloading, no welcome shows, and the tree showsReading the LLM Wiki state….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.statetakes the valuesloading,noneandother.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.findUnacknowledgedWikiLeftover.ts:37-60), so a new start is admitted again (Eng decision 74).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.
<output>/codebook-wiki.json,<output>.update-run.json,<output>.publish-lock.jsonor<output>.publish-journal.json, through aFileSystemWatcher(aRelativePatternon 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);codebook.wikiOutputDirectorysetting or of workspace trust;readLiveWikiUpdateMarker: pid and process start);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 changedwhen the view is next shown or refreshed, not at the save.utils/llmWikiView.tsfires 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.
wikiLocation()resolves today: the first workspace folder (requireWorkspace,environment.ts:69-70).readLiveWikiUpdateMarker), so the view shows the run as another window's until it ends.Essential explanations wrap. While row 2 or 2c is present in VS Code, the view's
TreeView.message, which wraps, readsCodebook 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.
TreeItem.id(wiki,run,elsewhere,reservation,last-attempt,attention,output), so a selection survives a change of label.reveal.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:
generated.revision, kept only when it is a full commit hash (asinspectDeepWikiFreshness.ts:176-187keeps it);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;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.
Generate the LLM Wiki of <repository folder name>?It is written to <resolved output folder>., then where the request goes: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).The model is the one cursor-agent is set to use; Codebook does not choose it.(until CEO X6).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 withENOENT, becauseplaceStorageLock.ts:30creates 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):.codebook;The first 10 seconds (Design decision D3).
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 readsWaiting for the chat to startuntil the first sign, thenIn chat · N min of 55. No notification appears, because notifications would cover the chat's approval buttons (README).Generating the LLM Wiki in cursor-agent…with Cancel (today'swithProgress,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 keepsCancel, because there it stops the agent.One wording table (D5).
constants.tsholds each surface's text for each host and each run kind, and host tests pin the table: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.tschooses the kind, the bound, the existing-Wiki offer and the hand-over;utils/readLlmWikiViewState.tsgives the view's state;utils/llmWikiView.tsis 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 atextension.ts:1476moves intostartWikiRun.ts, soinspectWikiToUpdateandlookAtWikiStartkeep their branches unchanged.Health.
pnpm --dir extension health:staticandpnpm --dir extension healthstay clean against their baselines, with no baseline re-saved to absorb a finding (prior learningwiki-open-notice-branch-consumes-health-baseline).Dependencies. The closures live inside
activate(), sostartWikiRun.tstakes 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).One lifecycle. It runs in the existing update run (
WikiUpdateRun,utils/wikiUpdateRun.ts), with a run kindgeneratebesideupdate. The kind is also written into the run marker as an optional field,runKind: 'generate' | 'update':update;readLiveWikiUpdateMarker.ts:25, a non-strictz.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:
readLiveWikiUpdateMarker.ts,isRunMarkerExpired(lines 115–116) and the reservation window (line 234), from the marker'srunKind;extension.ts:1162-1167, which today usesWIKI_UPDATE_WATCH_TIMEOUT_MS);WikiLastRun, throughrememberLastWikiRun), which gains the run kind, so a reload keeps the bound;findUnacknowledgedWikiLeftover, called atextension.ts:1584-1592with the update's bound), which takes each record's bound.A
generatemarker expires afterWIKI_GENERATE_TIMEOUT_MS, plusWIKI_CHAT_OPEN_TIMEOUT_MSin VS Code. Its reservation lastsWIKI_GENERATE_TIMEOUT_MSafterwatchEndedAtMs. Anupdaterecord 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 anywayorUpdate anyway).runKindis parsed as an enum, an unknown value reads asupdate, and no bound is ever longer than the generate maximum.Host tests pin:
<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:
findWikiUpdateStartBlock);<output>.update-run.json), so a second window cannot start beside it;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.No agent to hand over to. The start fails as an update's does today, with no marker left:
describeWikiChatHandOver's sentence;resolveCursorAgentExecutable's error, which names where Codebook looks for it (~/.local/bin/cursor-agentor 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, asbuildWikiUpdatePromptdoes:Paths are quoted as
buildWikiUpdatePromptquotes 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.
handWikiRequestToChat(a new chat session, the same first-sign wait).runCursorWikiUpdate, generalized asrunCursorWikiAgent(projectRoot, prompt, signal, timeoutMs).extension.ts:815-820). So before the agent starts, the run checks the managed skill (verifyManagedCursorSkill,cursorSkillDeployment.ts:1828).deployCursorSkill, which keeps a learner's own or edited same-name skill and reports the conflict. No runtime MCP start or registration happens.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), bothundefinedwith no Wiki. The run's end reads the new publication identity as the update'sverifiedPublicationdoes (classifyWikiUpdateEnd.ts:240-247, which already counts an identity that wasundefinedat the start as new), without its freshness condition, and then two checks of the generate run. All three hold at the run's end:assertWikiOwnerclosure (extension.ts:975) accepts the manifest as this project's;readWikiFileToOpenofindex.html, ascurrentDeepWikichecks 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 readsLLM 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.
LLM Wiki generated in <folder>. <N> source files changed while it was written., with Update LLM Wiki beside Open in Browser, and row 1 showsSource changed · Update available.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
generatednotice 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 withwatchEndedAtMs. It stands until its run kind's bound afterwatchEndedAtMs, 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:Waiting for chat).No
generatednotice 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):Cursor Agent finished without publishing an LLM Wiki in <folder>., and a non-zero exit keeps today'sunfinishedExitErrorsentence.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.
Publish in progress or stopped) withCopy recovery request.Last generation stopped) and its cause.generatedin 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;Each generate sentence ends with what was left and the next action:
The chat may still publish; the LLM Wiki view shows the Wiki when it does. To stop it, stop the request in the chat.;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:
describeWikiChatErrorReply.ts:14-17puts a chat's error message into it);It never holds the agent's stdout, stderr, reply or error text, which may carry private source or credentials (
runCursorWikiUpdate.ts:157-159discards stderr for that reason). Paths in the record and inCopy detailsshow the home folder as~.Show Outputopens the record, andCopy detailscopies 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) andUpdate LLM Wikion a folder with no Wiki showCodebook 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
codebook.openDeepWikibecomes Codebook: Open LLM Wiki in Browser; its id stays, so keybindings and scripts keep working.codebook.cancelWikiRunis titled Codebook: Stop LLM Wiki Run in both hosts. The row's label staysStop watching(VS Code) orCancel(Cursor), per D4.4. Documentation
extension/README.md, LLM Wiki: open and update:Stop watching(D4);extension/README.md, a First LLM Wiki quickstart near the top. It covers:cursor-agentCLI installed and signed in, with a version check whose exact command implementation verifies;codebook.wikiOutputDirectorysettings 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.mdalso states:cursor-agentis set to use;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.ryota-murakami commentedon Oct 26, 2026
/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:
.codebook/is created before the claim;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
gstack-autoplan-timing summary): ceo 7h34 (outside 5m) | design 12m (outside 15m) | dx 48m (outside 3m) | eng 15m (outside 4m).Cross-Phase Themes
Deferred to TODOS.md
None: the owner forbids a TODOS file (AGENTS.md). Deferred work is in the plan's Later candidates:
cursor-agentprogress;Implementation Tasks (aggregated across phases)
Phase coverage
Final gate
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).rows=7/7 verdict=complete; Engrows=7/7 unverified=2 verdict=complete.ryota-murakami commentedon Oct 26, 2026
Re-entry after compaction (2026-10-26, implementing: E1 in progress)
/autoplanreview record included.docs/designs/assets/codebook-product-spec-v9.png, opened with an image tool: 1024 × 1536, 1,878,402 bytes, SHA-256f189ee82…caf2aa. Regions: 1 (live), 2 (replay), 3 (DeepWiki, with Update LLM Wiki beside the freshness state and Output Change location) and the shortcut strip.codex/cycle-0055at601f3827, clean tree, no PR. E1 is running in the Spacelocal: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.ryota-murakami commentedon Oct 26, 2026
E1 result (Task 1): ADJUST, generate bound 55 minutes
Setup.
local:codebook-qa(macOS 26 VM). Codebook 0.2.44 is installed in both hosts, and its skill is the bundledskills/codebook/SKILL.md.nextjs-dashboard1936e41are~/qa/n55/e1-vscode,e1-cursorande1-cursorchat, one per route, so no route reads another's Wiki.copilot/gpt-6-lunain the session's recordspublished: manifest, receipt,index.html; 9 pages, 88 sources,generated.revision= full HEAD127.0.0.1:<port>/w/…/index.html, readingWiki source currentandConnected to Codebook readercursor-agentCLI with the runner's flags, request on stdin (the entry's Cursor route)~/.cursor/cli-config.jsonbefore the run, because the CLI had no model chosen (hasChangedDefaultModel: false).--output-format jsonreports no model.published; 12 pages, 71 sources, full HEAD/codebook Generate …(comparison)published; 12 pages, 71 sources, full HEADContent bar (N55 step 3, applied to E1). Each claim was checked by reading its cited source in
nextjs-dashboard1936e41.app/dashboard/).auth.ts,auth.config.tsandproxy.tsconfigure credential auth and route authorization.fetchCardDataruns three aggregates inPromise.alland turns nullish results into 0.fetchLatestInvoicesinner-joins, orders by date descending and limits to 5, andfetchRevenuewaits 3 s.amountcolumn (db/schema.ts:36) and dates withtoISOString().split('T')[0].invoices/actions.html): createInvoice → validate and insert → error (validation failure or insert throws) or revalidate and redirect. Correct againstapp/lib/actions.ts:65-103.app/page.tsxrenders a welcome panel and a/loginlink and loads no data.db/index.tsrequiresPOSTGRES_URL.ITEMS_PER_PAGEis 6, with offset(currentPage - 1) * 6andilikefilters.fetchInvoiceByIdreturns undefined oramount / 100, and the edit page callsnotFound().customerIderrors.server-actions.html(form →safeParse→ errors or insert → database error or revalidate and redirect) anddata-layer.html(overview → three components → their three queries). Both are correct.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.
WIKI_GENERATE_TIMEOUT_MS = 3_300_000, recorded as O9.What the VS Code duration contains (honest limits).
Findings.
skills/codebook/render-wiki-diagrams.mjs,flowSvg, where the vertical lane offset islaneGap34 px against ~22-character labels).artifacts/cycle-0055/e1/x/e1/vscode-diagram-overlap.png, SHA-256fdc11f75…290d..codebook/wikiitself 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.cursor-agentis 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.Evidence (Mac, ignored):
artifacts/cycle-0055/e1/e1-evidence.tgz, SHA-2567596dba1b3cc821f9e01a54f5535eea7a588a29aa126384f967b4fd4d0cfcbe3(same on both sides). It holds:wiki-e1-vscode.tgz8625d898…8a5c,wiki-e1-cursor.tgz9aa5dff2…2599andwiki-e1-cursorchat.tgz8720df1e…6d3d;E1b (nsx
0897231, the same CLI path, the request with the 55-minute bound) started at 05:13:23Z. Its result follows here.ryota-murakami commentedon Oct 26, 2026
E1b result (Task 5c): published in 5 min 27 s
Run.
laststance/nsxat0897231(P07), 409 tracked files, cloned in the Space.cursor-agentwith the runner's flags and the generate request (with the 55-minute bound) on stdin.Result. Published.
duration_ms332,743).generated.revisionthe full HEAD.Effect on the plan.
Evidence (Mac, ignored):
artifacts/cycle-0055/e1b/e1b-evidence.tgz, SHA-25663b2256749c3e603959ea2917e533bc7f98147834d3a52509e8fb975a9314ef6, 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.
ryota-murakami commentedon Oct 26, 2026
pt1: local delegated review (open-code-review delegation) and fixes
Coverage.
codex/cycle-0055-pt1againstorigin/main601f3827.extension/src/tests, plusREADME.md,extension/README.mdandextension/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:
~/.cursor.wikiRunRecord.ts.Also fixed:
workflowPins.test.mjsfound that the Windows job's path filter missedextension/src/utils/wikiRunBoundMs.tsandwikiUpdateRun.ts, which its marker tests now load. Both are added to.github/workflows/storage-locks-windows.ymland to the pin.pnpm healthrun refused because the suite failed under this Mac'sen_NZlocale: the lowercase "pm" fails the CI-locale time patterns, and the same happens onmain. The gate runs withLANG=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.
.codex/restore-product-context.mjs; its 9 tests pass).Next: the full gate on the final tree, then local CodeRabbit, the commit and
/ship.ryota-murakami commentedon Oct 26, 2026
pt1: local CodeRabbit CLI review
Run.
coderabbit review --agent --committed --base origin/main -c .coderabbit.yaml --fresh.ef2498bd, all 77 changed files. The review completed.coderabbit config validate .coderabbit.yamlstopped 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.wikiRunRecord.ts(CWE-532, minor): on Windows, the home-folder comparison was case-sensitive. A drive letter or folder written in another case thanhomedir()kept the account name in the Output record.wikiRunRecord.test.ts, a Windows path with a lowercase drive letter.findGeneratedWikiProblem.ts(minor): a published manifest that cannot be read was told as another checkout's Wiki.isWikiOwnedBy) tells an unreadable manifest apart and leaves it to the end's recovery sentence.findGeneratedWikiProblem.test.ts, and a host test with a receipt that names a broken manifest.Checks. After the fixes, typecheck, lint and
health:staticpass, and the 197 affected tests pass. Next:/ship.ryota-murakami commentedon Oct 26, 2026
Re-entry after compaction (2026-10-26, implementing → delivery:
/shippt1)git diff origin/main -- AGENTS.md).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-256f189ee82…caf2aa. Regions: 1 (live), 2 (replay), 3 (DeepWiki, with Update LLM Wiki beside the freshness state and Output Change location) and the shortcut strip.codex/cycle-0055-pt1at5f35228b, no PR yet./shipis 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/shipStep 13).ryota-murakami commentedon Oct 26, 2026
pt1:
/shipdone — PR #133 open (0.2.45.0)55ef3bce(v0.2.45.0). Delivery: PR-open./shipStep 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.55ef3bce: 15/15 checks and the pre-gate secrets scan exit 0:pnpm test7045 (7039 pass, 6 skipped, 0 fail),test:package1071 (1061 pass, 0 fail), Reader DOM 5/5 (387 cases),health0, restore hook 9/9./shipStep 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./coderabbit-resolveruntil CodeRabbit APPROVED on the exact head → merge with--match-head-commit. Then pt2.fix: resolve CodeRabbit review findings (PR #133)
fix: resolve CodeRabbit review finding (PR #133): a folder without a …
v0.2.45.0 feat: Cycle 0055 pt1: Codebook: Generate LLM Wiki writes a …
ryota-murakami commentedon Oct 26, 2026
Entry (2026-10-26, new session, implementing: pt2)
## 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/autoplanreview record. AGENTS.md is in context as project instructions (O10).docs/designs/assets/codebook-product-spec-v9.png, opened with an image tool: 1024 × 1536, 1,878,402 bytes, SHA-256f189ee82…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.codex/cycle-0055-pt2at293ded81(=origin/main, v0.2.45.0), no PR. The one dirty file isextension/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.local:codebook-qa.ryota-murakami commentedon Oct 26, 2026
pt2: implementation, local reviews and fixes
Implementation (subagent, re-executed by the driving agent). Eight commits,
ba8fe45a..d4150d3b, oncodex/cycle-0055-pt2:readLlmWikiViewState,readLlmWikiViewFacts,llmWikiView,registerLlmWikiCommands);describeWikiFreshness, passed to the page throughWikiUpdatePageSettings);learning.svg, the manifest entries, the README section, and 74 new tests.Driving agent's re-run on
d4150d3b, fromextension/withLANG=en_US.UTF-8:format:check,typecheck,lint,health:static,dupesanddead-codeeach exit 0.pnpm testgave 7122 tests: 7116 pass, 0 fail, 6 skipped.Local CodeRabbit CLI.
coderabbit review --agent --committed --base origin/main -c .coderabbit.yaml --freshond4150d3bcompleted with 30 files reviewed and 0 findings.open-code-review delegation. OCR range mode
origin/main..codex/cycle-0055-pt2gave 30 files: 19 reviewable, all reviewed (100 %, none skipped). The default exclusions (11) are reported apart: 9 test files,extension/README.mdandlearning.svg. Findings: no critical. All nine are fixed in8836c142and62f61d86(fixer subagent). Each behavior fix has a test that fails without it.fsPathequality. VS Code lowercases a Windows drive letter, so on Windows every event was dropped.comparableFilePath(case-folded on win32/darwin). Test: an event spelled with another case still refreshes.dispose()created a watcher, a poll and a notice.show,keepPollandkeepWatcherdo nothing once disposed. Test included.accessibilityInformation.label= label, description. Test per row kind.escapeGlobCharacters(e.g.wiki[1]→wiki[[]1]). Test included.fullCommitHashwas duplicated.utils/fullCommitHash.ts.split/join, which corrupts text when the home folder is/or empty.withHomeFolderShown. Unit test included.constants.ts.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'srefresh, 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-25668488dc071f63030023e2d3c31e3e3d2ec0b5b83209ce7d61a8986c78de7a11e, 2,080,966 bytes, with skill 1.0.4930c43967….ryota-murakami commentedon Oct 26, 2026
N55 result (Task 6): PASS for steps 1–6 in both hosts; step 7 PASS with finding N55-F4
Identity
codebook-pt2-d4150d3b.vsix(0.2.45, built fromd4150d3b), SHA-25668488dc071f63030023e2d3c31e3e3d2ec0b5b83209ce7d61a8986c78de7a11e, the same on both sides. Installed in the Space's VS Code profile "Codebook QA 0049" and in Cursor.local:codebook-qa, macOS 26.5.2, display 1920 × 1080, editor and Chrome windows at 1920 × 1050.cursor-agent2026.10.22-27dcf5f. Its model is Grok 4.6 High Fast (~/.cursor/cli-config.json).~/qa/n55/nextjs-dashboardat1936e41, which had no.codebookbefore the trial. It was removed after the evidence was copied.72ee7160…10823101…33c85162…e1fe7864…Step 1: empty state, Generate, row 2 and the icons. PASS in both hosts.
cursor-agent), the Generate LLM Wiki button and the inlineChange locationlink. The confirmation names/Users/lume/qa/n55/nextjs-dashboard/.codebook/wikiand the runner.Generating… In chat · N min of 55, with the wrapped watching message. The status bar readWatching for the LLM Wiki · Stop watching(D4).Sorry, the response hit the length limit. The watch kept going, and the learner typedContinuein the same session.generated, with the noticeLLM Wiki generated in .codebook/wiki.and Open in Browser, and row 1Wiki source current.Generating… cursor-agent · N min of 55.end=succeeded summary="published" output=~/qa/n55/….codebook(book.svg, a page) andcodebookLearning(learning.svg, an open notebook with a check mark) are two different, legible icons in both hosts (n55-icons.tgz).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):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.app/dashboard/layout.tsx:5-9).(overview)/page.tsx:18-28).fetchLatestInvoicesinner-joins customers, orders by date descending, limits to 5 and formats cents (data.ts:53-59).data.ts:112,125).actions.ts:65-77).actions.ts:79-97).actions.ts:65-89.POSTGRES_URL, the postgres-js client withmax: 1and SSL in production (db/index.ts:6-15).db/migrations,.env.localloading and the gitignored migrations (drizzle.config.ts:4-9,.gitignore:42).proxy.ts:5,9).auth.config.ts:8-17). Its diagram (authorized() → return false / return true / redirect /dashboard / return true) matches lines 11–17.data.ts:112,125,151,189).data.test.ts:144-169).app/lib/data.ts:271/274/279/296, and the code there matches. Clickingdata.ts:271opened VS Code at Ln 271 in the clone window.actions.ts:151/155/156andbuttons.tsx:32, which match. Clickingactions.ts:151opened Cursor (schemecursor://) 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.
Already current (checked 04:40 AM); VS Code: the confirmation and then a current check).app/lib/data.tsSHA-2561ddf2dc4…equalsshasum.ITEMS_PER_PAGEwas changed from 6 to 8.Source changed · Update available.a2494094…equals the edited file's.dashboard-data.htmlnow states "the source currently sets the page size to eight" with its citation atdata.ts:112(shaa2494094…), where it read "six" before.Wiki source current.ITEMS_PER_PAGEwas changed from 6 to 10. Both surfaces readSource changed · Update available.bab60427…equals the edited file's.data.ts:112(shabab60427…), and adds that the tests still assert six. The browser readWiki source current · Updated at 04:45 AM.Step 5b: interruption and recovery. PASS, with
codebook.wikiOutputDirectoryset to.codebook/wiki-interruptand restored afterwards.watchEndedAtMs). The view showedWaiting for chat · retry after …andLast generation stopped · stopped watching.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.Last generation stopped · cancelledwith the noticeLLM Wiki generation cancelled at 04:48 AM.Step 6: loaded skill identity.
/Users/lume/.vscode/extensions/laststance.codebook-0.2.45/skills/codebook/SKILL.md(skill 1.0.49, SHA-25630c43967…). The session records name this path 14 times, and it equals the VSIX'sextension/skills/codebook/SKILL.md.~/.cursor/skills/codebook/SKILL.mdis 1.0.49, SHA-256e9d45901…. 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.
codebook://node-historybefore and after equals instudyId,status,stopCount,explainedStopCountandmaterialRevision: VS Code 21 = 21 (with N54'sc762e4ea…_273f4157…), Cursor 14 = 14 (withfbd584e0…_6cf9fd04…).Findings (feature-cycle rule: none is critical, all carried as tasks)
Asking the editor model….TreeView.messagegoes before the rows change. For 7 frames (~233 ms) row 2Generating… In chat · 32 min of 55shows 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 aftergetChildren.Codebook could not open the test replay … Native pane, group or focus changed while presentation waited; the learner arrangement was preserved.presentation:placement-refused(guardretainPresentationPlacement). The first refusal had a group-change event 0 ms after arming. The second had "Events while armed: none".Evidence (Mac, ignored, SHA-256 the same on both sides):
artifacts/cycle-0055/n55/n55-vscode-evidence.tgz155fca94…: takes 1–2, chat session and transcripts, the.codebookfolder with the three publications, the "eight" Wiki, the edit diff, screenshots and the action log.n55-cursor-evidence.tgzc2816461…: take 3, the.codebookfolder, the deployed skill,cli-config.json, the edit diff, screenshots and the action log. Take 4's finished file iscursor/take4-chrome-cursor-reader-2026-10-26T113625Z.mp4e1fe7864….n55-step7-evidence.tgz5e2c5bf1…: the before and after lists, Cursor's Output log and screenshots.n55-icons.tgz43fb5114….compare/region3-vs-vscode.png1f9ee2e8…,compare/region3-vs-cursor.pngb4e0ae11…,compare/welcome-both.pngc9f8354f….Impact reason for the final head. OCR's fixes (
8836c142,62f61d86) came after the candidate. They change:None changes a row, label, notice, welcome, confirmation or reader pixel seen in N55, so N55's evidence stands for that head. Later
/shipfixes state their own impact in the PR.ryota-murakami commentedon Oct 26, 2026
Re-entry after compaction (2026-10-26, delivery: pt2
/shipfixing cycle 3)docs/designs/assets/codebook-product-spec-v9.png, opened with an image tool: 1024 × 1536, 1,878,402 bytes, SHA-256f189ee82…caf2aa. Regions: 1 (live), 2 (replay), 3 (DeepWiki, with Update LLM Wiki beside the freshness state and Output Change location) and the shortcut strip.codex/cycle-0055-pt2atb36df054, clean tree, no PR./shipStep 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.ryota-murakami commentedon Oct 26, 2026
pt2:
/shipdone — PR #134 open (0.2.46.0)e3d1721a(v0.2.46.0). Delivery: PR-open./shipStep 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 in076ac9f3; the full lane then showed one harness interaction (the view's follow-up read took a hold meant for a run), fixed in7a02e59d. 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.e3d1721a(treee7ab5594): 15/15 checks and the pre-gate secrets scan exit 0:pnpm test7195 (7189 pass, 6 skipped, 0 fail),test:package1073 (1063 pass, 0 fail), Reader DOM 5/5 (387 cases),health0, restore hook 9/9.extension/README.mdcovers every behaviour of the 0.2.46.0 CHANGELOG entry./coderabbit-resolveruntil CodeRabbit APPROVED on the exact head → merge with--match-head-commit→ closing comment.v0.2.46.0 feat: Cycle 0055 pt2: the LLM Wiki view in the Activity Bar…
ryota-murakami commentedon Oct 26, 2026
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-agentin 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.
293ded81(v0.2.45.0), gate 15/15 on582d6ab6, CI green, CodeRabbit APPROVED on the exact head.298e90bd(v0.2.46.0), merged 2026-10-26T14:31:43Z with--match-head-commit 35d481e3:/shipthree fixing cycles (converged:false, every last-round finding fixed, no open Critical/Major, so no next-cycle Issue records one), exact-HEAD gate 15/15 one3d1721aand again on35d481e3(pnpm test7197: 7191 pass, 0 fail, 6 skipped;test:package1073: 0 fail; Reader DOM 387/387;health0; restore hook 9/9), required CI green, hosted CodeRabbit: 2 Minor findings fixed in35d481e3(tests red one3d1721a), 1 outside-diff finding kept with evidence (reply), then APPROVED on35d481e3.packagejob green); no publication or installed verification beyond N55's candidate (d4150d3b, with the impact reason in 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).Gaps after this cycle (rows this cycle touched; the others keep #132's audit).
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).
skills/codebook/render-wiki-diagrams.mjsflowSvg, a vertical lane offset of 34 px against ~22-character labels). Source: E1, the VS Code agent's preview at 05:05Z (screenshot SHA-256fdc11f75…290d). Closes with a renderer fix and a test that fails without it: twobranchedges 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).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).startWikiRun.tsalso holdsdescribeMissingWiki;wikiRunBoundMs.tsalso holdslongestWikiRunMsandLONGEST_WIKI_RUN_MS;wikiRunRecord.tsalso holdsagentExitOf; the sentenceAn LLM Wiki already exists in <folder>. Update it instead?is inline inextension.ts. Closes with one utility per file and the sentence besidedescribeMissingWiki.codebook.showWikiOutputand the "nothing running" branch ofcodebook.cancelWikiRun. Closes with host tests (the harness'screateOutputChannelstub recordsshow)./shipQA probes only (the VS Code bound got a host test in pass 3). Closes with two host tests.wikiGenerateFlow.test.ts"a second Generate while a Cursor generation runs" reads the refusal after a fixed race. Closes by awaiting the refusal.wikiRunRecordrows (pass 1 T4). No row foralready-current, a failed end withsite: 'replaced', or an output folder equal to the home folder. Closes with those rows.describeWikiUpdate.tsdoc comments and its@examplestill say Cancel for the VS Code watch, which is Stop watching (D4). Closes with the docs corrected.wikiGenerateNotice.tssayscancelledin one notice andstoppedin its sibling. Closes with one verb per host and a wording test.describeWikiGenerateBlock.ts's fallback shows(<cause>: <path>)to the learner. Closes with a learner sentence and the cause in the Output record.startWikiRun.tsafter the claim,extension.tsclosing-window path) is not retried, so the marker can stand until its bound. Closes by routing it through the marker change's retry.Asking the editor model…. Closes when the reader tells the learner the editor may be asking for permission, with a test.TreeView.messagedisappears ~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.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.llmWikiView.test.tstests 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.readLlmWikiViewFactsreads 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.revealFileInOSon a remote workspace or a folder deleted meanwhile does nothing visible. Closes with a sentence for both cases and a host test.MANAGE_WORKSPACE_TRUST_COMMAND_IDSholds two candidate ids andresolveManageTrustCommand.ts(one caller) probesgetCommands. 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.describeWikiGeneration.tsnames the 7-character revisionfullRevision;isCursorHost ? 'cursor' : 'vscode'is written seven times inextension.ts; two learner sentences are inline inregisterLlmWikiCommands.ts(lines 81, 113). Closes withshortRevision, one host value, and the sentences inconstants.ts.Try againuses$(play), andStop watchingandCancelshare$(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 locationreads 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.studyWorkspaceRemovalfails under full-lane load (full lane onb36df054and earlier). It failed once withEACCESwhile 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):
/specwrites 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).