Repository navigation
Goals from the session, an optional expected outcome, and the harness's goal verdicts as claims - #642
Merged
gcko merged 99 commits intoOct 23, 2026
Conversation
An empty commit so the draft pull request can open before the first change. The plan lives in docs/plans/intent-from-the-session.md, which is gitignored. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Contributor
CoverageThreshold: |
…ript Shapes only, measured on Claude Code 2.1.308 (macOS): the set and verdict goal_status attachments, the command's user and local_command records, and the hook payloads, which carry no goal field. The README row names the shapes not captured: replacing an active goal, Goal cleared: for an active goal, the not-met and impossible verdicts, a very long condition, resume and interactive sessions. Implements [DRC-4945](https://linear.app/recce/issue/DRC-4945/record-how-claude-code-writes-a-goal-into-its-transcript) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
A Claude Code session that states its goal with /goal now publishes it as
session_goal ({text, at}), read forward and incrementally from the
goal_status and local_command records. The latest set wins, a cleared goal
publishes none, a met goal keeps its condition and its set time, and a
condition that cannot be held whole publishes nothing.
session-goal joins the closed goal sources (spelt once in records, re-exported
by reading, mirrored by the page and pinned by the vocabulary fixture), and the
server resolves it from its own row for adoption. The published mapping leaves
room for the harness verdict without a rename. Docs record the read and its
privacy limits.
Implements [DRC-4946](https://linear.app/recce/issue/DRC-4946/read-a-claude-code-goal-as-a-goal-source)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
workList.ts kept its own three-token goal-source list, so an adopted /goal was treated as typed words when deciding whether the window anchor sentence applies. Use PROMPT_SOURCES like every other site. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
…ne exists The Intent log listed three sources and closed with "No goal available from these sources" over a session that publishes a /goal, and the goal box said only that there was no first prompt to draft from. Both read as a session with no goal. The log now lists the /goal as a source and counts it, and the box says which /goal the session holds. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
A /goal condition over the Goal field's 240 characters now carries offered (the bounded excerpt an adoption stores) and cut: true on session_goal. The server resolves offered for adoption and counts the session's /goal as the draft time ahead of the prompts, so the page, the adoption and the store agree on one string and nothing clips on its own. Implements [DRC-4947](https://linear.app/recce/issue/DRC-4947/use-a-detected-goal-until-the-reader-edits-it-and-offer-a-later-one-as) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
…as an update A /goal the session set fills the Goal field, marked "Goal detected" with a "From /goal" line, ahead of the prompts and over a session that opened with a command, and Analyze drift adopts it by name. Typing or choosing a prompt replaces it and the line says so. After the reader saves a goal, a newer /goal is offered beside the field with Use this goal and Keep my goal, and never replaces the saved words. A goal over the limit is offered as its excerpt with a note that it was cut. The how-to says where a detected goal comes from. Implements [DRC-4947](https://linear.app/recce/issue/DRC-4947/use-a-detected-goal-until-the-reader-edits-it-and-offer-a-later-one-as) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Records the owner rulings on using a /goal until edited and offering a later one, the excerpt fields on session_goal, and the reader state the update offer holds. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
… note once it is saved Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Expected outcome sits under the Goal in an accordion labelled optional, closed until a saved or drafted line, a pending later direction or a departure citing an outcome line is held. It opens on each rise of that condition, so a reader's close holds. Add a line moves inside it. Disclosure gains an openWhen prop for the rise rule. Stories, the first view tests and the how-to are updated. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
OutcomeLines no longer renders the held-heading wrapper, so the rule never matches. GoalField still uses the other held-heading rules. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
…ng rule Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Step 1 called the expected outcome optional while the paragraph below said no level without one. Step 1 now states the cost, and the paragraph is shortened to stay within the popover word budget. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Keep the no-outcome-line sentence the docs test pins and trim two words elsewhere in the popover. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
… to read An analysis no longer needs an outcome line. With none, the producer prompt reads the goal's own stated end state as the outcome, the level rules treat the Goal row as the one line, and the reading's cutoff says it read against the goal. Rule L7 and its reason stay as a known token for older payloads. The model may instead answer the goal "goal_unclear" before it reads the session. That is a new closed result on the Goal row alone: it takes no citation, publishes every other row as not asked, leaves the analysis with no level (reason goal-unclear), is stored like any reading and still counts against the daily cap. The intent's prompt share rises from 9,216 to 9,728 bytes for the two added instructions. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
… analyze Draw the refusal where the reader can act on it: the agreed sentence under the Goal field, cleared when the goal is edited or saved again. The Drift card answers a refused goal in one line with no level, quiet rows or Steer back, and a goal alone is answered from its own row. The how-to drops the claim that a level needs an outcome line. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Record the 2026-10-22 amendment under the four-levels ruling and the frontend departure, and restate the promise in the README, promise map and skill. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
…e give-up claim The earlier-goal and cleared notes on the Intent card now use the dated clock, as the Drift notes do, so an event on a previous day no longer reads as today. The Drift give-up claim names Claude Code rather than the payload harness label, matching the Intent card. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
…y the cleared /goal note
The goal-met claim used the payload harness label ("Claude") while the
give-up claim said "Claude Code". Both now name the product. Add a story
proving the cleared note shows after a prompt is chosen over a session
that opened with /goal.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
The cleared note sat directly above a Goal field pre-filled from a prompt, so it could read as describing the draft. Over an untouched prompt draft it now ends "; the draft below is your first prompt" (or your latest prompt, a prompt you chose, a goal found in your prompts). Typed words and an empty box keep the plain sentence, and the update offer still suppresses it. Implements [DRC-4957](https://linear.app/recce/issue/DRC-4957) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
… names a found goal The offer test now uses a saved goal older than a newer /goal, so goalUpdate is non-null and the replaced note would otherwise show; it fails without the suppression. The found-goal clause gets a unit test and a story, including that editing the box drops it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
…above it The Intent lede becomes a hint under the Goal textarea, beside the count, and reads "Write what should be true when this session is done. Compass checks the session's work against it and never writes into the session." The goal source line moves from beside the count to directly above the box, under any ended note, and says what the words are: "Drafted from your first prompt", "Your edit of your first prompt", "From your /goal at 11:53", "Found in your prompts at 23:11", "You typed this". The cut suffixes name the real goal limit. The cleared note no longer names the draft, since the source line directly under it does. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
… proofs with the new source line The Goal label no longer breaks mid-word when Find goal and Use your prompt squeeze the heading row: the label does not shrink or wrap, and the row wraps at 760px and below so the buttons drop beneath it. A story at 400px proves the label sits on one line. The reader-state record and the on-demand editor proof now use the source line's new wording. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Every phase of What the session has done now starts closed, including one that holds a departure. The opening paragraph stays open, and the departure pills and failed-run count stay on the phase heading. A phase the reader opens stays open through later boards. The departure card's line that names the phase holding its evidence now opens that phase before focusing its heading, so the jump lands on visible lines. Records the reversal of "Phases arrive open" as a 2026-10-23 owner amendment and updates the reader-state row. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
The README still said a phase opens with its lines and cites, which you can fold. Phases start closed since the last change, and a reader opens the ones they want. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
The sample saved a goal and an expected outcome that said the same thing, so its Drift card showed two departures on the same evidence. It now saves one goal written as an end state, with a new reading made against it. The stored summary is the earlier one, kept. The capture drops the cutoff sentence about unsaved outcome lines, and a test holds the intent to a goal alone. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
The sample banner now lists the steps in order: open a session, set its goal, press Analyze drift, read the departures and use Steer back. The tour drops every expected-outcome reference and matches the new fixture and the closed summary phases. The ended-session notice says what saving now does and what Analyze still uses. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
A goal-only reading said "Read against your goal; no expected outcome lines were saved." Noting the absence of an optional field tells a reader nothing, so it now says "Read against your goal." A reading stored before keeps its stored sentence. The ended-session journey proof asserts the new notice. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
The kept summary read as made from a replaced record, so the sample told a reader to summarize again. The summary and the reading are now made together from the same transcript, the sample-only cutoff rewrite is gone, and the tour and the sample records match the new capture. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
A departure card and the claims row draw every cited entry as one line in its own words with its number, and drop the Evidence and Source folds that repeated the same entries. The stored why and the harness limit move inline. Implements [DRC-4960](https://linear.app/recce/issue/DRC-4960) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Adds the 2026-10-23 owner amendment, and brings the sample tour and the skill body in line with a card whose cited entries speak for themselves. Implements [DRC-4960](https://linear.app/recce/issue/DRC-4960) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
…ast Evidence fold Quiet goal and outcome rows and a departure's titled entry now use the same cited line as the claims row. The Evidence fold on quiet rows is gone; its status qualifier, why, detail and limit draw in view. Stories assert no Evidence or Source button on any row. The amendment no longer claims that HOW_TO_USE.md was updated. Implements [DRC-4960](https://linear.app/recce/issue/DRC-4960) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Jared Scott <jared.scott@variable.team>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-on to #631 from CL Kao's feedback on the session redesign. Based on
feature/session-redesign, so this diff shows only the new work; retarget tomainonce #631 merges.What changes for a reader
/goalfills the Goal field, marked "Goal detected", until the reader edits it; a later/goalafter a saved goal is offered as an update. With no/goaland no goal set, Find goal asks a model for the goal in the reader's own prompts and shows it only with verbatim quotes and citations to those prompts./goalwas replaced, met or given up, and when a/goalwas cleared. A session is named by the goal it holds now.What Claude Code records for
/goalMeasured on Claude Code 2.1.308 and 2.1.309 (macOS) and recorded under
docs/captures/claude/: set, replace, clear (sentinel, andGoal cleared:inclaude -p), met, not met, impossible (failed: true, after which the goal has ended), resume, an interactive session, and the 4000-character condition limit.Issues
Each line says "Part of" while this pull request targets
feature/session-redesign: Linear closes an issue when a pull request that says "Implements" merges anywhere, including into a feature branch. Switch them to "Implements" when this targetsmain.Part of DRC-4945
Part of DRC-4946
Part of DRC-4947
Part of DRC-4948
Part of DRC-4949
Part of DRC-4950
Part of DRC-4951
Part of DRC-4953
Part of DRC-4954
Part of DRC-4955
Part of DRC-4956
Part of DRC-4957
Part of DRC-4958
Part of DRC-4959
Part of DRC-4960
Verification
Each issue was built test-first, reviewed by two lenses with an arbiter that reproduces findings, checked in Chrome on real Claude Code sessions, and walked end to end on real sessions created for the test. The full pre-PR suite passes on the head. Not seen on a real session (unit tests and stories only): the
/goalupdate offer, an accordion opened by a departure that cites an outcome line, the goal-only "no check shows it done" sentence, and a cold transcript read that starts after the goal was set.🤖 Generated with Claude Code