Repository navigation
Harden recovery, posture checks, and replay handling - #24
Conversation
…ethods nothing calls go instead The first version deleted 24 comment lines from the inbound handler to fit the 6,650-line ceiling, including reasoning this change does not touch: the storm fuse's two stages, why the adapter parses before the storm path, why a failure leaves the sender's retry processable. They are back, and the replay comment now says the same thing in terms of the lease. signature_seen and claim_signature had no caller left; they go, their three tests ask the same questions of acquire/complete/release, and security.py's docstrings name the lease instead of the removed method. The pipe stays inside its ceiling (6,650 of 6,650) without raising it.
With nothing naming an AWS credential, the first version reported unverifiable unless AWS_EC2_METADATA_DISABLED=true. On a laptop and on the probes' internal network, where no metadata service can exist, that turned the quickstart's no-credentials and a read-only node's readonly-confirmed into unverifiable, paged at every start, and made a writing node with a declared radius refuse to start. No compose file set the variable. Now the service is asked directly, one second and no proxy (the egress proxy answers for addresses it refuses): one that answers is measured like any other source, none answering is no credential, and the CLI's 'Unable to locate credentials' is an absence. A profile name with no file behind it is no longer a credential source. A shared test fixture keeps every test off the network, because a cloud CI runner has a metadata service at the same address. Each behaviour has a test that fails without it.
…characters The first version omitted any output past 10,000 bytes, tail included, to avoid storing a secret the cut split in half. Redacting the whole output before cutting gives the same guarantee — the redactor sees every secret whole — and keeps the tail, where a failing command says why. Past a megabyte nothing is held and the output is omitted, so memory stays bounded. Tested with a secret straddling the cut and with a 1.1 MB flood; the straddle test fails when the cut comes first.
…note records the amendments and the rollback line The README and the containment page described the assumed metadata credentials and the omitted output of the first version. The decision note says what was amended in review and why, and adds the rollback consequence of the new pending_signatures table: an earlier pipe ignores it, and a lease left in it expires.
|
Review and amendments by Claude (claude-opus-5-5), at the repository owner's request. The remediation checkpoints, the signature lease, the non-finite timestamp check and the stricter AWS simulation parsing are kept as written. Three things were amended on this branch before merging.
Each amendment has a test that fails without it. Also run: the estate-identifier scan this PR's description says was skipped (clean), and the full gate (STACK GATE GREEN). The decision note records the amendments and the rollback consequence of the new Not changed, worth a follow-up: a failed lease renewal cancels the request mid-pipeline rather than letting |
… another vendor's answer is not CI's image boot and stack smoke refused to start the investigator: GitHub's runners are Azure VMs, Azure's metadata service answers at the same address, and the probe counted any answer as an AWS service. The image has no aws CLI, so the readonly node was unmeasurable and refused under enforce — what a deployment on any other vendor's VM would have hit too. The probe now asks what the AWS CLI asks: a token (IMDSv2), then the role listing, with the token when there is one. A role name is a credential; a 404 is an instance with no role; any other answer is no AWS service; nothing at the address is nothing. Tested against a stand-in answering as IMDSv2 with a role, IMDSv1 with a role, an instance with no role, and another vendor's service, with a bogus proxy in the environment; counting any answer, or asking through the proxy, fails those tests. Renamed metadata_reachable to metadata_offers_credentials, which is the question it answers.
|
Follow-up by Claude (claude-opus-5-5). CI caught a hole in amendment 1: GitHub's runners are Azure VMs, Azure's metadata service answers at the same address, and the probe counted any answer as AWS, so the image without an |
Summary
Verification
bash scripts/gate.sh— passed, including all component tests, cross-service checks, mutation checks, and Docker builds..estate-identifiersis not present locally. CI may enforce this check using the repository secret.Limitations
A crash after an external side effect but before its completion record can still result in that side effect being repeated after lease expiry. Pattern-based redaction cannot guarantee removal of every secret.