docs: define automation compatibility policy
This commit is contained in:
parent
2b604dd184
commit
97e9daa118
4 changed files with 137 additions and 8 deletions
|
|
@ -624,6 +624,11 @@ capability, or creating/registering a missing resource.
|
||||||
|
|
||||||
## CI, Security, And Releases
|
## CI, Security, And Releases
|
||||||
|
|
||||||
|
The automation-facing compatibility policy is documented in
|
||||||
|
[`docs/compatibility.md`](docs/compatibility.md). It defines the intended
|
||||||
|
stability rules for CLI commands, `--json` output, the local control JSONL
|
||||||
|
protocol, Iroh peer wire protocols, SQLite metadata, and signed operation logs.
|
||||||
|
|
||||||
GitHub Actions workflows live under `.github/workflows/`:
|
GitHub Actions workflows live under `.github/workflows/`:
|
||||||
|
|
||||||
- `ci.yml` runs formatting, clippy, docs, `cargo check`, and workspace tests on
|
- `ci.yml` runs formatting, clippy, docs, `cargo check`, and workspace tests on
|
||||||
|
|
|
||||||
|
|
@ -3204,4 +3204,23 @@ mod tests {
|
||||||
response
|
response
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn malformed_and_unknown_protocol_inputs_fail() {
|
||||||
|
for input in [
|
||||||
|
"{",
|
||||||
|
"{}",
|
||||||
|
r#"{"type":"unknown"}"#,
|
||||||
|
r#"{"type":"status","extra":}"#,
|
||||||
|
] {
|
||||||
|
assert!(decode_request(input).is_err());
|
||||||
|
assert!(decode_response(input).is_err());
|
||||||
|
assert!(decode_peer_request(input).is_err());
|
||||||
|
assert!(decode_peer_response(input).is_err());
|
||||||
|
assert!(decode_pipe_wire_request(input).is_err());
|
||||||
|
assert!(decode_pipe_wire_response(input).is_err());
|
||||||
|
assert!(decode_overlay_wire_request(input).is_err());
|
||||||
|
assert!(decode_overlay_wire_response(input).is_err());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
105
docs/compatibility.md
Normal file
105
docs/compatibility.md
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
# Compatibility Policy
|
||||||
|
|
||||||
|
`geth` has not shipped a stable release yet. Until the first deployment tag,
|
||||||
|
contracts may still change, but changes must be deliberate, documented in this
|
||||||
|
file, and reflected in `docs/production-readiness-roadmap.md`.
|
||||||
|
|
||||||
|
After the first deployment tag, compatibility is defined by the surfaces below.
|
||||||
|
|
||||||
|
## CLI Commands
|
||||||
|
|
||||||
|
Commands documented in `README.md` are the automation-facing CLI surface.
|
||||||
|
Existing command names, positional argument meanings, flag names, and default
|
||||||
|
behavior should remain compatible within a major release.
|
||||||
|
|
||||||
|
Backward-compatible CLI changes include:
|
||||||
|
|
||||||
|
- Adding optional flags with defaults that preserve previous behavior.
|
||||||
|
- Adding new subcommands.
|
||||||
|
- Adding fields to human-readable output when `--json` is not requested.
|
||||||
|
- Improving error messages while preserving the error kind and recovery path.
|
||||||
|
|
||||||
|
Breaking CLI changes include:
|
||||||
|
|
||||||
|
- Renaming or removing a documented command or flag.
|
||||||
|
- Changing the meaning of an existing argument or default.
|
||||||
|
- Changing exit success for the same observable result.
|
||||||
|
- Requiring a daemon, network path, privileged service, or host mutation where a
|
||||||
|
documented local command did not previously require one.
|
||||||
|
|
||||||
|
Prototype commands must be called out in `README.md` or feature docs with an
|
||||||
|
explicit migration expectation before scripts depend on them.
|
||||||
|
|
||||||
|
## JSON Output
|
||||||
|
|
||||||
|
`--json` output is the preferred script contract. For stable commands, the
|
||||||
|
top-level response variant name and existing field names keep their meaning
|
||||||
|
within a major release.
|
||||||
|
|
||||||
|
Backward-compatible JSON changes include:
|
||||||
|
|
||||||
|
- Adding nullable or optional fields.
|
||||||
|
- Adding enum variants for new commands or new explicit states.
|
||||||
|
- Adding elements to arrays where ordering was not documented as stable.
|
||||||
|
|
||||||
|
Breaking JSON changes include:
|
||||||
|
|
||||||
|
- Removing or renaming fields.
|
||||||
|
- Changing field type, unit, or identifier format.
|
||||||
|
- Reusing a field for a different semantic meaning.
|
||||||
|
- Changing a documented stable ordering.
|
||||||
|
|
||||||
|
Automation should ignore unknown fields. Tests that assert JSON fixtures should
|
||||||
|
cover the subset intended as stable rather than every incidental field.
|
||||||
|
|
||||||
|
## Local Control JSONL
|
||||||
|
|
||||||
|
The local daemon control socket uses newline-delimited JSON request and response
|
||||||
|
messages from `geth-control`. This protocol is local-only and not a remote trust
|
||||||
|
boundary, but local automation may still rely on it.
|
||||||
|
|
||||||
|
Stable local-control variants follow the same compatibility rules as `--json`
|
||||||
|
output. Unknown variants, malformed JSON, and messages without a trailing
|
||||||
|
newline must fail without daemon state mutation. Local control must not become a
|
||||||
|
remote transport.
|
||||||
|
|
||||||
|
## Peer Wire Protocols
|
||||||
|
|
||||||
|
Node-to-node geth communication is Iroh-only. Peer protocols are grouped by
|
||||||
|
explicit ALPNs:
|
||||||
|
|
||||||
|
- `/geth/control/1` for authenticated peer-control requests.
|
||||||
|
- `/geth/pipe/1` for authorized pipe byte streams.
|
||||||
|
- `/geth/overlay/1` for authorized overlay packets.
|
||||||
|
|
||||||
|
Within a major release, existing peer request and response variants should keep
|
||||||
|
their field names, field meanings, nonce behavior, peer-card validation, and
|
||||||
|
endpoint-binding validation. New variants must use explicit capabilities and
|
||||||
|
resource IDs. Discovery data remains untrusted and never grants capabilities.
|
||||||
|
|
||||||
|
Breaking peer-wire changes require a version bump, migration note, and tests
|
||||||
|
showing old messages fail closed rather than being interpreted as a different
|
||||||
|
operation.
|
||||||
|
|
||||||
|
## SQLite Metadata
|
||||||
|
|
||||||
|
The metadata database is product state. Schema changes must be represented as
|
||||||
|
ordered migrations before deployment. Fresh opens and repeated opens must be
|
||||||
|
idempotent, and multi-table writes that represent one logical operation should
|
||||||
|
commit atomically.
|
||||||
|
|
||||||
|
Stable table columns may be added through migrations. Removing or repurposing a
|
||||||
|
column requires a migration note and a recovery path. SQLite state is an
|
||||||
|
implementation detail for scripts unless a table is explicitly documented as
|
||||||
|
stable.
|
||||||
|
|
||||||
|
## Signed Operations
|
||||||
|
|
||||||
|
Signed keychain, auth, SSH certificate, and SSH revocation payloads are durable
|
||||||
|
compatibility surfaces. Signed payloads must use deterministic canonical
|
||||||
|
encoding with explicit namespaces and versions. A verifier must never treat
|
||||||
|
arbitrary JSON serialization as signed canonical data.
|
||||||
|
|
||||||
|
Changing a signed payload shape, namespace, or verification rule requires a new
|
||||||
|
versioned namespace or a documented migration that preserves validation of
|
||||||
|
existing signed history.
|
||||||
|
|
@ -86,13 +86,13 @@ behavior.
|
||||||
Goal: make command, JSON, and protocol contracts explicit enough for scripts
|
Goal: make command, JSON, and protocol contracts explicit enough for scripts
|
||||||
and downstream projects.
|
and downstream projects.
|
||||||
|
|
||||||
- `[ ]` Define compatibility policy.
|
- `[x]` Define compatibility policy.
|
||||||
Acceptance criteria:
|
Acceptance criteria:
|
||||||
- `[ ]` CLI command compatibility is documented.
|
- `[x]` CLI command compatibility is documented.
|
||||||
- `[ ]` `--json` output compatibility is documented.
|
- `[x]` `--json` output compatibility is documented.
|
||||||
- `[ ]` Local control JSONL compatibility is documented.
|
- `[x]` Local control JSONL compatibility is documented.
|
||||||
- `[ ]` Peer wire protocol compatibility is documented.
|
- `[x]` Peer wire protocol compatibility is documented.
|
||||||
- `[ ]` SQLite and signed-operation compatibility are documented.
|
- `[x]` SQLite and signed-operation compatibility are documented.
|
||||||
|
|
||||||
- `[ ]` Add golden JSON tests.
|
- `[ ]` Add golden JSON tests.
|
||||||
Acceptance criteria:
|
Acceptance criteria:
|
||||||
|
|
@ -101,13 +101,13 @@ and downstream projects.
|
||||||
failures.
|
failures.
|
||||||
- `[ ]` Fixture updates require intentional review.
|
- `[ ]` Fixture updates require intentional review.
|
||||||
|
|
||||||
- `[ ]` Expand protocol roundtrip tests.
|
- `[~]` Expand protocol roundtrip tests.
|
||||||
Acceptance criteria:
|
Acceptance criteria:
|
||||||
- `[ ]` Every `ControlRequest` and `ControlResponse` variant roundtrips.
|
- `[ ]` Every `ControlRequest` and `ControlResponse` variant roundtrips.
|
||||||
- `[ ]` Every `PeerControlRequest` and `PeerControlResponse` variant
|
- `[ ]` Every `PeerControlRequest` and `PeerControlResponse` variant
|
||||||
roundtrips.
|
roundtrips.
|
||||||
- `[ ]` Pipe and overlay wire protocol variants roundtrip.
|
- `[ ]` Pipe and overlay wire protocol variants roundtrip.
|
||||||
- `[ ]` Unknown or malformed protocol inputs fail safely.
|
- `[x]` Unknown or malformed protocol inputs fail safely.
|
||||||
|
|
||||||
- `[ ]` Classify command stability.
|
- `[ ]` Classify command stability.
|
||||||
Acceptance criteria:
|
Acceptance criteria:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue