You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Transcribe the spec grammar and serve mint through the endpoint
Context
The registrar endpoint already decodes requests, authenticates callers, invokes registrar verbs, and encodes responses. Deregistration is served end to end. Mint was deliberately incomplete because requested_spec() in src/registrar/endpoint/production.rs rejected every wire spec with SpecConversionError::GrammarNotSettled before the mint verb ran.
The wire exposes spec.reload and spec.cert_group as opaque owner-controlled strings. The verb layer requires ReloadSpec { kind, target } and Option<u32> for its rendered-config safe-set comparison. Bootler’s provisioning-file grammar is settled; its owner-published wire-packing row now defines both opaque wire strings.
Scope
This issue is unblocked. The bootler provisioning-config contract published the exact wire-packing productions in core/src/provisioning_file.rs, module documentation section Wire spelling, at immutable revision 008bbb458b0b (bootler #308, merged by PR #309).
Transcribe those productions verbatim into docs/reference/registrar-wire-contract.md with their owner artifact, location, section, and immutable revision. Implement requested_spec() only from those transcribed rows; preserve component and service_name in RequestedSpec; accept exactly the recorded forms; and reject every other spelling with typed SpecConversionError variants. Then remove GrammarNotSettled and serve mint through the existing handler path.
Acceptance criteria
Before any implementation in this issue starts, the bootler provisioning-config contract publishes an immutable wire-packing row for spec.reload and spec.cert_group. The row defines complete accepted and rejected text syntax and every canonicalization rule.
The wire-contract reference faithfully reproduces both productions with the owner artifact, exact location, section, and immutable revision; it has no unresolved item for either field.
requested_spec() maps every accepted production to the exact RequestedSpec required by the verb layer and accepts no unrecorded spelling.
Conversion tests cover every accepted production, every rejection and canonicalization class, target-required and target-forbidden cases, omitted certificate group, 0 and u32::MAX where admitted, and out-of-range numeric input.
Invalid grammar remains on the existing zero-byte, clean-close refusal path. A valid socket mint reaches the verb layer under the transport-authenticated CallerIdentity, returns an encoded mint outcome with a decoded ca_anchor, and observes a rewritten bootroot/ca on the next mint.
Conversion remains separately tested from rendered safe-set comparison, and the four operator-documentation pages, example configuration, and existing Unreleased changelog entry describe mint as served.
Constraints
This issue must not choose, broaden, normalize, or infer wire syntax from a TOML representation. It may apply only canonicalization explicitly recorded by the immutable owner row.
Do not change the frozen provisioning-file contract: reload is an inline table with kind and target; kind is exactly sighup, systemd, docker-restart, or none; the first three require a non-empty target and none omits it. cert_group is a bare u32, or its key is omitted.
Do not change rendered safe-set comparison, identity derivation, registrar verbs, wire protocol, limiter, audit records, or transport behavior. Do not add a wire error identifier or widen the conversion-refusal taxonomy.
Preserve the distinction between endpoint grammar rejection and a decoded spec outside the rendered safe set.
Out of scope
Publishing, deciding, or changing the bootler wire-packing row.
Changing the provisioning tool’s reload or cert_group vocabulary or file shape.
Operations other than mint, deregistration behavior, and a broader endpoint redesign.
Test plan
After the owner row is transcribed, add table-driven conversion tests directly from it and the required numeric and target boundaries.
Drive valid and invalid mint requests through the endpoint integration harness, including caller identity, encoded material, CA-anchor refresh, and zero-byte clean-close refusal.
Run targeted registrar tests, the CI rustfmt and clippy commands, ./scripts/check-docs.sh, and scripts/preflight/run-all.sh. If passwordless sudo blocks the E2E matrix, run it to that prerequisite, report passed and unrun arms in the PR, and leave the remaining Docker E2E gate to CI.
Dependencies
The old chain wording was stale rather than circular: bootler #200 was gated behind #198 and #186, and is its terminus. Both #186 and #198 are closed. The provisioning-file grammar from aicers/bootler#200 is frozen on bootler main by PR #304, merge commit 3ec391f398dd. #200 remains open only for test-observability and diagnostics follow-up (#305), which freezes the reload token vocabulary, cert_group shape, and fingerprint byte range.
The former remaining gate is now resolved by bootler #308, merged by PR #309 at immutable revision 008bbb458b0b. Its core/src/provisioning_file.rs module documentation section Wire spelling defines the packing of spec.reload and spec.cert_group into the opaque wire strings. This issue must name that exact artifact location and immutable revision and transcribe its complete productions before implementation begins.
aicers/review-protocol#218 intentionally types both values as opaque strings and is not their packing authority. The existing endpoint handler, verb layer, caller-identity plumbing, and CA-anchor read path need no further dependency.
Pointers
src/registrar/endpoint/production.rs: requested_spec(), SpecConversionError, and ProductionHandler
Transcribe the spec grammar and serve mint through the endpoint
Context
The registrar endpoint already decodes requests, authenticates callers, invokes registrar verbs, and encodes responses. Deregistration is served end to end. Mint was deliberately incomplete because
requested_spec()insrc/registrar/endpoint/production.rsrejected every wire spec withSpecConversionError::GrammarNotSettledbefore the mint verb ran.The wire exposes
spec.reloadandspec.cert_groupas opaque owner-controlled strings. The verb layer requiresReloadSpec { kind, target }andOption<u32>for its rendered-config safe-set comparison. Bootler’s provisioning-file grammar is settled; its owner-published wire-packing row now defines both opaque wire strings.Scope
This issue is unblocked. The bootler provisioning-config contract published the exact wire-packing productions in
core/src/provisioning_file.rs, module documentation sectionWire spelling, at immutable revision008bbb458b0b(bootler #308, merged by PR #309).Transcribe those productions verbatim into
docs/reference/registrar-wire-contract.mdwith their owner artifact, location, section, and immutable revision. Implementrequested_spec()only from those transcribed rows; preservecomponentandservice_nameinRequestedSpec; accept exactly the recorded forms; and reject every other spelling with typedSpecConversionErrorvariants. Then removeGrammarNotSettledand serve mint through the existing handler path.Acceptance criteria
spec.reloadandspec.cert_group. The row defines complete accepted and rejected text syntax and every canonicalization rule.requested_spec()maps every accepted production to the exactRequestedSpecrequired by the verb layer and accepts no unrecorded spelling.0andu32::MAXwhere admitted, and out-of-range numeric input.CallerIdentity, returns an encoded mint outcome with a decodedca_anchor, and observes a rewrittenbootroot/caon the next mint.Constraints
reloadis an inline table withkindandtarget;kindis exactlysighup,systemd,docker-restart, ornone; the first three require a non-empty target andnoneomits it.cert_groupis a bareu32, or its key is omitted.Out of scope
reloadorcert_groupvocabulary or file shape.Test plan
./scripts/check-docs.sh, andscripts/preflight/run-all.sh. If passwordless sudo blocks the E2E matrix, run it to that prerequisite, report passed and unrun arms in the PR, and leave the remaining Docker E2E gate to CI.Dependencies
The old chain wording was stale rather than circular: bootler #200 was gated behind #198 and #186, and is its terminus. Both #186 and #198 are closed. The provisioning-file grammar from aicers/bootler#200 is frozen on bootler main by PR #304, merge commit
3ec391f398dd. #200 remains open only for test-observability and diagnostics follow-up (#305), which freezes the reload token vocabulary,cert_groupshape, and fingerprint byte range.The former remaining gate is now resolved by bootler #308, merged by PR #309 at immutable revision
008bbb458b0b. Itscore/src/provisioning_file.rsmodule documentation sectionWire spellingdefines the packing ofspec.reloadandspec.cert_groupinto the opaque wire strings. This issue must name that exact artifact location and immutable revision and transcribe its complete productions before implementation begins.aicers/review-protocol#218 intentionally types both values as opaque strings and is not their packing authority. The existing endpoint handler, verb layer, caller-identity plumbing, and CA-anchor read path need no further dependency.
Pointers
src/registrar/endpoint/production.rs:requested_spec(),SpecConversionError, andProductionHandlersrc/registrar/endpoint/production/tests.rssrc/registrar/endpoint/protocol.rs:WireServiceSpecsrc/registrar/identity.rs:RequestedSpec;src/registrar/config.rs:ReloadSpecdocs/reference/registrar-wire-contract.mdanddocs/reference/registrar-provisioning-config.mdsection 3.2docs/en/configuration.md,docs/en/operations.md,docs/ko/configuration.md,docs/ko/operations.md,agent.toml.example, andCHANGELOG.md