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
redact() cannot reach notifications.ntfy.url by name — the key is the bare word 'url' and only nesting separates it; both pins name a closed issue #1630
redact() leaves notifications.ntfy.url — a capability URL — in a captured bundle's verbatim config.json. The suite states the gap in two places and both point at a closed issue, so after #1626 closes there is nothing open tracking it.
The gap
The ntfy topic in the URL path is the whole credential: anyone holding a captured bundle can publish
to, and subscribe to, the operator's notification channel.
The JSON key is the bare word url, and only its NESTING separates it from its siblings at config.reference.json:56 and :67. redact()'s JSON rule is line-wise and cannot see nesting, so
there is no name it can key on that reaches this value and not the two public endpoints.
tests/integration/selftest-redact.sh pins the gap at two sites — the MUST_SURVIVE/KNOWN_GAP
assertion and its it_warn — and both name #1587, which is CLOSED. lib.sh:37 also references it.
Pre-existing: 5 occurrences at base and 5 at head of #1627, so no recent change introduced it.
Next time these files are touched, the pins should name this issue. Not worth a commit of its own;
worth not losing.
What a fix would have to do
A name-keyed line-wise rule cannot express this. Any real fix changes the shape of the rule — parse
the JSON and redact by path, or redact by value shape for URLs carrying a path segment that is not a
known-public host. That is a redaction policy change, which is the same ruling #1623 deferred when it
declined to invert the .env rule to an allowlist. The two should be decided together, and neither
should be taken as a lane decision.
Until then the pin is the right holding pattern: it asserts the current behaviour, so it fails loudly
if someone closes the gap without updating it.
Provenance
Measured by the controller during the non-author passes on #1623 and #1627. Population of 129
independently re-derived from render_env's single heredoc. Full method is in the verdict comments on
those two PRs.
redact()leavesnotifications.ntfy.url— a capability URL — in a captured bundle's verbatimconfig.json. The suite states the gap in two places and both point at a closed issue, so after#1626 closes there is nothing open tracking it.
The gap
The ntfy topic in the URL path is the whole credential: anyone holding a captured bundle can publish
to, and subscribe to, the operator's notification channel.
The JSON key is the bare word
url, and only its NESTING separates it from its siblings atconfig.reference.json:56and:67.redact()'s JSON rule is line-wise and cannot see nesting, sothere is no name it can key on that reaches this value and not the two public endpoints.
What is already settled, so nobody re-derives it
.envhalf is fixed (redact()'s single vocabulary is a denylist: five credential-bearing .env keys are reached by neither rule, and two adjacent onion-client keys are classified differently #1621 → fix(integration): reach the four .env keys no redaction rule touched, and guard the vocabulary (#1621) #1623, then redact(): NTFY_URL survives as a capability URL, and the recorded reason for leaving it is refuted by the file's own technique #1626 → fix(integration): reach NTFY_URL by the technique the file already uses, and say why its JSON sibling stays open (#1626) #1627).NTFY_URLfell to a specificsuffix catching exactly itself, measured against all 129 keys
render_envwrites.been got wrong twice in this family: redact()'s single vocabulary is a denylist: five credential-bearing .env keys are reached by neither rule, and two adjacent onion-client keys are classified differently #1621 proposed
HASH, which caught nothing because the key endsB64; redact(): NTFY_URL survives as a capability URL, and the recorded reason for leaving it is refuted by the file's own technique #1626 (mine) proposedntfy_urlon the JSON side, and"ntfy_url"appears nowhere in thisrepo. Both were fixes priced against reasoning instead of against the population. Verified by
running the shipped
redact()over aconfig.json-shaped input: the nested"url"survives withits token,
xvb.urlsurvives, andntfy_urlfires only on a flat key that does not exist here.ntfy_urlIS carried in both ofredact()'s alternations and that is not coverage. env.redacted.txt keeps a wallet address under 90 chars: the KEY=value rule and the JSON rule disagree about the same field #1611'sinvariant requires the two vocabularies to agree entry-for-entry, so the entry is the price of the
invariant.
selftest-redact.shsays so and asserts the value is still not reached.The tracking defect this issue exists to fix
tests/integration/selftest-redact.shpins the gap at two sites — theMUST_SURVIVE/KNOWN_GAPassertion and its
it_warn— and both name #1587, which is CLOSED.lib.sh:37also references it.Pre-existing: 5 occurrences at base and 5 at head of #1627, so no recent change introduced it.
Next time these files are touched, the pins should name this issue. Not worth a commit of its own;
worth not losing.
What a fix would have to do
A name-keyed line-wise rule cannot express this. Any real fix changes the shape of the rule — parse
the JSON and redact by path, or redact by value shape for URLs carrying a path segment that is not a
known-public host. That is a redaction policy change, which is the same ruling #1623 deferred when it
declined to invert the
.envrule to an allowlist. The two should be decided together, and neithershould be taken as a lane decision.
Until then the pin is the right holding pattern: it asserts the current behaviour, so it fails loudly
if someone closes the gap without updating it.
Provenance
Measured by the controller during the non-author passes on #1623 and #1627. Population of 129
independently re-derived from
render_env's single heredoc. Full method is in the verdict comments onthose two PRs.