Skip to content

WORK-LAB V2: Unified Product Convergence (Authority / GAPS / Observer / Federation / U19 / Boundary) - #127

Merged
DTALEX66 merged 64 commits into
mainfrom
u17/global-agent-policy-20260918
Sep 23, 2026
Merged

DTALEX66 merged 64 commits into
mainfrom
u17/global-agent-policy-20260918

Conversation

@DTALEX66

@DTALEX66 DTALEX66 commented Sep 18, 2026 •

Copy link
Copy Markdown
Owner

WORK-LAB V2 Unified Product Convergence

This PR evolved from an initial U17 Global Agent Policy SSOT + native projection + protected-drive (E+F) scope into a full V2 convergence train. It is now 52+ commits covering the complete client-neutral control-plane product definition.

Authority

  • WORK-LAB-AUTHORITY.md + project-authority-index.json + taskpack-authority-index.json (single CURRENT, supersedes acyclic, 12/12 reference paths verified via git cat-file)
  • A00–A04: machine authority verifier (verify_project_authority_reference.py), CURRENT_STATE de-Stage3, physical history archive (46 taskpacks → taskpacks/history/)

Global Agent Policy

  • config/global-agent-policy.yaml SSOT + services/policy/policy_projection.py → native per-software renderers in integrations/executors/*
  • One semantic policy, N native projections. No per-client hand-written rule duplicates.

Policy Projection

  • config/config-ownership.json (field-level ownership across 7 managed clients)
  • config/adapter-registry.json (provenance, risk, status, package hash)

Repository Convergence

  • de-Stage3 structural decoupling: generate_current_state.py Stage3 files → optional (fail-open); canonical projects.json missing → fail-closed
  • taskpacks: 46 non-CURRENT archived to taskpacks/history/ (28 remain in current/)
  • Legacy roots (00-governance/, 10-workflow/, 30-observer/, 50-taskpacks/, 80-evidence/, 90-archive/) frozen as historical-only

Observer React/Tauri

  • React 18 + TS + Vite 5 + Tailwind 3 + recharts (read-only)
  • Tauri 2 / Rust native shell (src-tauri)
  • U19: real Windows Tauri E2E readback (currently PARTIAL — CDP/GDI evidence gap on CI runner; diagnostic hardening landed in 09a2d64)

Software Identity

  • composition_root.py _build_software_projection() (registry × discovery × resolver, UNKNOWN discipline, 60s TTL cache)
  • 13-field SoftwareIdentity contract (additive, no TS changes)
  • 10 shape/behavior tests (test_software_projection_shape.py)

Execution Federation

  • Parallel dispatch, receipt/checkpoint/lease, session federation, context handoff
  • services/execution-federation/ + services/session-federation/

Parallel Dispatch

  • Fanout isolation: all-routes-failed → FAILED (not PARTIAL)
  • Degraded batch not reported as failed
  • Hard-failed route never coerced to success

Config Transaction

  • nf10_config_transaction.py (U10 D3 negative control): monotonic revision floor, stale-revision rejection, config apply→readback truth
  • config_control_plane.py 5 gap mechanisms (additive)

Evidence Truth

  • EvidenceRecord +6 verifiable-identity fields (evidence_type/receipt_digest/producer/verifier/observed_at/evidence_level)
  • UNKNOWN/null discipline: missing → UNKNOWN, never fabricated zero

DSH Update Guard

  • DSH Desktop 2.0.4 community desktop managed via adapter contract
  • Update preflight: version drift + release-channel verification
  • WORK-LAB-DSH-UPDATE-SOP → superseded by WORK-LAB-DSH-UPDATE-MAINTENANCE-RUNBOOK-2026-09-20

Taskpack Cleanup

  • taskpacks/current/ converged to 28 active files (was 82); 46 archived with twin-verified rename
  • FROZEN-LEGACY-INDEX-20260918.md in taskpacks/history/

Protected-Drive Governance

  • E+F unified across 4 surfaces: global-agent-policy.yaml, projects.json, project-data-boundary.json (forbiddenExternalRoots + protectedDataVolume.roots), e_drive_guard.py
  • New verify_protected_drives_consistency.py (stdlib-only, fail-closed) + gate in run_quality_gate.py

Windows E2E

  • u19_webview_e2e.py: real Tauri app.exe + sidecar v3 + CDP readback + GDI PrintWindow
  • 09a2d64: +53 lines diagnostic hardening (stderr capture → log, staged process-liveness checks)
  • CI status: observer step 8 (U19 CDP readback) = PENDING on runner (swiftshader + raw-socket CDP fixes in tree)

Remaining Blockers

ID Status Reason
A01 OPEN (admin available) main required_status_checks not configured; aggregate gate not enforced as mandatory CI condition
A05 OPEN Squash-cutover lineage + MiniGame FOREIGN_HISTORICAL semantics
U19 PARTIAL CDP readback no CDP page target on CI runner; swiftshader GDI capture landed but not yet CI-verified
U18 PARTIAL Universal Workflow real slices: infra green, label auth-gated

Gate Evidence

  • Local run_quality_gate.py verify → QUALITY_GATE_PASS (all 40+ gates, governance batch 165 modules / 1650 tests OK)
  • CI wlr-060-production-gates → SUCCESS on 09a2d64
  • CI work-lab-gate → FAILURE (observer step 8 U19 CDP → aggregate cascade)
  • Not yet: exact-SHA CI PASS (blocked by U19)

…ction + A03 authority verifier

- PR1 authority landing: WORK-LAB-AUTHORITY.md (top human), project-authority-index.json (top machine), taskpack-authority-index.json aligned, FROZEN-LEGACY-INDEX + taskpacks/current converged to single current taskpack + single open register
- A03 machine verifier scripts/ci/verify_project_authority_reference.py (fail-closed, read-only, --root injectable) wired into integration gate + 10 negative controls
- U17.1 config/global-agent-policy.yaml: the ONE cross-software semantic SSOT
- U17.2/4 three new workflow contracts + registered in contract-catalog (33)
- U17.3 config-ownership.json: workflow.global_agent_policy USER_OVERLAY/MANAGE + per-client agent_policy fields + 5 fail-closed rules; user model/provider/reasoning OBSERVE, auth/credentials FORBIDDEN
- U17.4 adapter-registry policy_projection for all 10 adapters with maturity states
- AGENTS.md: mandatory authority-read bootstrap
…reports + tests

- services/policy/policy_projection.py: unified fail-closed projection contract (GlobalAgentPolicy + SoftwarePolicyRenderer + ProjectionLossReport, 5 honest coverage states, schema + invariant + secret + E-drive + model-neutrality validation)
- U17.5 Codex reference implementation: codex-policy-extension.yaml (native knobs out of the neutral core) + codex_policy_renderer.py -> regenerates the golden integrations/executors/codex/global-guidance.md (drops stale R4/R5 semantics: old .hermes/task-runtime, old scripts/workflow helpers, only-one-active hard limit, resident Git/PS tutorials)
- U17.6 Hermes projection: hermes-policy-extension.yaml + hermes_policy_renderer.py -> regenerates the managed config/SOUL.md (short high-frequency body; long-form technique stays in on-demand skills)
- loss reports persisted under config/loss-reports/{codex,hermes}-policy-loss-report.json (schema-validated; "rendered successfully" != "100% supported")
- tests/workflow-assistance/test_policy_projection.py: 20 tests, all section-26 negative controls (E-drive weakening / UNKNOWN-success / hardcoded model / credential material / unowned managed block / unsupported adapter claiming readback / APPLIED==VERIFIED)
…+ policy-coverage freshness gate

- config/capability-matrix.json: derived global_agent_policy_coverage block
  (10 software x 19 policy capabilities), derived from adapter-registry
  policy_projection + loss reports — a read-only view, not a second registry
- config/adapter-registry.json: capability_states realigned to the 19-cap
  policy truth source (codex/hermes from their extensions; others honest
  UNSUPPORTED/WORKFLOW_GUARD/OBSERVE) + capability_coverage_complete flag
- packages/contracts/schemas/workflow/adapter-registry.schema.json: allow
  capability_coverage_complete
- scripts/ci/verify_policy_coverage.py: fail-closed freshness verifier
  (loss-report schema + non-deceptive buckets, registry==loss-report states,
  matrix block derived, golden freshness via renderer determinism)
- services/orchestration/run_quality_gate.py: policy-coverage gate wired into
  GATES + VERIFY_ORDER + GATE_PATH_SCOPES
- tests: sync expected sets (core-schemas +3, gate order/list strings)
- full quality gate `verify` (1257+ tests incl. policy-coverage) passes locally
- integration job now runs `run_quality_gate.py policy-coverage` alongside the
  existing capability-matrix gate, so the Global Agent Policy coverage +
  freshness verifier (verify_policy_coverage.py) is a required CI gate
- A03 authority-reference verifier (verify_project_authority_reference.py)
  was already wired to the integration job's structural-check step; this
  keeps CI and the local `verify` gate sequence consistent
- no untrusted inputs / no new expression blocks are introduced

Local: `run_quality_gate.py policy-coverage` PASS, workflow YAML validates.
… + native guards + goldens) - global-agent-policy.yaml: protected_storage now protected_drives [E,F] + drive_default deny (revision 2); schema aligned - policy_projection: fail-closed PROTECTED_DRIVE_BASELINE invariant {E,F}; invariants_checked +1 - e_drive_guard / machine_identity / project_registry / projects.json / data-boundary CI: generalized from single-drive to both protected data drives - codex + hermes extensions, goldens (global-guidance.md, SOUL.md) and loss reports regenerated via --write (@Rev2) - global-execution-standard.md + deploy_global_rules.py + adapter-registry note: single-drive wording -> both protected drives - tests: F-block guard cases, F machine-identity rejection, drop-F negative control; full gate verify green
…nding + fix surface, branch evidence, boundaries, open items (PR 127)
…ce + supersedes graph integrity (indexReferencesExist verified, not trusted)
…ry (Stage3 no longer a current-identity source); regenerate projection + update 3 consumers
…rchive/superseded-current (kept one machine CURRENT + one human projection); CURRENT_STATE_TP20260819 stays as SUPERSEDED-layer snapshot
…controls) with fail-closed guards + real negative-mutation evidence; regenerate CURRENT_STATE projection
…ne-truth layout (packages/client-neutral-core, apps/observer, .project/governance, taskpacks/current, config/); regenerate CURRENT_STATE projection
…light contracts (workflow namespace, no new top-level); register in catalog (35) + verify_contract_catalog + test_core_schemas
…User State evidence layer, not 4th authority) + DSH 5-case golden regression + 7 negative location tests (fixture-driven, no real machine writes)
…ders into platform_discovery and DSH adapter (reuses shared resolver, no second engine); schema-conformance + _norm separator fix; regenerate CURRENT_STATE (contracts=35)
…oritative catalog (was hard-coded 33; broke after P0-07a added 2 contracts to 35) - TaskPack 4.1
…1/U17/U17a -> IMPLEMENTED (exact-SHA CI verified, not DONE: merge_main=false); U02 -> PARTIAL
…er (P1)

Fans one ACP op out to multiple executor adapters concurrently via
ThreadPoolExecutor, with per-route failure/timeout isolation, real-time
STARTED/DONE/FAILED/TIMEOUT events, fail_fast abort, idempotent dedup, and a
4-valued aggregate (OK/PARTIAL/DEGRADED/FAILED) back into the EXISTING
ExecResult. No second engine / ledger / runtime; the federation stays
passive (adapters remain the source of launch decisions).

+ tests/workflow-assistance/test_parallel_dispatch.py (17 tests)
+ tests/workflow-assistance/nf_parallel_dispatch.py (7 negative controls)
Adds packages/contracts/schemas/workflow/execution-parallel-dispatch.schema.json
draft-2020-12 modeling the fanout request (op/executors/payload/adapter_kind/
per_executor_timeout/fail_fast) and receipt (status/per_executor/succeeded/
failed/timed_out/unknown/events). Workflow namespace only; no new top-level
namespace.

- contract-catalog.json: 35 -> 36 (owner=workflow, consumers=[workflow,observer,ci])
- verify_contract_catalog.py: EXPECTED + canonical prefix synced
- test_core_schemas.py: schema-name set synced (count stays dynamic)
- test_governance_gate.py: already dynamic (P0-07a) — follows 36, no hardcode
- + nf_execution_parallel_dispatch_schema.py (7 schema-conformance tests)

Regenerated CURRENT_STATE projections (contracts=36, source_digest=d8aca018);
CURRENT_STATE_FRESHNESS_PASS.
Maps a P1 fanout ExecResult (payload.per_executor + batch status +
payload.events) into the EXISTING receipts execution_evidence shape — one
ExecutionEvidence row per route plus one batch row, with the event trace
attached verbatim. Pure mapping: no spawn, no credentials, no new ledger
file, no policy application (no second runtime).

- a hard-failed / UNKNOWN_EXECUTOR route stays a failure row (never
  coerced to success); a DEGRADED batch (all routes NOT_LAUNCHABLE /
  NOT_SUPPORTED, no hard failure) is NOT reported as FAILED.

+ tests/workflow-assistance/test_parallel_dispatch_evidence.py (7 unit)
+ tests/workflow-assistance/nf_parallel_dispatch_evidence.py (8 negative controls)
…h (P3-sub_F)

Addsitive-only streaming surface on the P1 dispatcher so callers (SSE /
live monitors) can consume fanout events as they happen, not only after
the batch settles:

- ParallelDispatcher.fanout_stream(...) generator: yields
  {executor, phase, ts, ok, status} per STARTED / terminal / TIMEOUT
  transition in real time, built on the SAME _RunState / lock /
  _run_routes collector as batch fanout() — stream and batch observe
  identical events by construction.
- module-level parallel_dispatch_stream(...) convenience; registered in
  __all__.
- schema: added events_stream (array of the event object) + boolean
  'streamed' flag to execution-parallel-dispatch.schema.json (existing
  properties intact, draft-2020-12 valid).

HARD CONTRACT PRESERVED: fanout() / dispatch_events() /
parallel_dispatch_of() signatures and return shape are unchanged — a
sibling receipts adapter (P3-sub_C) builds against that stable shape.

+ tests/workflow-assistance/test_parallel_dispatch_stream.py (7 tests:
  event order, fail_fast drops, per-route TIMEOUT, stream/batch
  consistency, batch regression guard, module helper)
…P2/P3)

Tracked handoff at docs/history/archive/session-history/WORK-LAB/ following the
repo's established WORK-LAB-*-HANDOFF convention. Covers:
- passive parallel-dispatch orchestration layer (P1) + execution-parallel-dispatch
  contract, catalog 36 (P2) + receipts evidence adapter (P3c) + streaming events
  (P3f), with usage snippets and hard semantic invariants.
- evidence: governance batch 160 modules / 1611 tests OK; authority PASS;
  CURRENT_STATE freshness (digest d8aca018); dual-gate CI green at 2d92c6d and
  bc3fe85 (exact run IDs).
- iron-rule boundaries: merge_main=false, §40 DSH protections, §22 no second
  engine, E/F drives untouched.
- local toolchain (wrapper / venv / scratch-runner / -F commit messages),
  next steps (observer UI, merge decision, U03-U19), and rollback SHAs.

Outside CURRENT_STATE digest coverage (session-history archive dir) — no
projection regen needed.
…i-recurrence)

Fixes the 2026-09-20 DSH update recurrence class: post-update verification of the real installation location and body integrity was missing from governance.
- new pure module packages/client-neutral-core/scripts/software_update_postflight.py (fail-closed run_postflight_checks: version readback, body integrity, launcher/data-root pinning, C-residue watchlist, runtime health; reuses sii.location_readback, no second engine)
- new contract packages/contracts/schemas/workflow/software-update-postflight.schema.json (Draft 2020-12, closed 10-value reasons enum, additionalProperties:false)
- catalog 36->37, verify_contract_catalog EXPECTED + prefixes, test_core_schemas inventory
- 21 tests (9 golden/PENDING + 12 negative controls)
- CURRENT_STATE regenerated: source_digest=e550caf1, contracts=37
…rrence traps)

Tracked runbook fixing DSH maintenance into WORK-LAB governance: golden identity, P0-07 preflight gate, 7-step update procedure, mandatory software-update-postflight post-update gate, the three 2026-09-20 recurrence traps (NSIS .lnk reset / DSH_HOME session-freeze C-fallback / resources\app wipe by update loop), maintenance cadence, and rollback procedure. No C-drive writes, no second updater/runtime (S40).
…ing) @656e7d2

Register both 2026-09-20 branch workstreams in OPEN-TASK-REGISTER: U20 real-time parallel agent-invocation (P1-P3, dual-gate @bc3fe85), U21 software-update-postflight anti-recurrence gate + DSH maintenance RUNBOOK (dual-gate @656e7d2). CURRENT_STATE regenerated for the register change. merge_main=false unchanged; lifecycle stays awaiting MERGED -> READBACK -> ACCEPTED.
…etire legacy roots

- delete pnpm residue in an npm project (pnpm-lock.yaml, pnpm-workspace.yaml); npm stays authoritative (CI uses npm ci; esbuild already a transitive dep in package-lock.json)
- archive 50-taskpacks 09-05 docs -> docs/history/archive/session-history/WORK-LAB/ (git mv, SHA-verified)
- remove empty untracked 10-workflow/ (bytecode pyc only)
- module-profile.json evidencePath: dead 80-evidence/observer -> .project-local/runs/observer (S25 machine-local, not Git authority)
- NOTICE.md: fix two dead path refs (90-archive-manifests/, 00-governance/projects.json -> docs/history/archive-manifests/, .project/governance/projects.json)
- WORK-LAB-AUTHORITY.md already lists these roots as historical-only (S12) - left unchanged
…x pending; digest + timestamp refreshed)
… snapshot The legacy React front rendered a PHANTOM schema (agents[]/models[]/cost[]/ resources{cpu,mem}/services[]/memory[]) that the real v3 snapshot (snapshot_api.py::build_snapshot, authoritative in test_sidecar_v3_snapshot.py) does not expose. This is the deepest form of the U07 front-truth disease: not just hardcoded prices, but an entire fabricated data contract. - types.ts / api.ts now mirror ONLY the real v3 fields; cost truth = tokenSummary.costQuality (no frontend price/FX/quota, estimateCost gone). - U06: typed RuntimeDescriptor (Tauri-injected loopback ?api=), SSE-first transport with Last-Event-ID, no fixed-port single source of truth. - U04: typed view registry replaces the array-index coupling that left Delivery/Trust/Settings unreachable; all lanes now reachable by stable id. - U05: real Dark/Light via CSS-variable surfaces (index.css + tailwind config), URL-driven theme, hardcoded class="dark" removed; Light now actually renders. - U07: null stays UNKNOWN (never 0/false healthy); timeline no fallthrough. - S31/32: read-only SoftwareView projects installation-identity (U17/P0-07) when the backend carries it; absent => UNKNOWN, never a fake Healthy. - Removed 4 phantom dashboard components + data/mock.ts (zero consumers). - New ExecutionTable/ProjectPanel/TokenPanel read the real projections. Verified: tsc --noEmit exit 0; vite build exit 0 (1586 modules); the 80 existing Observer UI/desktop contract tests (node run_all_tests.js) all pass.
…erver Rust CI - U05: Compact is now a DEDICATED HUD (CompactHUD.tsx) — single column, no sidebar, dense 4-KPI strip, 320px-safe; App renders it when layout=compact. (Dark/Light theme was already real; compact was the missing half.) - U08: React behavior tests via Vitest + @testing-library (jsdom):   api.test.ts (U07 truth formatters/projections keep UNKNOWN, no fabricated   0/cost/success), viewRegistry.test.ts (U04 lane reachability regression),   truth.test.tsx (mount real components: empty/absent snap -> UNKNOWN, the   software panel never claims a fabricated verified/healthy identity).   18 tests / 3 files, all pass. - U08: observer desktop crate (src-tauri) now has a locked Rust CI step in   work-lab-gate.yml (cargo test/check --locked), mirroring token-monitor. - vitest + @testing-library + jsdom added as devDependencies (lockfile updated   atomically); npm test script wired in.  Verified: tsc --noEmit exit 0; vite build exit 0; npm test 18/18 pass.
The 2026-09-21 execution round landed U03-U16 but the register still
showed OPEN. Synced each row to its real status with commit anchors
and no over-claiming:
- U03 PARTIAL (parity proven @f0926e2; static web/ deletion is a U19
  release-gate step, not executed)
- U04-U07 IMPLEMENTED@f0926e2, U08 PARTIAL (E2E -> U19)
- U09 IMPLEMENTED@2a3756b, U15 IMPLEMENTED@25158bf, U16 IMPLEMENTED@9a6ea95
- U10 IMPLEMENTED@04a25f4, U11 IMPLEMENTED@f510516
- U12/U13/U14 IMPLEMENTED@gate (already-implemented; verified green in
  the 162-module governance gate; register rows were stale per 33)
…y matrix

Migrate the one valid accessibility capability the retired static web/ surface had: WlA11y.announce polite live-region announcements (theme + LIVE/STALE/OFFLINE data-source transitions) into React src/lib/a11y.ts, wired into App.tsx. Intentionally NOT migrated: WlCharts (no v3 time-series data source -> would be a phantom KPI) and escapeHtml (React-native). Parity matrix (apps/observer/parity-matrix-u03.md) records the evidence-based decision per capability. 23/23 React tests green (was 18; +5 a11y), tsc clean, vite build green. web/ retirement stays gated on U19 + release.
…iew_e2e.py drives sidecar-v3 -> app.exe -> WebView2 CDP readback (non-about:blank), stdlib CDP client with RFC6455 masked-frame fix verified. u19_chromium_readback.py decouples the CDP client from the broken local GNU toolchain by validating against a real Chromium rendering the real React dist + real sidecar data (PASS). Settle CURRENT_STATE source_digest 58b7e97c.
The authoritative WINDOWS_TAURI_E2E gate requires a real native-shell WebView readback (non-about:blank). The local GNU toolchain lacks a link.exe so it cannot produce a runnable exe; CI windows-latest has the complete MSVC toolchain + WebView2. Add to the observer job: (1) cargo build --release --locked to build the real binary, (2) run apps/observer/scripts/u19_webview_e2e.py to drive the real chain (sidecar v3 backend -> app.exe -> WebView2 CDP readback). Bump observer timeout to 40m for the cold Tauri release build. The harness is fail-closed: any unproven stage exits non-zero, never a fabricated PASS.
CI 19a112d proved the MSVC-built app.exe launches (pid RUNNING) but the CDP readback found 'no CDP page target': modern WebView2 (Chromium 111+) requires --remote-allow-origins=* for a non-browser CDP client to attach. Add the flag to WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS. Settle CURRENT_STATE against the tree (source_digest churn from the 19a112d workflow edit).
…st negative test. Proves canonical map_usage and observer project_usage/project_cost agree on the same fixture (input/output token rollup), and both REFUSE a fabricated cost_cents on a not-metered source (codex subscription / local not-metered). Grounded in u09_one_truth_probe.py real outputs; self-contained import (does not extend the shared gate PYTHONPATH). Full governance batch 1640 tests OK.
- lib.rs: opt-in default-OFF WORK_LAB_U19_CDP_PORT probe webview window via WebviewWindowBuilder::additional_browser_args -- the ONLY wry-reachable path (env var WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS is permanently shadowed by wry's app-level args; verified in wry source). Shipped binary behavior unchanged unless the var is set.
- u19_webview_e2e.py: stage 2 now sets WORK_LAB_U19_CDP_PORT (was WEBVIEW2_*, never consumed). Stage 3b adds _gdi_render_proof: PrintWindow capture of the real app window + pixel-diversity analysis (real React dashboard = many colors; about:blank = near-solid). Verdict = backend PASS AND (CDP PASS OR GDI PASS) — either proves the real render; never a fabricated PASS. provenBy recorded in evidence.
…ntWindow, x64 ABI). Local probe: unknown-pid -> graceful unavailable, no ABI crash.
… for headless GDI capture

- u19_webview_e2e.py: _cdp_http_get via raw socket instead of urllib — BadStatusLine on CI was urllib/proxy transport pollution, not a closed CDP port.
- lib.rs: probe window CDP args add --use-angle=swiftshader so GDI PrintWindow captures real pixels on headless CI (GPU-composited surfaces print black). Opt-in only; shipped default unchanged.
…ce, repo hygiene, environment facts.

Tracked at taskpacks/current/ (repo handoff convention). Evidence-anchored to commit SHAs; U19 remains PARTIAL until the CI run carrying the raw-socket CDP + swiftshader fix lands.
…vernance views + shell

Source: D:/All projects/UI套件 WORK-LAB batches (B10 supreme, L4/L6/L7 + L8
prototype) extracted to gitignored .ui-reference/WORK-LAB/; authority chain
B10>B09>...>B01, three-way-identical token truth (L4 design_tokens.json =
L7 theme/tokens.json = B10 :root).

SPEC-A design tokens: index.css full B10 dark/light rewrite (deep-navy
#050D16 console, electric blue #2A91FF primary, cyan #20CDE1 secondary,
border #17435D, radius 4/10/16/22, motion 120/180/220/280/420, density
68/56/44); legacy GitHub palette + violet #7C6CF0 removed (CODEX hard
constraint: no purple / warm gold / cross-project mixing).
src/theme/tokens.ts = CI-assertable single source of truth (DARK/LIGHT),
asserted by tokens.test.ts incl. purple-residue negative checks.
tailwind.config.js: sidebar/muted/info colors, radius/shadow/
transitionDuration; theme flip stays URL-driven (?theme=).

SPEC-B shared components (src/components/ui/, zero new deps): button /
input / tag / modal (220ms Esc aria-modal) / drawer (280ms cubic-bezier) /
toast (4s stack) / states (L7 five-state Empty/Loading/Error/Offline/
Unknown) / command-palette (Ctrl+K, arrow+Enter, Esc, fuzzy includes)
- pinned by components.test.tsx.

SPEC-C five honest views + routes (SnapshotV3 truth, no fabricated KPIs):
RulesPolicyView (governance.families), AuditTrailView (ci[]/executions[]/
sourceRefs read-only filter+sort), ApprovalsView (workspace.plan.approvals
else UNKNOWN projection note), IntegrationsView (adapters family + static
7-client documentation), TaskPacksView (snap.tasks counts + plan tasks).
viewRegistry +5 lanes (rules-policy/audit/approvals/integrations/task-packs),
15 total; views.test.tsx pins empty-state text + real field rendering.

SPEC-D shell: Sidebar 260<->72px collapse + 4 foldable groups
(overview/exec/insight/governance) + mobile overlay drawer; TopStatusBar
global search trigger; App global Ctrl/Cmd+K palette (view jumps +
theme/layout actions) + deep-link write-back (?view=/?theme=/?layout=);
App.smoke.test.tsx.

Root-cause colour fix (same class as SPEC-A): TokenPanel.tsx + Views.tsx
chart series hardcoded #00d4ff/#7c6cf0 now resolve via rgb(var(--primary-rgb))
/ rgb(var(--secondary-rgb)).

Verification (layered): tsc --noEmit PASS; vitest full 47/47; vite build
PASS (1598 modules); dist colour audit = authoritative tokens present,
legacy purple count 0; real-WebView render of dist (static :54321, browser
screenshots overview + audit) confirmed deep-navy console, 4-group sidebar,
honest empty states, no purple, no layout breakage; temp server stopped.
Build PASS != runtime PASS: verified in a real browser.

Docs: apps/observer/UI_IMPLEMENTATION_AUDIT.md (audit + acceptance) and
UI_DECISIONS.md (D1-D9 conflict decisions). .ui-reference/ gitignored.

Not included (queued after UI, per priority): the pre-existing convergence
workstream changes (taskpack archive moves, governance, config, CI scripts)
remain in the working tree.
…ted, mainline-verified)

WS-2 (Observer software[] backend wiring):
- composition_root.py +153: _build_software_projection() cross-joins
  registry x discovery x resolver with UNKNOWN discipline (no obs ->
  locationStatus=UNKNOWN / discoverySource=unavailable; no fabrication),
  bounded 60s in-memory TTL cache, try/except degradation so a failed
  discovery never crashes snapshot build.
- snapshot_api.py +5: additive optional `software` param on build_snapshot
  (key omitted when None -> backward-compatible; no observer gate breaks).
- tests/workflow-assistance/test_software_projection_shape.py: 10 new
  shape/behavior tests, auto-included by mandatory discovery.
- Frontend SoftwareIdentity (13 fields) already aligned; no TS changes.

WS-3 (E/F protected-drive truth unified):
- project-data-boundary.json: F:/ + F:\\ on forbiddenExternalRoots and
  spillGovernance.protectedDataVolume.roots.
- README L85 + project-data-boundary SKILL.md rule 8: E: AND F: protected
  (existing E:\ test assertion still passes).
- NEW packages/client-neutral-core/scripts/verify_protected_drives_
  consistency.py (stdlib-only, fail-closed): asserts {E,F} equal across
  global-agent-policy.yaml, projects.json, both boundary lists; registered
  as gate protected-drives-consistency in run_quality_gate.py.
- Negative control verified: strip F -> verifier exit 1; restore -> 0.
- test_workflow_governance.py: VERIFY_ORDER tuple gains the new gate
  (mainline decision carried from WS-3 open items).

WS-4 (de-Stage3 structural decoupling + taskpack archive):
- generate_current_state.py: Stage3 files optional (missing -> fail-open
  rc=0); canonical projects.json missing stays fail-closed rc=1; negative
  controls in tests/ci/test_stage3_baseline.py + test_current_state.py.
- 46 non-CURRENT taskpacks archived taskpacks/current/ -> taskpacks/
  history/ (current keeps 28); mainline twin-verified 46/46.
- project-authority-index.json allowlist cleaned; README L90-92 repointed.

U19 diagnostic hardening (CI TASK-1 evidence gap):
- u19_webview_e2e.py +53: stderr capture to log + staged process-liveness
  checks so the 'no CDP page target' failure yields REAL artifact evidence
  on CI instead of silent exit 1.

Misc landing: tests/workflow-assistance/nf10_config_transaction.py
(U10 D3 negative-control module, mandatory-discovery included).

Gate evidence (mainline re-verified, project interpreter w/ pytest 9.1.1):
- FULL run_quality_gate verify -> QUALITY_GATE_PASS (all gates listed,
  including new protected-drives-consistency).
- governance batch: 165 modules, Ran 1650 tests OK (skipped=8).
- Note: gate batch run under a python WITHOUT pytest fails 3 pre-existing
  import-pytest modules (exit 1) -> interpreter environment issue, not a
  product regression; project env declares pytest.
@DTALEX66 DTALEX66 changed the title U17: Global Agent Policy SSOT + native projection + protected-drive (E+F) enforcement WORK-LAB V2: Unified Product Convergence (Authority / GAPS / Observer / Federation / U19 / Boundary) Sep 22, 2026
… to history; rebind refs; fix DESIGN-LAB source_of_truth pointer; declare .hermes secondary runtime roots; prune stale canonical ref
…e 11 P3 candidates enumerated, taskpacks-current 0 residuals, knowledge-staging by-design noted)
…ng route + gitignore dead rule), classify 149 mentions, 4 PENDING keep-decisions recorded
…ary (R5) + 0bbbce8 CI log evidence, tracked for cross-machine sync
…dary (gh-actions only, fail-closed preserved)
…er-registry/client-evidence 2.0.4->2.0.13 + D: config root), register ERR-087 (.lnk NSIS reset regression + --user-data-dir discipline)
@DTALEX66
DTALEX66 merged commit 62f666e into main Sep 23, 2026
19 checks passed
DTALEX66 added a commit that referenced this pull request Sep 23, 2026
@DTALEX66
DTALEX66 deleted the u17/global-agent-policy-20260918 branch September 23, 2026 16:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant