Publish an agent-readable contribution and capability front door #95

Closed AtlantisPleb opened this 23h ago 2 comments

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.md front 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

  • Publish concise human-readable guidance and a machine-readable representation from the same source.
  • Identify the forge as canonical and GitHub as a read-only mirror.
  • Link authentication, repository discovery, openagents api, issue capture, project views, claim and bounty policy, work start, receipts, and contribution rules.
  • State that detailed issues are welcome and direct pushes require repository membership and policy.
  • Link the promises registry and do-not-build register.
  • Version and digest the contract so agent receipts can record what instructions they followed.
  • Expose no tokens, private repository names, internal topology, or ambient capabilities.

Acceptance criteria

  • A fresh agent can discover one public issue, read its acceptance criteria, and identify the permitted contribution path without crawling unrelated pages.
  • Human and machine-readable versions agree and share a version digest.
  • The front door never directs a push to GitHub.
  • Private capabilities appear only after authenticated discovery.
  • Contract changes fail CI when human and machine forms diverge.

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.

  1. AtlantisPleb opened this issue 23h ago
  2. A AtlantisPleb Author 8h ago

    The front door needs the delegation substrates as they now stand.

    Boxes became API-reachable in #106 under a box:control scope, 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 a computer:control scope 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 name openagents computer pair as the way a human offers a machine rather than pointing at the Sarah-era controller package.

  3. A AtlantisPleb Author 5h ago

    Shipped in c4e2b1b on main.

    Where it is published

    • GET /agents.md — the human-readable contract, text/markdown.
    • GET /agents.json — the machine-readable contract.
    • GET /api/v3 gains a contribution object naming both, with the contract identifier, version, revision, and current digest.

    Episode 230 named openagents.com/agents.md as 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 at GET /api/v3 instead 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. digest is 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 reads openagents.contribution.v1 every 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/v3 requests carry principal, family, and error contract from ApiRouteAuthority; everything else carries class, principal, and scope from RouteAuthority. POST /api/v3/agents/register is 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/v3 writes 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.sh would 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 1ae43fc an 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-ready is presented as a tracker convention verifiable at GET /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 precommit on the integrated state: 3360 passed, 15 excluded, exit 0.

  4. closed this as completed 5h ago
Sign in with GitHub to comment on this issue.