Answers the two questions gating the rest of TD-WP-0002. Classifier: stratify evidence into S1 surface / S2 realization / S3 judgment. Adaptation writes only to S1; claims and invariants are run inputs with no adaptation write path, so False Adaptation Rate = 0 is architectural rather than a tuning target. Classification is a total function over three signals, defaulting to AMBIGUOUS on missing evidence; a surface change concurrent with a verdict change is PRODUCT_DEFECT. Semantic actions declare permitted surfaces so surface-substitution cannot pass as recovery. Provenance: claims require a source causally independent of the implementation. agent-from-implementation output is an exploratory hypothesis until a human promotes it. New adoption precondition D-07: test-driver requires an independent observation channel into the system under test. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 1629012@bnt-lap001 Assistant-Session: 78d4fb13-8a1e-474b-87a3-9b9261c49a39
9.2 KiB
Adaptation Classification and Intent Provenance
Status: v0.1 — design decision
Workplan: TD-WP-0002-T02
Supersedes nothing. Extends TestDriverConceptModel.md §§ 2.3, 7.8, 9.4.
This note answers the two questions that gate every implementation task in
TD-WP-0002. Both were unanswered in the concept corpus, and both are cheaper to
answer on paper than to discover at canonical M6.
Part A — The classifier
The question
What deterministic evidence separates "the sharing button moved" from "Bob can still read R after revocation"?
The concept corpus assumes such a discriminator exists but never names it. If the honest answer were "a model decides", Concept Model § 2.3 would be violated and the framework's central safety claim would collapse.
The reframe
The question as posed is harder than the question the framework actually has to answer, because it presumes a single classifier looking at an undifferentiated failure and deciding what kind it is.
Instead, evidence is stratified, and each stratum has a different authority:
| Stratum | Content | Gathered by | May a model touch it? |
|---|---|---|---|
| S1 — Surface | selectors, DOM, URLs, route shapes, coordinates, screenshots | the actor, incidentally, while realizing an action | yes — this is mechanics |
| S2 — Realization | did the semantic action's declared postcondition hold; which surface was actually used | an Observer, out-of-band from the actor | no |
| S3 — Judgment | claims and invariants evaluated against domain-state observations | Observers + Oracles, independent of the actor | never |
S1 is how. S2 is whether it happened. S3 is whether that was correct.
The structural rule
A change in S1 can never license a change in S3.
This is enforced architecturally rather than by classifier accuracy:
- Claims and invariants are inputs to a run, not outputs of it. The adaptation machinery has no write path to them. There is no code path by which a retry, a re-realization, or a learned trajectory can alter what is asserted.
- Adaptation is confined to the realization loop. It may change how a semantic action is performed. It cannot change what follows from performing it.
- Therefore the classifier is never asked "is this failure acceptable?" It is only asked "why did this run fail to reach the point of judgment?"
This makes False Adaptation Rate = 0 an architectural property, not a tuning
target. The system does not merely try hard to avoid normalizing a defect — it
cannot express the operation. That matters because a rate driven near zero by
tuning regresses silently; a rate that is zero by construction does not.
The decision table
Classification is a total function over three observed signals. Baseline refers to the last accepted run of the same verification asset.
| S1 surface differs | S2 postcondition met | S3 verdicts vs baseline | Classification |
|---|---|---|---|
| yes | yes | unchanged | MECHANICAL_ADAPTATION |
| no | yes | changed to FAIL | PRODUCT_DEFECT |
| yes | yes | changed to FAIL | PRODUCT_DEFECT |
| any | yes | unchanged, but the asset's declared claim set differs from the use case | SEMANTIC_CHANGE → human |
| any | no, and no legitimate surface affords it | — | PRODUCT_DEFECT |
| any | no, but the action is expressible and the actor simply failed | — | FRAMEWORK_LIMITATION |
| any | any | any oracle INCONCLUSIVE, or required evidence missing |
AMBIGUOUS → escalate |
Two rows carry the whole safety argument:
- Row 3 — a surface change occurring alongside a verdict change is classified as a defect, never as an adaptation. Coincidence is not exoneration. This is the row that a naive self-healing tool gets wrong, and it is where the seeded M05 authorization defect must land even when it ships together with M01/M02.
- Row 7 — missing or contradictory evidence yields
AMBIGUOUS, never a default-to-pass and never a default-to-adapt.INCONCLUSIVEalready exists as a first-class verdict; this row is what gives it teeth.
Realization legitimacy
S2 records not only whether the postcondition held but which surface produced
it. A semantic action declares the surfaces it may legitimately use; an actor
that achieves grant_access by calling the HTTP API when the scenario constrains
it to the browser has not realized the action — it has performed an unrequested
surface-substitution, which is itself one of the catalogued security
mutations.
Without this check, an agent can "recover" from a UI authorization control by routing around it and the run would score as a successful mechanical adaptation. That is the most plausible concrete route to a false adaptation, so it is checked explicitly rather than assumed away.
Where model judgment is and is not used
Concept Model § 2.3 is satisfied, and the boundary is now precise:
- Used: locating a moved control, proposing a path through a changed DOM, summarizing a trajectory. All S1. All independently verified afterwards by S2.
- Not used: evaluating a claim, evaluating an invariant, producing a verdict, deciding whether an adaptation was legitimate, deciding whether a run passed.
A model can be wrong about where the button is; the run then fails at S2 and is retried or reported. A model is never in a position to be wrong about whether Bob could still read R.
What this costs
The design requires an out-of-band observer capable of evaluating every semantic action's postcondition and every claim without going through the actor's surface. In the lab this is a direct database or admin-API reader. For a real system under test it is the main integration burden the framework imposes, and it should be stated plainly to any future adopter: test-driver requires an independent observation channel. Without one, S2 and S3 collapse into S1 and the safety argument is void.
This is a real limitation and is recorded as such rather than discovered later.
Part B — Intent provenance
The question
If an agent writes the implementation, an agent writes the use case, and an agent realizes the test, then "oracles are independent from actors" is procedurally true and epistemically empty. Independence of components does not give independence of belief when all components derive from the same source.
The rule
A claim may only be authored by a source causally independent of the implementation it constrains.
UseCase and Claim therefore carry a required provenance field:
| Value | Meaning | Admissible as a claim? |
|---|---|---|
human |
authored by a person | yes |
spec |
derived from a specification artifact that demonstrably predates the implementation (ref + commit SHA recorded) | yes |
agent-from-spec |
an agent transcribed a human or spec artifact; a human accepted the result | yes, with the accepting identity recorded |
agent-from-implementation |
an agent derived it by observing what the system does | no |
agent-from-implementation is not forbidden as an activity — it is genuinely
useful for T0 exploration. It is forbidden as a claim. Such output enters the
system as an exploratory hypothesis, which can drive runs and accumulate
evidence but cannot produce a FAIL, cannot enter an invariant, and cannot be
crystallized. Promotion to a claim requires an explicit human acceptance event,
recorded with identity and timestamp.
Without this rule, the framework's guarantee reduces to "the implementation agrees with itself", which is exactly the failure the project exists to prevent.
Consequences
- Provenance is carried into every Evidence Pack, so any verdict can later be
audited for independence. A
FAILwhose claim has inadmissible provenance is itself anEVIDENCE_FAILURE. - Crystallization preserves provenance. A deterministic test generated from an agentic ancestor inherits the ancestor's claim provenance and cannot launder it.
- A fourth self-test joins the M3 set:
td://self/intent-independence— asserting that no admissible claim in the corpus has implementation-derived provenance.
Honest limitation
This rule constrains provenance, not quality. A human can write a claim that merely restates what they saw the system do. The rule makes the independence question answerable and auditable; it does not make it automatic. That residual is accepted for the spike and revisited at T10.
Decisions recorded
- D-01 Evidence is stratified S1/S2/S3; adaptation may write only to S1.
- D-02 Claims and invariants are run inputs; no adaptation path may modify them.
- D-03 Classification is a total function over (S1 differs, S2 met, S3 vs baseline),
defaulting to
AMBIGUOUSon missing evidence. - D-04 A surface change concurrent with a verdict change classifies as
PRODUCT_DEFECT, neverMECHANICAL_ADAPTATION. - D-05 Semantic actions declare permitted surfaces; realization via another surface is a finding, not a recovery.
- D-06 Claims require causally independent provenance;
agent-from-implementationoutput is an exploratory hypothesis until a human promotes it. - D-07 test-driver requires an independent observation channel into the system under test. Stated as an adoption precondition.