diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1cad1f17c..5f96edc07 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -4,6 +4,7 @@ on: push: branches: [main] pull_request: + types: [opened, synchronize, reopened, closed] permissions: contents: read @@ -15,6 +16,7 @@ concurrency: jobs: pytest: name: Full test suite + if: github.event_name != 'pull_request' || github.event.action != 'closed' runs-on: ubuntu-latest services: postgres: @@ -60,6 +62,7 @@ jobs: frontend: name: Frontend lint, test, build + if: github.event_name != 'pull_request' || github.event.action != 'closed' runs-on: ubuntu-latest steps: - name: Checkout repository diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 974bef3ac..7704fa748 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -1,7 +1,7 @@ # Product & Technical Gap Baseline -> Dashboard delivery snapshot: 2026-08-26 06:20 KST. Protected `main` was -> `04e6b610655d0db91d5f7ba9486bdda1440e0b19`. This local branch is not +> Dashboard delivery snapshot: 2026-08-26 07:15 KST. Protected `main` was +> `494b54e2245040bcf02b45376f221c37cd437e76`. This local branch is not > protected-main release evidence. ## Operations Dashboard PRD/TRD traceability @@ -60,14 +60,14 @@ only aggregate, non-identifying evidence to this repository. ### Exact open-PR boundary -At this snapshot there were 11 open PRs and 10 open issues. The exact-head -inventory in section 1 is authoritative for this snapshot. Every open head -remained blocked on hosted gates and/or independent review. These observations -are not merge readiness. Re-fetch exact heads, -unresolved threads, checks, approvals, rulesets, and merge SHA before any -lifecycle claim. +At this snapshot there were 11 open PRs and 10 open issues. PRs #660 and #659 +merged to protected `main`; PR #666 remains only non-default-branch stack +composition inside #663. Every remaining open head required refreshed hosted +gates and/or independent review after the base changed. These observations are +not merge readiness. Re-fetch exact heads, unresolved threads, checks, +approvals, rulesets, and merge SHA before any lifecycle claim. -> Audit snapshot: 2026-08-26 06:20 KST (refreshed by the autonomous merge +> Audit snapshot: 2026-08-26 07:15 KST (refreshed by the autonomous merge > loop). This repository records synthetic fixtures and aggregate, > non-identifying runtime evidence only. Open PRs and local checks are not > protected-default-branch release evidence. Identifying post identifiers, @@ -76,7 +76,7 @@ lifecycle claim. ## 1. Exact-head and governance evidence -The protected default branch was `04e6b610655d0db91d5f7ba9486bdda1440e0b19` +The protected default branch was `494b54e2245040bcf02b45376f221c37cd437e76` when this baseline was refreshed. The live queue contained 11 open PRs and 10 open issues. The exact-head inventory below supersedes older per-PR snapshots elsewhere in this document; those older rows remain useful historical delivery @@ -84,28 +84,23 @@ context only. | PR | Exact observed head | Merge/check state at this snapshot | | ---: | --- | --- | -| #663 | `ab330a0f` | project ontology traversal plus cutoff/snapshot-frozen project focus and labels; exact-head checks/review required | -| #660 | `24fda085` | backend runtime repair plus semantic-unit stack; exact-head checks/review required | -| #659 | `0739b9d7` | ontology node readability and tokenized UI fills; branch is DIRTY against current main and requires conflict repair | -| #658 | `fe830b0a` | evidence-honest Global Ask cutoff with revision-interval live-after semantics; exact-head checks/review required | -| #657 | `64f48679` | Dashboard case-metric contract work; exact-head checks/review required | -| #644 | `d9ff9980` | native-surface code splitting with modal-focus regression coverage; exact-head checks/review required | -| #643 | `0a1f8ec1` | accessible status-notice surfaces; exact-head checks/review required | -| #640 | `2d50fa01` | operations-dashboard contract alignment; exact-head checks/review required | -| #639 | `aee02dca` | exact-head checks/review required | -| #632 | `a4059113` | active semantic provenance repair head; exact-head checks/review required | -| #631 | `1d9ac825` | documentation decomposition; branch is DIRTY against current main and requires conflict repair | -| #629 | `4b4d6707` | exact-head checks/review required | +| #667 | `3bc662d7` | refreshes protected-main and open-queue documentation evidence; base conflict remains to be repaired | +| #663 | `6fd2f701` | combined Project ontology candidate plus #666's non-default-branch removal of sampled region-coverage arithmetic; base conflict remains to be repaired | +| #658 | `f007a5ed` | evidence-honest Global Ask cutoff; hosted checks and independent review required | +| #657 | `2d9b43b7` | TEPP asynchronous lifecycle persistence while unpublished producer work stays unavailable; hosted checks and independent review required | +| #644 | `ed8d97f3` | native frontend surface code splitting; hosted checks and independent review required | +| #643 | `7fb4d18c` | shared token-backed status notice; hosted checks and independent review required | +| #640 | `2d50fa01` | dashboard case metrics and project journeys; base conflict remains to be repaired | +| #639 | `48065ad1` | restores Running action and Compose contracts; hosted checks and independent review required | +| #632 | `29aee18d` | graph-fact provenance, public verification, MCP admission, and k6 evidence; hosted checks and independent review required | +| #631 | `665046dc` (observed parent) | decomposes closed PR #490; this merge refresh advances its head and restarts hosted review evidence | +| #629 | `0138db5f` | provider-work release and bounded landing reads refreshed onto protected `main`; hosted checks and independent review restarted | No row above is merge evidence. Immediately before any lifecycle action, re-fetch the head, unresolved threads, formal reviews, rulesets, and same-head check conclusions. In particular, queued checks are infrastructure state and do not transfer evidence from an earlier SHA. -PR #664 merged as `b2e48d5b0db59f5aa434e2a293cd182ee810c019` -into #660's non-default branch. Its semantic-unit implementation is therefore -stack evidence only until #660 passes the protected-`main` gate. - PR #607 first merged as `61fd631c7bb3c57113fd19763c2c43161eeb2824` into #606's non-default branch. PR #606 subsequently passed the protected gate, so the combined TEPP-consumer and operations-dashboard implementation is now @@ -179,6 +174,8 @@ Recent protected-default-branch delivery evidence (squash merges onto | PR | Merged (UTC) | Delivered | | ---: | --- | --- | +| #628 | 2026-08-25 12:39 | one-round-trip authorized post filter options without narrowing the complete ABAC-visible set | +| #627 | 2026-08-25 12:35 | preserved valid k6 lifecycle evidence across setup, scenario execution, and teardown | | #468 | 2026-08-25 08:44 | fast-mlsirm, Keyverse, contextual-orchestrator, and TEPP integration boundaries | | #493 | 2026-08-25 08:44 | evidence-grounded Event Lineage isolation reasons | | #600 | 2026-08-25 08:44 | then-current exact-head product/technical baseline | @@ -352,35 +349,29 @@ this file per §3.5 of the prior snapshot). | #79 | Milestone 2: port verified direct-PostgreSQL analysis into the protected architecture | analysis-run registry on `main`; remaining runtime bridge | | #87 | Milestone 2.1 normalized runtime-analysis schema bridge | related analysis-run work | | #269 | Authenticated Global Ask MCP browser-safe and admission-bounded | Ask stack | -| #271 | Evidence-honest knowledge-cutoff scope on Global Ask | Ask stack | -| #272 | Verify Global Ask KG/ontology/semantic claims with public SearXNG evidence | Ask stack | -| #274 | Persist and explain Event Lineage channel evidence | #387 | -| #277 | TEPP: persist accepted receipts, poll completed results, keep measurement authority distinct | #468, #417 | -| #280 | Full project-lifecycle history and handover intervals | Tracked with issue #284; no active delivery PR confirmed | +| #271 | Evidence-honest knowledge-cutoff scope on Global Ask | #658; still open and not protected-main evidence | +| #272 | Verify Global Ask KG/ontology/semantic claims with public SearXNG evidence | #632 preserves internal provenance; public verification acceptance remains open | +| #277 | TEPP: persist accepted receipts, poll completed results, keep measurement authority distinct | #657 consumer lifecycle; executable producer route remains unavailable | +| #280 | Full project-lifecycle history and handover intervals | #640 adds case/project journeys and #663 adds evidence-backed Project exploration; authoritative lifecycle reconciliation remains #284 | | #284 | Authoritative lifecycle ingestion and idempotent reconciliation | No active delivery PR confirmed | -| #289 | Activate the optional lineage LLM channel through a bounded asynchronous rebuild | #434 | -| #336 | Replace pseudo-CalDAV feed with a Naruon-owned calendar projection | Contract on `main` (#355); operator consume wiring in historical branch `feat/naruon-calendar-buyer-wiring-v2170` | -| #338 | Evidence-bounded email/project lineage contract for Naruon consumption | #355 | -| #341 | Heterogeneous ontology and provenance explorer separate from Event Lineage | Protected `main` via #349; issue closed | -| #358 | Batch reauthorize persisted post-Ask evidence without N+1 queries | Ask stack | -| #359 | Centralize Global Ask session storage access | Ask stack | -| #363 | Continue ontology neighborhoods beyond the bounded source window | Protected `main` via #349; issue closed | -| #372 | Reconcile lowercase and repository-case public namespace IRIs | Protected `main` via #616; issue closed, with term-kind hardening on #618 | +| #338 | Evidence-bounded email/project lineage contract for Naruon consumption | Missing on protected `main`; #343 merged only into a non-default stack, while #355 is a distinct calendar-consumer contract and is not delivery evidence for email/project lineage | +| #611 | Decompose closed PR #490 ADR 0133–0137 evidence without transferring stale branch state | #631 supplies the current-main inventory only; focused implementation PRs and tests for every unmet criterion are still required | ## 5. Open product and technical gaps | Gap | Current evidence | Acceptance requirement | | --- | --- | --- | -| Protected release | 3 open PRs at snapshot: #627 and #628 are current-main performance follow-ups, while reopened #579 retains hosted and independent-review gates | Terminal exact-head checks, no unresolved threads, independent exact-head approvals, protected squash-merge SHA | +| Protected release | 12 open PRs at snapshot, all targeting `main` with normal auto-merge enabled. None has the required independent approval, and running checks on #631/#632/#663 are not treated as blockers for safe work on other PRs. #666's merge into the non-default #663 branch is not protected-main delivery | Terminal exact-head checks, no unresolved threads, two independent approvals including last-push approval, protected squash-merge SHA | +| CI queue release latency | Two Tests runs for already merged PRs occupied the available runner slots while 54 newer runs remained queued. Manual cancellation released the stale work, but the central close workflow was itself queued behind those runs. #634 merged into #631's non-default branch and reuses the repository's existing per-PR concurrency group so a jobless close event can cancel obsolete Tests work before runner allocation; this is not protected-main delivery | Merge #631 through its refreshed protected gate; close a synthetic PR while its Tests run is active and verify the old run becomes cancelled, the close-event jobs remain skipped, and a newer exact-head run starts without manual intervention | | Evidence-grounded operations workspace | Protected-main #614 delivers governed semantic Ask, live Similar VOC, disjoint pending/failed analysis metrics, full Storybook state inventory, and current desktop/mobile screenshot evidence. Authorized-corpus backfill acceptance remains unavailable | Perform authenticated authorized-corpus acceptance with aggregate evidence and retain fail-closed no-match behavior | | Shared frontend gate | The ADR 0109 login repair is on protected `main`; eight older branches carried the defect and received the same verified repair this loop (#521–#560) | Keep every future branch cut from post-repair bases; re-verify with frontend lint/test/build before push | | Identifying baseline regression | `main` gap file listed real post identifiers; separately, closed #506 and pre-existing public history contain a private runtime source-table identifier, while current `main` and #507 trees are clean | Land this non-identifying rewrite, then coordinate ADR 0001 history remediation with security/privacy owners; do not reproduce the value, force-push, or delete evidence ad hoc | | Authorized-corpus runtime | Repository tests use synthetic fixtures; private records remain outside git | Authenticated runtime validation returning only aggregate, non-identifying evidence | -| Concurrent web responsiveness | ADR 0204 releases pooled transactions during provider work, and the synthetic Compose boundary has an authenticated k6 E2E harness for Ask enqueue, concurrent reads, and job polling. An older-image local observation found repeated post-filter queries while `/api/posts` exceeded 30 seconds; ADR 0212 combines two authorized filter-option queries into one round trip without narrowing ABAC-visible options. The observation is not exact-head evidence or a product guarantee, and no physical scan reduction is claimed without an exact-head plan | Rebuild an exact-head application image, run `make load-http` with declared environment concurrency/window, and retain raw distributions and resource configuration. Compare the post-list database plan and latency with ADR 0212 while preserving the complete authorized filter set; set no SLO until representative capacity evidence is approved | +| Concurrent web responsiveness | ADR 0204 releases pooled transactions during provider work, and the synthetic Compose boundary has an authenticated k6 E2E harness for Ask enqueue, concurrent reads, and job polling. PR #633's measured landing-query and event-loop work merged into open parent #629 rather than protected `main`; its aggregate observation improved 25-VU throughput but did not establish a latency SLO. The current exact #629 also persists each completed relation verification before propagating a later provider failure | Land #629 through its refreshed protected gate, rebuild that exact-head application image, and repeat `make load-http` with declared environment concurrency/window and retained raw distributions/resource configuration; set no SLO until representative capacity evidence is approved | | Image understanding | Region, OCR, and description work exists across active heads (#405, #419), but current runtime acceptance has not yet proved table-image structure, complete region coverage, or summary/image readiness together | Orchestrator-backed rendered workflow, original/derived asset provenance, region-before-OCR processing, and honest unsupported states; reconcile ADR 0052's image-bearing summary readiness with ADR 0098 before changing sequencing | -| Semantic source rendering | ADR 0223 and migration 0221 give new paragraph, list, table, MathML formula, and caller-parsed conversation-turn units explicit persisted kinds without rewriting historical rows; image regions remain ordered normalized children under ADR 0091. This branch is candidate evidence, not protected-main delivery | Land the exact-head candidate, then prove an authorized semantic-only query retrieves each persisted unit kind and gather authenticated browser evidence that nesting, continuation alignment, formula units, and image regions retain source order | -| Event and project semantics | Multi-project mentions, project-bound actions, 5W1H, requester/processor, and semantic relations exist in ADR 0036/0052/0100/0111/0129 and active stacks | Aggregate authenticated evidence must show distinct projects and events, explicit requester/processor and real R&R, normalized relative time, and product/entity relations without promoting attendance or co-occurrence | -| Knowledge Graph readability | The black evidence-node root cause is an undefined-token fallback; the design-token repair and long-label/evidence-table coverage remain only on closed, unmerged #490, not protected `main` | Recreate the token repair on a current base and deliver it through protected `main`, then verify light/dark contrast, keyboard graph navigation, full labels, and evidence tables in the authenticated rendered surface | +| Semantic source rendering | Paragraph, table, list, formula, and indentation work exists across stacks (#394, #427, #448–#450); #515 adds synthetic backend/frontend parity for deterministic rows/cells, footnote boundaries, and encoded scripts | Land the #427 → #515 stack, then gather authenticated browser evidence that list nesting, continuation alignment, and formula units render without authoring-layout artifacts | +| Event and project semantics | #663 is the largest current user-visible gap slice: evidence-backed Project nodes, bounded traversal, cutoff/snapshot fencing, exact-value table parity, and localized graph labels. Focus visibility, label-bound, and temporal test-double regressions are repaired. #666's heuristic removal is composed into this parent but is not separately protected-main evidence. #640 separately adds project journeys without claiming authoritative lifecycle status | Combined #663 must pass exact-head checks and independent approval before protected merge. Aggregate authenticated evidence must still prove distinct projects/events and handover intervals without promoting co-occurrence | +| Knowledge Graph readability | #659 recreates the token-backed node-type repair on current `main`, including regression coverage; it is open and therefore not protected-main evidence | Merge #659 normally, then verify light/dark contrast, keyboard graph navigation, full labels, and evidence tables in the authenticated rendered surface | | Source-code lookup UX | Source state/detail codes remain evidence-bearing machine values and current detail presentation is dense | Catalog-backed display labels with raw-code provenance, compact 5W1H/source-detail hierarchy, keyboard access, and no unsupported customer/project binding | | Calendar / Naruon | #355 delivered the projection contract; v2.17.0 wires operator consumption without forwarding the end-user token. Naruon producer, provider/consumer fixtures, and protected merge remain open (#336) | Verify observed events against the published schema without invented events; keep commitments available when the channel is unwired | | SKOS organization aliases | Catalog binding and chip caption live on #480 / #482 | One catalog row per corroborated org; companion caption is hint-only until bound | @@ -390,14 +381,37 @@ this file per §3.5 of the prior snapshot). | Planned-facility intent | Planned-facility relationship intent remains only on closed, unmerged #490; earlier stack-only merges were not protected delivery | Recreate the evidence-backed slice on a current base and land through protected `main` before a release claim | | Accessibility and responsive UX | #602 delivered base post-detail modal semantics; #605 adds selected-post refocus, collapsed/hidden/inert/CSS-invisible focus exclusion across both modal types, readable evidence separators, focused tests, and desktop/mobile Storybook screenshots | Land #605 through the protected gate, then complete screen-reader and authenticated Playwright acceptance on the exact release head | | Design tokens and repeated objects | Token extraction started; sanitized Figma Event Lineage desktop/mobile frames exist, while other repeated product surfaces remain incomplete | Tokens in CSS + Storybook stories for board, popup, DAG, Ask, calendar, forms, charts; same-viewport Figma/runtime visual comparison before release | -| Frontend delivery performance | A current production build succeeds but emits Vite's >500 kB chunk warning (`539.27 kB` minified); raising the warning limit would conceal rather than reduce delivery cost | Measure module contribution on an exact head, split one real route/surface boundary with native dynamic import, then prove the warning is absent and loading/error states remain accessible | +| Frontend delivery performance | #644 implements a native dynamic-import boundary for conditional workspace surfaces and retains accessible loading/error states; exact-head checks passed but the PR is not protected-main evidence | Merge #644 normally, rebuild the protected-main production bundle, and retain the measured chunk inventory rather than raising the warning limit | | External integrations | Search, Zotero, calendar, Keyverse, orchestrator, RankWeave, ThreadWeave, TEPP, DiskSage, wardnet | Provider conformance, failure/reconciliation behavior, and provenance-bearing integration evidence | | MSA / modular reuse | LineageWeave must run standalone and as a consumer of org packages | Do not reimplement RankWeave/TEPP/orchestrator/ThreadWeave/Keyverse; fix upstream and PR there | -| Product contract authority | This branch recreates the first LineageWeave PRD after superseded #613 closed without merge and records an exact-case ecosystem authority register; TEPP, fast-mlsirm, keyverse, and ThreadWeave have standalone PRDs, while contextual-orchestrator, RankWeave, DiskSage, and wardnet currently rely on product-planning/architecture documents and naruon has only a scoped Topic Intelligence PRD | Land the LineageWeave PRD, keep ADRs normative, and add standalone PRDs in each owning repository before making cross-product release claims beyond its documented boundary | -| Release quality | The #664/#660 stacked tree passed the complete Python suite (1,352 passed, 17 skipped) after #660 removed a duplicate synthetic snapshot digest and restored the TEPP settings contract. This is local candidate evidence, not protected-main delivery | Repository-wide coverage, frontend/Storybook, security, browser, and protected merge evidence on one exact head | +| Product contract authority | The current LineageWeave PRD records exact-case ecosystem authorities. TEPP, fast-mlsirm, keyverse, ThreadWeave, and RankWeave PR #41 have standalone PRDs; RankWeave's remains unmerged. contextual-orchestrator, disksage, and wardnet still rely on product/architecture documents, and naruon has only a scoped Topic Intelligence PRD | Keep ADRs normative, preserve canonical repository case in machine references, land the pending PRDs, and add standalone PRDs in each remaining owning repository before cross-product release claims exceed its documented boundary | +| Release quality | PR #660 is now on protected `main`; its pre-merge full Python suite passed 1,352 tests with 17 skips, but release-wide frontend, Storybook, security, browser, and runtime acceptance remain unproven on one exact protected head | Repository-wide coverage, docstrings, Storybook, security, browser, and release evidence on one exact head | | PII | Masking would paralyze the product; ADR 0001 forbids identifying artifacts in git | ABAC + authorized runtime; synthetic fixtures in git; no mask-in-place that drops names the operator must read | | Database | PostgreSQL, 3NF, snake_case ≥ two words, hot-partition and lock policy | No file DBs; read/write split if lock management fails; whitelist every migration | +### 5.1 Closed PR #490 decomposition (issue #611) + +Protected `main` at `04e6b610` and the three open PRs present during the initial +decomposition were rechecked; the later audit snapshot above includes #631 +itself as the fourth open PR. Protected `main` contains none of PR #490. That PR remains +closed, unmerged branch evidence; its ADR 0133–0137 files are not normative and +its 321-file tree must not be replayed. Current-main code and schema searches +give this delivery matrix: + +| Closed-branch decision | Current-main classification | Smallest remaining delivery | +| --- | --- | --- | +| ADR 0133 source-reference research | Partial foundation: protected `main` has the self-hosted SearXNG relation-verification client and fail-closed configuration, but it verifies an already extracted relation. It has no source-unit/image-region lead, cited-resource retrieval, claim judgment, or normalized research citation workflow | One post-scoped lead-to-citation slice that reuses the self-hosted SearXNG search boundary, adds public-target SSRF/redirect rejection for result retrieval, and judges through contextual-orchestrator with explicit unavailable outcomes | +| ADR 0134 token-backed exception messages | Partial: sanitized next-action failures exist, but no shared token-backed exception component or complete Storybook error inventory exists | Migrate one existing unavailable flow to one shared accessible alert and verify its success, unavailable, and retry states | +| ADR 0135 kind/status-exact analysis actions | Partial: protected `main` has kind-aware start/retry controls plus normative analysis-run, TEPP, cutoff-body, and channel-evidence contracts; it does not contain the closed branch's unified guidance component or its full kind × status interaction inventory | Test the current run-kind/status matrix first, then add only a proven missing state/control pair rather than copying the closed-branch function | +| ADR 0136 per-post Ask history | Partial: `post_chat_result` / `post_chat_citation`, the authorized post Chat API, and its linear exchange history are on protected `main`. Account-and-post-scoped sessions, ordered turns, list/select/new controls, and batched citation reauthorization are not | Define the 3NF account/post session boundary, bounded batch reauthorization, and one authorized list/load/write path before adding the conversation picker | +| ADR 0137 cross-post customer identity | Partial foundation: protected `main` preserves source customer hints and has corporate-catalog unique/miss/tie safeguards, but it has no normalized cross-post customer-identity judgment, supporting-post binding, or corporate-name-history workflow | Add only after external corroboration, orchestrator judgment, TEPP ordering, and unique-catalog fail-close can be verified together; never promote a one-post hint | + +This matrix satisfies only #611's current-main inventory step. Issue #611 +remains open: every unmet criterion above still needs a focused regression test +and exact-head current-main implementation PR before its acceptance criteria +are satisfied. No stale check, review, or implementation is transferred from +#490. + ## 6. UI-UX acceptance inventory (must be defined, reviewed, applied, audited) Each item needs a Storybook scene, an edge-case story, and an automated check @@ -468,23 +482,29 @@ Process every open PR in ascending number order, considering leverage; for each: check reviews → repair → re-verify Checks → merge → continue. Checks and review latency are never blockers — keep working while they settle. -1. Revalidate Strix after protected ContextualWisdomLab/.github#1320, reconcile - .github#1263, and land the atomic hourly LineageWeave caller in .github#1288. -2. Merge #387 and #618–#621 only after each exact head shows terminal - green required checks plus current-head independent approval. -3. After the queue drains, resume user-visible gaps from §5 in leverage order: - Event Lineage evidence (#387/#274), Naruon calendar (#355/#336), and - authenticated operations/ontology publication acceptance. -5. Rename remaining `[Buyer Gap]` issue titles to neutral product-object +1. Revalidate Strix after merged ContextualWisdomLab/.github#1320, reconcile + open .github#1263, and land the atomic hourly LineageWeave caller in open + .github#1288 only through their protected gates. +2. Process main-targeted PRs #629, #631, #632, #639, #640, #643, #644, #657, + #658, #659, #660, and #663 only after each exact head shows terminal green + required checks plus current-head independent approval. Treat #666's + non-default-branch merge only as part of #663's combined candidate and + collect all protected evidence on #663's exact head. +3. While hosted checks or independent reviews wait, resume user-visible gaps + from §5 in leverage order: + external semantic verification (#272), Naruon calendar (#355/#336), and + authenticated operations/ontology publication acceptance. Event Lineage + evidence shipped in merged PR #387 and closed issue #274 is not an open gap. +4. Rename remaining `[Buyer Gap]` issue titles to neutral product-object naming per repository convention (no "Buyer" for internal objects). -6. Keep psychometric tests as true-parameter recovery (RMSE); never fixture +5. Keep psychometric tests as true-parameter recovery (RMSE); never fixture tautologies, invented theta, or hand-authored numeric weights. Remove weights from tests that do not exercise fusion; fusion tests must consume provenance-bearing fast-mlsirm estimates over synthetic fixtures. -7. Run frontend lint/test/build/Storybook, backend tests, and authenticated +6. Run frontend lint/test/build/Storybook, backend tests, and authenticated browser/accessibility checks on the exact candidate release head. -8. Fix only evidence-backed failures and repeat the protected merge gate. -9. Refresh this file each loop with the exact queue state. +7. Fix only evidence-backed failures and repeat the protected merge gate. +8. Refresh this file each loop with the exact queue state. ## 11. Spec pointers (derive, do not fork) diff --git a/tests/test_tests_workflow_contract.py b/tests/test_tests_workflow_contract.py new file mode 100644 index 000000000..2fd145b0e --- /dev/null +++ b/tests/test_tests_workflow_contract.py @@ -0,0 +1,15 @@ +"""Regression contracts for the repository test workflow.""" + +from pathlib import Path + + +def test_pr_close_cancels_obsolete_test_runs_without_starting_jobs() -> None: + """A close event must cancel the same-PR run while scheduling no test work.""" + workflow = ( + Path(__file__).resolve().parents[1] / ".github/workflows/tests.yml" + ).read_text(encoding="utf-8") + + assert "types: [opened, synchronize, reopened, closed]" in workflow + assert "group: tests-${{ github.ref }}" in workflow + assert "cancel-in-progress: true" in workflow + assert workflow.count("github.event.action != 'closed'") == 2