Skip to content

Declare the FR-052 property_idioms registry (FR-001 CR-001) - #13

Merged
kreneskyp merged 1 commit into
mainfrom
feat/property-idioms-registry
Aug 8, 2026
Merged

kreneskyp merged 1 commit into
mainfrom
feat/property-idioms-registry

Conversation

@kreneskyp

Copy link
Copy Markdown
Contributor

Implements the spec-artifacts-iso follow-up named in quire-rs FR-052's
Downstream 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. extractable is derived from the structural shape
alone (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:

Shape Phrase Corpus attestation (files / repos)
round-trip lossless 33 / 10
round-trip parse-then-serialize 3 / 1
idempotence idempotent 253 / 81
idempotence idempotency 149 / 54
idempotence idempotently 49 / 31
idempotence idempotence 20 / 11
ordering total order 8 / 6

Why it is this small

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 speculative phrase list here recreates that shape, so every candidate had to
clear two rules:

  1. attested in the authored corpus (~/dev/*/spec), counted by distinct
    file and repo — raw grep counts are inflated several-fold by duplicated
    repos, so they were not used;
  2. sufficient standing alone, because the matcher sees only the phrase.

The idempotence lemma is the strongest case in the corpus: the built-in
Idempotence 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 identity back-reference set misses — it carries
losslessly only — which is why "Pack then unpack of MSE indices is lossless
for 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 API
    or a seam ("the encode/decode seam", "the complete encode/decode/score API"),
    not a property. Same for encoding/decoding and
    serialization/deserialization ("handles JSON serialization/deserialization").
  • read/write, save/load — I/O descriptions far more often than round-trip
    claims.
  • monotonic — usually "monotonic clock", a mechanism.
  • bare 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 (unmarshal has
zero 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

  • CR note in FR-001 — the FR that owns the manifest document and its
    top-level declarations. FR-002 scopes to archetype shape and body_extraction
    and 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.md bullet.
  • tests/module-manifest.schema.json gains property_idioms 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 (feat: promote ac:vacuous-outcome and ac:non-singular to error (FR-048) #12) and
    lexicon (Add lexicon registry to module manifest schema (FR-043) #6) each took.
  • quire-rs Manifest carries no deny_unknown_fields, so an engine predating
    FR-052 ignores the key rather than failing to load.

Gates

make test  → 82 passed, 2 skipped
make lint  → ruff: All checks passed!  black: 5 files would be left unchanged

🤖 Generated with Claude Code

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant