diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 5ea0c95b..4a44981c 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -1,17 +1,32 @@ # Product and Technical Gap Baseline -## 2026-08-27 Driver p.16 standardised-map recovery queue (three landed) - -- Five Driver p.16 `std`-family estimator restorations remain individually - reviewable open PRs against protected `c7cf34b8`: `asymDIFFUSIONstd` (#267), - `TRAITVARstd` (#268), `MANIFESTTRAITVARstd` (#270), `MANIFESTVARstd` (#271), - and `TIPREDVARstd` (#272). Each is a small slice and lands only after - exact-head checks and independent review. -- The TDT/CHRONOS composition (#269) folds the two event-intelligence bounded - gates into one versioned workflow. It remains an active-PR slice: queued or - passing Checks do not promote it to implemented-main. -- This register refresh (PR #273) is itself open; snapshot facts were fetched - live at 2026-08-27T07:35:00Z against protected main `c7cf34b8`. +## 2026-08-28 active delivery queue + +- Protected main now includes the Driver p.16 `std` restorations through + `MANIFESTVARstd` (#271). `TIPREDVARstd` remains active on #272 and + `discreteDRIFTstd` on #280; #296 adds the distinct finite-interval + `discreteDIFFUSIONstd` map. None is implemented-main before protected merge + at its exact reviewed head. +- The versioned TDT/CHRONOS composition landed through #269. PR #279 adds a + bounded Allen/CHRONOS interval-consistency slice; persistence and exports + remain product gaps under #170. +- PR #282 merged its fitted candidate-`K` topic-selection slice into #283's + feature branch. PR #283 now carries that candidate plus the duplicate-ADR + repair; neither capability is protected-main authority before #283 merges. +- PR #287 adds durable, tenant-isolated analysis-run request and state-event + persistence for #166. It remains an unmerged branch candidate and does not + establish an executable end-to-end analysis service on protected main. +- PR #288 merged typed durable-run reads, retained-session worker locking, and + atomic artifact/terminal publication into #287's feature branch. PR #287 is + still unmerged from protected main. +- PR #289 merged tenant-bound, evidence-digest-bound reproducibility-manifest + materialization into the durable-worker feature branch. PR #290 carries the + bounded one-shot executable worker; PR #292 adds its scheduler-facing exit + classification; PR #294 adds real topic-lineage estimation and atomic + artifact publication on that stack. Scheduler leases and protected object + ingestion remain gaps. +- PR #291 merged durable interval-artifact persistence into #279's current + feature head and closed; #293 remains the dependent authority candidate. ## 2026-08-26 Pair criterion and Project Journey posterior slice @@ -66,8 +81,9 @@ **Status:** Live delivery baseline **Product:** Temporal Event Psychometrics Platform (TEPP) -**Snapshot:** 2026-08-27T14:40:00Z -**Protected-main evidence:** `9cd1b263926c456e8c56424c43679d3611310ddb` (merge of [PR #269](https://github.com/ContextualWisdomLab/TEPP/pull/269) TDT/CHRONOS composition at 2026-08-27T14:35Z, on top of #268 TRAITVARstd) +**Snapshot:** 2026-08-28T15:56:03Z +Facts fetched live from GitHub at 2026-08-28T15:56:03Z. +**Protected-main evidence:** `b03cc378228d5e568fc34970fcb23dc2b452f535` (merge of [PR #271](https://github.com/ContextualWisdomLab/TEPP/pull/271) `MANIFESTVARstd`, on top of #270 `MANIFESTTRAITVARstd`) **Workspace version on protected main:** `0.2.0` **Canonical gap-baseline authority:** [PR #164](https://github.com/ContextualWisdomLab/TEPP/pull/164). [PR #164](https://github.com/ContextualWisdomLab/TEPP/pull/164) merged; this file is now maintained by follow-up refresh PRs against protected main. @@ -88,12 +104,12 @@ GitHub state before any customer, release, certification, or valuation claim. | Signal | Snapshot evidence | Delivery implication | |---|---:|---| -| Protected-main SHA | `c7cf34b84d087904bdcb4604479dda2ed8cfcf77` (2026-08-26T12:40Z, merge of [#266](https://github.com/ContextualWisdomLab/TEPP/pull/266)) | All as-built claims are bounded to this commit. | +| Protected-main SHA | `b03cc378228d5e568fc34970fcb23dc2b452f535` (2026-08-28T00:39Z, merge of [#271](https://github.com/ContextualWisdomLab/TEPP/pull/271)) | All as-built claims are bounded to this commit. | | Workspace members | 58 unique Rust crates | The repository is modular, but the approved target still lacks complete semantic, compute, psychometric-engine, event-intelligence, interpretation, artifact, and visual product boundaries. | | Workspace version | `0.2.0` (aligned across every crate manifest) | A version number alone does not establish a supported product release; no signed artifact or support policy exists yet. | -| Open pull requests | **3** | Active queue: #270 MANIFESTTRAITVARstd, #271 MANIFESTVARstd, #272 TIPREDVARstd. | -| Draft pull requests | **0** | No drafts are open at this snapshot; the previously referenced repair and life-cycle orchestration drafts are closed. | -| Open product issues | **9** | Issues #166–#167 and #169–#174 plus #176 remain open. Result-contract issue #156, semantic-units issue #168, queue-consolidation issue #175, and lineage-consumer issue #155 are all CLOSED. | +| Open pull requests | **11** | Active queue: #272 `TIPREDVARstd`, #279 interval consistency with closed #291 folded into its head, #280 `discreteDRIFTstd`, #281 this baseline refresh, #283 ADR identity repair with #282/#284–#286 folded into its feature head, #287 durable analysis-run persistence with #288/#289 folded into its dependent stack, #290 bounded executable worker, #292 worker exit classification, #293 interval-artifact authority repair, #294 topic-lineage worker execution, and #296 `discreteDIFFUSIONstd`. | +| Draft pull requests | **1** | Only #272 remains draft. Non-draft state is not approval or merge readiness. | +| Open product issues | **11** | Issues #166–#167, #169–#174, #176, #275, and #277 remain open. | | Current package version | `0.2.0` | No supported product release is established by the repository version alone; the tagged cut remains queued. | The pull-request counts come from the live GitHub search at this snapshot. The @@ -120,9 +136,9 @@ as squash and landed things operators must know: itself a release: no tag, signed artifact, SBOM/provenance bundle, or support policy exists yet ([GAP-011](#operator-gap-register)). 3. **Driver p.16 `std`-family restorations continue on protected main:** the - Driver et al. (2017) SDE discrete-time recovery suite drained through - #231/#232 was extended by `T0MEANSstd` (#262) and `T0VARstd` (#265); the - remaining `std`-family restorations stay open as #267/#268/#270/#271/#272. + suite now includes #267/#268/#270/#271. `TIPREDVARstd` (#272) and + `discreteDRIFTstd` (#280) remain active-PR candidates. Fitted candidate-`K` + execution is also an unmerged candidate on #282, not protected-main behavior. ### Queue-consolidation progress (GAP-012) — COMPLETE (issue #175 closed) @@ -143,37 +159,36 @@ All previously queued slices landed on protected main through: 2026-08-25T06:24Z), and network-repair/version-alignment [#239](https://github.com/ContextualWisdomLab/TEPP/pull/239). -The residual open PRs are new forward work (register refresh #273, release cut, -API anchor contract, coverage completion, event-intelligence fold, and the -`std`-family psychometric restorations #267/#268/#270/#271/#272), not backlog. +The residual open PRs are new forward work (#272, #279–#281, #283, #287, +#290, #292–#294, and #296), not the +historic consolidation backlog. ## Snapshot open pull-request evidence -The following exact-head register was fetched live from GitHub at -2026-08-27T07:35:00Z against protected main `c7cf34b8`. Review decisions, +The following snapshot-head register belongs to the canonical live snapshot +above. Review decisions, required Checks, and mergeability remain volatile; the live GitHub API supersedes this snapshot. `draft=false` is not approval, mergeability, or a passing-check claim. Re-read the full SHA, current review decision, required Checks, and branch rules immediately before every mutation. -| PR | Exact current head | Draft | Base | Title | -| #272 | `eff029c809d2e3227c8fb31e42348464268ce511` | false | main | feat(psychometric): restore Driver p.16 TIPREDVARstd v/v=1 on main | -| #271 | `6033582cb060f3ad7b32a4f9ece16d642727393e` | false | main | feat(psychometric): restore Driver p.16 MANIFESTVARstd θ/θ=1 on main | -| #270 | `b4b51f135eb653b4b39241da4a64b89dd7abfc73` | false | main | feat(psychometric): restore Driver p.16 MANIFESTTRAITVARstd ψ/ψ=1 on main | -|---:|---|:---:|---|---| - - - - +For this baseline PR itself, the recorded SHA is its immediate publication +parent: the commit containing this table necessarily changes its own head. All +other rows record the exact live head observed at the snapshot. - - -Note on #241: the #239 squash-merge landed through its pre-fix head, so #241 -cherry-picks the final coverage-and-semantics commit (dead singleton-guard -removal in `network_analysis::consensus`, unreachable let-else replacement in -`evidence_core::image_unit`) onto current main. Until #241 merges, protected -main carries those two dead-branch semantics points; they are test debt, not a -weakened 100% gate. +| PR | Snapshot head evidence | Draft | Base | Title | +|---:|---|:---:|---|---| +| #272 | `1f37cf4a154734a252b6bf8261748a289c0dd493` | true | main | feat(psychometric): restore Driver p.16 TIPREDVARstd v/v=1 on main | +| #279 | `907d3a7278592d063773cd79b34bf0ce1bd90cb0` | false | main | feat(event): bounded Allen/CHRONOS interval consistency (#170) | +| #280 | `fe42aa19f70b398f66ee034b87284e33c0e7db2c` | false | main | feat(psychometric): restore Driver p.16 discreteDRIFTstd on main | +| #281 | `cc90c77e254068a64706137322d78126227f9790` | false | main | docs(gap): refresh protected-main and ten-PR queue | +| #283 | `ada51518878fef05e3b860edf08462964a517d6a` | false | main | fix(adr): enforce unique decision identities | +| #287 | `12f9a22b21e2c93c95606cd94404587ea01726cd` | false | main | feat(persistence): persist idempotent analysis runs | +| #290 | `62a9c3fbf88414c6b89cb61714d9fd86ed4b7994` | false | feat/analysis-run-persistence | feat: execute durable analysis runs | +| #292 | `219ccba50c1ba7530694f31b495caf1a6f51b4ae` | false | feat/executable-analysis-worker | feat(worker): classify scheduler exit outcomes | +| #293 | `11a6a6ad645681789a544f74df0be29a30b53590` | false | feat/interval-consistency-export-persistence | fix(event): bind complete interval artifact authority | +| #294 | `36b25a9ac1cadc0ef694d19bd5b9c52516a5dfa4` | false | feat/analysis-worker-exit-contract | feat(worker): execute durable topic-lineage runs | +| #296 | `1907526a59e36ac46d24db51479a160210a42982` | false | main | feat(psychometric): restore Driver p.16 discreteDIFFUSIONstd Q_Δt/p on main | Review decisions, required Checks, and mergeability remain volatile; re-read them immediately before every mutation. This snapshot is not merge authorization @@ -196,7 +211,7 @@ and does not treat queued or passing Checks as shipped protected-main behavior. ## Protected-main as-built baseline Protected `main` contains 58 unique Rust crate boundaries in the current -workspace manifest (as of `c7cf34b8`). The `members` and `default-members` +workspace manifest (as of `b03cc378`). The `members` and `default-members` arrays enumerate the same crate set for distinct Cargo commands; the unique-crate count is the authoritative modularity measure. The core boundaries include: @@ -229,7 +244,9 @@ contracts, orchestration routing, privacy authorization, release-evidence generation, the CPU topic-measurement reference estimator, the repaired posterior network estimator (#230 + #239), the Driver et al. (2017) SDE recovery suite (#231/#232) and its `T0MEANSstd`/`T0VARstd` restorations -(#262/#265), the deterministic analysis-run execution engine, the loopback +(#262/#265), followed by `asymDIFFUSIONstd`, `TRAITVARstd`, +`MANIFESTTRAITVARstd`, and `MANIFESTVARstd` (#267/#268/#270/#271), the +deterministic analysis-run execution engine, the loopback interpretation gateway, the provider-owned analysis-run status/read HTTP exchange (#266), the macOS-native MLX CPU receipt probe (`mlx_native_receipt`), and VRAM-policy compute types. @@ -251,21 +268,21 @@ the coordinated visual workspace, or a supported multi-tenant release. | GAP-003A | Immutable evidence cannot yet be submitted to a durable validation run that produces operator-usable scientific acceptance evidence. | `accepted-target` | product-completion | `e65cd66` (validation metrics are library-level only) | [#166](https://github.com/ContextualWisdomLab/TEPP/issues/166) | `—` (issue program; no current implementation PR) | Compose/CLI/API execution must bind immutable evidence, cutoffs, model configuration, validation metrics, and reproducibility manifests to one idempotent run. | | GAP-003B | Scientific result artifacts cannot yet be persisted, restarted, and recovered as one supported operator workflow. | `accepted-target` | product-completion | `e65cd66` (persistence contracts lack E2E recovery) | [#166](https://github.com/ContextualWisdomLab/TEPP/issues/166) | `—` (issue program; no current implementation PR) | Durable storage, migration/rollback, restart/recovery, artifact digest verification, and terminal retrieval must pass against a real Compose deployment. | | GAP-003C | The persistence slice classifies concurrent-write SQLSTATEs, but has no measured hot-partition detection, routing, or mitigation for tenant/result workloads. | `accepted-target` | product-completion | `e65cd66` (conflict classification only; no measured partition control) | [#166](https://github.com/ContextualWisdomLab/TEPP/issues/166) | `—` (issue program; no current implementation PR) | A real Compose/PostgreSQL workload identifies hot keys and partition skew, applies bounded tenant/time or result routing without weakening 3NF or temporal authority, and proves conflict rate, latency, recovery, and migration/rollback behavior under load. | -| GAP-004 | The central shared-latent temporal/relational topic estimator is absent. | `partial` | product vertical | CPU `f64` TRSL-TM reference estimator with ALR/ILR coordinates and refusal gates is implemented-main (v0.2.0 `topic_measurement`); fitted candidate-`K` scoring present | [#167](https://github.com/ContextualWisdomLab/TEPP/issues/167) | — | GPU, method effects, full Bayesian sampling, and topic birth/split/merge remain. This is not full #167 closure. | +| GAP-004 | The central shared-latent temporal/relational topic estimator is absent. | `partial` | product vertical | CPU `f64` TRSL-TM reference estimator with ALR/ILR coordinates and refusal gates is implemented-main (v0.2.0 `topic_measurement`); fitted candidate-`K`, digest-bound v2 topic-context artifact, draw-basis binding, and coverage repair from merged #282/#284–#286 are folded into open #283's feature head | [#167](https://github.com/ContextualWisdomLab/TEPP/issues/167) / [PR #283](https://github.com/ContextualWisdomLab/TEPP/pull/283) | `ada51518878f` | Revalidate and land #283 with exact-head checks and independent review; GPU, method effects, full Bayesian sampling, and topic birth/split/merge remain. This is not full #167 closure. | | GAP-005 | Real multilingual documents are not yet transformed into validated exact-span semantic units and versioned shared concepts. | `partial` | product vertical | `e65cd66` lineage (semantic_core exact-span units and language-profile validation are implemented-main as the first slice from [PR #201](https://github.com/ContextualWisdomLab/TEPP/pull/201)) | [#168](https://github.com/ContextualWisdomLab/TEPP/issues/168) CLOSED COMPLETED 2026-08-24; residual evidence tracked under product completion (#166/#169) | `—` | Remaining evidence beyond the closed first slice: concept alignment, Unicode/layout/language-tailored processing, unknown-concept review, multilingual calibration/invariance, image-position evidence, and prompt-injection tests. | -| GAP-006 | Posterior topic measurements cannot yet be fitted through a complete cross-classified longitudinal ESEM/DSEM engine. | `partial` | product vertical | Psychometric recovery stack drained onto protected main through integration vehicles [#231](https://github.com/ContextualWisdomLab/TEPP/pull/231)/[#232](https://github.com/ContextualWisdomLab/TEPP/pull/232) (both merged 2026-08-25T06:2xZ): Driver et al. (2017) SDE discrete-time recovery suite with standardised-parameter families and true-parameter RMSE tests is implemented-main (`psychometric_core`) | [#169](https://github.com/ContextualWisdomLab/TEPP/issues/169) | — | Remaining: joint plausible-value uncertainty wiring, full invariance evidence, irregular event-time fitting at production scale, multiple-membership integration with posterior coordinates, and end-to-end composition under #166/#167. Recovery primitives alone are not the ESEM/DSEM engine. | -| GAP-007 | TDT detection/tracking and CHRONOS schema/forecast/temporal reasoning remain isolated bounded gates rather than one calibrated product workflow. | `accepted-target` | product vertical | `e65cd66` (event/time primitives only) | [#170](https://github.com/ContextualWisdomLab/TEPP/issues/170) / [PR #70](https://github.com/ContextualWisdomLab/TEPP/pull/70) | `7a1f33aa68c1` | Span-grounded mentions, calibrated TDT metrics, schema/forecast hypothesis states, interval consistency, known-truth recovery, persistence, and exports. | +| GAP-006 | Posterior topic measurements cannot yet be fitted through a complete cross-classified longitudinal ESEM/DSEM engine. | `partial` | product vertical | Psychometric recovery primitives, including Driver p.16 maps through `MANIFESTVARstd`, are implemented-main in `psychometric_core` through [#271](https://github.com/ContextualWisdomLab/TEPP/pull/271) | [#169](https://github.com/ContextualWisdomLab/TEPP/issues/169); bounded map slices [#272](https://github.com/ContextualWisdomLab/TEPP/pull/272), [#280](https://github.com/ContextualWisdomLab/TEPP/pull/280), and [#296](https://github.com/ContextualWisdomLab/TEPP/pull/296) are active PRs | `1f37cf4a154734a252b6bf8261748a289c0dd493` / `fe42aa19f70b398f66ee034b87284e33c0e7db2c` / `1907526a59e36ac46d24db51479a160210a42982` | Remaining: joint plausible-value uncertainty wiring, full invariance evidence, irregular event-time fitting at production scale, multiple-membership integration with posterior coordinates, and end-to-end composition under #166/#167. Recovery primitives alone are not the ESEM/DSEM engine. | +| GAP-007 | TDT detection/tracking and CHRONOS schema/forecast/temporal reasoning now compose on protected main, but interval consistency, persistence, and exports are not yet one calibrated operator workflow. | `partial` | product vertical | Versioned TDT/CHRONOS composition merged through [#269](https://github.com/ContextualWisdomLab/TEPP/pull/269) | [#170](https://github.com/ContextualWisdomLab/TEPP/issues/170) / [PR #279](https://github.com/ContextualWisdomLab/TEPP/pull/279) / [PR #293](https://github.com/ContextualWisdomLab/TEPP/pull/293); closed #291 is folded into #279's feature head | `907d3a7278592d063773cd79b34bf0ce1bd90cb0` / `11a6a6ad6456` | Land #279 with its folded persistence slice, then revalidate #293, which binds complete variable scope and cutoff provenance; versioned JSON-LD export and known-truth workflow recovery remain. | | GAP-008 | GPU support is policy-only; no production estimator kernel has real hardware parity or declared VRAM evidence. | `accepted-target` | product vertical | `e65cd66` (VRAM policy only) | [#171](https://github.com/ContextualWisdomLab/TEPP/issues/171) / [PR #51](https://github.com/ContextualWisdomLab/TEPP/pull/51) | `1801501c4d7c` | Real CUDA/portable backend execution, CPU parity, streamed memory, bounded OOM/fallback, hardware profiles, telemetry, and no skipped-support claim. | -| GAP-009 | Topic association and cluster outputs lacked posterior-valid estimation, uncertainty, edge stability, and consensus communities. | `partial` (estimator core + repairs landed; Leiden consensus + buyer workflow remain) | product vertical | `a69eb3e2` (posterior log-ratio edge estimator merged from [PR #230](https://github.com/ContextualWisdomLab/TEPP/pull/230)) advanced by [#239](https://github.com/ContextualWisdomLab/TEPP/pull/239) (`c482ccea`): exact two-sided Fisher z-transform p-values driving Benjamini–Hochberg admission (Benjamini & Hochberg, 1995), percentile-bootstrap credible intervals and selection fractions (Efron, 1979), fail-closed guard ordering for non-finite correlations and short samples, negative-effect edges excluded from the whole consensus perturbation pipeline, explicit validated `edge_drop_probability`, bounds-safe admission helpers | [#172](https://github.com/ContextualWisdomLab/TEPP/issues/172) | — (#241 carries two dead-guard removals) | Remaining closure evidence: repeated Leiden consensus replacing the union-find stand-in (Traag et al., 2019), known-truth network/cluster recovery at production scale, and reproducible exports wired into the end-to-end run (#166). | +| GAP-009 | Topic association and cluster outputs lacked posterior-valid estimation, uncertainty, edge stability, and consensus communities. | `partial` (estimator core + repairs landed; Leiden consensus + buyer workflow remain) | product vertical | `a69eb3e2` (posterior log-ratio edge estimator merged from [PR #230](https://github.com/ContextualWisdomLab/TEPP/pull/230)) advanced by [#239](https://github.com/ContextualWisdomLab/TEPP/pull/239) (`c482ccea`): exact two-sided Fisher z-transform p-values driving Benjamini–Hochberg admission (Benjamini & Hochberg, 1995), percentile-bootstrap credible intervals and selection fractions (Efron, 1979), fail-closed guard ordering for non-finite correlations and short samples, negative-effect edges excluded from the whole consensus perturbation pipeline, explicit validated `edge_drop_probability`, bounds-safe admission helpers | [#172](https://github.com/ContextualWisdomLab/TEPP/issues/172) | — | Remaining closure evidence: repeated Leiden consensus replacing the union-find stand-in (Traag et al., 2019), known-truth network/cluster recovery at production scale, and reproducible exports wired into the end-to-end run (#166). | | GAP-010 | Operators lack coordinated accessible visual analytics and exact-value export workflows. | `accepted-target` | product vertical | `e65cd66` (no visual workspace) | [#173](https://github.com/ContextualWisdomLab/TEPP/issues/173) | `—` (Figma work not started) | Real Figma File ID in ADR, Storybook/design tokens, ten PRD views, exact-value tables, accessible interaction/print/PDF states, provenance, and source-consistent exports. | -| GAP-011 | TEPP is not yet an operable multi-tenant service or supported release. | `accepted-target` | product vertical | `e65cd66` (library contracts only) | [#174](https://github.com/ContextualWisdomLab/TEPP/issues/174) | `—` (issue program; no current implementation PR) | Durable queue/storage, OIDC/RLS/purpose controls, OpenTelemetry/SLOs, load/recovery, migrations, signed release/SBOM/provenance, assurance evidence, and support policy. | -| GAP-012 | The 71-PR queue obscured authority, repeatedly staled exact-head evidence, and fragmented product boundaries. | `implemented-main` (consolidation complete) | closed | `c7cf34b8` (#239 merged 2026-08-25T09:23Z; #266 merged 2026-08-26T12:40Z); [#175](https://github.com/ContextualWisdomLab/TEPP/issues/175) CLOSED; queue drained from 58 through #215, the hourly scheduler, vehicles #231/#232, and individual passes | — | — | Residual open queue is forward work (register refresh #273, event-intelligence fold #269, `std`-family psychometric restorations #267/#268/#270/#271/#272); no backlog remains. Exact-head discipline stays enforced by this register's refresh rule. | +| GAP-011 | TEPP is not yet an operable multi-tenant service or supported release. | `partial` | product vertical | `e65cd66` (library contracts only); durable analysis-run persistence remains an unmerged candidate on #287, with typed worker transport and evidence-bound manifest loading folded through merged #288/#289; #290 adds the bounded executable worker, #292 its scheduler-facing exit classification, and #294 real topic-lineage estimation plus atomic artifact publication on the dependent stack | [#174](https://github.com/ContextualWisdomLab/TEPP/issues/174) / [#166](https://github.com/ContextualWisdomLab/TEPP/issues/166) / [PR #287](https://github.com/ContextualWisdomLab/TEPP/pull/287) / [PR #290](https://github.com/ContextualWisdomLab/TEPP/pull/290) / [PR #292](https://github.com/ContextualWisdomLab/TEPP/pull/292) / [PR #294](https://github.com/ContextualWisdomLab/TEPP/pull/294) | `36b25a9ac1cadc0ef694d19bd5b9c52516a5dfa4` | Land #287/#290, then revalidate #292/#294 through the stack; scheduler-owned durable input retention/backoff, protected object ingestion, OIDC/purpose enforcement, OpenTelemetry/SLOs, load/recovery, signed release/SBOM/provenance, assurance evidence, and support policy remain. | +| GAP-012 | The 71-PR queue obscured authority, repeatedly staled exact-head evidence, and fragmented product boundaries. | `implemented-main` (consolidation complete) | closed | [#175](https://github.com/ContextualWisdomLab/TEPP/issues/175) CLOSED; queue drained through #215, the hourly scheduler, vehicles #231/#232, and individual passes | — | — | The eleven current PRs are bounded forward work; exact-head discipline stays enforced by this register's refresh rule. | | GAP-013 | Evidence-grounded LLM interpretation is routed but not executed and validated as a production interpreter/verifier port. | `partial` | active integration | `e65cd66` lineage (routing and refusal contracts implemented-main; loopback interpretation POSTs landed via #92/#107) | [#176](https://github.com/ContextualWisdomLab/TEPP/issues/176), [PR #69](https://github.com/ContextualWisdomLab/TEPP/pull/69), [PR #165](https://github.com/ContextualWisdomLab/TEPP/pull/165) | `8e4a3ca9cc80` / `34083c3f5d66` | Contextual-orchestrator execution, evidence citations, verifier refusals, comparable-budget ablations, provider eligibility/fallback, abstention, live/offline contract tests, and no numerical-authority escalation. | -| GAP-014 | README/TRD and some PR descriptions lag protected-main and live queue reality. | `partial` | documentation drift | Documentation synchronized to `c7cf34b8` through register refreshes including this file (#273) | [#175](https://github.com/ContextualWisdomLab/TEPP/issues/175) (closed) | — | Remaining: reconcile README/TRD crate counts to 58, retire CHANGELOG `[Unreleased]` bullets superseded by the v0.2.0 entry, and keep ADR maturity current. | -| GAP-015 | There was no canonical live product/operator-gap register tied to documentation validation. | `implemented-main` (register + validator); this refresh is the live maintenance slice | register refresh | `c7cf34b8` (register and validator are implemented-main; this snapshot refresh keeps the volatile queue current) | [PR #164](https://github.com/ContextualWisdomLab/TEPP/pull/164) is the merged authority; this refresh is [#273](https://github.com/ContextualWisdomLab/TEPP/pull/273) | `7f6c8a5a4351b4a8d0cfa5b7d2eaadfae71c7a9a` | Land each refresh after exact-head checks and independent review, then regenerate it whenever protected-main or the live queue changes. Only one refresh authority lands per queue state. | -| GAP-016 | Hourly PR maintenance used an older central scheduler revision whose per-repository sweep budgets could amplify the queued review workload. | `active-PR` | operability hardening | `e65cd66` (caller pin before central budget hardening) | [PR #177](https://github.com/ContextualWisdomLab/TEPP/pull/177) | `580d45206536` | The change pins a verified central revision immutably; closure still requires exact-head hosted Checks, resolved threads, and independent review. With the queue near zero the urgency is low but the slice remains unlanded. | +| GAP-014 | README/TRD and some PR descriptions can lag protected-main and live queue reality. | `partial` | documentation drift | This register is synchronized to `b03cc378`; documentation validation enforces its structure | [#175](https://github.com/ContextualWisdomLab/TEPP/issues/175) (closed) | — | Reconcile any remaining README/TRD/CHANGELOG drift and keep ADR maturity current. | +| GAP-015 | There was no canonical live product/operator-gap register tied to documentation validation. | `implemented-main` | register refresh | Register and validator are implemented-main; [#278](https://github.com/ContextualWisdomLab/TEPP/pull/278) is the latest protected refresh before this snapshot | [PR #164](https://github.com/ContextualWisdomLab/TEPP/pull/164) is the merged authority | — | Regenerate after protected-main or queue changes and land each refresh only after exact-head checks and independent review. | +| GAP-016 | Hourly PR maintenance previously used an older central scheduler revision. | `implemented-main` | closed | The immutable central scheduler pin and bounded trust separation are implemented-main | — | — | Continue verifying the pinned reusable workflow and hourly caller; no open implementation PR exists for this closed slice. | | GAP-017 | Accepted analysis runs have a terminal DTO and cutoff-safe execution on protected main after #157 merged. | `implemented-main` | closed on protected main | [PR #157](https://github.com/ContextualWisdomLab/TEPP/pull/157) merged 2026-08-25T02:53Z carrying the terminal result contract and folded cutoff-safe execution from closed stacked PR #178 | [#156](https://github.com/ContextualWisdomLab/TEPP/issues/156) (closed) / [#166](https://github.com/ContextualWisdomLab/TEPP/issues/166) | — | Exact availability cutoff, snapshot binding, multiple-membership preservation, digest integrity, redacted no-eligible failure, and realistic end-to-end tests are protected-main behavior; remaining E2E composition work belongs to #166. | -| GAP-018 | Coverage debt: the #219 repair landed, and #239 added 27 exact branch cases, leaving two dead-guard semantics points queued on [#241](https://github.com/ContextualWisdomLab/TEPP/pull/241). | `active-PR` | coverage completion | `5c8599442e85` lineage + #219 (merged 2026-08-25T03:17Z) + #239 (`c482ccea`): gates enforce 100% unique production arms; remaining items are dead-branch removals in `network_analysis::consensus` and `evidence_core::image_unit` | [PR #241](https://github.com/ContextualWisdomLab/TEPP/pull/241) | `a12e48c1e61b` | Merge #241 after exact-head Checks plus independent review so protected main carries the final semantics cleanup; two provably-dead singleton guards and an unreachable let-else are the last known items. | +| GAP-018 | Production statement and branch coverage gates are enforced at 100%. | `implemented-main` | closed | Coverage repairs through #241 are implemented-main; current PRs must continue to pass exact-head line and branch gates | — | — | Keep both gates required and add the smallest executable oracle whenever a production branch is introduced. | ## Product-completion issue register @@ -276,13 +293,15 @@ the coordinated visual workspace, or a supported multi-tenant release. | [#167](https://github.com/ContextualWisdomLab/TEPP/issues/167) | Shared-latent temporal topic CPU estimator | Numerical foundation for K selection, networks, psychometrics, interpretation, and product E2E; CPU reference landed, full estimator remains. | | [#168](https://github.com/ContextualWisdomLab/TEPP/issues/168) **CLOSED** | Multilingual semantic units and concept dictionary | Closed COMPLETED 2026-08-24; first-slice span units are implemented-main, remaining invariance/calibration evidence tracks product completion elsewhere. | | [#169](https://github.com/ContextualWisdomLab/TEPP/issues/169) | Multilevel longitudinal ESEM/DSEM | Consumes posterior topic coordinates and membership/time contracts; recovery stack landed via #231/#232, engine composition remains. | -| [#170](https://github.com/ContextualWisdomLab/TEPP/issues/170) | TDT/CHRONOS event intelligence | Consumes evidence/time/event contracts and supplies calibrated event artifacts; span-grounding fold queued as draft #233. | +| [#170](https://github.com/ContextualWisdomLab/TEPP/issues/170) | TDT/CHRONOS event intelligence | Versioned composition is implemented-main; #279 carries bounded interval consistency, while persistence and exports remain. | | [#171](https://github.com/ContextualWisdomLab/TEPP/issues/171) | Real GPU compute and parity | Accelerates production estimators only after CPU authority is stable. | | [#172](https://github.com/ContextualWisdomLab/TEPP/issues/172) | Posterior network and consensus clustering | Estimator core plus #239 repairs landed; Leiden consensus and buyer workflow remain. | | [#173](https://github.com/ContextualWisdomLab/TEPP/issues/173) | Accessible visual analytics and exports | Starts after stable API/artifact contracts; requires Figma and Storybook evidence. | | [#174](https://github.com/ContextualWisdomLab/TEPP/issues/174) | Commercial deployment/release/support | Wraps a scientifically complete product without weakening gates; v0.2.0 version alignment (#239) is a prerequisite slice, not closure. | | [#175](https://github.com/ContextualWisdomLab/TEPP/issues/175) **CLOSED** | PR queue and delivery consolidation | Queue consolidation completed at near-zero; issue closed after the residual queue drained through #239. | | [#176](https://github.com/ContextualWisdomLab/TEPP/issues/176) | Contextual-orchestrator interpreter/verifier | Consumes validated artifacts and cannot promote scientific truth. | +| [#275](https://github.com/ContextualWisdomLab/TEPP/issues/275) | Leakage-safe longitudinal CEFR language-profile and drift analysis | Blocked on released interoperability, immutable result, psychometric, and temporal/persistence contracts; must not average ordinal CEFR labels. | +| [#277](https://github.com/ContextualWisdomLab/TEPP/issues/277) | Longitudinal CEFR development and drift from immutable result events | Consumes versioned result observations without re-owning assessment execution or base scoring; requires cutoff-safe recovery evidence. | ## Priority pull-request queue @@ -292,13 +311,18 @@ committed. | PR | Current delivery role | Required next action | |---:|---|---| -| [#273](https://github.com/ContextualWisdomLab/TEPP/pull/273) | Live gap-baseline refresh to protected `c7cf34b8` (GAP-015 maintenance slice) | Exact-head Required Checks must pass on the current head plus independent review before merge; re-dispatch superseded exact-head evidence. | -| [#272](https://github.com/ContextualWisdomLab/TEPP/pull/272) | Driver p.16 `TIPREDVARstd` restore (GAP-006 recovery family) | Exact-head Required Checks must pass on the current head plus independent review before merge; re-dispatch superseded exact-head evidence. | -| [#271](https://github.com/ContextualWisdomLab/TEPP/pull/271) | Driver p.16 `MANIFESTVARstd` restore (GAP-006 recovery family) | Exact-head Required Checks must pass on the current head plus independent review before merge; re-dispatch superseded exact-head evidence. | -| [#270](https://github.com/ContextualWisdomLab/TEPP/pull/270) | Driver p.16 `MANIFESTTRAITVARstd` restore (GAP-006 recovery family) | Exact-head Required Checks must pass on the current head plus independent review before merge; re-dispatch superseded exact-head evidence. | -| [#269](https://github.com/ContextualWisdomLab/TEPP/pull/269) | Calibrated workflow composition: fold TDT detection and CHRONOS schema/forecast reasoning into one versioned product workflow (GAP-007) | Exact-head Required Checks must pass on the current head plus independent review before merge; re-dispatch superseded exact-head evidence. | -| [#268](https://github.com/ContextualWisdomLab/TEPP/pull/268) | Driver p.16 `TRAITVARstd` restore (GAP-006 recovery family) | Exact-head Required Checks must pass on the current head plus independent review before merge; re-dispatch superseded exact-head evidence. | -| [#267](https://github.com/ContextualWisdomLab/TEPP/pull/267) | Driver p.16 `asymDIFFUSIONstd` restore (GAP-006 recovery family) | Exact-head Required Checks must pass on the current head plus independent review before merge; re-dispatch superseded exact-head evidence. | +| [#272](https://github.com/ContextualWisdomLab/TEPP/pull/272) | Driver p.16 `TIPREDVARstd` restore (GAP-006 recovery family) | Complete restarted checks on exact head `1f37cf4a1547`; keep draft until current-head review evidence is complete. | +| [#279](https://github.com/ContextualWisdomLab/TEPP/pull/279) | Bounded Allen/CHRONOS interval consistency (GAP-007) | Resolve current-head central review/check failures on `907d3a727859`, then obtain qualifying independent approval. | +| [#280](https://github.com/ContextualWisdomLab/TEPP/pull/280) | Driver p.16 `discreteDRIFTstd` restore (GAP-006 recovery family) | Exact-head checks are terminal-success or intentionally skipped; qualifying independent approval remains required. | +| [#281](https://github.com/ContextualWisdomLab/TEPP/pull/281) | Buyer-visible protected-main and queue baseline refresh (GAP-014/GAP-015) | Refresh this branch snapshot, rerun documentation checks, then obtain qualifying independent approval. | +| [#283](https://github.com/ContextualWisdomLab/TEPP/pull/283) | Unique ADR identity enforcement (documentation authority) | Obtain a current-head OpenCode verdict and qualifying independent approval; all other current-head required checks are terminal-success. | +| [#287](https://github.com/ContextualWisdomLab/TEPP/pull/287) | Durable tenant-isolated analysis-run persistence for #166 (GAP-011), with #288/#289 folded into its dependent feature stack | Complete exact-head checks on `12f9a22b21e2`; obtain qualifying independent approval after all current-head gates pass. | +| [#290](https://github.com/ContextualWisdomLab/TEPP/pull/290) | Bounded executable one-shot analysis worker for #166 (GAP-011) | Complete exact-head checks and independent review on `62a9c3fbf884`; after #287 lands, rebase the complete dependent stack against protected main before merge. | +| [#292](https://github.com/ContextualWisdomLab/TEPP/pull/292) | Stable one-shot worker exit classification for #166 (GAP-011) | Complete exact-head line coverage and obtain independent approval on `219ccba50c1b`; land and revalidate the #287/#290 parent stack first. | +| [#293](https://github.com/ContextualWisdomLab/TEPP/pull/293) | Complete event-inventory and cutoff authority for interval artifacts (GAP-007) | Complete exact-head checks and independent review on `11a6a6ad6456`; land and revalidate the #279/#291 parent stack first. | +| [#294](https://github.com/ContextualWisdomLab/TEPP/pull/294) | Real topic-lineage worker estimation and atomic artifact publication for #166 (GAP-011) | Complete exact-head checks and independent review on `36b25a9ac1ca`; land and revalidate the #287/#290/#292 parent stack first. | +| [#296](https://github.com/ContextualWisdomLab/TEPP/pull/296) | Driver p.16 finite-interval `discreteDIFFUSIONstd` restore (GAP-006 recovery family) | Complete current-head central checks and obtain qualifying independent approval on `1907526a59e3`. | + ## Delivery sequence The dependency-aware product order is (✓ = landed on protected main): @@ -306,9 +330,9 @@ The dependency-aware product order is (✓ = landed on protected main): 1. ✓ **Consolidate delivery authority:** #175 closed; PR #164 merged; queue drained through #239. 2. ✓ **Finish live result contracts:** #156/#157 merged; the LineageWeave consumer parent #155 is implemented-main. 3. ✓ **Build validated multilingual evidence (first slice):** #168 closed COMPLETED 2026-08-24 with span units implemented-main from #201; remaining alignment/invariance evidence tracks product completion under #166/#169. -4. **Build the CPU topic estimator:** #167 — reference estimator landed, full Bayesian/candidate-K fitting remains. -5. **Build event intelligence and posterior networks:** #170 and #172 — network estimator core plus #239 repairs landed; Leiden consensus, buyer workflow, and event-intelligence calibration remain; the calibration compositional fold is open (#269). -6. **Build the posterior-aware longitudinal psychometric engine:** #169 — recovery stack landed via #231/#232 plus #262/#265; remaining Driver p.16 `std`-family restorations are open as #267/#268/#270/#271/#272, and engine composition remains. +4. **Build the CPU topic estimator:** #167 — reference estimator landed; fitted candidate-`K`, topic-context artifact, draw-basis binding, and coverage repair are combined on open PR #282, while full Bayesian fitting remains. +5. **Build event intelligence and posterior networks:** #170 and #172 — the versioned TDT/CHRONOS composition is implemented-main; interval consistency is active on #279, while persistence/exports, Leiden consensus, and buyer workflow remain. +6. **Build the posterior-aware longitudinal psychometric engine:** #169 — recovery primitives through `MANIFESTVARstd` are implemented-main; #272, #280, and #296 are bounded active-PR restorations, and engine composition remains. 7. **Accelerate real kernels with parity:** #171. 8. **Complete the durable end-to-end run:** #166 — terminal-result lifecycle and analysis-run execution engine are implemented-main; full E2E validation remains. 9. **Execute and validate interpretation:** #176. diff --git a/scripts/validate_documentation.py b/scripts/validate_documentation.py index 7b7364c9..7658fcaa 100644 --- a/scripts/validate_documentation.py +++ b/scripts/validate_documentation.py @@ -72,6 +72,11 @@ SNAPSHOT_STAMP = re.compile( r"\*\*Snapshot:\*\*\s*(?P\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z)" ) +SNAPSHOT_FETCH_STAMP = re.compile( + r"^Facts fetched live (?:from GitHub )?at\s+" + r"(?P\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z)\.\s*$", + re.MULTILINE, +) INVENTORY_ROW = re.compile( r"^\|\s*#(?P\d+)\s*\|\s*`(?P[0-9a-f]{40})`\s*\|\s*" r"(?Ptrue|false)\s*\|", @@ -389,14 +394,24 @@ def validate_product_technical_gap_baseline(root: Path = ROOT) -> None: ) text = path.read_text(encoding="utf-8") failures: list[str] = [] - if SNAPSHOT_STAMP.search(text) is None: + snapshot_match = SNAPSHOT_STAMP.search(text) + if snapshot_match is None: failures.append("gap baseline lacks a dated UTC snapshot stamp") + else: + fetch_stamps = list(SNAPSHOT_FETCH_STAMP.finditer(text)) + if not fetch_stamps: + failures.append("gap baseline lacks fetched-live snapshot evidence") + elif any( + match.group("stamp") != snapshot_match.group("stamp") + for match in fetch_stamps + ): + failures.append("gap baseline snapshot stamp does not match fetched-live evidence") if PROTECTED_MAIN_SHA.search(text) is None: failures.append("gap baseline lacks a 40-character protected-main SHA") if "Closure evidence" not in text: failures.append("gap baseline lacks operator-gap closure evidence") - if "Exact current head" not in text: - failures.append("gap baseline lacks an exact-head open-PR inventory") + if "Snapshot head evidence" not in text: + failures.append("gap baseline lacks a snapshot-head open-PR inventory") if any( not _promotion_is_denied(text, match) for match in QUEUED_CHECKS_AS_SHIPPED.finditer(text) @@ -404,7 +419,7 @@ def validate_product_technical_gap_baseline(root: Path = ROOT) -> None: failures.append("gap baseline treats queued Checks as implemented-main") inventory = list(INVENTORY_ROW.finditer(text)) if not inventory: - failures.append("gap baseline open-PR inventory has no exact-head rows") + failures.append("gap baseline open-PR inventory has no snapshot-head rows") count_match = OPEN_PR_COUNT.search(text) if count_match is None: failures.append("gap baseline lacks an open pull-request count") diff --git a/tests/quality/test_check_workspace_contract.py b/tests/quality/test_check_workspace_contract.py index 12056a4c..cb249dde 100644 --- a/tests/quality/test_check_workspace_contract.py +++ b/tests/quality/test_check_workspace_contract.py @@ -29,7 +29,7 @@ def copy_repository(self) -> tuple[tempfile.TemporaryDirectory[str], Path]: REPOSITORY_ROOT, destination, ignore=shutil.ignore_patterns( - "target", ".git", ".coverage", "__pycache__", "*.pyc" + "target", ".git", ".codegraph", ".coverage", "__pycache__", "*.pyc" ), ) return temporary, destination diff --git a/tests/quality/test_product_technical_gap_baseline.py b/tests/quality/test_product_technical_gap_baseline.py index a6542153..06b6f4e7 100644 --- a/tests/quality/test_product_technical_gap_baseline.py +++ b/tests/quality/test_product_technical_gap_baseline.py @@ -22,12 +22,13 @@ def valid_baseline(*, count: int = 1, extra: str = "") -> str: "# Product and Technical Gap Baseline\n\n" "**Snapshot:** 2026-08-23T12:27:12Z\n" f"**Protected-main evidence:** `{VALID_SHA}`\n\n" + "Facts fetched live at 2026-08-23T12:27:12Z.\n\n" "## Snapshot facts\n\n" "| Signal | Snapshot evidence | Delivery implication |\n" "|---|---:|---|\n" f"| Open pull requests | **{count}** | Queue only. |\n\n" "## Current open pull-request evidence\n\n" - "| PR | Exact current head | Draft | Base | Title |\n" + "| PR | Snapshot head evidence | Draft | Base | Title |\n" "|---:|---|:---:|---|---|\n" f"| #164 | `{VALID_HEAD}` | false | main | docs |\n\n" "## Operator-gap register\n\n" @@ -81,7 +82,7 @@ def test_map_without_baseline_link_fails(self) -> None: docs.validate_documentation_map(root) def test_valid_fixture_passes_structure_validator(self) -> None: - """A dated exact-head register with matching count is accepted.""" + """A dated snapshot-head register with matching count is accepted.""" with tempfile.TemporaryDirectory() as temporary: root = Path(temporary) @@ -90,6 +91,22 @@ def test_valid_fixture_passes_structure_validator(self) -> None: path.write_text(valid_baseline(), encoding="utf-8") docs.validate_product_technical_gap_baseline(root) + def test_obsolete_exact_head_header_fails(self) -> None: + """The register rejects the obsolete exact-current-head inventory header.""" + + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + path = root / BASELINE_PATH + path.parent.mkdir(parents=True) + path.write_text( + valid_baseline().replace( + "Snapshot head evidence", "Exact current head" + ), + encoding="utf-8", + ) + with self.assertRaisesRegex(AssertionError, "snapshot-head"): + docs.validate_product_technical_gap_baseline(root) + def test_missing_snapshot_sha_closure_or_inventory_fails(self) -> None: """Structure validation refuses an undated or uninventoried register.""" @@ -104,7 +121,7 @@ def test_missing_snapshot_sha_closure_or_inventory_fails(self) -> None: docs.validate_product_technical_gap_baseline(root) with self.assertRaisesRegex(AssertionError, "closure evidence"): docs.validate_product_technical_gap_baseline(root) - with self.assertRaisesRegex(AssertionError, "exact-head"): + with self.assertRaisesRegex(AssertionError, "snapshot-head"): docs.validate_product_technical_gap_baseline(root) def test_inventory_count_mismatch_fails(self) -> None: @@ -118,6 +135,53 @@ def test_inventory_count_mismatch_fails(self) -> None: with self.assertRaisesRegex(AssertionError, "does not match inventory"): docs.validate_product_technical_gap_baseline(root) + def test_snapshot_stamp_must_match_fetched_live_evidence(self) -> None: + """A stale headline timestamp cannot summarize newer fetched evidence.""" + + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + path = root / BASELINE_PATH + path.parent.mkdir(parents=True) + path.write_text( + valid_baseline(extra="\nFacts fetched live at 2026-08-23T12:28:00Z.\n"), + encoding="utf-8", + ) + with self.assertRaisesRegex(AssertionError, "fetched-live evidence"): + docs.validate_product_technical_gap_baseline(root) + + def test_snapshot_requires_fetched_live_evidence(self) -> None: + """A timestamp without a matching live-fetch claim is insufficient.""" + + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + path = root / BASELINE_PATH + path.parent.mkdir(parents=True) + path.write_text( + valid_baseline().replace( + "Facts fetched live at 2026-08-23T12:27:12Z.\n\n", "" + ), + encoding="utf-8", + ) + with self.assertRaisesRegex(AssertionError, "fetched-live snapshot"): + docs.validate_product_technical_gap_baseline(root) + + def test_incidental_fetched_live_prose_is_not_snapshot_evidence(self) -> None: + """A negated prose sentence cannot impersonate the canonical evidence line.""" + + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + path = root / BASELINE_PATH + path.parent.mkdir(parents=True) + path.write_text( + valid_baseline().replace( + "Facts fetched live at 2026-08-23T12:27:12Z.", + "No facts fetched live at 2026-08-23T12:27:12Z.", + ), + encoding="utf-8", + ) + with self.assertRaisesRegex(AssertionError, "fetched-live snapshot"): + docs.validate_product_technical_gap_baseline(root) + def test_queued_checks_as_implemented_main_fails(self) -> None: """Queued Checks must not be promoted to protected-main maturity."""