feat(carriers): three cases minted, and the id is named rather than adopted
Both runtimes answered the 2026-08-11 decision request, and they did not ask for the same name. The guard ruled `sanitize:` names its `Finding.detector` and offered all three labels for verbatim adoption. llm-security, asked directly, answered that the name would make its conformance result read as a claim about neutralisation it does not perform. Two things decided it. The guard's own unprompted correction: prefix == detector holds for those six labels and is no general law in its runtime (`egress:*` carries detector="output"; decode-and-rescan yields two-part `decoded:lexicon:*`). A prefix whose meaning is recoverable only by reading one implementation cannot carry a shared id space. And a measurement taken here at be9759b: on the surface the guard's own ruling pinned, `sanitize()` returns changed text on all three carriers, so the counterargument's decisive case -- that `scan_output` mutates nothing -- does not reach this surface. Not a mediation. Neither runtime claimed the shared id must equal its label, and `override:ignore-previous` already carries two different alias strings. - carriers.json 0.1.0 -> 0.2.0: carrier:zero-width / :bidi-override / :unicode-tag, aliased to the guard's labels. No aliases.llm_security -- that runtime's carrier findings carry no id yet, and publishing the alias is the irreversible act that forces the table into its declared set. - manifest 0.3.4 -> 0.4.0: entry_points_by_scope, carrying findings accessor and fixture presentation per scope per runtime. This was objection (c), and it blocked minting harder than the name did. - Corpus 90 -> 93. Measured through sanitize(text, source=Source.INPUT) at guard v0.7.0; verified by a separate checker that re-derives everything from disk -- a generator agreeing with itself proves nothing. - CLAUDE.md gains the two rules that are not derivable from the data: a shared id space cannot rest on a one-runtime prefix, and publishing an alias -- not minting the case -- is the irreversible act. Not minted on purpose: no artifact-side id (the other runtime would only fail them), and no ZWJ-exemption case (U+200D between two emoji is exempt on both guard surfaces since v0.6.1; the fixture avoids it rather than trips it). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U3o4zSQ2kwLsgJNU7apK3Z
This commit is contained in:
parent
7ce0ba706c
commit
8f08e9ac73
11 changed files with 350 additions and 30 deletions
19
conformance/carrier__bidi-override/expected.json
Normal file
19
conformance/carrier__bidi-override/expected.json
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"$comment": "Generated from a measurement, not written by hand. Normative semantics: spec/conformance-corpus.md. Measurement header and per-runtime provenance: conformance/manifest.json.",
|
||||
"case_id": "carrier__bidi-override",
|
||||
"input": {
|
||||
"file": "input.txt",
|
||||
"bytes": 17,
|
||||
"sha256": "460d6ce9a116d34eb2db0307df7629ea9a8c428e53052913b702496bae695f09"
|
||||
},
|
||||
"scope": [
|
||||
"codepoints/carriers.json"
|
||||
],
|
||||
"match": "exact-within-scope",
|
||||
"findings": [
|
||||
{
|
||||
"pattern_id": "carrier:bidi-override"
|
||||
}
|
||||
],
|
||||
"observed_out_of_scope": {}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue