Skip to content

Goals from the session, an optional expected outcome, and the harness's goal verdicts as claims - #642

Merged
gcko merged 99 commits into
feature/session-redesignfrom
feature/session-redesign-cl-feedback
Oct 23, 2026
Merged

gcko merged 99 commits into
feature/session-redesignfrom
feature/session-redesign-cl-feedback

Conversation

@gcko

@gcko gcko commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

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 to main once #631 merges.

What changes for a reader

  • Goal first. The Intent card asks for a Goal; Expected outcome is optional and folded into an accordion.
  • A level from the goal alone. With no outcome line, the analysis reads the goal and gives a level. The evidence floor stands: with nothing departing and no check showing the goal done, no level is drawn, and the card says which check would let Compass draw one.
  • Vague goals are refused with "This goal is too vague to analyze against. Rewrite it with what should be true when the work is done, then try again." under the Goal field.
  • Goals from the session. A Claude Code /goal fills the Goal field, marked "Goal detected", until the reader edits it; a later /goal after a saved goal is offered as an update. With no /goal and 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.
  • The harness's verdicts are claims. Claude Code's "goal met" is shown as its claim and checked against the record (disputed with a reason when the record undoes it). A goal Claude Code gave up on is shown as "Claude Code gave up on this goal at HH:MM", never as met.
  • What happened to a goal. The Intent card says when an earlier /goal was replaced, met or given up, and when a /goal was cleared. A session is named by the goal it holds now.

What Claude Code records for /goal

Measured on Claude Code 2.1.308 and 2.1.309 (macOS) and recorded under docs/captures/claude/: set, replace, clear (sentinel, and Goal cleared: in claude -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 targets main.

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 /goal update 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

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>
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Coverage

Name                                                               Stmts   Miss Branch BrPart  Cover
----------------------------------------------------------------------------------------------------
compass/skills/compass/agy_hook.py                                    86     15     28      7  78.9%
compass/skills/compass/compass_runtime/__init__.py                     0      0      0      0 100.0%
compass/skills/compass/compass_runtime/aggregate.py                  349      2    118      2  99.1%
compass/skills/compass/compass_runtime/annotations.py               1056     23    422     21  97.0%
compass/skills/compass/compass_runtime/asks.py                       110      0     28      0 100.0%
compass/skills/compass/compass_runtime/claude_data.py                549     49    246     19  91.4%
compass/skills/compass/compass_runtime/cli.py                        277     21     66      6  91.5%
compass/skills/compass/compass_runtime/collectors/__init__.py          0      0      0      0 100.0%
compass/skills/compass/compass_runtime/collectors/antigravity.py     427     41    178     24  87.6%
compass/skills/compass/compass_runtime/collectors/claude.py          321     17    122     15  92.3%
compass/skills/compass/compass_runtime/collectors/codex.py           258     18     96     15  90.7%
compass/skills/compass/compass_runtime/collectors/copilot.py         153      4     52      2  97.1%
compass/skills/compass/compass_runtime/collectors/cursor.py          287     19    108     16  90.6%
compass/skills/compass/compass_runtime/collectors/droid.py            34      3      6      1  90.0%
compass/skills/compass/compass_runtime/collectors/gemini.py           54      7     16      4  84.3%
compass/skills/compass/compass_runtime/collectors/goose.py            95      6     28      4  91.9%
compass/skills/compass/compass_runtime/collectors/opencode.py        124      4     44      4  95.2%
compass/skills/compass/compass_runtime/collectors/pi.py              328     34    152     20  88.8%
compass/skills/compass/compass_runtime/config.py                     341      3     26      2  98.6%
compass/skills/compass/compass_runtime/copied_corrections.py         330     28     98     20  88.8%
compass/skills/compass/compass_runtime/correction.py                 337      6    112      4  97.8%
compass/skills/compass/compass_runtime/deliveries.py                 128     12     30      7  88.0%
compass/skills/compass/compass_runtime/departures.py                 135      6     30      6  92.7%
compass/skills/compass/compass_runtime/diagnostics.py                 89      3     26      3  94.8%
compass/skills/compass/compass_runtime/dismissals.py                 111      3     32      3  95.8%
compass/skills/compass/compass_runtime/ends.py                        86      5     18      0  95.2%
compass/skills/compass/compass_runtime/entry_numbers.py              121      5     38      5  93.7%
compass/skills/compass/compass_runtime/events.py                     230      1     86      3  98.7%
compass/skills/compass/compass_runtime/focus.py                       72      2     20      2  95.7%
compass/skills/compass/compass_runtime/frontend_dev.py               142      8     46      9  91.0%
compass/skills/compass/compass_runtime/git_status.py                  59      1     22      2  96.3%
compass/skills/compass/compass_runtime/goal_find.py                  136      4     46      4  95.6%
compass/skills/compass/compass_runtime/history.py                    236      9     60      7  94.6%
compass/skills/compass/compass_runtime/http_api.py                  1734    181    546     58  89.3%
compass/skills/compass/compass_runtime/interaction_prototype.py      709    221    198     38  65.7%
compass/skills/compass/compass_runtime/io.py                         301      8     72      6  96.2%
compass/skills/compass/compass_runtime/irreversible.py                39      0      6      0 100.0%
compass/skills/compass/compass_runtime/levels.py                     314      4    102      5  97.8%
compass/skills/compass/compass_runtime/lifecycle.py                  451     53    160     20  86.7%
compass/skills/compass/compass_runtime/live_estimate.py              282     17     84     13  91.8%
compass/skills/compass/compass_runtime/notifications.py              264     11     92      6  95.2%
compass/skills/compass/compass_runtime/observation.py                412      5    122      2  98.7%
compass/skills/compass/compass_runtime/observer.py                   723     36    276     22  94.2%
compass/skills/compass/compass_runtime/probe.py                       44      0     18      1  98.4%
compass/skills/compass/compass_runtime/project_context.py           4134    225   1732    159  92.8%
compass/skills/compass/compass_runtime/quota.py                      392      7    144      6  97.2%
compass/skills/compass/compass_runtime/reach.py                       78      6     30      4  90.7%
compass/skills/compass/compass_runtime/reading.py                   1753     23    620     26  97.9%
compass/skills/compass/compass_runtime/reading_jobs.py               223     14     52      4  93.5%
compass/skills/compass/compass_runtime/reading_policy.py             428     21    140     18  93.1%
compass/skills/compass/compass_runtime/reading_route.py              299     12     96      4  95.9%
compass/skills/compass/compass_runtime/record_pages.py               223     11     72     10  92.9%
compass/skills/compass/compass_runtime/records.py                    404      8    166     11  96.7%
compass/skills/compass/compass_runtime/semantic_history.py           332     12    126     15  94.1%
compass/skills/compass/compass_runtime/session_outline.py            142      7     42      5  93.5%
compass/skills/compass/compass_runtime/session_source.py             512     19    142     17  94.5%
compass/skills/compass/compass_runtime/session_summary.py            895     19    282     19  96.8%
compass/skills/compass/compass_runtime/sessions.py                   252      5    100      5  97.2%
compass/skills/compass/compass_runtime/snapshot.py                    43      0      6      0 100.0%
compass/skills/compass/compass_runtime/spacedock.py                  516     50    264     26  90.0%
compass/skills/compass/compass_runtime/state.py                       95      0      2      0 100.0%
compass/skills/compass/compass_runtime/stream.py                      57      0      8      0 100.0%
compass/skills/compass/compass_runtime/summary_jobs.py               328     36     92     21  85.5%
compass/skills/compass/compass_runtime/summary_store.py              295     23     82      9  91.5%
compass/skills/compass/compass_runtime/supervise.py                  431     95    126     10  78.3%
compass/skills/compass/compass_runtime/transcripts.py                673     42    328     29  92.9%
compass/skills/compass/compass_runtime/tripwires.py                  233     11     94     11  93.3%
compass/skills/compass/compass_runtime/turns.py                      209     11    104     12  92.7%
compass/skills/compass/compass_runtime/unasked.py                    177      6     50      5  95.2%
compass/skills/compass/compass_runtime/web/__init__.py                 0      0      0      0 100.0%
compass/skills/compass/compass_runtime/web/page.py                   114      8     42      6  91.0%
compass/skills/compass/event_hook.py                                 218      6     92      4  96.8%
compass/skills/compass/mcp_server.py                                 382     23    112     14  92.1%
compass/skills/compass/notify_hook.py                                 49     15      6      1  67.3%
compass/skills/compass/server.py                                       3      0      2      1  80.0%
compass/skills/compass/statusline_hook.py                            136     14     46      8  86.8%
scripts/abstention_ledger.py                                         440     42    148     18  89.8%
scripts/analyze_campaign.py                                          776     64    290     59  88.5%
scripts/bench_collect.py                                             214     13     54      6  92.9%
scripts/bench_event_latency.py                                        67     21     14      1  67.9%
scripts/build_sample_fixture.py                                      186     62     68      8  66.9%
scripts/bump_version.py                                               60     12     24      5  77.4%
scripts/capture_focus_raise.py                                       729    131    236     16  79.4%
scripts/capture_hook.py                                              293     30     90     11  88.8%
scripts/capture_team_registry.py                                     172     33     48      6  80.5%
scripts/capture_terminal_identity.py                                 347    108    104     14  66.3%
scripts/claude_route_verification.py                                 334     25     38      5  90.9%
scripts/cut_sample_session.py                                         49     12     12      1  78.7%
scripts/derive_prompt_shapes.py                                      210     16     88     14  89.3%
scripts/drift_closure_grading.py                                     400     14    204     14  95.4%
scripts/drift_closure_operator.py                                    329     31    126     33  85.9%
scripts/drift_replay.py                                             1643    230    600    106  83.1%
scripts/drift_study.py                                               239     23     98     16  88.4%
scripts/drift_study_controls.py                                      155     11     42      9  89.8%
scripts/frontend_inventory.py                                        143    143     66      0   0.0%
scripts/frozen_page.py                                                13      0      4      0 100.0%
scripts/levels_cases.py                                              778     99    254     30  85.4%
scripts/live_analyze_campaign.py                                      59      4     14      3  90.4%
scripts/mark_abstention.py                                          1272    166    462     64  85.0%
scripts/ordinary_turn_driver.py                                      475     33    156     30  90.0%
scripts/redact_session.py                                            173     25     50      7  83.9%
scripts/regen_client_fixtures.py                                     565     56     68      7  86.9%
scripts/release_transition.py                                        344     73    114      5  75.5%
scripts/run_tests.py                                                 187     37     60      5  78.1%
scripts/sanitize_session.py                                          370     35    122      9  89.4%
scripts/score_abstention.py                                         1527    110    554     58  91.8%
scripts/store_paths.py                                                 7      0      0      0 100.0%
scripts/update_homebrew.py                                            83      5     26      2  93.6%
scripts/update_marketplace.py                                         59      3     18      2  93.5%
scripts/validate_plugins.py                                          839    218    466     66  71.6%
scripts/verify_release_archive.py                                    222     21     50      4  90.8%
----------------------------------------------------------------------------------------------------
TOTAL                                                              40119   3530  14044   1502  89.6%

Threshold: fail_under in pyproject.toml · label coverage-exception to bypass (visible in PR timeline).

gcko and others added 28 commits October 22, 2026 17:36
…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>
gcko and others added 3 commits October 23, 2026 12:26
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>
@gcko gcko changed the title Read the session's goal, make expected outcome optional, and refuse vague goals Goals from the session, an optional expected outcome, and the harness's goal verdicts as claims Oct 23, 2026
gcko and others added 23 commits October 23, 2026 13:07
…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>
@gcko
gcko marked this pull request as ready for review October 23, 2026 08:23
@gcko
gcko merged commit c726634 into feature/session-redesign Oct 23, 2026
20 checks passed
@gcko
gcko deleted the feature/session-redesign-cl-feedback branch October 23, 2026 08:23
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