Skip to content

feat(decisions): log reads, re-runs, verification notes, linked PRs; intent from the working session (0.25.0) - #62

Merged
taylorg009 merged 4 commits into
mainfrom
feat/decisions-0-25
Oct 23, 2026
Merged

taylorg009 merged 4 commits into
mainfrom
feat/decisions-0-25

Conversation

@taylorg009

Copy link
Copy Markdown
Collaborator

How this PR was decided

A long agent session on a web-app PR made four decisions a reviewer needed: it fixed two failing tests, ran the whole suite to a log, re-ran the 15 failing files (none in the change) until they passed, and verified the change end to end against the shared dev API. It also split the work with an API PR in another repository. The brief's table showed one row, and that row was right by accident: an unrelated file's pass had closed the failure. The Intent and model came from a different session on another ticket.

What changes

  • Intent and model: sessions are picked by evidence (Entire saw it write a committed file, then full-path work, then basename), most files written first; the model comes from that session; the turn starts at the prompt before the first full-path work at the commit's checkout, or after another PR the turn committed first.
  • Logs: a redirected test run takes the output of the later call that read its log. Redirects are removed whole before targets are read (> full.log was read as a test file).
  • Failures and re-runs: runs are grouped by what they ran; failing files come from the output's FAIL lines; later runs close a failure together; a list-fed re-run (xargs vitest run) of exactly the failing files counts; whole-suite failures say how many files failed and whether none is in the change. A run with no cd of its own can be closed by one that cds first.
  • Verification notes: a verif… Markdown note the change carries with a status: line gives a PASS/FAIL/PARTIAL row; heredoc-written notes count.
  • Linked PRs: owner/name#123 in the body or a commit leads the table with its state, review threads and review decision, looked up by the Action with the new linked-token input (default github-token; unreadable links say so). New linked-refs command and brief --linked.
  • Windows: a transcript that ends before its own commit falls back to the checkout of the commit's last full-path work when the last commit shown is elsewhere; a call that cds into another checkout is left out; decisions come only from sessions that wrote the commit's files when any did.
  • Claims: a folder named in the body is found in the paths inside it.

Evidence

  • vitest: 472 tests pass; tsc clean. New tests cover each case above.
  • Replay of 29 checkpointed PRs from one week of a web-app repository, 0.24.1 against this branch: briefs with the section 18 → 21, rows 29 → 42 (10 verification notes), runner-only rows 8 → 3. Changed rows on 8 PRs were checked by hand against their transcripts; three regressions found that way (an over-eager checkout cut, cross-session decision leaks, a heredoc read as leaving the repo) are fixed and covered.
  • The Action's linked-PR lookup loop was run as written against a real cross-repository PR: merged, 6 of 6 threads resolved; an unreadable repository exits 1 and becomes a row without a state.

🤖 Generated with Claude Code

taylorg009 and others added 2 commits October 22, 2026 17:24
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…intent from the working session (0.25.0)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

PR brief: 4 agent commits · 8 of 25 test files reach this diff

Run at least these. Selection is a safe superset; it never marks a test safe to skip.

Summary PR #62 at ca25617
Changed 13 files: 9 mapped to 62 symbols, 4 ignored by policy
Tests reached 8 of 25 ▮▮▮▮▮▮▯▯▯▯▯▯▯▯▯▯▯▯▯▯ 32% of the suite
Downstream code 5 files, 20 dependents · review effort high
Intent 4 of 4 commits attributed by trailer (claude-code)
Reviewed by no reviewer other than the author (taylorg009) so far · the 14 changed and reached files were last changed by Taylor Gagne (60 commits in 12 files), Taylor (19 commits in 12 files) · Taylor Gagne has no prior commit in 2 of the 14 files this change touches or reaches: src/decisions.test.ts, src/decisions.ts
Symbols 21 changed, 43 added, 6 removed within the diff
Since push e3e475e 1 new commit, 0 changed files, 0 tests reached
Compared against base 83b58f0

How this PR was decided

# What happened Decision Evidence
1 linked PR in owner/name not readable with this token owner/name#123

What each commit did

Commit Intent Files Reaches Ran before push
963717a wip: decisions 0.25.0 (untested, saved before mars reboot) claude-code by Co-authored-by 13 files 5 files, 8 tests
02bff8a feat(decisions): log reads, re-runs, verification notes, li… claude-code by Co-authored-by 8 files 5 files, 8 tests
e3e475e fix(decisions): review round on 0.25.0 — pipe-fed re-runs o… claude-code by Co-authored-by 11 files 5 files, 8 tests
ca25617 fix(decisions): second review round — the committing call b… claude-code by Co-authored-by 5 files 5 files, 8 tests

Claims checked

  • refuted: commit 963717a describes the change. placeholder text: "wip".
  • partial: annotations removed from src/brief.ts. could not resolve it in the base graph (symbol-ambiguous).
  • partial: agent removed from src/checkpoint.ts. could not resolve it in the base graph (symbol-ambiguous).
  • partial: model removed from src/checkpoint.ts. could not resolve it in the base graph (symbol-ambiguous).
  • partial: the narrative names the changed code. not named by the PR body or any commit message: src/comment.ts (decisionRow changed, +2) (understated scope).
  • consistent: decisionsFound removed from src/brief.ts. 1 static caller in the base graph, all in files this diff changes: Brief (src/brief.ts:171).
  • consistent: session_id removed from src/checkpoint.ts. 1 static caller in the base graph, all in files this diff changes: SessionMetadata (src/checkpoint.ts:294).
  • consistent: worked removed from src/checkpoint.ts. 1 static caller in the base graph, all in files this diff changes: Windows (src/checkpoint.ts:414).
  • consistent: PR body names 10 things in code font. every one is a changed symbol, a changed path, or in a changed line.

What each changed file reaches

Read Changed file Change Reaches Tests
1 decisions.ts DecisionKind changed, decisionsIn changed, PRIORITY changed, +23 5 files 8
with decisions.ts checkpoint.ts Checkpoint changed, agent removed, model removed, +22 5 files 7
with checkpoint.ts brief.ts Brief changed, decisionsFound removed, BriefOptions changed, +13 2 files 3
with brief.ts comment.ts decisionRow changed, decisionStory changed, linkedState added 2 files 2
with comment.ts cli.ts whole file 0
2 brief.test.ts test code, selected directly 1
3 checkpoint.test.ts test code, selected directly 1
4 comment.test.ts test code, selected directly 1
5 decisions.test.ts test code, selected directly 1
4 files under the repo root ignored by policy 0

Paths above are under src/ unless shown in full.

Tests to run (8)

Blast radius by changed file: 20 dependents

blastline 0.25.0. Selection is advisory unless your workflow gates on it. How selection works. Graph 4b4fbc4. change-context budget 81180: omitted 0 impacts, 896 context entries (truncated); symbols are classified within the diff only. Intent: 0 of 4 commits, 4 attributed by trailer.

…ommitting session decides, whole failing lists, committed note status, faster path match

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@taylorg009

Copy link
Copy Markdown
Collaborator Author

Review round addressed in e3e475e. Each blocker got a test that failed on 02bff8a first.

# Finding Fix Test
1 A narrowed pass closed a failure by file count Count-based re-run closure (and the failing re-run merge) only for runs fed from a pipe (xargs …) decisionsIn: review round on 0.25.0 > does not let a narrowed pass that counts as many files close a whole-suite failure: only a list-fed re-run does
2 Shell-writing committer lost its model and rows to a session that edited a committed file elsewhere New top tier: the session whose git commit call carries the commit's subject. Decisions come from it and any session working at its checkout, else writers, else full-path sessions. files_touched only orders sessions within a tier checkpointFor: a committer that wrote through the shell > keeps the model and decisions of the session that made the commit, over one that edited a committed file elsewhere
3 "none in this change" from a cut pytest list failingFiles needs a count that proves the list is whole: vitest/jest failed files, or pytest's distinct failed tests against the closing N failed. No count, no list … > says nothing is outside the change from a pytest list it cannot prove is whole
4 Status taken from the first write Status is read from the note as committed (git show <commit>:<path>). The transcript (Write, Edit, a heredoc) only proves the session wrote it … > takes a verification note's status from the note as committed, not from the first time it was written; checkpointFor: … > reads the status a verification note has in the commit, after an edit changed it
5 Sub-step status line Front matter wins. Without front matter, every body status line must agree, else no row … > gives no status from a body whose status lines disagree
6 Log matched by substring Whole-name match … > reads a log only by its whole name, never another log whose name ends the same
7 Relative path named the wrong changed file Resolved against the run's cd (relative → repo path; absolute → the longest changed file it ends with). With no cd, a suffix shared by two changed files names neither and is not called outside … > resolves a failing path against the run's own directory before naming a changed file
8 Grouping vs CHANGELOG Code now matches the CHANGELOG: two different known cds never share a group or close each other; a run with no cd still joins … > never lets runs from two different directories share a target or close each other
9 strictRoots speed Words are read once against a Set of path suffixes, scanned from the tail only as far as the longest path. namedIn and worksOnPath try their pattern only after a substring hit. A 15,000-call session against 400 files took 13.7 s on main and 1.07 s now; 10 commands with 5,000 slashes each took 3 ms windowsOf: speed on long transcripts > …
10 Issue refs became "not readable" rows The loop classifies the GraphQL body gh prints even on exit 1: pull request → state; repository resolves but no pull request → dropped; repository unreadable → kept without a state. Run under set -euo pipefail on a merged PR, an issue and a missing repo: exit 0, two rows (action.yml, exercised by hand)
11 Threads >100 understated The lookup records how many threads were read (checked); past 100 the row says "of the first 100 of 150" renderBrief: how this PR was decided > leads with the linked PRs …
12 Private identifiers in tests Renamed to neutral ones —

Tests: 482 pass, tsc clean.

Replay of 29 checkpointed PRs from one week, against the previous head:

  • Rows from a question about another PR, asked in another session, are gone on three PRs (the committing session is a different one).
  • One PR gets a verification row it had missed, because the session only edited the note.
  • One PR's "then:" line now comes from the committing session.

Totals against 0.24.1: sections 18 → 22, rows 29 → 40, verification notes 0 → 11, runner-only rows 8 → 3. Every changed row was checked against its transcript.

🤖 Generated with Claude Code

…ted sha or whole message, later-committed notes, same-directory last run

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@taylorg009

Copy link
Copy Markdown
Collaborator Author

Second review round addressed in ca25617.

# Fix Test (failed on e3e475e unless noted)
N1 A git commit call is this commit when the short sha it printed ([<branch> <sha>], (root-commit), after --amend) starts the commit's sha. A call that printed another sha is never this commit. Only a quiet call falls back to the message its command shows (commitSubjectIn: heredoc after -F - or -m "$(cat <<EOF, else the first -m/--message= argument, \" unescaped), and it must equal the whole subject, never a prefix. When several sessions match, those whose commit ran at one of their own roots win. Committers keep session order, not files_touched order windowsOf: which git commit made this commit > knows the commit by the short sha git prints… (-F, --amend, root-commit, another sha); … > falls back to the whole message when git printed no sha, unescaping quotes, never a prefix (escaped quotes, both prefix directions, heredocs); checkpointFor: two sessions that committed the same subject > keeps the one whose commit ran where it worked on the files…
N2 A note missing at this commit is read from what the session wrote decisionsIn: second review round on 0.25.0 > reads a note written here but committed later from what the session wrote
N4 The "last run" check needs the same directory too … > calls a failure its last run when the only later pass ran in another directory. The earlier two-directory test now expects that row
N3 Path-match differences pinned windowsOf: path matching, pinned > … (-I/abs/path, [/abs/path], *.orig no match; plain and --flag=/abs/path match). Passes as a pin

488 tests pass, tsc clean. The 29-PR replay is unchanged from e3e475e (sections 22, rows 40, notes 11). On four real commits the committer is still exactly one session each.

🤖 Generated with Claude Code

@taylorg009
taylorg009 marked this pull request as ready for review October 23, 2026 01:51
@taylorg009
taylorg009 merged commit cc1f924 into main Oct 23, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant