Skip to content

Transcribe the spec grammar and serve mint through the endpoint #912

Description

@sehkone

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
  • src/registrar/endpoint/production/tests.rs
  • src/registrar/endpoint/protocol.rs: WireServiceSpec
  • src/registrar/identity.rs: RequestedSpec; src/registrar/config.rs: ReloadSpec
  • docs/reference/registrar-wire-contract.md and docs/reference/registrar-provisioning-config.md section 3.2
  • docs/en/configuration.md, docs/en/operations.md, docs/ko/configuration.md, docs/ko/operations.md, agent.toml.example, and CHANGELOG.md

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions