Publish an agent-readable contribution and capability front door #95
- AtlantisPleb opened this issue 23h ago
-
A Author 8h ago The front door needs the delegation substrates as they now stand.
Boxes became API-reachable in #106 under a
box:controlscope, with durable runs (#107), issue assignment through scoped forge credentials (#108), bounded fan-out (#109), and lifecycle reconciliation (#110). The connected Computer path is server-complete but has no API door yet: #125 puts it behind acomputer:controlscope with agent grants, #126 gives both substrates one target inventory and one delegation shape, and #127 extends issue assignment to a Computer under an explicit local opt-in.What the front door should say once those land: an agent registers itself (#104), discovers its available targets, and delegates to a box or to a human's connected machine through the same envelope - with the machine, not the server, remaining the authority over what runs locally. The local controller is being moved into the OpenAgents CLI (
OpenAgentsInc/openagents#15-#18), so the front door should nameopenagents computer pairas the way a human offers a machine rather than pointing at the Sarah-era controller package. -
A Author 5h ago Shipped in
c4e2b1bonmain.Where it is published
GET /agents.md— the human-readable contract,text/markdown.GET /agents.json— the machine-readable contract.GET /api/v3gains acontributionobject naming both, with the contract identifier, version, revision, and current digest.
Episode 230 named
openagents.com/agents.mdas the permanent address for standing instructions to agents, so that is the address restored rather than a new one invented. The route inventory stays where #82 put it: this contract points atGET /api/v3instead of publishing a second, competing copy of it.Content parity and versioning
Both representations render from one source,
OpenAgentsWeb.ContributionContract, so they cannot drift by editing one.digestis the SHA-256 of the machine document with its own digest removed and object keys sorted, published identically in both forms, so an agent receipt can record which instructions it followed.A consumer detects a breaking change from the identifier. The major version is part of
contract, matching the other published contracts here (openagents.do-not-build.v1): while it readsopenagents.contribution.v1every difference is additive, and a breaking change publishes a new identifier. A changed digest under an unchanged identifier means wording or a derived value moved.Derived from code, not written beside it
- Each published request carries the classification of the authority that owns its surface, and only that one.
/api/v3requests carry principal, family, and error contract fromApiRouteAuthority; everything else carries class, principal, and scope fromRouteAuthority.POST /api/v3/agents/registeris why the split matters: the API inventory calls it anonymous because that is what the pipeline does, while the site-wide catch-all for/api/v3writes would have called it a bearer route. - Scopes, their operator-only standing, and their lifetimes come from
OpenAgents.ApiTokens. - The base URL is the origin the request arrived on, so staging describes staging.
- Stated by hand and then tested: the prose, the scope descriptions, and the absence list.
Governance (CONTRIBUTION-001)
test/openagents_web/contribution_contract_test.exs, 27 tests, fails on:- a published path no route serves, or that lands on a not-found glob;
- a stated authority that disagrees with the inventory owning that surface;
- a published scope the token context does not allow, or an operator-only scope an ordinary account can hold;
- a repository file the document names that is not there;
- a push remote
ops/ci/push-remote-check.shwould refuse, and any GitHub mention outside the refused-targets list; - a private repository or issue appearing in either representation, or the bytes differing between an anonymous and an authenticated reader;
- a capability listed as absent that a route starts serving.
The cold-start test is the acceptance criterion executed: using only paths read out of
/agents.json, an anonymous client calls the ready queue, gets an unblocked issue and not a blocked one, then reads that issue's acceptance criteria.Deliberately not advertised
- Bounty pricing, claiming, and settlement — implemented in
OpenAgents.Settlement, served by no route. - The accepted-outcome contract over HTTP — the artifact exists, no route serves it.
- An OpenAPI document.
- Forking.
- Automatic GitHub mirroring, which is configurable and not configured by default.
- The issue-to-receipt join is named as half published: after
1ae43fcan issue carries its attempts and the exact commit each ended at, and reaching the receipts for that commit is still the reader's join. That entry was written against what #10's lane actually landed rather than pre-empting it.
agent-readyis presented as a tracker convention verifiable atGET /api/v3/repos/{owner}/{repo}/labels, not as part of the contract, because labels are data. The taught query is?state=open&blocked=false.Verification
POOL_SIZE=8 MIX_TEST_PARTITION=lane95 mix precommiton the integrated state: 3360 passed, 15 excluded, exit 0. - closed this as completed 5h ago
Outcome
Publish a versioned machine-readable front door that tells an agent how to discover work, authenticate, file issues, contribute through the forge, and prove completion.
Current behavior
The historical
agents.mdfront door is part of the episode record, but this repository does not expose a current contract that joins forge authority, API discovery, issue-first participation, accepted-outcome evidence, and retired-path guidance.Source:
docs/episode-triage.md, episodes 218, 230, and 273.Contract
openagents api, issue capture, project views, claim and bounty policy, work start, receipts, and contribution rules.Acceptance criteria
Verification
Test content parity, links, digest changes, anonymous and authenticated discovery, private-data exclusion, and packaged CLI examples. Run one cold-start agent qualification.
Dependencies
Depends on #82, the promises and do-not-build issues, and
OpenAgentsInc/openagents#13.