spec: six-layer fingerprint stack — classification that can abstain (SP-FPRINT-STACK-001) - #284
Merged
Merged
Conversation
mdheller
force-pushed
the
feat/fingerprint-stack-six-layer
branch
from
August 4, 2026 07:41
d71c217 to
aaf7d6e
Compare
…SP-FPRINT-STACK-001) Lands the spine of the six-layer metadata fingerprint classifier: the stance algebra, per-layer witnesses, the admissibility gate, the L5 drift detector, and DR-4 enforcement. The one genuinely new thing is that ZERO (ignorance) and INADMISSIBLE (conflict) are different values. The 2018 source design had the three-channel matcher, OntoDT, the mereotopological framing and DQ-into-access-enforcement already; what it could not say was "I don't know" distinctly from "my evidence contradicts itself". A gap wants more data; a glut wants a human. Everything else here follows from separating them. Structural properties, all enforced rather than documented: - pool -> guard -> quantize, in that order; guards only lower stance in the knowledge order, so gated stances retain conformal coverage (policy costs efficiency, not validity) - every stored verdict is recomputed from what produced it - quorum is n_eff (covariance participation ratio), not Herfindahl concentration - coverage does not compose: depth and the loosened epsilon ride on the stance - guards are measurable w.r.t. evidence and witness only — reading the outcome breaks exchangeability, so `value.*` cannot be named in a guard input path - an inadmissible layer contributes ZERO, never a guess Axiom X1 (parthood and subtyping are disjoint arrows) is enforced as a CI invariant. It is the precondition for the source deck's own two questions — a count over the subtype closure and an enumeration of parts — being simultaneously answerable from one graph. L5's drift detector is blocking, not advisory: under silent repurpose the schema does not change, so L5's evidence is precisely the unchanged schema and it asserts stale semantics with maximum confidence exactly when it is wrong. Retires the `tf-lattice-wide-and-deep` const in DataClass — that repository was archived by its owner in April 2026. The pin now enumerates structurally-monotone constructions, with the dead name deprecated-but-accepted so existing documents stay valid. Teeth: 81 checks, 9 schema negative vectors, and 25 semantic gates proven to bite by a mutation harness that requires each rejection for its stated reason. The M5 monotonicity property test is run against a deliberately non-monotone aggregator and fails if it does not catch it — because the closest precedent in this repo (#264) shipped a monotone constraint whose fixture held the monotone feature constant, so it bound nothing and passed vacuously.
mdheller
force-pushed
the
feat/fingerprint-stack-six-layer
branch
from
August 4, 2026 07:53
aaf7d6e to
77cbef3
Compare
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.
Lands the spine of the six-layer metadata fingerprint classifier from SP-FPRINT-STACK-001: the stance algebra, per-layer witnesses, the admissibility gate, the L5 drift detector, and DR-4 enforcement.
The one genuinely new thing
ZERO(ignorance) andINADMISSIBLE(conflict) are different values.The 2018 source design already had the three-channel matcher, OntoDT, the mereotopological framing (its own term), and the routing of DQ inference into access enforcement. What it could not say was "I don't know" distinctly from "my evidence contradicts itself". A gap wants more data; a glut wants a human. Everything else here follows from separating them.
What lands
ClassificationStanceFingerprintLayerEvidenceColumnFingerprintColumnDriftObservationEstateAdmissibilityReportClassificationEnforcementPolicyProperties enforced, not documented
n_efffrom the covariance spectrum, drift from the measured distance.n_eff, not Herfindahl. H measures concentration of magnitude — two perfectly correlated layers contributing equally give H = 0.5, which looks healthy while supplying one layer's worth of information. H is demoted to a cheap precheck.value.*cannot be named in a guard input path (enforced by pattern).DR-4 settled
POS → allowandNEG → denyare not knobs.INADMISSIBLE → fail-closedis deliberately not configurable — a glut means two layers disagree about what the column is, and one reading may well be "personal data"; serving it lets a contradiction resolve itself in the requester's favour.ZEROis the knob, per resource class, requiring an attestation and unavailable at confidential/restricted sensitivity.Dead-library pin retired
DataClass.classifier.kindwas aconstontf-lattice-wide-and-deep. That repository was archived by its owner in April 2026 (read-only; last release July 2024). It migrated onto the Keras 3 era via atf_kerascompatibility shim and was then archived — it did not become part of Keras. The pin is now an enum over structurally-monotone constructions, with the dead name deprecated-but-accepted so existing documents stay valid, plus a newfingerprintStackbinding.Teeth
tools/test_fingerprint_stack_teeth.pymutates each conformant example one invariant at a time and requires the validator to reject it for its stated reason. A gate that stays green under its own mutation is reported as a failure of the checker.That last one is not decorative. The closest precedent in this repo shipped exactly that defect: #264's monotone classifier had a fixture holding the monotone feature constant, so the constraint bound nothing and the test passed vacuously (fixed in #265). A green check is not evidence until you have watched it go red.
Not in this contract
Named so the gaps stay visible: WO-15 justification-scoped INADMISSIBLE (required before production — without it one bad axiom makes everything derivable; note this is classical inference over justified fragments with the bilattice for bookkeeping, not paraconsistent inference); cold-start phases 1–4 as executable pipeline; KKO cross-domain transfer, which remains a hypothesis with a test protocol and must not appear in customer-facing material until the held-out-domain measurement returns a number; DR-2, DR-7, DR-8, DR-9.
make validategreen across all families.