WORK-LAB V2: Unified Product Convergence (Authority / GAPS / Observer / Federation / U19 / Boundary) - #127
Merged
Conversation
…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)
…ection (fix red work-lab-gate)
…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.
…eletion stays U19-gated
…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.
…, fail-closed gate, A01 record, PR metadata
…K J/M re-baseline, governance PASS
… to history; rebind refs; fix DESIGN-LAB source_of_truth pointer; declare .hermes secondary runtime roots; prune stale canonical ref
…assification + prevention)
…ence contract, not drift)
…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
…(R1/R3/R4 one-grep diagnosis)
…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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 viagit cat-file)verify_project_authority_reference.py), CURRENT_STATE de-Stage3, physical history archive (46 taskpacks →taskpacks/history/)Global Agent Policy
config/global-agent-policy.yamlSSOT +services/policy/policy_projection.py→ native per-software renderers inintegrations/executors/*Policy Projection
config/config-ownership.json(field-level ownership across 7 managed clients)config/adapter-registry.json(provenance, risk, status, package hash)Repository Convergence
generate_current_state.pyStage3 files → optional (fail-open); canonicalprojects.jsonmissing → fail-closedtaskpacks/history/(28 remain incurrent/)00-governance/,10-workflow/,30-observer/,50-taskpacks/,80-evidence/,90-archive/) frozen as historical-onlyObserver React/Tauri
Software Identity
composition_root.py_build_software_projection()(registry × discovery × resolver, UNKNOWN discipline, 60s TTL cache)SoftwareIdentitycontract (additive, no TS changes)test_software_projection_shape.py)Execution Federation
services/execution-federation/+services/session-federation/Parallel Dispatch
Config Transaction
nf10_config_transaction.py(U10 D3 negative control): monotonic revision floor, stale-revision rejection, config apply→readback truthconfig_control_plane.py5 gap mechanisms (additive)Evidence Truth
EvidenceRecord+6 verifiable-identity fields (evidence_type/receipt_digest/producer/verifier/observed_at/evidence_level)DSH Update Guard
WORK-LAB-DSH-UPDATE-SOP→ superseded byWORK-LAB-DSH-UPDATE-MAINTENANCE-RUNBOOK-2026-09-20Taskpack Cleanup
taskpacks/current/converged to 28 active files (was 82); 46 archived with twin-verified renameFROZEN-LEGACY-INDEX-20260918.mdintaskpacks/history/Protected-Drive Governance
global-agent-policy.yaml,projects.json,project-data-boundary.json(forbiddenExternalRoots + protectedDataVolume.roots),e_drive_guard.pyverify_protected_drives_consistency.py(stdlib-only, fail-closed) + gate inrun_quality_gate.pyWindows E2E
u19_webview_e2e.py: real Tauri app.exe + sidecar v3 + CDP readback + GDI PrintWindowRemaining Blockers
required_status_checksnot configured; aggregate gate not enforced as mandatory CI conditionno CDP page targeton CI runner; swiftshader GDI capture landed but not yet CI-verifiedGate Evidence
run_quality_gate.py verify→ QUALITY_GATE_PASS (all 40+ gates, governance batch 165 modules / 1650 tests OK)wlr-060-production-gates→ SUCCESS on 09a2d64work-lab-gate→ FAILURE (observer step 8 U19 CDP → aggregate cascade)