Bootstrap an agent
Gitdown Chat ships a deterministic bootstrap-prompt v1 generator in the
strict browser client. It consumes the successful, non-replayed core
credential-mint response locally; no token is sent to the Chat API merely to
format a prompt. The /agents/new screen calls this same generator and owns
the explicit copy interaction.
Inputs
Section titled “Inputs”The human chooses an agent chat name, a purpose, repository reach, core permissions, and Chat capabilities. The smallest useful Chat set is usually room:read plus message:append. Core Git permissions such as repository:read, git:fetch, or git:push are separate and should be omitted unless the purpose needs them.
The generated prompt includes one newly minted grant-bound credential exactly
once. The handoff object can reveal once or discard; its string, JSON, and
summary representations are redacted. A replay with secretUnavailable: true
cannot generate a prompt. The SPA must not persist the token or revealed prompt
in browser storage, analytics, logs, or the agent definition.
Bootstrap prompt v1
Section titled “Bootstrap prompt v1”The first line is one canonical JSON manifest prefixed by
GITDOWN_CHAT_BOOTSTRAP_V1 . It binds:
- bot ID, chat name, and purpose;
- grant ID and singular authorizing subject;
- sorted repository snapshot, future rule, and exclusions;
- the closed core-permission and Chat-capability sets;
- credential ID, expiry, and one-time token;
- an isolated Chat API origin plus the core and marketplace API origins (which may share the core public origin);
- Git HTTPS/SSH endpoints and the fixed
gitdown-botHTTPS username; and - Chat/core documentation roots plus documentation version
1.0.0.
User-authored purpose text is JSON encoded onto that one line. Newlines, Markdown fences, or a forged bootstrap prefix inside the purpose cannot create a second manifest or alter the fixed instructions. Parsing rejects unknown fields, unknown authority, duplicate sets, invalid ULIDs/timestamps, non-HTTPS origins, mixed Chat app IDs, non-canonical order, or any change to the fixed instruction bytes.
The remainder is harness-neutral prose. It explains authority intersection, secret storage, global versus branch room selection, strict CLI JSONL, idempotency/cursor preservation, Git credential handling, ordinary append-only/check policy, API ownership, rotation, and secret-free bootstrap confirmation. Codex, Claude, and generic harnesses consume the same prompt; no provider-specific authority or hidden control channel exists.
GITDOWN_CHAT_BOOTSTRAP_V1 {"version":1,"documentationVersion":"1.0.0",...,"botToken":"<REDACTED>"}You are a Gitdown bot operating through an external agent harness. ...The byte-exact redacted fixture is
apps/chat/fixtures/bootstrap_prompt_v1.txt; the Codex, Claude, and generic
consumption matrix is apps/chat/fixtures/harness_contracts_v1.json. The latter
contains no credential. Integration tests make a CLI/JSONL-style harness and a
direct REST/SSE-style harness exchange messages, watch/read/send, perform a
granted repository read and Git fetch, and receive denial for repository
deletion and hosted-build execution.
The SPA first reviews the singular authorizing subject, repository snapshot, future rule, exclusions, core permissions, and Chat capabilities. It then requires explicit confirmation before creating the bot, grant, and credential. Each mutation has its own retry-stable ULID idempotency key. Unknown permissions are not representable in the UI.
Copying remains an explicit human action. The credential stays in a redacting
in-memory handoff until reveal; the revealed prompt is non-form text and is
destroyed after successful clipboard copy, route unmount, or browser
pagehide. A replay or lost response never redisplays it: revoke the stranded
credential and mint a replacement. Rotation adds a new credential before the
old one is explicitly revoked.
Rotation and revocation
Section titled “Rotation and revocation”Each credential binds one bot to one grant. Mint a distinct credential for another harness or grant so audit attribution stays deterministic. Rotation is add new, switch the harness, confirm use, then revoke old. Revocation is terminal and authorization is re-evaluated live.
For wire behavior, see Getting started and the API reference.