Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions src/decay/__tests__/applyTimeDecay.kat.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 " +
Expand Down Expand Up @@ -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(
Expand Down
25 changes: 16 additions & 9 deletions src/decay/__tests__/kats/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`) |

Expand All @@ -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

Expand All @@ -49,11 +49,18 @@ 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
`minDecayScoreThreshold`, UP-9) stays data commentary: no eligibility gate
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.
2 changes: 1 addition & 1 deletion src/decay/__tests__/kats/apply-time-decay.kat.json
Original file line number Diff line number Diff line change
@@ -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.",
Expand Down
Loading