diff --git a/MANIFEST.yaml b/MANIFEST.yaml index bb972c38..c1eea989 100644 --- a/MANIFEST.yaml +++ b/MANIFEST.yaml @@ -598,7 +598,7 @@ files: - path: scripts/build.js role: tooling - hash: sha256:12e43a8be8b10149d6bd3ea4891c65289b50112c0bd7c7b5e44b53142d59e2e5 + hash: sha256:0ea9b3d271f36829c75e01943da3956143aa47fb581083894b171ae4067bcf96 note: scripts/build.js - path: scripts/check-production-search.mjs @@ -828,7 +828,7 @@ files: - path: scripts/lib/verify-policy.js role: tooling - hash: sha256:647e61a061137ab9ab14d1fd1c856f5defa008427c87302e5744ea04fc2b7adb + hash: sha256:160300832c7319eab1ad67a4809eebcb1a81963c79a12f4e46be0081df47602e note: scripts/lib/verify-policy.js - path: scripts/ocr-pdf.sh @@ -853,7 +853,7 @@ files: - path: scripts/verify.js role: tooling - hash: sha256:dfd3690ef2b8ed18271ba9b8ac2efa24f4015af8f7b69c332c34d94afe77fcd7 + hash: sha256:661d837aec73b8cce20f40ecbcb6c169f1969654a3796c4e1a7906f4acc6aaf5 note: scripts/verify.js - path: scripts/verify-ci.js @@ -893,7 +893,7 @@ files: - path: assets/tables.js role: site-source - hash: sha256:4ea130b337a1696c85f9c98ebb3b8d391a1e00db690566f24bdcbf1433f39819 + hash: sha256:44aeb59b32113a06d418b6ce42cded11e1dc36197b883a82f05616d4ea3d0717 note: assets/tables.js - path: assets/theme.js @@ -981,6 +981,11 @@ files: hash: sha256:a1b0c0bd67c30c9fa82b2ab45fd3ace3dee00067f11f2f3f7211c08aa9c7f342 note: ElizaChat source review receipt + - path: ops/evidence/utah-overdue-dispositions-2026-09-23.json + role: evidence + hash: sha256:90c25a4874701966486eba0f1405dc4e7680e66173bf7130580a641020821945 + note: Agent source-consistency dispositions for the nine overdue Utah records (issue 3) + - path: scripts/lib/freshness-contract.js role: code hash: sha256:df27fe4ca8be68fbacfa3e00d8b874d8687d87ffbc97874a9f84dc7e3a943cc8 diff --git a/assets/tables.js b/assets/tables.js index 8df2eac5..eaf328d7 100644 --- a/assets/tables.js +++ b/assets/tables.js @@ -349,6 +349,7 @@ // Enhance deterministic absolute verification dates with a relative age. // The source HTML remains stable across builds; only the browser view ages. + // data-review-days carries the record's review cadence from project.yml. function initFreshnessBadges() { var badges = document.querySelectorAll('.freshness-badge[data-last-verified]'); var now = new Date(); @@ -358,9 +359,29 @@ var verified = new Date(value + 'T00:00:00Z'); if (isNaN(verified.getTime())) continue; var days = Math.max(0, Math.floor((now.getTime() - verified.getTime()) / 86400000)); - var state = days < 90 ? 'fresh' : days < 180 ? 'aging' : 'stale'; + var cadence = parseInt(badge.getAttribute('data-review-days'), 10); + var state; + if (cadence > 0) { + state = days > cadence ? 'stale' : 'fresh'; + badge.textContent = state === 'fresh' ? 'verified ' + days + 'd ago' : 'review overdue (verified ' + days + 'd ago)'; + } else { + state = days < 90 ? 'fresh' : days < 180 ? 'aging' : 'stale'; + badge.textContent = state === 'fresh' ? 'verified ' + days + 'd ago' : state + ' (' + days + 'd)'; + } badge.classList.add(state); - badge.textContent = state === 'fresh' ? 'verified ' + days + 'd ago' : state + ' (' + days + 'd)'; + } + } + + // Recompute build-time countdowns against the reader's current date. + function initCountdowns() { + var cells = document.querySelectorAll('.upcoming-days[data-date]'); + var now = new Date(); + var today = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()); + for (var i = 0; i < cells.length; i++) { + var target = new Date(cells[i].getAttribute('data-date') + 'T00:00:00Z').getTime(); + if (isNaN(target)) continue; + var days = Math.round((target - today) / 86400000); + cells[i].textContent = days < 0 ? 'passed' : days === 0 ? 'today' : days + 'd'; } } @@ -369,6 +390,7 @@ initKeyboardAndDismiss(); initAnchors(); initFreshnessBadges(); + initCountdowns(); } if (document.readyState === 'loading') { diff --git a/docs/MANIFEST.yaml b/docs/MANIFEST.yaml index bb972c38..c1eea989 100644 --- a/docs/MANIFEST.yaml +++ b/docs/MANIFEST.yaml @@ -598,7 +598,7 @@ files: - path: scripts/build.js role: tooling - hash: sha256:12e43a8be8b10149d6bd3ea4891c65289b50112c0bd7c7b5e44b53142d59e2e5 + hash: sha256:0ea9b3d271f36829c75e01943da3956143aa47fb581083894b171ae4067bcf96 note: scripts/build.js - path: scripts/check-production-search.mjs @@ -828,7 +828,7 @@ files: - path: scripts/lib/verify-policy.js role: tooling - hash: sha256:647e61a061137ab9ab14d1fd1c856f5defa008427c87302e5744ea04fc2b7adb + hash: sha256:160300832c7319eab1ad67a4809eebcb1a81963c79a12f4e46be0081df47602e note: scripts/lib/verify-policy.js - path: scripts/ocr-pdf.sh @@ -853,7 +853,7 @@ files: - path: scripts/verify.js role: tooling - hash: sha256:dfd3690ef2b8ed18271ba9b8ac2efa24f4015af8f7b69c332c34d94afe77fcd7 + hash: sha256:661d837aec73b8cce20f40ecbcb6c169f1969654a3796c4e1a7906f4acc6aaf5 note: scripts/verify.js - path: scripts/verify-ci.js @@ -893,7 +893,7 @@ files: - path: assets/tables.js role: site-source - hash: sha256:4ea130b337a1696c85f9c98ebb3b8d391a1e00db690566f24bdcbf1433f39819 + hash: sha256:44aeb59b32113a06d418b6ce42cded11e1dc36197b883a82f05616d4ea3d0717 note: assets/tables.js - path: assets/theme.js @@ -981,6 +981,11 @@ files: hash: sha256:a1b0c0bd67c30c9fa82b2ab45fd3ace3dee00067f11f2f3f7211c08aa9c7f342 note: ElizaChat source review receipt + - path: ops/evidence/utah-overdue-dispositions-2026-09-23.json + role: evidence + hash: sha256:90c25a4874701966486eba0f1405dc4e7680e66173bf7130580a641020821945 + note: Agent source-consistency dispositions for the nine overdue Utah records (issue 3) + - path: scripts/lib/freshness-contract.js role: code hash: sha256:df27fe4ca8be68fbacfa3e00d8b874d8687d87ffbc97874a9f84dc7e3a943cc8 diff --git a/docs/assets/tables.js b/docs/assets/tables.js index 8df2eac5..eaf328d7 100644 --- a/docs/assets/tables.js +++ b/docs/assets/tables.js @@ -349,6 +349,7 @@ // Enhance deterministic absolute verification dates with a relative age. // The source HTML remains stable across builds; only the browser view ages. + // data-review-days carries the record's review cadence from project.yml. function initFreshnessBadges() { var badges = document.querySelectorAll('.freshness-badge[data-last-verified]'); var now = new Date(); @@ -358,9 +359,29 @@ var verified = new Date(value + 'T00:00:00Z'); if (isNaN(verified.getTime())) continue; var days = Math.max(0, Math.floor((now.getTime() - verified.getTime()) / 86400000)); - var state = days < 90 ? 'fresh' : days < 180 ? 'aging' : 'stale'; + var cadence = parseInt(badge.getAttribute('data-review-days'), 10); + var state; + if (cadence > 0) { + state = days > cadence ? 'stale' : 'fresh'; + badge.textContent = state === 'fresh' ? 'verified ' + days + 'd ago' : 'review overdue (verified ' + days + 'd ago)'; + } else { + state = days < 90 ? 'fresh' : days < 180 ? 'aging' : 'stale'; + badge.textContent = state === 'fresh' ? 'verified ' + days + 'd ago' : state + ' (' + days + 'd)'; + } badge.classList.add(state); - badge.textContent = state === 'fresh' ? 'verified ' + days + 'd ago' : state + ' (' + days + 'd)'; + } + } + + // Recompute build-time countdowns against the reader's current date. + function initCountdowns() { + var cells = document.querySelectorAll('.upcoming-days[data-date]'); + var now = new Date(); + var today = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()); + for (var i = 0; i < cells.length; i++) { + var target = new Date(cells[i].getAttribute('data-date') + 'T00:00:00Z').getTime(); + if (isNaN(target)) continue; + var days = Math.round((target - today) / 86400000); + cells[i].textContent = days < 0 ? 'passed' : days === 0 ? 'today' : days + 'd'; } } @@ -369,6 +390,7 @@ initKeyboardAndDismiss(); initAnchors(); initFreshnessBadges(); + initCountdowns(); } if (document.readyState === 'loading') { diff --git a/docs/index.html b/docs/index.html index 85182fe6..5c3aac47 100644 --- a/docs/index.html +++ b/docs/index.html @@ -117,14 +117,14 @@
Closest enforcement and term-end dates across the registry. Subscribe: calendar.ics.
diff --git a/docs/us/federal/cftc-dsio/il/2017-001/index.html b/docs/us/federal/cftc-dsio/il/2017-001/index.html index 7cb7c0b1..99184a2c 100644 --- a/docs/us/federal/cftc-dsio/il/2017-001/index.html +++ b/docs/us/federal/cftc-dsio/il/2017-001/index.html @@ -117,7 +117,7 @@