Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
b694420
fix: Cycle 0056 pt3: a test replay chosen in a Study pane inside your…
ryota-murakami Oct 26, 2026
6f18883
fix: Cycle 0056 pt3: a refused test replay no longer blocks your next…
ryota-murakami Oct 26, 2026
51b9755
fix: Cycle 0056 pt3: a Saved studies choice dropped after Close Study…
ryota-murakami Oct 26, 2026
b0a83ec
fix: Cycle 0056 pt3: a refused placement now says which call, which c…
ryota-murakami Oct 26, 2026
e7c1061
fix: Cycle 0056 pt3: Close Study Workspace no longer fails with Webvi…
ryota-murakami Oct 26, 2026
5e0eee3
fix: Cycle 0056 pt3: a test replay opens although the editor reports …
ryota-murakami Oct 26, 2026
fc54bac
fix: Cycle 0056 pt3: a test replay opens although the editor activate…
ryota-murakami Oct 26, 2026
84b3b35
fix: Cycle 0056 pt3: the live-entry measurement test no longer fails …
ryota-murakami Oct 26, 2026
5b39b76
fix: Cycle 0056 pt3: the saved test replay reader test waits for the …
ryota-murakami Oct 26, 2026
9fd7e6c
fix: Cycle 0056 pt3: after Close Study Workspace the Saved studies li…
ryota-murakami Oct 27, 2026
506200e
fix: Cycle 0056 pt3: opening another test replay from a closed reader…
ryota-murakami Oct 27, 2026
26a12ed
fix: Cycle 0056 pt3: Manage Workspace Trust runs the one trust comman…
ryota-murakami Oct 26, 2026
e816e18
fix: Cycle 0056 pt3: the LLM Wiki view follows a deleted or moved Wik…
ryota-murakami Oct 26, 2026
02acefa
fix: Cycle 0056 pt3: the LLM Wiki view's message and rows change in o…
ryota-murakami Oct 27, 2026
7ff3ab5
fix: Cycle 0056 pt3: the LLM Wiki view's message leaves with the repl…
ryota-murakami Oct 27, 2026
6aac541
test: Cycle 0056 pt3: the live-entry measurement test derives its exp…
ryota-murakami Oct 27, 2026
932cdae
fix: Cycle 0056 pt3: local review fixes (sanitized unreported-focus e…
ryota-murakami Oct 27, 2026
6941035
test: Cycle 0056 pt3: the cancelled late-activation wait test asserts…
ryota-murakami Oct 27, 2026
0d2c3e3
test: Cycle 0056 pt3: coverage for the home-folder project watch, the…
ryota-murakami Oct 27, 2026
784f03a
fix: Cycle 0056 pt3: pre-landing review fixes (held-back replay redra…
ryota-murakami Oct 27, 2026
eb9c9b1
fix: Cycle 0056 pt3: pre-landing review fixes, pass 2 (hold kept unti…
ryota-murakami Oct 27, 2026
25ff222
fix: Cycle 0056 pt3: pre-landing review fixes, pass 3 (Open keeps Clo…
ryota-murakami Oct 27, 2026
577ba5e
docs: Cycle 0056 pt3: the packaged README says a late-reported Applic…
ryota-murakami Oct 27, 2026
b5227ce
chore: bump version and changelog (v0.2.49.0)
ryota-murakami Oct 27, 2026
1074b35
fix: Cycle 0056 pt3: pnpm health builds Fallow's graph from the curre…
ryota-murakami Oct 27, 2026
41da79d
fix: Cycle 0056 pt3: resolve CodeRabbit review findings on PR #138
ryota-murakami Oct 27, 2026
4c9d0b5
fix: Cycle 0056 pt3: resolve CodeRabbit's outside-diff findings on PR…
ryota-murakami Oct 27, 2026
896e421
fix: Cycle 0056 pt3: resolve CodeRabbit's findings on 4c9d0b58 (PR #138)
ryota-murakami Oct 27, 2026
f5a509a
fix: Cycle 0056 pt3: resolve CodeRabbit's outside-diff findings on 89…
ryota-murakami Oct 27, 2026
79a7e78
fix: Cycle 0056 pt3: local CodeRabbit CLI findings on f5a509a5
ryota-murakami Oct 27, 2026
bfe62b3
docs: Cycle 0056 pt3: the late-report claims and N56's scope say only…
ryota-murakami Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@
# Changelog

## [0.2.49.0] - 2026-10-27 (development candidate)

Cycle 0056 ([Issue #135](https://github.com/laststance/codebook/issues/135)), a bug-fix cycle, last of its three pull requests: a saved test replay opens in Cursor when it is chosen, the Saved studies list and the Learning summary say what is true around **Codebook: Close Study Workspace**, and the LLM Wiki view follows its folder, trusts through the editor's own command and changes its message with its rows. The native trial N56 checked part of this in the real editors, on this part's development candidates (`02acefaa`, `7ff3ab57`, `932cdae3`), not on the released build: VS Code 1.142.0 and Cursor 3.27.12 on macOS 26 (a virtual machine), with the development target `nextjs-dashboard`. It covered the test replay's opens and the Saved studies list after Close in Cursor, the trust command in both editors, and the view's message and rows and a deleted Wiki folder in VS Code; the other changes are covered by tests only. Each candidate was packaged from its own commit; the target's QA clone carried QA-owned edits that the Issue names, and the designated checkout none. N56 did not run again on the released source, which adds the review fixes made after `932cdae3`. Each step's host, candidate and result, and the hashes of its recordings (kept private), are in [Issue #135's comments](https://github.com/laststance/codebook/issues/135#issuecomment-6431339240).

**Saved test replays.**

- **A saved test replay opens in Cursor when you choose it**: choosing it from a Study pane that stands in a group with your own tabs no longer refuses with `Native pane, group or focus changed while presentation waited`, and neither does an editor that reports the Application's new group, or its activation, a moment late (the two causes N55-F4's refusals pointed to, reproduced in tests; Cursor's own report order was not observed); in N56, five opens in a row in Cursor opened without a refusal.
- **A refused or failed open never holds up your next choice**: its notice is shown and recorded at once, and your next Saved studies choice or **Open replay** is carried out; a choice the Learning summary sends while the Study workspace is closed, closing or no longer showing a replay is not carried out, and you are told so in a notice that starts `Codebook did not carry out your choice:` and says what to do next, with one `choice:dropped` entry in **Output › Codebook**.
- **After Close Study Workspace the Saved studies list names no study** (it reads `Choose a saved study`), so choosing any entry that can be opened opens it, the one the closed reader showed included; **Codebook: Open Study Workspace** still shows that replay again. An entry that cannot be opened and that you chose before the Close stays chosen with its delete control.
- **Opening another replay after Close never shows the closed one first**: the Learning summary goes from its opening state straight to the replay you chose.
- **Close Study Workspace no longer fails with `Webview is disposed`** after the editor closed the panes itself, and a Close made while an open is still waiting leaves the workspace closed.
- **A refused placement says why** in **Output › Codebook**: which call refused, which compared parts differed (or that none did), each group's front tab and the editor changes and Codebook's own effects since the guard was armed, with your folders' paths shortened.

**The LLM Wiki view.**

- **Message and rows change together**: the view hands the editor the message above the tree with its rows, so in VS Code, at a run's start and end, the message changes in the same frame as the rows.
- **The view follows its folder**: deleting or moving the Wiki folder, or any folder above it inside your project (for example `rm -rf .codebook`), brings back the welcome without **Refresh**.
- **Manage Workspace Trust opens the editor's trust editor** in both editors through `workbench.trust.manage`; if the editor lacks that command, the view points you to “Workspaces: Manage Workspace Trust” in the Command Palette, and if the command fails it says so and records the cause, with your folders' paths shortened, in **Output › Codebook**.

**Compatibility.** The MCP API stays 1.8; the Wiki's published format, the marker format, stored learner data and the bundled skill (1.0.50) do not change.

## [0.2.48.0] - 2026-10-27 (development candidate)

Cycle 0056 ([Issue #135](https://github.com/laststance/codebook/issues/135)), a bug-fix cycle, second of its three pull requests: the LLM Wiki view and the browser reader say what is true in the states the cycle's tasks list. The Cursor test-replay fix and the native trial N56 follow in the third.
Expand All @@ -19,7 +40,7 @@ Cycle 0056 ([Issue #135](https://github.com/laststance/codebook/issues/135)), a
- a link whose target is missing;
- a path that cannot be read (with its error code, also when the disk does not answer within 3 seconds);
- a folder in a remote window (`Reveal Wiki Folder opens folders on this computer only; the Wiki folder is on <remote>. …`).
A WSL window reveals the folder like a local one.
A WSL window reveals the folder like a local one.
- **View actions have decided names and icons**: inline actions in Title Case (**Stop Watching** with an eye-closed icon, **Try Again** with a restart icon, **Change Location**, **Open Chat**, **Open Folder**, **Show Output**, **Copy Recovery Request**); **Cancel** keeps the stop icon because it stops the agent.
- **The welcome names the default folder**: `The Wiki is written to .codebook/wiki unless the setting codebook.wikiOutputDirectory names another folder.` with the **Change location** link, and a click on the **Output** row opens the same setting.

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Codebook contributes `debug.focusEditorOnBreak: false` as the native debugger de

## Implementation status

This is a preview, not a Marketplace or Open VSX release. The delivered version is **0.2.48.0** once the second pull request of [Cycle 0056](https://github.com/laststance/codebook/issues/135) is merged; until then 0.2.47.0 ([PR #136](https://github.com/laststance/codebook/pull/136), the cycle's first pull request) is the delivered one, and the active cycle Issue says where the delivery stands. Cycle 0056 is a bug-fix cycle that closes the defects Cycle 0055 carried, in three pull requests: the first makes an LLM Wiki start say what happens when it joins a start under way, is stopped or passes its bound, and release or write back what it claimed; the second the LLM Wiki view and the reader; the third a saved test replay that Cursor refused to open, with the native trial. [Cycle 0055](https://github.com/laststance/codebook/issues/132) is a feature cycle: **Codebook: Generate LLM Wiki** writes a project's first LLM Wiki through the editor's agent from Codebook's own entry (its first pull request), and an **LLM Wiki** view in the Activity Bar shows, opens and updates it (its second). Cycle 0053 was a feature cycle: a test inside a workspace package runs with that package's Vitest and config, as the package's own `vitest` would, while a test the repository root's config already selects keeps running from the root. Cycle 0054 is a bug-fix cycle that closes the three defects Cycle 0053 carried: a test that ends before a later declared stop says so, a package test's launch asks the repository root again whether its config now selects the test, and the native-trial bootstrap keeps a listing it could not release. Cycle 0051 opened a test replay in the learning-replay composition a browser replay has: the Learning summary in the chat's place, one transport for both replay families, and a Learning summary button that shows a hidden summary again. Cycle 0052 was a bug-fix cycle that closed every defect Cycle 0051 carried, in three pull requests: the first makes replays leave, open and reload without stale frames and makes their entries and exits behave as the learner chose; the second fixes a test replay's moves and its summary page; the third the live runtime's unreadable facts, a browser run's refusals and the tests' hygiene. The MCP API is 1.8. What each earlier cycle delivered, with its tests, trials and limits, is in the [change history](CHANGELOG.md) and in that cycle's record, kept under the tag [`docs-archive-2026-10-20`](https://github.com/laststance/codebook/tree/docs-archive-2026-10-20/docs/cycles); from Cycle 0048 on, the cycle's Issue holds its tasks and state, and its pull requests the results.
This is a preview, not a Marketplace or Open VSX release. The delivered version is **0.2.49.0** once the third pull request of [Cycle 0056](https://github.com/laststance/codebook/issues/135) is merged; until then 0.2.48.0 ([PR #137](https://github.com/laststance/codebook/pull/137), the cycle's second pull request) is the delivered one, and the active cycle Issue says where the delivery stands. Cycle 0056 is a bug-fix cycle that closes the defects Cycle 0055 carried, in three pull requests: the first makes an LLM Wiki start say what happens when it joins a start under way, is stopped or passes its bound, and release or write back what it claimed; the second the LLM Wiki view and the reader; the third a saved test replay that Cursor refused to open, with the native trial. [Cycle 0055](https://github.com/laststance/codebook/issues/132) is a feature cycle: **Codebook: Generate LLM Wiki** writes a project's first LLM Wiki through the editor's agent from Codebook's own entry (its first pull request), and an **LLM Wiki** view in the Activity Bar shows, opens and updates it (its second). Cycle 0053 was a feature cycle: a test inside a workspace package runs with that package's Vitest and config, as the package's own `vitest` would, while a test the repository root's config already selects keeps running from the root. Cycle 0054 is a bug-fix cycle that closes the three defects Cycle 0053 carried: a test that ends before a later declared stop says so, a package test's launch asks the repository root again whether its config now selects the test, and the native-trial bootstrap keeps a listing it could not release. Cycle 0051 opened a test replay in the learning-replay composition a browser replay has: the Learning summary in the chat's place, one transport for both replay families, and a Learning summary button that shows a hidden summary again. Cycle 0052 was a bug-fix cycle that closed every defect Cycle 0051 carried, in three pull requests: the first makes replays leave, open and reload without stale frames and makes their entries and exits behave as the learner chose; the second fixes a test replay's moves and its summary page; the third the live runtime's unreadable facts, a browser run's refusals and the tests' hygiene. The MCP API is 1.8. What each earlier cycle delivered, with its tests, trials and limits, is in the [change history](CHANGELOG.md) and in that cycle's record, kept under the tag [`docs-archive-2026-10-20`](https://github.com/laststance/codebook/tree/docs-archive-2026-10-20/docs/cycles); from Cycle 0048 on, the cycle's Issue holds its tasks and state, and its pull requests the results.

The specification is [goal version 10](PRODUCT_GOAL.md), and the implementation targets external repositories. Historical fixture or coupled-Wiki success is not proof of that destination.

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.2.48.0
0.2.49.0
13 changes: 9 additions & 4 deletions extension/README.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"displayName": "codebook",
"description": "Connect an external agent to source-grounded codebase studies.",
"publisher": "laststance",
"version": "0.2.48",
"version": "0.2.49",
"private": true,
"engines": {
"vscode": "^1.120.0",
Expand Down
2 changes: 2 additions & 0 deletions extension/scripts/checkHealth.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,8 @@ function fallowArguments(reference, coverage, format) {
'health',
'--fail-on-issues',
'--quiet',
// Fallow's incremental cache in the checkout can outlive the source it describes: a reused graph cache once scored functions the tests reach as unreached (Cycle 0056 pt3). Each measured run builds its graph from the current source.
'--no-cache',
'--baseline',
reference.baseline.file,
'--coverage',
Expand Down
58 changes: 58 additions & 0 deletions extension/scripts/study-bootstrap-qa.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -8684,6 +8684,64 @@ async function check(page, options, collected) {
!promptOption.rendered,
})

// Arrange: the reader showed a saved study and was closed (Close Study Workspace keeps its selection, so the message still names it).
await library([shownStudy, otherStudy], shownStudy.id)
const whileReaderOpen = await removalControl()
await page.evaluate(() => {
window.sent = []
})
// Act: the reader closes, then the learner chooses the entry the closed reader showed.
await library([shownStudy, otherStudy], shownStudy.id, {
readerClosed: true,
})
const whileReaderClosed = await removalControl()
await page.selectOption('#studies', shownStudy.id)
const openAskedAfterClose = await page.evaluate(
(studyId) =>
window.sent.filter(
(message) => message.type === 'history' && message.studyId === studyId,
).length,
shownStudy.id,
)
// The host opens the reader again with that study.
await library([shownStudy, otherStudy], shownStudy.id)
const afterReaderOpened = await removalControl()
// Assert
// Value: protects=the learner choosing, right after Close Study Workspace, the saved study the closed reader showed and having it open (the list named it, so the choice fired no change event); fails_when=a closed reader's list names the study the reader showed, or the list stops naming the study once the reader is open again; why_new=Cycle 0056 task 31 (N56-F1, found in Cursor); seam=none; no_claim=the host's own open (studyWorkspace tests) (stand-ins: the Study messages the host posts)
cases.push({
name: 'after Close Study Workspace the Saved studies list names no study, so choosing the study the closed reader showed opens it, and an open reader names its study again',
actual: {
whileReaderOpen,
whileReaderClosed,
openAskedAfterClose,
afterReaderOpened,
},
passed:
whileReaderOpen.chosen === shownStudy.id &&
whileReaderClosed.chosen === '' &&
whileReaderClosed.shownText === 'Choose a saved study' &&
openAskedAfterClose === 1 &&
afterReaderOpened.chosen === shownStudy.id,
})

// Arrange: the learner chose a saved study that cannot be opened, to delete it, and the Study workspace closes (the bottom panel's Saved studies survives the close and offers the delete control).
await library([shownStudy, staleStudy], shownStudy.id)
await page.selectOption('#studies', staleStudy.id)
// Act
await library([shownStudy, staleStudy], shownStudy.id, {
readerClosed: true,
})
const unopenableWhileReaderClosed = await removalControl()
// Assert
// Value: protects=the learner's own choice of a saved study that cannot be opened, to delete it, surviving Close Study Workspace; fails_when=the closed reader empties the list and the delete control loses the study the learner chose (task 31 clears only the study the reader showed: a study that cannot be opened has no open for a repeated choice to miss); why_new=local CodeRabbit CR2 (Cycle 0056 pt3), decided as not a defect; seam=the Study messages the host posts; no_claim=the host's delete
cases.push({
name: 'a saved study that cannot be opened and was chosen for deletion stays chosen, with its delete control, after Close Study Workspace',
actual: { unopenableWhileReaderClosed },
passed:
unopenableWhileReaderClosed.chosen === staleStudy.id &&
unopenableWhileReaderClosed.ariaDisabled === null,
})

// Arrange: a delete request the host refuses, shown under the button (A-L5, AD-14, DR-26).
const sameRefusal = {
status: 'refused',
Expand Down
16 changes: 16 additions & 0 deletions extension/scripts/tests/health.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,22 @@ test('a complete passing run reports health and discloses its skipped test', asy
assert.deepEqual(await runDirectoriesIn(fixture.temporary), [])
})

// Value: protects=a maintainer or CI job that reads the exit of `pnpm health` as the verdict of the current source; fails_when=the measured Fallow runs read or write Fallow's incremental cache in the checkout (`.fallow/`), so a graph cache left by earlier runs decides which functions tests reach and the CRAP estimates of unmatched functions (Cycle 0056 pt3's gate: 35 findings with a reused cache, 0 with a fresh graph, same source); why_new=Cycle 0056 pt3 gate; seam=the fixture checkout's `.fallow` folder after a passing run; no_claim=how Fallow's incremental cache goes stale
test("a measured run leaves no Fallow cache in the checkout, so an earlier run's cache never decides its verdict", async (context) => {
// Arrange
const fixture = await createFixture(context)

// Act
const result = await runChecker(fixture)

// Assert: the run passed, and Fallow wrote no cache beside the sources (it read none either: `--no-cache` disables both).
assert.equal(result.code, 0, result.stderr)
assert.deepEqual(
(await readdir(fixture.root)).filter((name) => name === '.fallow'),
[],
)
})

test('a failing test refuses health instead of scoring the coverage of a failed run', async (context) => {
// Arrange
const fixture = await createFixture(context, {
Expand Down
2 changes: 1 addition & 1 deletion extension/scripts/tests/package.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ test('a real VSIX loads outside the checkout and excludes bundled applications a
// Assert
assert.equal(receipt.isolatedModuleLoad, true)
assert.equal(receipt.isolatedWikiPageWorker, true)
assert.equal(checked.extension.version, '0.2.48')
assert.equal(checked.extension.version, '0.2.49')
assert.equal(checked.extension.apiVersion, '1.8')
assert.equal(checked.entries, 33)
assert.equal(receipt.dependencies.length, 16)
Expand Down
Loading