Route the README by Reader and Document the Cross-Owner Write Grant - #631
Merged
Merged
Conversation
The README opened straight into prose written for an agent, so a human arriving from GitHub had no path to the four things they actually ask: how to use this repo, how to deploy the host rules, how to diverge from one, and where to file an issue. It now forks by reader above the Table of Contents, and fills the Installation, Configuration, and Questions or Issues slots that spec/readme-structure.md already orders, the last of which was absent entirely. The write grant is the concrete gap behind the Configuration half. The guard denies a cross-owner gh write and names GH_WRITE_GUARD_ALLOW in the denial, and no document said how to give one. docs/host-setup.md now carries the worked fork example, the env block in the checkout's .claude/settings.local.json, the per-checkout scope, the required session restart, the two forms that fail silently, and a confirmation that does not involve making the write. The license shield moves into the closing License section, on the maintainer's instruction, matching the form PlexCleaner carries. spec/readme-structure.md still states the old placement, and reconciling it is the README Structure Rework cluster's edit rather than a loose end here. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Updates the repository’s human-facing entry points and host write-safety documentation so humans can quickly find “how to use this repo” guidance, while keeping agent routing explicit and documenting the cross-owner write grant mechanics in the place readers will hit them.
Changes:
- Add a “Getting Started” reader-routing table and new sections (“Using This Repo”, “Diverging From a Rule”, “Questions or Issues”) to the README, and move the license shield into the License section.
- Document how to grant cross-owner GitHub write targets via
GH_WRITE_GUARD_ALLOW(including scope, restart requirements, and confirmation) indocs/host-setup.md, with a corresponding pointer section in the agent-safety kit README. - Clean up backlog tracking in
TODO.mdand adduntriagedto the cspell word list.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| TODO.md | Removes the shipped “cross-owner write grant” cluster and updates README-structure backlog notes and link definitions. |
| README.md | Adds reader-routing and new guidance sections; relocates the license shield to the License section and adds issue/discussion entry guidance. |
| host-setup/agent-safety/README.md | Adds a “Granting a Cross-Owner Write” section pointing to the worked example in docs/host-setup.md. |
| host-setup/agent-safety/install.sh | Updates platform list in the wrapper comment (removes Proxmox mention). |
| docs/host-setup.md | Adds a detailed “Granting a Write the Guard Denies” section and updates platform list (removes Proxmox mention). |
| cspell.json | Adds untriaged to the dictionary. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Uh oh!
There was an error while loading. Please reload this page.
ptr727 added a commit
that referenced
this pull request
Aug 9, 2026
…ate (#635) Promotion of develop at 2082547, six squashes since the last one. Closes#633. #631 routes the README by reader and documents the GH_WRITE_GUARD_ALLOW grant where a denied cross-owner write puts the reader. #632 moves readme.sections from intent to letter with four checks beside it, backed by spec/readme-sections.json and spec/third-party-tools.json, and settles the tagline rule. #634 adds repo_gate.py --check eol-coverage, reading the line-ending pins against the tree rather than only against .editorconfig. #636 and #637 repair two readers Copilot found on this pull request, both defects develop already carried: a tool row required both outer table pipes that GitHub's Markdown makes optional, and a retired badge written as an inline image was invisible to a scan that read reference definitions alone. #638 turns the host contract's presence check into a version gate, and retires two gh workarounds that were artifacts of a stale distribution package, re-tested on an upgraded host rather than inferred. Four carried files owe a downstream re-vendor and none is recorded in the TODO.md entry yet. GOVERNANCE.md Repository Details is verbatim, so the audit reports it, and it propagates a rule: the About description is the tagline alone, and Docker Hub receives it from the About panel rather than from the README. CODESTYLE.md item 4 and .gitattributes are intent, so nothing reports them, and the second couples to the new gate through the forward-declared mark. .github/copilot-instructions.md is intent and propagates a correction rather than a refresh, so a repo left on the old copy is wrong rather than merely stale.
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 freeto 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.
The README opened straight into prose written for an agent, so a human arriving from GitHub had no path to what they actually ask: how to use this repo, how to deploy the host rules, how to diverge from one, and where to file an issue. It now forks by reader, and it carries the write-grant documentation that
TODO.mdrecorded as ready in #629 without doing.The README, routed by reader
A Getting Started table above the Table of Contents states the human/agent split outright, an agent starting at
AGENTS.mdand a human starting at the table, then routes six reader shapes to one destination each. Three new sections fill the gaps, placed in the slotsspec/readme-structure.mdalready orders them in so the redesign does not fight the hub's own spec:spec/divergences.json, and a write the host guard denies.The cross-owner write grant
The guard denies a
ghwrite whose explicit target sits under another owner and namesGH_WRITE_GUARD_ALLOWin the denial, and no document said how to give one.docs/host-setup.mdnow carries it where the reader already is when the denial arrives:originis your fork and only the half of the work aimed atupstreamdenies.envblock in the checkout's.claude/settings.local.json, which scopes the grant to that checkout rather than the host, and the session restart that loads it.owner/*granting a whole owner and a token carrying no/silently granting nothing. Verified against_granted_targetsand_target_permitted.VAR=x gh ...prefix and anexportin a shell call, neither of which reaches a hook running as its own process. That is the property making a grant a deliberate act outside the session rather than something an agent does for itself once blocked.host-setup/agent-safety/README.mdcarries the mechanics beside the hook description and links across.Also here
spec/readme-structure.mdstill states the old placement under Build and Distribution, so this README is deliberately ahead of the spec, and reconciling the two is thedecision-state README Structure Rework cluster's edit rather than a loose end here. That cluster'sSettledbullet asserting the old placement as fact is rewritten to record it.untriagedjoins the cspell word list, since the new Diverging section names the literal value the divergence report renders.TODO.mdloses the shipped cluster and its orphaned link definitions, and the stale "Refresh the README" chore becomes the open question this change leaves behind: whether these human entry points belong in the spec so fleet repos are measured on them. The per-section index alternative is recorded as declined, with the reason.Verification
markdownlint, cspell, editorconfig-checker,
spec/validate.py, andscripts/prose_lint.py --diff developall clean locally. CRLF preserved in every Markdown file, LF preserved ininstall.sh. Every relative link target and every in-file anchor resolves, checked mechanically.🤖 Generated with Claude Code