diff --git a/src/decay/__tests__/applyTimeDecay.kat.test.ts b/src/decay/__tests__/applyTimeDecay.kat.test.ts index d527329..243945d 100644 --- a/src/decay/__tests__/applyTimeDecay.kat.test.ts +++ b/src/decay/__tests__/applyTimeDecay.kat.test.ts @@ -22,7 +22,9 @@ * binary64 — `Object.is` bit-exactness for all 32 vectors, no tolerance. * * Scope: profile uwr-weighted-lifts-v0.1 is testnet-provisional - * (x-afiStatus: draft-non-implementation). Execution ≠ wiring — this suite + * (x-afiStatus: implemented since DLC-APPLY — the reactor serving-path + * derivation executes these vectors in production; DKS-GOV re-vendor). + * Execution ≠ wiring beyond that — this suite * executes vectors against the engine and nothing more: no reward, mint, or * validator-scoring path is touched and no registry is consumed at runtime * (the KAT JSON is imported only by this test). The KAT description's @@ -52,7 +54,7 @@ const SIBLING_URL = new URL( /** sha256 of the vendored bytes, pinned at vendoring time (PR-UWR-KAT-EXEC). */ const PINNED_SHA256 = - "1a1240cc9f8cc8ed70b22f4aa00e7cdfe1176f4f1d3c6b1e10e886b0cfe81b78"; + "eb342a9c0a6ae0534c871930724e2b6ac2f5d6ee716699834e71f2a5c15cad1d"; const DRIFT_MESSAGE = "Vendored copy or upstream KAT changed — requires a new scoped " + @@ -107,7 +109,7 @@ describe("PR-UWR-KAT-EXEC: applyTimeDecay vs afi-config KAT vectors", () => { it("KAT metadata pins are intact", () => { expect(kat.schema, DRIFT_MESSAGE).toBe("afi.uwr-decay-kat.v0"); - expect(kat["x-afiStatus"], DRIFT_MESSAGE).toBe("draft-non-implementation"); + expect(kat["x-afiStatus"], DRIFT_MESSAGE).toBe("implemented"); expect(kat.profileId, DRIFT_MESSAGE).toBe("uwr-weighted-lifts-v0.1"); expect(kat.status, DRIFT_MESSAGE).toBe("testnet-provisional"); expect(kat.decisionRef, DRIFT_MESSAGE).toBe( diff --git a/src/decay/__tests__/kats/README.md b/src/decay/__tests__/kats/README.md index 0e13b8a..4dfa6ac 100644 --- a/src/decay/__tests__/kats/README.md +++ b/src/decay/__tests__/kats/README.md @@ -11,10 +11,10 @@ is never consumed by runtime code. |---|---| | Repository | `AFI-Protocol/afi-config` | | Path | `kats/uwr-profile/v0/apply-time-decay.kat.json` | -| Merge commit (PR #17) | `fe329164919f0c1c9dc24bb5c279978fb680e983` | -| Content commit | `7809af4b0308f7db47488947770a0ab9f236268d` | -| Git blob SHA-1 | `1199f705ee65eef70e6c0c58fffcd10206693cf0` | -| sha256 (file bytes) | `1a1240cc9f8cc8ed70b22f4aa00e7cdfe1176f4f1d3c6b1e10e886b0cfe81b78` | +| Merge commit (PR #88, DKS-GOV re-vendor) | `36cdc66891f3fe11cd6967ea2a1cee5004bcc5a0` | +| Content commit | `e8d7892` (status flip only; vectors byte-identical to the PR #17 vendoring) | +| Git blob SHA-1 | `8baf7ddeec2efcea21ca5f8fe7e4f4f254629c2b` | +| sha256 (file bytes) | `eb342a9c0a6ae0534c871930724e2b6ac2f5d6ee716699834e71f2a5c15cad1d` | | Executed against afi-core | `254185381c3c9be91da303454c1f7a27e8818983` (main, PR #16 merge) | | Profile | `uwr-weighted-lifts-v0.1` (afi-governance `decisions/uwr-profile-pin-v0.1.md`) | @@ -31,10 +31,10 @@ bit-exact** against the pre-delegation closed form in outputs exactly. The vendored bytes are **not** "corrected" for this — the stale-looking pin is documented here instead, per change control. -Decay-engine canonicality (UP-8, `math-authority-v0.1.md` §8) **remains -OPEN**; neither the PR #16 delegation nor this KAT execution resolves it. This -file pins the `GreeksDecayTemplate` surface only, as the KAT's own -`engine.canonicalityNote` states. +Decay-engine canonicality (UP-8) is **CLOSED by DLC-GOV D-DLC-1** +(`decay-lifecycle-v0.1.md`, accepted 2026-08-24): the minutes-based +exponential half-life law — exactly the `GreeksDecayTemplate.applyTimeDecay` +surface these vectors pin — is the canonical engine. ## Change control @@ -49,7 +49,9 @@ file pins the `GreeksDecayTemplate` surface only, as the KAT's own ## Status and scope - **testnet-provisional** (the KAT file's own `status`), under - `x-afiStatus: draft-non-implementation`. + `x-afiStatus: implemented` — flipped by DKS-GOV D-DKS-1 (accepted + `defe527`) when DLC-APPLY wired the reactor's serving-path derivation to + reproduce these vectors bit-exactly in production. - **Execution ≠ wiring.** These tests execute the KAT vectors against `applyTimeDecay` and nothing more. The KAT description's observation that base-1 one-half-life rows land on 0.5 (the testnet-provisional @@ -57,3 +59,8 @@ file pins the `GreeksDecayTemplate` surface only, as the KAT's own is asserted or wired here, and no reward, mint, or validator-scoring path changes. Each follow-up (e.g. PR-UWR-STAMP, any runtime consumption, UP-8 closure) is separately authorized. +- **DKS-GOV re-vendor (2026-08-24):** the single byte-difference from the + PR #17 vendoring is the `x-afiStatus` marker (`draft-non-implementation` → + `implemented`); every vector, expected value, template, and the + `engine.sourceCommit 390b440` caveat are byte-identical. Pins above + updated per the change-control rule. diff --git a/src/decay/__tests__/kats/apply-time-decay.kat.json b/src/decay/__tests__/kats/apply-time-decay.kat.json index 1199f70..8baf7dd 100644 --- a/src/decay/__tests__/kats/apply-time-decay.kat.json +++ b/src/decay/__tests__/kats/apply-time-decay.kat.json @@ -1,6 +1,6 @@ { "schema": "afi.uwr-decay-kat.v0", - "x-afiStatus": "draft-non-implementation", + "x-afiStatus": "implemented", "profileId": "uwr-weighted-lifts-v0.1", "status": "testnet-provisional", "description": "Known-answer-test vectors for applyTimeDecay over the pinned GreeksDecayTemplate v1 template set of the version-pinned UWR profile uwr-weighted-lifts-v0.1 (UP-11 item 2). Pure data: expected values are decision-anchored literals; nothing in afi-config executes the decay function. 32 vectors: all four templates x base scores {1, 0.1875 (the D2 M2 golden anchor, = 3*2^-4)} x elapsed = {0, 1, 2, 4} half-lives. The base-1 rows at exactly one half-life land on 0.5, the testnet-provisional minDecayScoreThreshold (UP-9) - data commentary only; the qualification gate is not wired.",