Skip to content

Name the Host Contract in the Layout, and Record Peer Messaging - #653

Merged
ptr727 merged 2 commits into
developfrom
describe-the-host-contract-in-the-layout
Aug 10, 2026
Merged

Name the Host Contract in the Layout, and Record Peer Messaging#653
ptr727 merged 2 commits into
developfrom
describe-the-host-contract-in-the-layout

Conversation

@ptr727

@ptr727ptr727 commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Two changes from one source: a stale enumeration a peer agent found, and a backlog entry for the method that found it. TODO disposition: New entry, per TODO.md rule 8.

1. The stale enumeration

Two enumerations of spec/ list its contents and stop before the host tool contract, which landed there in #652 along with a stub at the repository root:

  • GOVERNANCE.md "Repository Layout"
  • README.md's spec/ bullet

Both were accurate when written. Neither is now, and a reader looking for where the tool floors live would search both and find nothing.

Provenance, and two claims that did not reproduce

Raised by the ESPHome-Config agent over peer messaging, not by a gate. It hit the same class in its own Repository Layout while planning its AGENTS.md -> AGENTS.md + GOVERNANCE.md split, and named it as the trap the Documentation Style Conventions maintenance rule exists for: prose no linter can see, going stale under a change that never mentioned it.

I checked the hub for the same shape and for two adjacent claims from the same report. Recorded because a future reader will wonder:

ClaimHub result
Carried docs still link AGENTS.md#<section> for sections that moved to GOVERNANCE.mdNot present. Zero AGENTS.md# anchors tree-wide, so the hub's anchors were rewritten with the split. Downstream-only, for repos still carrying pre-split docs.
Other gh api ... --jq '{...}' projections feeding a diff share the gojq key-sorting exposure fixed in #649Not exposed. The only other one is the settings diff, where both sides pass through jq -S . over a flat boolean object, so key order cannot reach the comparison. Verified by running it both ways, gh api --jq and raw gh api piped to real jq: byte-identical.

repo-config/ keeps its "apply script" wording, still true of the hub, which hosts the script it no longer carries downstream.

2. The backlog entry

A decision cluster, because the mechanism needs no build and the only open question is which document may carry rules that bind a downstream agent. GOVERNANCE.md reaches those agents and costs a fleet-wide re-vendor plus the two manifest edits spec/section-model.md requires of any new section. A hub-only docs/ file costs nothing and leaves the rules unreachable from the repositories that would apply them, which is the failure AGENTS.md "Fleet Bootstrap" exists to prevent.

Settled and recorded so it is not re-derived:

  • Cross-host does not work, by construction rather than configuration. A peer address is a Unix domain socket under /run/user/1000/cc-socks/, which cannot cross a machine boundary. Cloud sessions and Remote Control sessions are the documented cross-host paths and neither appears in a listing on this host, so both are unverified rather than absent.
  • The addressing has a guardrail worth keeping. A bare peer name was refused and the transport demanded the [ref] a listing prints, which is what stops a message reaching the wrong repository's agent.
  • The method earns its place on evidence. One exchange produced the causal commit for the section 6 defect (90e3255), which this session had not identified from the symptom; a one-line reproduction of the gojq behavior that made an earlier fix pass for the wrong reason; and four procedure gaps no gate reports.
  • A peer's finding is checked rather than adopted. Two of those four did not reproduce here, one did and is part 1 of this PR.
  • The boundary that matters is permission, not politeness. A peer cannot widen what the asking session may do, so blocked work goes back to the maintainer rather than sideways to another agent.

Verification

prose_lint --diff HEAD, repo_gate --check eol, editorconfig-checker, markdownlint-cli2 on TODO.md, and cspell on the gated files: all clean. Both [files] and [section-model] reference names already resolve in TODO.md. GOVERNANCE.md "Repository Layout" is intent fidelity per spec/section-model.md, so part 1 forces no fleet-wide re-vendor.

🤖 Generated with Claude Code

Two enumerations of spec/ list its contents and stop before the host tool
contract, which landed there in #652 along with a stub at the repository root.
Both were accurate when written and are now short by the part a reader looking
for the tool floors would search for.
Raised by the ESPHome-Config agent, which hit the same class in its own
Repository Layout section while planning its AGENTS.md split, and named it as the
trap the Documentation Style Conventions maintenance rule exists for: prose
elsewhere that no gate can see going stale under a change it never mentioned.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CopilotAI lite review requested due to automatic review settings August 10, 2026 18:46

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Updates repository documentation to explicitly include the host tool contract within the spec/ directory descriptions, keeping the high-level layout summaries accurate after the host contract addition.

Changes:

  • Extend README.md’s spec/ bullet to mention the host tool contract and version floors.
  • Extend GOVERNANCE.md “Repository Layout” spec/ entry to mention the host tool contract and floors.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
README.mdUpdates the spec/ summary bullet to include the host tool contract and version floors.
GOVERNANCE.mdUpdates the “Repository Layout” spec/ entry to include the host tool contract and floors.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Agent-to-agent messaging was exercised end to end today and produced findings no
gate reports, so it is worth declaring rather than rediscovering. The entry is a
decision cluster because the mechanism needs no build and the only open question
is which document may carry rules that bind a downstream agent: GOVERNANCE.md
reaches them and costs a fleet-wide re-vendor, a hub-only doc costs nothing and
leaves them unreachable from the repositories they govern.
Cross-host is recorded as settled and negative. A peer address is a Unix domain
socket, which cannot leave the machine, and the two documented cross-host paths
appear in no listing here, so they are unverified rather than absent.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CopilotAI review requested due to automatic review settings August 10, 2026 18:49
@ptr727ptr727 changed the title Name the Host Contract Where the Layout Enumerates spec/Name the Host Contract in the Layout, and Record Peer MessagingAug 10, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated no new comments.

@ptr727
ptr727 merged commit 7e92b6d into developAug 10, 2026
7 checks passed
@ptr727
ptr727 deleted the describe-the-host-contract-in-the-layout branch August 10, 2026 19:15
ptr727 added a commit that referenced this pull request Aug 10, 2026
Promotion of six squashes. **Merge with a merge commit, never a squash,
and never with `--delete-branch`** — this PR's head *is* `develop`.
| PR | What it fixed |
|---|---|
| [#649](#649) |
`AUDIT.md` section 6's ruleset diff projected `bypass_actors`, which no
payload declares, so jq exited 5 and **every ruleset on every repo
reported DRIFT**. Two further surfaces carried the same dead policy. |
| [#650](#650) | The
deletion detector: hub git-tracked paths minus the `spec/files.json`
baseline, so a retired file is derived rather than remembered. Corrected
`configure.sh` from 6 carriers to **15**. |
| [#651](#651) |
`RESYNC.md`, the third entry point, routed from the byte-locked
`AGENTS.md` "Fleet Bootstrap". |
| [#652](#652) | A `jq`
1.7 target floor, `host-tools.json` as a carried baseline file, and
`scripts/host_gate.py` wired into all three procedures for the first
time. |
| [#653](#653) | Two
`spec/` enumerations that went stale when the host contract landed
there. |
| [#654](#654) | The
inbound-reference sweep counts as part of a deletion, including the
runnable-command and orphaned-definition shapes. |
## Why this promotion matters more than most
Downstream repos read hub `main` as ground truth. While `main` sits at
[`0a86bca`](0a86bca):
- Every repo that runs the `AUDIT.md` section 6 snippet gets **false
ruleset drift on both branches**. The ESPHome-Config agent reproduced
this live and is holding its own fix stashed rather than diverging from
the hub.
- A repo resyncing now re-vendors to `main`'s revision and then again
after promotion. Verified against Blog, whose carried `AGENTS.md` "Fleet
Bootstrap" differs from both refs, so it is two re-vendors instead of
one.
- `RESYNC.md` does not exist on `main`, so a downstream agent asking
"how do I sync" still routes to `AUDIT.md`, which measures and
deliberately states no order.
## Fleet cost this carries, measured and accepted
`host-tools.json` becomes a carried baseline file, so it is one `LETTER`
on **22 of 22** cataloged repos, the hub included. That was measured
before landing and accepted by the maintainer. `RESYNC.md` section 0 was
amended so a letter wave of this shape reads as a file to carry inside a
resync rather than as evidence a repo was never stood up.
## Verification on the merged head
`spec/validate.py` OK, `spec/audit.py --selftest` PASS, 557 script tests
OK, `scripts/host_gate.py` clean over 7 declared tools, `repo_gate.py
--check eol` clean, `editorconfig-checker` clean, working tree clean.
Post-merge fleet audit: 22 repos, **zero errors**.
Two hub-side artifacts clear on this merge, both promotion-pending
rather than defects: the hub's own `AGENTS.md` "Fleet Bootstrap" reads
as stale against its `develop` canonical, and the hub reports its own
`host-tools.json` absent because the file exists on `develop` only.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
ptr727 added a commit that referenced this pull request Aug 11, 2026
A pre-release check that found something, rather than a change anyone
asked for.
## Problem
`HISTORY.md`'s Version 2.0 entry enumerates what this repository became:
*"the shared fleet rules, a machine-readable `spec/`, the fleet
`registry/`, per-repo audit `reports/`, branch rulesets, and the
`AUDIT.md` convergence procedure."*
Three things shipped since are **peers of the items in that list** and
appear nowhere in it:
- **`RESYNC.md`**, now the third procedure an agent routes between, not
a detail of the second
- **The host tool contract** and its version floors,
`spec/host-tools.json` plus a carried `host-tools.json` per repository
- **The derived detector** for files the hub hosts rather than carries,
so a retired file is found rather than remembered
## Why it was worth catching first
A patch release cut against this entry would have published a changelog
whose summary omits the session's main deliverable. A reader asking how
a repository resyncs would find an enumeration naming only the procedure
that *measures*.
`HISTORY.md` is per minor version rather than per patch, so nothing is
owed for a routine `2.0.x`. What is owed is that the 2.0 summary stay
true about what 2.0 contains, and it had stopped being true.
## The pattern, third time today
This is the same shape as the `spec/` enumerations corrected in
[#653](#653) and the
`Repository Layout` bullet corrected downstream in Blog: **a list that
was accurate when written, going stale under a change that never
mentioned it, with no gate that reads it.**
The recurrence is worth noting on its own. Three instances in one
session suggests enumerations are a standing hazard rather than three
accidents, and the deletion sweep's new "read the files whose job is to
say what the repo holds"
([#660](#660)) covers
deletions only. Additions have no equivalent instruction. Not fixing
that here.
## Verification
The `README.md` and `HISTORY.md` openings must mirror per
`spec/readme-structure.md`, so that was checked rather than assumed:
titles match, taglines match, using the audit's own extraction.
`cspell` on both gated files clean, `prose_lint --diff HEAD` clean,
`markdownlint-cli2` clean, `editorconfig-checker` clean, CRLF preserved
byte-wise.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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

@ptr727