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
Conversation
…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>
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.
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).
3adcb60— closes [bug·delivery·P1] Every command in SKILL.md is relative to the skill directory and nothing establishes that cwd — the README's own install breaks the first one #821: SKILL.md states where commands run instead of relying on acdthe README's install never establishes.45ecbb5— closes [design·M1] "Still-live candidate" reading lets exploration persist canonical rows the user never selected #829: exploration (consider --ephemeral) persists nothing without an explicit user selection; a standing recommendation is not one.0855618— closes [research·product] Cross-route evidence-backed decision priors — 建立不低於通用模型的回答基準 #716: the research-baseline catalogue is reachable from every route that answers a decision, with the engine-fact-dominates-a-prior boundary stated verbatim in the book-bearing routes.814955c— closes [bug·delivery·P1] The six non-negotiable boundaries live outside the installed skill — an installed user receives none of them, and the privacy one has no copy they can reach #838: the six non-negotiable boundaries now live insideskills/fomo-kernel/— the one directory the install actually delivers. Privacy gets its own always-loaded section in SKILL.md with the floor's sentences verbatim;freeform-answers.mdstates the card-privacy rule instead of citing a file the installed reader does not have; [done·P0] Minimal live-decision runtime harness #507's single 16 KiB pair budget splits into two per-scenario ceilings (SKILL.md 12 KiB installed / AGENTS.md 8 KiB checkout — the pair sat at exactly 16384 bytes); newtests/test_installed_skill_tree.pyreads only the installed tree and reddens when a boundary retreats to the repository root, when SKILL.md stops naming the routed boundary file, or when a subtree runtime surface cites AGENTS.md. Adversarial probes that stayed green mid-review (pointer deletion, privacy exception-clause rewrite) now redden.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