Skip to content

Delivery batch: commands get a cwd, exploration stops persisting, the research baseline and the six boundaries reach every route and the installed tree - #840

Merged
atomchung merged 5 commits into
mainfrom
claude/821-716-829-parity-gaps
Aug 23, 2026
Merged

Delivery batch: commands get a cwd, exploration stops persisting, the research baseline and the six boundaries reach every route and the installed tree#840
atomchung merged 5 commits into
mainfrom
claude/821-716-829-parity-gaps

Conversation

@atomchung

Copy link
Copy Markdown
Owner

Four commits, each closing its own issue; the first three were owner-verified before this PR, the fourth went through a three-lens adversarial review (receipts on #838).

Out-of-scope findings from the #838 review are filed as #839 (subtree links escaping to docs/; engine comments citing AGENTS.md, one mis-cited).

python3 tests/run_all.py --group product: all 49 suites pass.

Closes #821, closes #829, closes #716, closes #838.

🤖 Generated with Claude Code

test and others added 5 commits August 23, 2026 11:18
…llow (closes #821)

Every command in SKILL.md was written relative to the skill directory and
nothing established that directory. The documented install symlinks the skill
into ~/.claude/skills, after which a Claude Code session starts in the user's
own project and the relative `cd skills/fomo-kernel` names nothing — so the
first command a new user runs fails.

review.py resolves its own root from any working directory (verified from an
unrelated directory against this tree), so the fix is a deletion plus one
statement of where commands run, not a new mechanism.

Also deletes the bare mid-session `pip install -r requirements.txt`: README.md
already installs into a venv activated before Claude Code launches, and a
mid-session bare pip can resolve to a different interpreter than the one the
engine runs under.

SKILL.md net +13 bytes, which is the entire remaining headroom under the
16384-byte always-loaded budget #507 set.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…selection (closes #829)

The #827 acceptance A/B found both arms writing canonical evaluation rows for
candidates the user never selected: the candidate arm reran its own top
recommendation twice without --ephemeral after a ranking request where no
selection ever happened, and the baseline arm persisted the rejected candidate
too. Both traced to one word.

"rerun only the user-selected or still-live candidate" reads as "my
recommendation still stands", which turns exploration into durable state. The
persist path now requires explicit user selection or commitment, and says that
a standing recommendation and the user's silence are neither.

Both surfaces carrying the sentence move together: SKILL.md's candidate
comparison paragraph and docs/decision-fomo-kernel-shape.md's inquiry-layer
bullet.

The deterministic guard the issue also proposes (a --decision-context carrying
user intent, failing a canonical write closed when no selection marker is
present) is deliberately not in this commit: it is a new gate, and which user
scene it changes is the owner's call.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…at have a book (closes #716)

#716's title is "Cross-route evidence-backed decision priors" and the shipped
implementation (#727) wired exactly one route. `references/research-priors.md`
was linked by a single file — `decision-framing.md`, the no-recorded-book
route — so the product answered a user worse the more evidence they handed
over: with nothing recorded they heard that broad diversification is the
baseline and that an index label alone does not establish breadth, and after
supplying a book they got weight and concentration arithmetic and could no
longer reach that baseline at all.

The catalogue is now the baseline on every route that answers a decision.
`trade-consequence.md` (the `consider` route) and `freeform-answers.md` each
link it and say when a prior belongs in the answer; `decision-framing.md` keeps
the baseline as its top sentence and stops implying the catalogue is its own.
No prior is added, widened, or restated, and the per-prior structure —
applicable decision class, bounded directional claim, material exceptions,
forbidden overclaims, reviewed date, primary sources — is untouched.

Widening the reach is only safe with #716 section 4 written down, so the
catalogue gains "An engine fact dominates a prior": a prior may interpret a
deterministic result, never replace, substitute for, or fill a gap in one, and
it may not invent a cap, an allocation, or a threshold the user has no rule for
and the engine did not compute. The two book-bearing routes carry that sentence
verbatim rather than paraphrasing it — #834's answer applied to a rule instead
of an exemplar — and the drift is mechanical, not forbidden.

This is a routing and boundary change. No engine file, schema, JSON payload
contract, runtime field, or engine vocabulary moved, and `AGENTS.md` and
`SKILL.md` are byte-identical: the always-loaded pair already routes to all
three route files, which is what #507's budget exists to force.

`tests/test_research_priors.py` replaces its single-route loading assertion
with the whole walk (`SKILL.md` -> route file -> catalogue) plus the boundary
drift check, and keeps the field-completeness and question-cap regressions. Its
mutation proof covers dropping a route's link, unrouting a route file from
`SKILL.md`, softening any copy of the boundary sentence, and removing the
section the routes point at.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…alled skill tree (closes #838)

README.md installs this product by symlinking skills/fomo-kernel/ alone, so
AGENTS.md — and every rule stated only there — never reached an installed
host. The privacy boundary had no copy that host could read at all, and the
only sentence citing it pointed at a file the reader does not have.

- SKILL.md now states all six boundaries in the section that exercises each;
  privacy gets its own "Private data stays local" section with key sentences
  verbatim from the floor. references/agent-boundaries.md gains the general
  third-party/cloud privacy sentence and the canonical-writer rule's second
  half (a named later reader must exist).
- references/freeform-answers.md states the card-privacy default instead of
  citing "AGENTS.md invariant 4" (twice).
- #507's single 16 KiB budget over the AGENTS.md+SKILL.md pair measured a
  pair that exists only in a checkout, and sat at exactly 16384 bytes.
  Split per the #838 owner ruling: SKILL.md 12 KiB (the installed host's
  entire always-loaded surface) and AGENTS.md 8 KiB (the checkout floor),
  each documented with its scenario.
- New tests/test_installed_skill_tree.py reads only skills/fomo-kernel/ and
  fails when a boundary's statement retreats to the repository root, when
  SKILL.md stops naming the routed boundary file (reachability, the
  profile.md precedent), or when a subtree .md/.json cites AGENTS.md.
  Adversarially probed: pointer deletion and an exception-clause rewrite of
  the privacy sentence both redden; full-sentence pins, per-phrase mutation
  arms, a subdirectory injection arm, and a registration self-check.

Out-of-scope findings from the same review moved to #839 (docs/ links that
escape the installed tree; engine comments citing AGENTS.md, one mis-cited).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tree gate (PR #840 review round)

Ten finder angles plus a gap sweep over the full PR diff; every fix below
re-verified by the touched suites and the full product group (49/49).

- references/trade-consequence.md still told the agent to "rerun only the
  selected or live candidate without the flag" — the pre-#829 licence to
  persist a canonical row for a candidate the user never selected, in the
  exact reference SKILL.md routes to for consider's rules. It now carries
  #829's sentence: a persistent rerun needs the user's explicit selection,
  and a standing recommendation is not one.
- tests/test_installed_skill_tree.py: phrase matching is whitespace-collapsed
  through one shared helper (a cosmetic re-flow no longer false-reddens, and
  the live gate and its mutation proof share one membership definition); the
  citation scan widened from .md/.json to every text runtime surface
  (.md/.json/.html/.txt — the card templates and requirements.txt were
  silently outside it) and reads strictly instead of errors="ignore";
  source keys are POSIX so the assertions hold on every OS; the
  "never recompute" pin carries the full clause.
- tests/test_doc_language.py: budget-violation messages name files in POSIX
  form, matching the mutation test's assertions on every OS.
- tests/test_research_priors.py: BOOK_BEARING is derived from ROUTE_FILES
  instead of hand-listed, and test_b is renamed to match what it actually
  covers (every route, not only the book-bearing two); the maintainer-guide
  row citing it follows.
- docs/maintainer-guide.md: the #838 row states the widened citation-scan
  scope and documents that the privacy section's anything-public example
  list is deliberately re-cast for the installed audience.

Reviewed and deliberately unchanged: no combined AGENTS.md+SKILL.md sum
ceiling (the #838 owner ruling split the scenarios; the sum is bounded by
the two ceilings), and SKILL.md's prose cwd statement (#821's accepted fix).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@atomchung
atomchung merged commit fd431a8 into main Aug 23, 2026
5 checks passed
@atomchung
atomchung deleted the claude/821-716-829-parity-gaps branch August 23, 2026 09:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment