feat(install): deliver the rules, don't just install them - #26
Merged
Conversation
AGENTS.orly.md was reachable only through a prose pointer an agent had to notice and follow. Nothing loaded it: no import, no symlink, no hook. The same held one file up — Claude Code loads CLAUDE.md and nothing else, so a repository with only an AGENTS.md handed its agent no rules at all. This checkout was itself an example. So the install now writes one loader per runtime that has a deterministic way in: a bare `@AGENTS.orly.md` import inside the pointer block, a CLAUDE.md importing the host where the repository has none, and both rule files in opencode.json's `instructions`. Codex and Amp auto-load AGENTS.md and reach orly's rules through the block already there. The loaders are the repository's files, not orly's: absent from `managed`, written only where nothing was written before, and never rewritten. A CLAUDE.md symlinked at the host counts as delivery and is left alone — editing through it would import AGENTS.md into itself. Delivery logic moves to src/loaders.ts, which is the concern's own unit and takes install.ts from 452 lines to 393. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DTMFyrbXJo3UrzQygaNtcn
The three-way Verdict union repeated its own strings at every return. The push gate saw them the moment the file became tracked, which the working tree could not — ufs.sh scans git ls-files. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DTMFyrbXJo3UrzQygaNtcn
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
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.
AGENTS.orly.mdwas reachable only through a prose pointer an agent had to notice and follow. Nothing loaded it — no import, no symlink, no hook, no settings entry. The same gap held one file further up: Claude Code loadsCLAUDE.mdand nothing else, so a repository carrying only anAGENTS.mdhanded its agent no rules at all. This checkout was itself an example, which is how the gap surfaced.The install now writes one loader per runtime that has a deterministic way into context, and leaves the runtimes that have none to the read-record gate.
CLAUDE.mdonlyCLAUDE.mdimporting the host, where the repository has noneAGENTS.mdinstructionsThe bare
@AGENTS.orly.mdline in the pointer block is the load-bearing half. Backticked it is decoration, which is what the block shipped as before: an import inside a code span stays literal text.Your files stay yours
The loaders are the repository's files, not orly's. They stay out of
managed, are written only where nothing was written before, and are never rewritten:CLAUDE.mdof your own is untouched, reported rather than editedCLAUDE.mdsymlinked at the host counts as delivery — editing through the link would land inAGENTS.mdand import it into itselfopencode.jsongains the two missinginstructionsentries and nothing else; one orly cannot parse is left byte for byteSession notes 1
Delivery logic moved to
src/loaders.ts— the concern's own unit, takinginstall.tsfrom 452 lines to 393.README.mdcarried the claim this change disproves ("Every agent runtime auto-loadsAGENTS.md"); it now states what each runtime actually loads. Questions 26.8 and 26.9 lock the behaviour into the invariance suite. Nocore/orpacks/edit, so the rendered ruleset is unchanged.Review
make auditgreen,make install-evals23/23 green, including "a second init writes nothing and leaves the tree byte-identical" — the loaders are idempotent through the packed tarball path.One finding, found by the push gate rather than by me: the three-way
Verdictunion repeated its own string literals, which RULE UFS forbids.ufs.shscansgit ls-files, so the working tree could not see it and the commit could — fixed in 4a12271.orly gate prgreen on every criterion.Make
End-to-end probe, a Go repository with its own
AGENTS.md:Ships as 0.9.0 — merging to main publishes it.
🤖 Generated with Claude Code
https://claude.ai/code/session_01DTMFyrbXJo3UrzQygaNtcn