Declare the FR-052 property_idioms registry (FR-001 CR-001) - #13
Merged
Merged
Conversation
quire-rs FR-052 adds a property-shape classifier over acceptance criteria and
lets a Filament module declare a `property_idioms:` registry merged first-wins
over the engine built-ins. This module declares the ISO one.
Seven phrases, and the smallness is the point. The registry is applied AFTER
the closed structural signals and can only sharpen a label to a
higher-precedence shape; `extractable` is derived from the structural shape
alone (FR-052-CON-4), so nothing here can make a criterion extractable or
remove one from extraction. No finding is emitted on that path, so this
declaration cannot change any validation verdict.
quire-rs CR-014 retired `no-observable-outcome` because an open verb set whose
membership was *required* to earn a label reached ~13% sampled precision. A big
speculative phrase list here would recreate that shape, so every candidate had
to clear two rules: attested in the authored corpus (counted by distinct file
and repo across ~/dev/*/spec, not by raw grep hit — raw counts are inflated
several-fold by duplicated repos), and sufficient standing alone, because the
matcher sees only the phrase.
Declared:
round-trip lossless 33 files / 10 repos
parse-then-serialize 3 / 1
idempotence idempotent 253 / 81
idempotency 149 / 54
idempotently 49 / 31
idempotence 20 / 11
ordering total order 8 / 6
The idempotence lemma is the strongest case in the corpus: the built-in signal
needs a repetition adverb in the same clause as an equality verb, and "re-
activation is idempotent" carries neither. `lossless` is the adjective the
built-in back-reference set misses — it has `losslessly` only — which is why
"Pack then unpack of MSE indices is lossless for all bit widths 1-7" composes
but falls through.
Declined despite being attested, all on the sufficient-alone rule:
`encode/decode` (30 files / 8 repos) is nearly always an API or seam name —
"the encode/decode seam", "the complete encode/decode/score API" — not a
property claim; likewise `encoding/decoding`, `serialization/deserialization`
("handles JSON serialization/deserialization"), `read`/`write`, `save/load`,
and `monotonic` (usually "monotonic clock"). Bare `deterministic` is excluded
by FR-052 itself. `marshal`/`unmarshal` and `compress`/`inflate` are
unattested and are therefore not declared at all. `round-trip`,
`byte-identical` and `losslessly` are already engine built-ins and are not
re-declared.
`tests/module-manifest.schema.json` gains the `property_idioms` property and a
`PropertyIdiomEntry` definition with the closed kebab-case shape enum: the
fixture is `additionalProperties: false`, so without it this module's own suite
would reject the manifest it ships — the same step `grammar_severity` and
`lexicon` each took. quire-rs `Manifest` carries no `deny_unknown_fields`, so
an engine predating FR-052 ignores the key rather than failing to load.
Verified: `make test` 82 passed / 2 skipped, `make lint` clean (ruff + black).
Refs: agent-ix/quire-rs#20, umbrella agent-ix/quire-rs#17
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements the
spec-artifacts-isofollow-up named in quire-rs FR-052'sDownstream list. Refs agent-ix/quire-rs#20 (Phase B), umbrella agent-ix/quire-rs#17.
Must not be published until B3 completes
This PR is additive and must stay unpublished. This module's publish is
gated on #11 / B3, and releases are user-gated. No
version bump is included and nothing here should be tagged or pushed to a
registry until B3 lands.
What this declares
quire-rs FR-052 classifies acceptance criteria by property shape from
engine-owned closed signal sets, and lets a module declare a
property_idioms:registry merged first-wins over those built-ins. The registry is applied
after the structural signals and can only sharpen a label to a
higher-precedence shape.
extractableis derived from the structural shapealone (FR-052-CON-4), so nothing declared here can make a criterion
extractable or remove one from extraction, and no finding is emitted on that
path — this declaration cannot change any validation verdict.
Seven phrases:
round-triplosslessround-tripparse-then-serializeidempotenceidempotentidempotenceidempotencyidempotenceidempotentlyidempotenceidempotenceorderingtotal orderWhy it is this small
quire-rs CR-014 retired
no-observable-outcomebecause an open verb set whosemembership was required to earn a label reached ~13% sampled precision.
A speculative phrase list here recreates that shape, so every candidate had to
clear two rules:
~/dev/*/spec), counted by distinctfile and repo — raw grep counts are inflated several-fold by duplicated
repos, so they were not used;
The idempotence lemma is the strongest case in the corpus: the built-in
Idempotencesignal needs a repetition adverb in the same clause as an equalityverb, and "re-activation is idempotent" carries neither.
losslessis theadjective the built-in identity back-reference set misses — it carries
losslesslyonly — which is why "Pack then unpack of MSE indices is losslessfor all bit widths 1–7" composes but falls through to
Universal.Declined
Attested but failing the sufficient-alone rule, so not declared:
encode/decode— 30 files / 8 repos, but nearly every occurrence names an APIor a seam ("the encode/decode seam", "the complete encode/decode/score API"),
not a property. Same for
encoding/decodingandserialization/deserialization("handles JSON serialization/deserialization").read/write,save/load— I/O descriptions far more often than round-tripclaims.
monotonic— usually "monotonic clock", a mechanism.deterministic— excluded by FR-052 itself.commutative— no matching shape in the closed enum, and CON-3 forbids adding one.Unattested, so not declared at all:
marshal/unmarshal(unmarshalhaszero corpus occurrences) and
compress/inflate.Already engine built-ins, not re-declared:
round-trip/round-trips/roundtrip(both a composition signal and an identity back-reference),byte-identical,losslessly.Spec + schema
top-level declarations. FR-002 scopes to archetype shape and
body_extractionand is untouched. This is the first numbered CR in this repo; the two earlier
notes (FR-002, StR-001, "render removal") predate the sequence, hence CR-001.
spec/log.mdbullet.tests/module-manifest.schema.jsongainsproperty_idiomsand aPropertyIdiomEntrydefinition with the closed kebab-case shape enum. Thefixture is
additionalProperties: false, so without it this module's own suitewould reject the manifest it ships — the same step
grammar_severity(feat: promote ac:vacuous-outcome and ac:non-singular to error (FR-048) #12) andlexicon(Add lexicon registry to module manifest schema (FR-043) #6) each took.Manifestcarries nodeny_unknown_fields, so an engine predatingFR-052 ignores the key rather than failing to load.
Gates
🤖 Generated with Claude Code