Skip to content

feat(session-flow): a "You are here" position panel on the save-point skills - #3055

Merged
kyle-sexton merged 3 commits into
mainfrom
claude/session-flow-handoff-status-c37k4d
Aug 20, 2026
Merged

feat(session-flow): a "You are here" position panel on the save-point skills#3055
kyle-sexton merged 3 commits into
mainfrom
claude/session-flow-handoff-status-c37k4d

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

No linked issue

Summary

Both save-point skills showed the operator exactly two things: a ticked enforcement checklist, which
is the skill's own audit trail, and the rails resume prompt, which is a block to copy. Everything
answering what did we do, where are we, what is next was computed and then filed into the handoff
document — whose stated reader is "a session with NO prior context" (reference/structure.md), so
the operator never reads it. On the prompt-only path no file is written at all and the recap existed
nowhere.

At the moment a human is deciding whether this is a sane place to stop and whether the work is still
pointed where they wanted it, the skill showed them a compliance checklist. The information to answer
both was already gathered — it was just never rendered for them.

Fix

A new engine section, Emit the position panel, owns it once for both citing skills:

**You are here**

  [x] Phase 1 — discovery
  [x] Phase 2 — engine
▸ [~] Phase 3 — wiring          you are here
  [ ] Phase 4 — evals
  [ ] Phase 5 — docs

3 of 5 phases complete · completion criteria 4/7 met (2 UNVERIFIED)

Done this session — retry wrapper landed and green (a1b2c3d); OrderWriter stub does not compile yet.
Where we are — mid Phase 3, blocked on that stub.
Up next — finish the cancellation pass-through, then Phase 3 edge-case tests (§11 owns the rest).

It restates; it never discovers. Every line comes from what Locate the position first and the
sections above already established. It triggers no read the save-point did not already need — that is
the line between it and orient, which sweeps durable and off-thread state on demand.

Units are resolved from the work, not assumed. A first-match ladder takes workflow-checklist
stages, then plan/spec/PRD phases, then an issue chain, then live TaskList items, then completion
criteria. Work matching none of those gets the three prose blocks and explicitly no rail
inventing phases to have something to draw renders a map of a plan that does not exist, and the
operator would resume against it.

The rail is vertical because a horizontal one wraps. One unit per line, one line per block, never
a continuation line. A -chained row wraps at whatever width the terminal happens to be, and the
wrap orphans the position marker from the unit it marks — destroying the single thing the panel
exists to show. Above 8 units the middle elides to a … N more line, keeping the ends and the
current position; the whole panel caps at 16 lines. Status glyphs are the ones structure.md already
uses for the TaskList snapshot, so no legend is needed.

It cannot become a reason to lose the rails prompt. The one observed failure of this engine is a
turn that ends before the prompt reaches the screen (skills/handoff/context/gotchas.md), and this
change puts new text in front of that prompt. So the caps are load-bearing rather than cosmetic, an
uncertain panel degrades to one abbreviated line instead of growing, and the engine states outright
that the panel never gates the rails. A gotchas entry names this as the same failure with a new
cause.

Delivery order per skill: handoff is panel → checklist → rails, leaving the rails-last rule intact;
continue-in-background is panel → rails → launch, and the launched agent still receives exactly the
text between the rails, never a line of the panel.

Not a detection-contract change — the panel sits above every keyed signal and outside the copy
region, so find-handoff recovers exactly what it recovered before and needs no edit. That is stated
explicitly in the contract section, which otherwise treats a shape change as a knowing break.

Claim provenance and the redaction sweep both extend to the panel: an inherited status keeps its
UNVERIFIED (<source>) marker, the completeness line says how many marks are unverified, and the
panel joins the outbound set the mandatory redaction pass covers.

Verification

Run against the rebased tree, not an earlier one:

  • npx markdownlint-cli2 "plugins/session-flow/**/*.md" — 0 issues
  • editorconfig-checker plugins/session-flow — clean
  • typos plugins/session-flow — clean
  • jq empty on both changed eval suites and the manifest — parse clean
  • scripts/validate-plugins.sh — all manifests and the catalog validated
  • scripts/check-changelog-parity.sh in all four modes — --check, --check-bump origin/main,
    --check-order, --check-preserved origin/main — all pass
  • scripts/check-changed-skills.sh origin/main — both changed skills PASS, 0 errors
  • node scripts/generate-catalog.mjs and generate-cheatsheet.mjs — no drift; frontmatter
    description and metadata.summary were deliberately left alone, since this is an output-shape
    change rather than a new capability and both feed the skill-listing context budget
  • session-flow's own three test suites (check-usage-limit-reset, parse-transcript, observer) —
    pass

New eval coverage grades the shape rather than mere presence: the vertical rail with the current
unit marked, elision above 8 units, the prose fallback inventing no units, and the launched agent's
payload staying panel-free.

Not verified here: the behavioral end-to-end (invoking the skills and reading the rendered output at
an 80-column width). The evals encode those assertions; a live run is a separate exercise.

Also unverified by me, and worth a reviewer's eye: scripts/run-plugin-tests.sh fails in
plugins/claude-config/skills/audit-permission-state/scripts/ in my local container. That area is
untouched by this diff and main is green at the commit this branch was cut from, so I read those as
container-local (uid 0, and several of those suites read the ambient ~/.claude state). CI is the
arbiter, not that reading.

Related

Refs #3018 — that issue asks to compress the handoff instruction walk and names save-point.md
specifically. This change moves that file the other way, 452 → 547 lines (+95). Shipping the panel at
full spec was a deliberate call: the rationale paragraphs are what make the caps stick, and the
gotchas entry documents a real failure they guard against, so trimming them here is how the rule
quietly stops being followed. Recorded plainly so the compression pass starts from an accurate
picture rather than a surprise.


Generated by Claude Code

…oint skills

Both save-point skills showed the operator only two things: a ticked
enforcement checklist (the skill's own audit trail) and the rails resume
prompt (a block to copy). Everything answering "what did we do, where are
we, what is next" was computed and then filed into the handoff document,
whose stated reader is a session with no prior context — and on the
prompt-only path no file is written at all, so the recap existed nowhere.

Add an engine section, "Emit the position panel", owning it once for both
citing skills: a vertical rail with one line per unit, the current position
marked in the gutter, a completeness read, and three one-line blocks. It
restates what the save-point already established and triggers no read it did
not already need — that is the line between it and orient's on-demand
durable + off-thread sweep.

Units resolve by first match: workflow stages, plan phases, an issue chain,
live TaskList items, then completion criteria. Work with none of those gets
the prose blocks and explicitly no rail; units are never invented to fill one.

The rail is vertical because a horizontal one wraps at terminal width and
orphans the position marker from the unit it marks. Above 8 units the middle
elides; the panel caps at 16 lines. Those caps are load-bearing: the one
observed failure of this engine is a turn ending before the rails prompt
reaches the screen, and the panel is new text standing in front of it, so an
uncertain panel degrades to one line rather than growing, and the engine
states outright that it never gates the rails.

handoff fixes its order as panel then checklist then rails, keeping the
rails-last rule intact. continue-in-background emits panel, rails, launch,
and passes the agent exactly the text between the rails.

Not a detection-contract change: the panel sits above every keyed signal and
outside the copy region, so find-handoff needs no edit. Four evals grade the
shape rather than mere presence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014cvjkNWz2hCfo6S5UBpgcv
@claude

claude Bot commented Aug 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 48s —— View job


Code review complete

  • Gather context (PR diff, changed files, CLAUDE.md)
  • Run skip-gate checks
  • Review changed files for correctness/maintainability
  • Post findings

Ran /review:code-review (org CI code-review lane) against this PR. Scope: correctness and maintainability only (no linked security-review lane found in this repo, but the change is prose/instruction docs with no executable code path, so there's no security surface here regardless).

Skip-gate

PR is open, not a draft, and has real review surface (245/-7 across 9 files). Proceeded with full review.

What I checked

This PR is entirely documentation / skill-instruction prose (SKILL.md files, a reference engine doc, changelog, README, and eval JSON) — there's no executable code path to unit-test for runtime bugs. I verified the claims the PR body makes against the actual repo state rather than taking them on faith:

  • Status glyphs. The new panel claims to reuse structure.md's [x]/[~]/[ ]/[!] TaskList glyphs so "no legend is needed." Confirmed against reference/structure.md#L175-180 — glyphs match exactly.
  • Detection-contract claim. The PR claims the panel is "not a detection-contract change" because find-handoff keys off the dashed U+2500 rails and specific literal strings, not the panel. Confirmed against skills/find-handoff/SKILL.md#L38-78 — the three detection signals are the file directive, the dashed rails + copy instruction, and the Prior session:/frontmatter corroboration. The panel sits outside all three and above the rails, so the claim holds.
  • JSON validity. jq empty on both changed evals.json files and plugin.json — all parse clean, matching the author's stated verification.
  • Version/changelog parity. plugin.json bump to 0.29.0 has a matching CHANGELOG.md entry; no other file in the plugin references the old version number, so no drift.
  • Eval coverage shape. New evals (handoff ci: add Conventional Commits PR-title gate #13–15, continue-in-background chore: adopt widened comment-hygiene policy and re-pin ci-workflows @9567b8b #9) grade the specific behaviors called out in the PR body (vertical rail, elision above 8 units, prose fallback inventing no units, agent payload staying panel-free) rather than mere presence — matches the stated intent.
  • Output-order and gating logic. Traced the panel → checklist → rails ordering in handoff/SKILL.md and panel → rails → launch in continue-in-background/SKILL.md, plus the "panel never gates the rails" rule in the engine doc and its corresponding gotchas.md entry. Internally consistent — no case where the new panel step could plausibly replace or delay the rails prompt per the written instructions.

Findings

None that clear the high-signal bar (a careful senior reviewer blocking or flagging). One cosmetic-only observation, not filed as a blocking finding: reference/save-point.md#L67 has one prose line noticeably longer than its neighbors after the edit (an unwrapped join where "the position panel" was inserted into the sweep list). Purely cosmetic — MD013 (line length) is disabled in this repo's .markdownlint-cli2.jsonc, so it's not a lint failure, just a minor readability inconsistency if anyone hand-wraps these files.

No correctness bugs, no broken cross-references, no contract violations found in the reviewed diff.
· branch

@claude

claude Bot commented Aug 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 43s —— View job


Security review

  • Gather context (PR diff, changed files)
  • Run skip-gate check
  • Review changed files for security-relevant surface
  • Post findings

No security issues found.

This PR is entirely documentation/prose and eval-fixture content for a Claude Code skill plugin — no executable code, no GitHub Actions workflow changes, no auth/authz logic, no data handling, and no external input parsing. Changed files:

  • plugins/session-flow/.claude-plugin/plugin.json — version bump + manifest description text
  • plugins/session-flow/CHANGELOG.md, README.md — changelog/docs prose
  • plugins/session-flow/reference/save-point.md — new "Emit the position panel" spec section (prose instructions for how a skill renders a status panel to the terminal)
  • plugins/session-flow/skills/{handoff,continue-in-background}/SKILL.md — output-order and checklist prose updates
  • plugins/session-flow/skills/handoff/context/gotchas.md — new gotcha entry (prose)
  • plugins/session-flow/skills/{handoff,continue-in-background}/evals/evals.json — new eval fixtures (prompt/expected-output text only)

Notably, the redaction-pass language in reference/save-point.md is explicitly extended to cover the new position panel ("Redaction... sweeps it with everything else outbound... screen output is copied, pasted, and screenshotted"), which is a security-positive addition — it closes a potential gap where the new panel could otherwise have bypassed the existing secret-redaction sweep.

Skip-gate condition 2 applies: no security-relevant surface in this diff. Nothing further to report.

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown

Last security-reviewed head: 3cac2640b7ca087e609bb5995a7e5ab156d5994a. On the next push, the relevance gate compares only the commits since this SHA; delete this comment to force a full re-review.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 42ef1dff9e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/session-flow/reference/save-point.md Outdated
Comment thread plugins/session-flow/reference/save-point.md Outdated
@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown

Claude has reviewed this PR 3 times. The lane skips further automatic reviews after 5; deleting this comment resets the count.

…kList rung

Two defects in the position-panel spec, both found by review.

The worked example marked two phases `[x]` and a third `[~]`, then read
"3 of 5 phases complete" — counting the in-progress unit as done. That
example defines the shape agents copy, so it taught the miscount, in the
one section whose whole purpose is an accurate progress read. The example
now reads 2 of 5, and a rule states it: `[~]`, `[ ]`, and `[!]` count
against the total, only `[x]` counts toward it.

Unit-ladder rung 4 claimed live TaskList items were "already fetched, so
this costs nothing extra". That holds only on the full path, where
structure.md's Environment section makes the call. Prompt-only walks no
body sections, so on that path the rung asked for a list nobody had
fetched while the rule above forbade the panel from triggering a read —
unfollowable either way. Rung 4 is now full-path only and falls through
to completion criteria on prompt-only, which costs almost nothing since
"no non-trivial task list to reconstitute" is one of the criteria that
selects prompt-only to begin with. A prompt-only run FORCED by the
explicit argument never tested that criterion, so it makes the one
TaskList call rather than guessing from the conversation — named as the
single exemption to "never discovers", since it reads the session's own
ledger rather than the world outside the conversation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014cvjkNWz2hCfo6S5UBpgcv
@claude

claude Bot commented Aug 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 18s —— View job


Security review

  • Gather context (PR diff, changed files, CLAUDE.md)
  • Run skip-gate check
  • Review changed files for security-relevant surface
  • Post findings

No security issues found.

This PR remains entirely documentation/prose and eval-fixture content for a Claude Code skill plugin. Since the last security review (head 42ef1dff9e), one new commit landed — 3cac264, "fix(session-flow): correct the panel's completeness count and its TaskList rung" — which addresses the two Codex review nits on the position-panel spec:

  • reference/save-point.md#L200-223 — corrects the worked example's completeness arithmetic (3 of 52 of 5) so an in-progress [~] unit no longer counts as completed, and adds prose spelling out that only [x] counts toward the total.
  • reference/save-point.md#L259-272 — narrows rung 4 of the unit-resolution ladder (TaskList) to the full-file path where the list is already fetched, and carves out the one exception: when prompt is explicitly FORCED (bypassing the auto-detect criteria that would otherwise guarantee no non-trivial task list exists), the skill makes the one TaskList call rather than guessing from the conversation. This is scoped as an explicit, narrow exemption to the "the panel triggers no read" rule, not a general loosening.
  • skills/handoff/SKILL.md#L230-235 and CHANGELOG.md — mirror the same correction in the enforcement checklist and changelog prose.

All three changes are prose-only edits to instruction/spec documents — no executable code, no shell commands, no new tool invocations, and no change to the redaction sweep, the rails-prompt handling, or the continue-in-background launch path (claude --bg, temp-file argument passing) that the earlier review already checked for injection safety. The TaskList call added as an exception reads the session's own local task ledger (an in-session tool call, not an external fetch) and is explicitly scoped by the doc itself to not "turn the panel into an orientation sweep."

Confirmed the full PR diff (origin/main-equivalent base d9f15d4) still matches the stated file set — same 9 files, +272/-7 — with no additions beyond what's described above.

Skip-gate condition 2 applies: no security-relevant surface in this diff. Nothing further to report.
· branch

@claude

claude Bot commented Aug 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 30s —— View job


Code review complete

  • Gather context (PR diff, changed files, CLAUDE.md, REVIEW.md)
  • Invoke /review:code-review skill and follow its instructions
  • Review changed files for correctness/maintainability
  • Post findings

Skip-gate

PR is open, not a draft, and has real review surface (272/-7 across 9 files). Proceeded with full review.

Scope

Per REVIEW.md, this repo runs a dedicated claude-security-review lane, so this lane is code-review only (correctness + maintainability). This PR is entirely documentation/skill-instruction prose (SKILL.md files, an engine reference doc, changelog, README, gotchas, and eval JSON fixtures) — no executable code path, so no security surface applies regardless.

What I checked

This PR ships across two commits: 42ef1df (the panel feature) and 3cac264 (a same-day self-correction). The second commit already fixes both issues flagged in the earlier Codex review:

  1. Completeness-count example (reference/save-point.md) — the worked example now correctly reads 2 of 5 phases complete (an in-progress [~] phase no longer counts toward the total), and a new rule states the arithmetic explicitly: only [x] counts toward the total, [~]/[ ]/[!] count against it.
  2. TaskList-rung ordering (reference/save-point.md, unit-ladder rung 4) — rung 4 is now scoped "full path only, where they are already fetched"; prompt-only skips it and falls through to completion criteria, except when prompt was explicitly forced (the one criterion that would have selected prompt-only was never tested), in which case the spec now calls for making the single TaskList call rather than guessing from the conversation. This is also named as the sole exemption to "the panel never triggers a read" earlier in the same section, and mirrored into skills/handoff/SKILL.md's prompt-only checklist item.

I independently traced the cross-references these changes lean on rather than taking them on faith:

  • reference/structure.md §5 (Environment to re-establish) does mandate a TaskList call on the full path — confirms rung 4's "already fetched" premise holds there.
  • reference/save-point.md's "Choosing the path" section does list "No non-trivial task list to reconstitute" as a prompt-only auto-detect criterion — confirms the fallback reasoning ("that criterion was never tested" under forced prompt-only) is accurate, not asserted.
  • reference/structure.md §3 ("Completion criteria") is a separate, always-present body section distinct from the ladder's "phases" unit — so the example's 2 of 5 phases complete · completion criteria 4/7 met correctly reports two independent measures, not a ladder violation (initially looked like a possible bug, ruled out on inspection).
  • The gotchas.md addition ("The panel eating the prompt") correctly cites the engine doc's "The panel NEVER gates the rails prompt" heading, which exists as written.
  • Both SKILL.md files' updated output-order prose (handoff: panel → checklist → rails; continue-in-background: panel → rails → launch) matches the actual section content, and the "rails prompt from the engine doc is still emitted before the launch" phrasing was correctly changed from the old "FIRST" now that the panel precedes it.
  • Eval IDs in both evals.json files are sequential with no duplicates or gaps (handoff: 1–15, continue-in-background: 1–9), and both parse clean with jq empty.

Findings

None that clear the high-signal bar. No correctness bugs, no broken cross-references, no internal inconsistencies survived inspection in the current (post-fix) diff.

One pre-existing cosmetic note carried over from my prior pass, not a blocking finding: reference/save-point.md#L108 still has one unwrapped long line from the "position panel" insertion into the redaction-sweep sentence. MD013 is disabled repo-wide, so this is not a lint failure — purely a hand-wrap readability nit if anyone cares to touch it.
· branch

Adding "the position panel" to the swept-set sentence pushed the paragraph
past the file's wrap band and left a 110-column line. Rewraps the whole
paragraph rather than the one line, since fixing a single line just moved
the overflow to the next one. Prose unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014cvjkNWz2hCfo6S5UBpgcv
@claude

claude Bot commented Aug 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 55s —— View job


Code review complete

  • Gather context (PR diff, changed files, CLAUDE.md)
  • Invoke /review:code-review and follow its instructions
  • Review changed files for correctness/maintainability
  • Post findings

Scope

Per this repo's REVIEW.md, this is the code-review lane only (correctness + maintainability); a separate claude-security-review lane covers security, and this PR has no security-relevant surface regardless (pure documentation/skill-instruction prose). Diff reviewed: d9f15d4..9d67268 (9 files, +275/-10), matching the PR's stated file list.

What's new since the last review pass

The prior two review passes (against 42ef1df and 3cac264) already covered the position-panel feature in depth and both flagged issues (completeness-count example, TaskList-rung ordering) were fixed in 3cac264 and confirmed correct in that thread. The only change since then is the third commit, 9d67268 — a pure rewrap of the redaction-sweep paragraph in reference/save-point.md, which is exactly the cosmetic nit both automated code-review passes had noted as non-blocking (an unwrapped line after "the position panel" was inserted into the sentence).

I diffed the paragraph text with line breaks stripped (before vs. after) to confirm the rewrap changed only line breaks, not wording — content is byte-identical apart from where it wraps. No new prose, no dropped words, no reflow artifacts.

Independent checks performed

Findings

None. No correctness bugs, no broken cross-references, no contract violations, and the one previously-noted cosmetic issue is now resolved.

Not verified in this pass

markdownlint-cli2, editorconfig-checker, typos, and the repo's scripts/check-changelog-parity.sh / scripts/check-changed-skills.sh could not be run in this session (network/script-execution approval unavailable to this lane). The PR author's stated verification already reports these as clean/passing against the rebased tree; a maintainer with those tools available may want to spot-check, but nothing found here suggests they'd fail.
· branch

@kyle-sexton
kyle-sexton merged commit 4e67bc1 into main Aug 20, 2026
49 checks passed
@kyle-sexton
kyle-sexton deleted the claude/session-flow-handoff-status-c37k4d branch August 20, 2026 22:10
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.

2 participants