page:docs-specs-platform-gaps-research-fabric-current-state
Research dossier R1 — Fabric current state + audit refresh reference
Date: 2026-09-27 · Verified against fabric HEAD 5e46b998e5826af3b11fbba0dc7ad4e9d9023e6c ("fix(kradle): repository reconcile loop must only adopt its own environment's CRs") · Author: platform-gaps spec research run
Research dossier R1 — Fabric current state + audit refresh
Date: 2026-09-27 · Verified against fabric HEAD 5e46b998e5826af3b11fbba0dc7ad4e9d9023e6c ("fix(kradle): repository reconcile loop must only adopt its own environment's CRs") · Author: platform-gaps spec research run
Method: every claim below was re-derived from source at HEAD. Evidence is path:line relative to C:/work/fabric unless prefixed company/ (= C:/work/company). CONFIRMED = read directly in code. INFERRED = deduced from adjacent confirmed evidence and marked as such. The prior findings register re-verified here is Appendix A of company/products/platform/PLATFORM-REMEDIATION-AND-RENAME-ROADMAP.md (2026-09-14 5-agent audit).
---
1. Repo shape at HEAD
- npm-workspaces monorepo (
package.jsonworkspaces): 40+ workspaces acrosspackages/{adapters/*, genty/*, kradle/*, atlas, babysitter, babysitter-sdk, kip-sdk, trust-core, observer-dashboard}andapps/commander; plus non-workspace treeslibrary/(process library),plugins/,blueprints/,e2e-tests/,docs-site/. - Scale (non-test source files): babysitter-sdk 334 TS files; adapters family ~640 (hooks 137, core 69, tasks 66, gateway 52, codecs 46, extensions 42, cli 37, transport 18, channels 18, policy 14, triggers 13, tools 9, config 9, observability 7, launch 6, plus a Python
adapters/proxy); kradle/core 69 controller modules; kip-sdk with a single 7,005-linepackages/kip-sdk/src/kip-repo.ts. - Recent churn is the GKE migration (HEAD and 7 prior commits are all kradle/atlas/CI deploy fixes), which is why the D8 refresh below matters: some 2026-09-14 anchors moved files but almost none of the findings were actually fixed.
- The repo grades its own test reality in
MATURITY-MATRIX.md(last updated 2026-08-13, i.e., pre-GKE-churn but structurally still accurate — spot-checked below in §4).
---
2. Prior findings register — re-verification (D8)
Verdict codes: **STILL-VALID** (reproduced at HEAD), **CHANGED** (partially addressed or moved; residual gap stated), **FIXED** (no longer reproducible). Score: **24 STILL-VALID · 10 CHANGED (all with residual gaps) · 0 fully FIXED** of the 34 distinct register rows.
Critical
| ID | Verdict | Fresh evidence at HEAD |
|---|---|---|
| C1 — journal checksum written, never verified on load | **STILL-VALID** | Checksum computed at write: packages/babysitter-sdk/src/storage/journal.ts:77-79. Load path loadJournal → parseJournalFile (storage/journal.ts:111-141,151-161) only JSON.parses; the stored checksum field is copied into the event (journal.ts:132) and never recomputed or compared anywhere. loadJournalSafe (runtime/replay/effectIndex.ts:374-380) normalizes parse errors only. |
| C2 — journal events unsigned | **STILL-VALID** | appendEvent payload is {type, recordedAt, data} + sha256 checksum only (storage/journal.ts:72-82). No SignedEnvelope, no principal. (Signing exists in the platform — trust-core is consumed by adapters/policy/tools/transport and genty-core per their package.json deps — but journal events do not pass through it.) |
| C3 — tool/MCP attestation off by default (opt-in anchor) | **STILL-VALID** (posture unchanged, semantics hardened) | Enforcement activates only when POLICY_CONFIG_ROOT_FP is set: packages/genty/platform/src/harness/internal/createRun/orchestration/policy-enforcement-wiring.ts:123-124 (anchor check) and :132-137 (fast path: no anchor ⇒ no gate constructed, "back-compat posture"). When pinned it is now genuinely fail-closed (deny-all on adapter failure, policy-enforcement-wiring.ts:139-150), but there is still no loud journaled "attestation disabled" marker for the default run. |
High
| ID | Verdict | Fresh evidence at HEAD |
|---|---|---|
| H1 — no hash chain between events; tail truncation undetectable | **STILL-VALID** | No prevHash anywhere in storage/journal.ts (write path :72-82). EffectIndex.validateSequence (runtime/replay/effectIndex.ts:144-185) detects seq gaps/regressions *between loaded files*, but deleting the tail N files just shortens the sequence and passes; no head-checksum persisted for comparison. |
| H2 — invocation key hashes arg *shape*, not value | **STILL-VALID** | hashArgsShape (runtime/intrinsics/task.ts:255-258) hashes stableNormalizeShape, which reduces every primitive to typeof value (task.ts:264-276, leaf at :275). No value digest stored on EFFECT_REQUESTED, so a changed arg value replays the stale result silently. |
| H3 — positional occurrence index shifts on inserted step | **STILL-VALID** | deriveStableTaskKey appends a per-shape counter idx (runtime/intrinsics/task.ts:245-253, counter at :249-252). No warning when idx > 0 is relied upon. |
| H4 — replay key mismatch fails open (silent re-exec) | **STILL-VALID** | EffectIndex.getByInvocation returns undefined on miss (runtime/replay/effectIndex.ts:124-126); caller then requests a brand-new effect (runtime/intrinsics/task.ts:94 → requestNewEffect). No orphan detection (resolved-but-never-consulted keys are never diffed). |
| H5 — cancellation is journal-only; live processes leak | **STILL-VALID** | commitEffectCancellation (runtime/commitEffectResult.ts:136-183) writes EFFECT_CANCELLED + result file + registry update; nothing signals or kills a live process. Repo-wide, the only .kill( sites in the SDK are hook-subprocess helpers (harness/unified/subprocess.ts:131, hooks/dispatcher.ts:138,262) — none reachable from cancellation. No run-scoped AbortSignal/PID registry exists. |
| H6 — effect timeouts configured but never enforced | **STILL-VALID** | DEFAULTS.timeout: 120000 and nodeTaskTimeout: 15min (config/defaults.ts:64,68); surfaced in config UX (cli/commands/configure.ts:147,170; config/configValidation.ts:74-76). No deadline field on EffectAction (zero grep hits for "deadline" in runtime/ + tasks/), no enforcement at dispatch. Only *hook* timeouts are enforced (hooks/dispatcher.ts:136-139). |
| H7 — stop-hook re-implements session precedence | **CHANGED — residual** | resolveSessionIdFromInput now prefers hook-input fields and uses AGENT_SESSION_ID as fallback (harness/hooks/stopHookHandler.ts:209-225, env at :218-220; stale-retry against env again at :294-296). But the file still never imports resolveSessionIdWithMarker/resolveAmbientSessionId (zero grep hits), so PID-marker precedence is still bypassed and a leaked AGENT_SESSION_ID still shadows the marker whenever the harness omits the input field. |
| H8 — run:create session bind has no cross-run lock | **CHANGED — residual** | In-process guard added: addRunToSession now throws RUN_ALREADY_ASSOCIATED unless retirePrevious: true (session/write.ts:130-159, guard at :139-146). But the read-modify-write in updateSessionState (session/write.ts:87-116) is still lockless (temp-file rename only, write.ts:48-81); two concurrent *processes* still last-writer-wins. |
| H9 — no verifier requires human-principal root | **CHANGED — residual** | trust-core/src/chain.ts still has no requiredRootKind (zero grep hits for rootKind/human in the file). Human-root checks now exist one layer up: packages/adapters/policy/src/proven-bridge.ts:92-119 (breakpoint answers must chain to a non-revoked, unexpired kind === 'human' trust root) and verify-envelope-trusted.ts:253-257 (root kind must match required kind). Residual: the trust-core chain verifier itself remains kind-agnostic, so any consumer not going through adapters/policy gets no human-root guarantee. |
| H10 — attestation producers unwired / off by default | **CHANGED — residual** | Producers are now *wired but opt-in*. Proxy model-attestation seam: packages/adapters/transport/src/server.ts:1596-1607 (sidecar store + key), enabled only by config.attestationEnabled === true (server.ts:1603) from AGENT_MUX_PROXY_ATTESTATION_ENABLED (transport/src/config.ts:47; default undefined, config.ts:21); streaming sink fails closed to "no attestation" (server.ts:1303-1365). In-process model-decision signing is wired into the genty turn loop: packages/genty/core/src/session.ts:1452-1508 (signInProcessModelDecision at :1463, attach per tool call at :1508) but only when modelAttestationKey is configured (session.ts:1460-1461). Residual: both default OFF; combined with C3's opt-in anchor, the unconfigured platform still runs fully unattested. |
Medium
| ID | Verdict | Fresh evidence at HEAD |
|---|---|---|
| M1 — cancel-vs-complete race → nondeterministic outcome | **STILL-VALID** | Losing committer gets a thrown RunFailedError ("already resolved", runtime/commitEffectResult.ts:35-38; cancellation side :147-149) — not an idempotent typed no-op; no cancel-wins/result-wins precedence defined. The run lock (:25,:139) serializes the two commits but does not make the loser benign. |
M2 — bounded parallel drops undefined results / misaligns | **STILL-VALID** | Result collection filters slot.value !== undefined (runtime/intrinsics/parallel.ts:132-137), so a branch legitimately resolving undefined vanishes and positions shift; first non-pending error throws away sibling pendings (parallel.ts:128-129). |
| M3 — parallel strategies discard sibling errors | **STILL-VALID** | allOrNothing throws only errors[0] (runtime/parallelStrategies.ts:28-30); firstSuccess treats undefined result as failure (:64) and throws only the first error (:75-78). |
| M4 — background commit has no incarnation guard | **STILL-VALID** | createBackgroundEffectRecord (runtime/asyncEffects.ts:78-94) carries no run-incarnation token; nothing rebuilds group state from the journal. |
| M5 — hook timeout SIGTERM-only, waits on close | **STILL-VALID** | Timeout fires SIGTERM (hooks/dispatcher.ts:136-139) then the promise still resolves only on close (:146-153) — a child that ignores SIGTERM with open pipes hangs the commit. Same pattern at :262. No SIGKILL escalation, no detached process-group kill. |
| M6 — crash cleanup uses 24h staleness, not liveness | **CHANGED — residual** | PID-liveness added for *markers*: session/cleanup.ts:4 imports isProcessAlive, applied at :78, dead markers unlinked (:127-141); sessions with a terminal run deactivate promptly (:174-181 via isRunTerminal, :85-109). Residual: a non-terminal run whose owning process died still waits the full STATE_STALE_MS = 24h (cleanup.ts:7, used :179); runState.processId liveness is still not cross-referenced. |
| M7 — PID-marker session id shared across descendants | **STILL-VALID** | Marker path is current-session-<harness>-pid-<ancestorPid> (utils/sessionMarker.ts:49-52) — keyed only by harness ancestor PID; no per-session discriminator. (File moved from session/ to utils/.) |
| M8 — policy gate seams fail open for uncovered actions | **STILL-VALID** | verifyDispatchAuthorization: uncovered dispatch → { allowed: true } (genty/platform/src/harness/internal/createRun/orchestration/policy-dispatch-gate.ts:67-71); error path also returns allowed at :96 region. Covered-set is opt-in, not default-covered. |
Suspected (S)
| ID | Verdict | Fresh evidence at HEAD |
|---|---|---|
| S1 — global unhandledRejection capture can cross runs | **STILL-VALID** | process.on("unhandledRejection", strayEffectHandler) (runtime/orchestrateIteration.ts:86-87, removed :215) — process-global, captures a single stray (capturedStrayEffect), not scoped by AsyncLocalStorage (ALS exists only for process context, runtime/processContext.ts:47). |
S2 — resolveAmbientSessionId(undefined) env-first | **STILL-VALID** | session/discovery.ts:36-39: with no harness argument it returns process.env.AGENT_SESSION_ID directly, bypassing marker resolution. |
| S3 — no guard for un-keyed same-shape conditional skipping | **STILL-VALID** (INFERRED from H2/H3 unchanged; no new runtime assertion found in intrinsics/task.ts). | |
| S4 — ambiguous stop-hook recovery exit path | **STILL-VALID** (INFERRED: the stale-session retry against raw AGENT_SESSION_ID persists, stopHookHandler.ts:294-296). | |
| S5 — spawning lives in harness/subprocess layer, uncoordinated with SDK cancel | **STILL-VALID** | Spawn/kill sites are harness/unified/subprocess.ts:110-140 and hooks/dispatcher.ts:124-153; nothing threads them to effect cancellation (see H5). |
| S6 — brittle checksum canonicalization | **STILL-VALID** | Checksum is over JSON.stringify(eventPayload, null, 2) (storage/journal.ts:77-78) — insertion-order + formatting dependent; no canonical-JSON helper exists. |
Capability gaps (CAP), KIP, tests, hygiene
| ID | Verdict | Fresh evidence at HEAD |
|---|---|---|
| CAP1 — KIP orphaned from genty sessions | **STILL-VALID** | Zero kip-sdk/@a5c-ai/kip imports anywhere under packages/genty (repo-wide grep). Three disconnected memory systems persist: kip-sdk graph repo; genty long-term-memory.json (genty/platform/src/session/memoryExtraction.ts:45-47, mirrored in genty/runtime/src/session/memoryExtraction.ts, consumed only inside the session modules); kradle git AgentMemory (kradle/core/src/agent-memory-{controller,import,query,repository-source-controller}.js). |
| CAP2 — budgets enforced after dispatch, not before | **STILL-VALID** | The budget check lives in applyPostEffectOrchestrationOverlays (genty/platform/src/harness/internal/createRun/orchestration/effects.ts:661); checkBudget runs at :681 on cost *already incurred*; over-budget only sets paused-after-the-fact (:687-695). No estimateEffectCost-style pre-dispatch guard exists. |
| CAP3 — campaigns / scheduler-preemption absent | **STILL-VALID** | Zero campaign/Campaign hits in kradle/core/src, kradle/web, genty/platform/src (case-insensitive grep). No scheduler/preemption entity. |
| CAP4 — improvement outer loop absent | **STILL-VALID** | kip-sdk/src/learn/ exists (compile.ts 242 + index.ts 749 lines) but has no incumbent-comparison/promotion logic (zero hits for promote/incumbent) and no consumer orchestrating history→eval→compare→promote. |
| CAP5 — inference scale-to-zero absent; virtual-model not on infer route | **CHANGED — residual** | Virtual-model matching IS now on the infer route: packages/kradle/web/app/api/orgs/[org]/inference/services/[name]/infer/route.js:36-45 (bridge.matchVirtualModel at :45; 93-line route). Residual: scale-to-zero still absent — zero hits for `minScale |
| CAP6 — session pause/resume/fork/rewind unwired | **CHANGED — residual** | genty/runtime/src/session/rewind.ts and tree.ts exist; their only consumer outside the session module is a CLI export command (genty/cli/src/cli/commands/session/export.ts). The agent loop has a 'paused' *status string* (genty/core/src/loop/types.ts:97) but zero pause handling in genty/core/src/loop/agent-loop.ts (no pause hits). Snapshot-at-step-boundaries / mid-loop pause+persist / resume-context restoration remain unimplemented. |
| KIP-TODO — KeyAuthorization chain / manifest CID / durability | **STILL-VALID** | kip-sdk/src/kip-repo.ts:4063-4075: TODO(M9/T9.6) genesis-manifest CID re-verification "not implemented" (reported true unconditionally), TODO(M9/T9.1-T9.6) authority checking (authorityViolations: [] hardcoded), TODO(M6/M9) durability tiers (empty arrays). |
| TEST1 — kip/kradle/atlas tests not in CI | **CHANGED — residual** | Improved: trust-core tests now gated in ci.yml:177; kradle-core suite gated in publish.yml:565-568 ("Test kradle core") plus kradle e2e+smoke publish.yml:423-424. Residual: root scripts test:kip, test:kradle, test:atlas-catalog-contracts, test:library, test:shared exist (package.json) but are referenced by **no** workflow (repo-wide grep of .github/workflows/*.yml = zero hits); kip-sdk's 114 test files are gated only by the single-file kip-inv12-golden-digest.yml (runs exactly src/__tests__/inv12-golden-digest.test.ts, workflow line 71); atlas is built + graph-verified but its 31 test files are not run by name. |
| TEST2 — no adversarial ledger tests | **STILL-VALID** | "tamper" tests exist only for signed breakpoints (babysitter-sdk/src/breakpoints/__tests__/enforce-signed-breakpoint.test.ts); no journal-tamper/truncation/value-drift tests (consistent with C1/H1/H2 being unfixed — the behavior under test does not exist). |
| HYG1 — no secret redaction in logs/artifacts | **CHANGED — residual** | Partial mitigations landed: task env-var redaction (babysitter-sdk/src/tasks/kinds/index.ts:257-268, applied :64-65), CLI payload redaction behind BABYSITTER_ALLOW_SECRET_LOGS (cli/main/taskCommands.ts:365), transport passthrough header redaction (adapters/transport/src/server.ts:525-550), and live-stack asserts a provider-trace-redacted artifact (live-stack.yml install-mode spec). Residual: the general logging layer packages/adapters/observability/src/logger.ts / logger-simple.ts still has **zero** redact/scrub/mask logic (grep). |
| HYG2 — version-pin drift; krate-sdk vs kradle-sdk | **CHANGED — residual** | krate-sdk naming is gone (zero repo hits) — that half is FIXED. Residual: wildcard workspace deps persist — "@a5c-ai/atlas": "*" (packages/atlas/webui/package.json:16), "@a5c-ai/genty-ui": "*" (genty/desktop-app/package.json:16, genty/web-app/package.json:15), "@a5c-ai/kradle-sdk": "*" (kradle/web/package.json:21). observer-dashboard is at 6.0.3 depending on sdk ^6.0.0 (observer-dashboard/package.json:3,72). |
| HYG3 — DuplicateTaskIdError global-registry footgun | **STILL-VALID** | tasks/registry.ts:39-44 (error class), throw on re-register :50-52. No build-time duplicate-id scan in CI. |
| HYG4 — company-repo Windows-invalid colon paths | **STILL-VALID** | git -C C:/work/company ls-files still tracks docs/LinkedinConnections/Beni/Beni - Connections 1:2.csv and …2:2.csv; on the Windows working tree only Beni Connections.csv exists — the colon-named blobs cannot be checked out on Windows. |
---
3. Functionality wiring per subsystem (what is end-to-end vs orphaned/stubbed)
3.1 adapters (harness gateway family)
- **Wired end-to-end:** hooks family (core+cli+12 per-agent adapters: claude, codex, gemini, copilot, cursor, pi, oh-my-pi, opencode, openclaw, antigravity, hermes, genty —
packages/adapters/hooks/*), core, cli (hosts the live-stack e2e harness underadapters/cli/tests/live-stack/), codecs, transport (model proxy w/ attestation seam), gateway (SQLite control-plane gateway, Node-engine-floor gated in CI), tasks, extensions, triggers, channels, policy, observability. All are built and (except tools/config/launch) test-gated inci.yml/publish.yml(§4). - **Protocol reality (D6 input):** there is **no ACP anywhere** — zero hits for
agentclientprotocol/agent-client-protocol/ACPunderpackages/adapters. The harness-driving layer speaks fabric's own event/hook model; ACP-canonical re-platforming is greenfield, not a refactor of an existing ACP surface. - **No Grok Build support:** the 12 hook adapters (
packages/adapters/hooks/) and the live-stack agent map (live-stack.yml, agents map — claude, codex, pi, gemini, copilot, cursor, hermes, opencode, openclaw, omp, droid, amp, genty, antigravity) contain no grok entry (zero case-insensitive hits repo-wide in adapters + workflows). - **Stub/empty:**
adapters/harness-mock/src/multi-execution.tsis **0 lines** (still, per WS-9);adapters/proxyis a separate Python package (own pyproject/Docker), outside the TS test lattice.
3.2 kradle (control plane)
- **Wired:** 69 controller modules in
kradle/core/src(dispatch, approval, memory, persona, workspace, writeback, secrets, transport-binding, triggers, subagents, gitops, gitea backend, event bus, control/data plane split).kradle/web(Next.js API routes) fronts them, e.g. the inference infer route calling the virtual-model bridge (kradle/web/app/api/orgs/[org]/inference/services/[name]/infer/route.js:36-45). Helm charts (kradle/charts), installer workspace, and jitsi-agent-sidecar exist; publish.yml deploys to GKE (publish.yml:792 deploy_kradle) and runs a live e2e+smoke (publish.yml:423-424) — the GKE cutover completed per the company-repo migration commits. - **Gaps:** campaigns/scheduler-preemption entities absent (CAP3); inference scale-to-zero absent (CAP5 residual);
kradle/sdkandkradle/clihave zero tests (MATURITY-MATRIX.md, kradle-sdk/cli row);kradle/web's 30 spec files are not run by any workflow (kradle-web row + workflow grep). Realtime media plane is control-plane-real/media-stub (seedocs/research/realtime-agent-gaps.md— §5).
3.3 genty (agent runtime + shells)
- **Wired:** core (session/turn loop with in-process attestation seam,
core/src/session.ts:1452-1508), platform (135-test harness package; policy wiring §2 C3/M8), runtime, cli, tui (90 source files), ui (149), web-app (thin shell over ui, Playwright-e2e-gated inci.yml). - **Orphaned/stubbed:** the 7 device shells — desktop-app (10 source files), mobile-android (23), mobile-ios (22), tv-androidtv (18), tv-appletv (16), watch-watchos (25), watch-wearos (22) — remain L0 scaffolds with ~0 tests and no CI gating (MATURITY-MATRIX.md "genty app shells" row). WS-11 disposition is still undecided. Session rewind/tree modules orphaned from the loop (CAP6). Memory extraction writes
long-term-memory.jsonused nowhere outside the session module (CAP1/WS-7). - **Relevant to D2(c):** these shells are exactly what the t3code apps would retire; only web-app has real e2e protection today.
3.4 babysitter-sdk (+ `packages/babysitter` metapackage, `library/`)
- **Wired:** the whole run lifecycle — journal, replay engine, effect index, intrinsics (task/parallel/breakpoint/hook/subprocess/sleep), session management, harness hooks, CLI, breakpoint trust enforcement (
breakpoints/enforce-signed-breakpoint.ts), 173 test files,test:sdk+ architecture gate inci.yml:114-132. - **Core correctness debt:** the entire §2 C1/H1–H6/M1–M5/S1–S6 cluster lives here and is essentially untouched since 2026-09-14.
library/(processes/methodologies/skills) ships in-repo;test:library/test:sharedscripts are not CI-wired (workflow grep).
3.5 kip-sdk
- Substantial, isolated: 7,005-line
kip-repo.ts, learn/, miner/, rdf/, mcp/, 114 test files. **Zero consumers in genty/kradle/adapters** (CAP1). Security TODOs open (KIP-TODO,kip-repo.ts:4063-4075). CI gate = one golden-digest test file (kip-inv12-golden-digest.yml:71).
3.6 atlas
- Graph catalog consumed by effectively the whole adapters family (
"@a5c-ai/atlas"in adapters channels/codecs/core/extensions + every hooks adapterpackage.json); built early in every CI lane; webui deployed (publish.yml:646 deploy_atlas_webui). Its 31 in-package tests andtest:atlas-catalog-contractsare not invoked by any workflow. The hardcoded-literals backlog (~201 harness literals that should derive from the graph) is still the standing atlas-adoption gap (docs/hard-coded-and-should-be-in-graph-gaps-backlog.md).
3.7 trust-core
- Wired as a dependency of adapters/{core,policy,tools,transport} and genty/core (package.json deps), tests gated (
ci.yml:177). Only 8 test files. Chain verifier still kind-agnostic (H9 residual).
3.8 observer(-dashboard)
- Next.js dashboard + CLI at v6.0.3; 105 test files; own CI job (
ci.yml:459 observer-dashboard,test:observeratci.ymlstep ~line 498) +publish.yml validate_observer_and_compiler:578. Playwright e2e config exists in-package (observer-dashboard/playwright.config.ts,e2e/) — not seen invoked in ci.yml's observer job (INFERRED ungated).
3.9 commander (apps/commander)
- Rich operator board (51 test files, Playwright e2e in-package) that **runs entirely on a mocked, seeded backend by design**: "v5 runs entirely on a mocked, seeded, deterministic backend — but every frame mirrors the real gateway/kradle/babysitter contracts" (
apps/commander/README.md, intro paragraph;SPEC-LIVE-BACKEND.mdexists as the unbuilt plan). **No workflow references commander at all** (grep of.github/workflows/= zero hits). It is the largest fully-orphaned functional surface in the repo: real UI, no live wiring, no CI.
3.10 Remote access (D12 pre-check)
- **CONFIRMED absent:** zero hits for
tailscale,cloud relay,cloudrelayinpackages/(ts/js, excluding node_modules/dist). No ssh-tunnel/hosted-relay story exists anywhere in fabric. The D12 guaranteed gap is real, not just decreed.
---
4. Test/CI reality
4.1 What actually gates PRs (`ci.yml`, jobs at :15, :54, :319, :372, :459)
docs-quality— docs QA gates.test(Lint, Tests, Package): SDK lint (:82-85), metadata verify, release-tooling tests, binary-rename guardrail, metapackage shim tests, architecture boundary gate (:114-117),test:sdk(:129-132), tasks-adapter tests + packaged-surface parity (:139-154), hooks-adapter tests, **trust-core + policy-adapter + tools-adapter tests** (:171-183), triggers unit/e2e/coverage, genty-tui + comm-adapterverify:release, realtime-flow tests, **genty-web-app Playwright browser e2e** (step "adapters webui browser e2e"), extensions tests, **genty-core + genty-platform tests**, plugin-bundle generation.gateway-node-engine— adapters-gateway tests on a Node version matrix + engine-floor test (:319-).workspace-coverage— transport-adapter build/lint/typecheck/test + migration scorecard, cloud workspacetest:cloud/verify:cloud-release(:372-457).observer-dashboard— build +test:observer(:459-505).
4.2 What gates releases (`publish.yml` jobs: lint:39, build_all:68, validate_core:203, validate_mux:276, validate_cloud:457, validate_kradle:517, validate_observer_and_compiler:578, deploy_atlas_webui:646, deploy_kradle:792, deploy_staging_cloud:1285)
- Adds: kradle-core node:test suite (
:565-568), kradle live e2e + smoke against the deployed stack (:423-424), cloud release verification, GKE deploys.
4.3 Live per-harness e2e (the strongest thing fabric has)
live-stack.yml(push + dispatch): builds everything, then a matrix over an **agent map of 14 harnesses** — claude(-code), codex, pi, gemini(-cli), copilot(-cli), cursor(-cli), hermes, opencode, openclaw, omp, droid, amp, genty, antigravity (agents map inside the Compute Matrix job) — × models (gpt-5.5, gemini-3.1-pro/3.5-flash, claude-sonnet-4-6) × install modes (vanilla / babysitter-plugin) × interaction modes, asserting per-lane artifacts (adapters-events,transport-adapter-trace,provider-trace-redacted, trace ids). Push defaults exercise claude-code, codex, pi, antigravity + the genty runtime-cli lane.live-stack-published.ymlre-validates the *published* plugin (documented marketplace install lanes), plusfailure-triage-live-stack.yml,live-stack-gardening.yml,qa-daily.yml.- **Status vs D7's six required harnesses** (per
MATURITY-MATRIX.mdper-agent rows, 2026-08-13, cross-checked against the workflow map): Claude Code GREEN, Codex GREEN, Cursor failing (#562), OpenCode skipped/failing, Antigravity failing (#945; active churn — HEAD~718e5a7de8fixes antigravity hook mappings), **Grok Build entirely unsupported (no adapter, no lane)**.
4.4 Per-package suites and the gating holes
Test-file counts at HEAD (find *.test.*|*.spec.*, excluding node_modules/dist): babysitter-sdk 173 · adapters 353 · genty 251 · kradle 130 · kip-sdk 114 · observer-dashboard 105 · commander 51 · atlas 31 · trust-core 8.
Ungated at HEAD (script exists / files exist, no workflow invokes them — all CONFIRMED by workflow grep unless noted): 1. test:kip (kip-sdk full 114-file suite; only INV-12 golden digest gated). 2. test:kradle root script (kradle gated only via publish.yml, not PR CI). 3. test:atlas-catalog-contracts + atlas's 31 tests. 4. test:library, test:shared (process library). 5. genty-runtime (19 tests), genty-cli (10), genty-ui (18) — built only (MATURITY-MATRIX rows; matrix cross-checked accurate on method). 6. kradle-web 30 spec files — image built, tests never run. 7. adapters-tools 6 tests — not in any test enumeration. 8. apps/commander — 51 test files + Playwright, zero workflow references. 9. genty device shells — nothing to run (L0).
- adapters-config / adapters-launch / kradle-sdk / kradle-cli: zero test files at all.
4.5 Whole-platform e2e (D7(b) input)
What exists: live-stack "documented install" lanes (published plugin install → run → hook load, 3 OS), kradle deployed-stack e2e + smoke (publish.yml:423-424), g0-rt-jitsi-e2e.yml (meeting-agent dispatch), e2e-tests/ fixture projects driven by test:e2e:live-stack:*. What does **not** exist: a single flow asserting *packaged install → create run → dispatch → agent session → journal → UI assertions* — the UI ends (observer, kradle-web, commander) are never asserted inside any live lane (observer/kradle-web/commander gating status above; live-stack asserts artifacts and traces, not UI state).
---
5. Pre-existing gap docs absorbed (reference these; do not re-derive)
| Doc | What it is / standing value |
|---|---|
MATURITY-MATRIX.md | Per-component test-gating grades L0–L4 with workflow-line evidence (2026-08-13). Use as the baseline for 30-testing.md; §4 above refreshes its deltas (trust-core now ci-gated; live-stack agent map now 14). |
docs/agent-layer-gaps.md | 386-line inventory: 47 agent-core gaps (no streaming, no multi-turn history, token usage discarded, browser tool fragile, …) + runtime/platform/adapter gaps. Feeds 20-functionality-coverage genty/agent-layer work packages. |
docs/atlas-library-gaps.md | Graph↔library coverage report (2026-05-07): 456/456 skill-areas connected; 29 roles intentionally skipped. Mostly CLOSED — cite as done, don't respec. |
docs/hard-coded-and-should-be-in-graph-gaps-backlog.md | ~201 hardcoded harness literals that should derive from the atlas graph (per-category counts + severities). Open architectural debt relevant to both t3code migration seams and coverage spec. |
docs/research/realtime-agent-gaps.md | Voice/video harness register (2026-06-23): control plane real, media plane stub; G0 socket client DONE, live meeting dispatch proven, current blocker cluster capacity. Coverage-spec input for the realtime lane. |
docs/harness-features-backlog/gaps/ | 149 gap files across 22 categories (delegation, breakpoints, observability, remote-integration, session-management, …). The canonical fine-grained backlog; the coverage spec should absorb by category reference, not duplicate. |
docs/genty-features-backlog-updated/gap-status-matrix.md | 165 rows, **all marked CLOSED** — the genty features backlog claims full closure. Treat CLOSED claims as *claims*: spot-verified only via the phase2/3 correction files next to it. |
docs/adapters/terminology-and-structure-gaps/ | Rename mechanics (packages, binaries, env vars, dirs). OUT of scope per D14 — cite only to *exclude*. |
docs/v6-spec-and-roadmap/ (incl. current-state.md) | Prior architecture/roadmap docs; superseded in authority by this spec effort but useful for package-spec history. |
company/products/platform/PLATFORM-REMEDIATION-AND-RENAME-ROADMAP.md | The prior program roadmap (WS-1…WS-11 remediation + RN rename track) whose Appendix A register §2 refreshes. WS-1–WS-6 (ledger/replay/attestation/exec-control/session/parallel) map ~1:1 onto surviving findings. |
---
6. CONFIRMED vs INFERRED summary
- CONFIRMED: every table row in §2 except S3/S4 (marked INFERRED inline); all §3 wiring claims (each backed by a grep/read cited above); all §4 gating claims (workflow files read; script-to-workflow greps run at HEAD).
- INFERRED (flagged): S3, S4 still-valid (from unchanged surrounding code); observer-dashboard Playwright e2e ungated (config exists, no invoking step found); MATURITY-MATRIX per-agent GREEN/FAIL statuses are the repo's own 2026-08-13 evidence, not re-run live for this dossier.
---
Spec inputs
Concrete facts the spec authors MUST build on:
1. **Audit refresh outcome (D8):** 24 of 34 register findings STILL-VALID, 10 CHANGED-with-residual, 0 fully FIXED. The survivor set to absorb into 20-functionality-coverage.md as work packages: C1, C2, C3, H1–H6, M1–M5, M7, M8, S1–S6, CAP1–CAP4, KIP-TODO, TEST2, HYG3, HYG4 (still-valid) **plus** the residuals of H7, H8, H9, H10, M6, CAP5, CAP6, TEST1, HYG1, HYG2 (each residual is stated verbatim in §2 and is the work-package objective). 2. **Ledger cluster is untouched:** no checksum verification on load (storage/journal.ts:151-161), no signing (:72-82), no hash chain, canonicalization = JSON.stringify(…, null, 2) (:77). Any provenance claim in specs must treat WS-1 as open. 3. **ACP is greenfield (D6):** zero ACP code exists in packages/adapters. The migration spec re-platforms fabric's bespoke event/hook model onto ACP; there is no partial ACP surface to extend. 4. **Harness surface today:** 12 hook adapters (claude, codex, gemini, copilot, cursor, pi, oh-my-pi, opencode, openclaw, antigravity, hermes, genty); live-stack matrix maps 14 agent ids. **Grok Build requires a brand-new adapter + lane** (D7(a)). Cursor/OpenCode/Antigravity lanes exist but are red/skipped (#562, —, #945). 5. **Whole-platform e2e gap (D7(b)):** no lane asserts packaged-install → run → dispatch → session → journal → **UI**; observer-dashboard e2e, kradle-web specs (30 files), and commander (51 files) are all CI-orphans. 6. **Unit-floor gaps (D7(c)):** ungated suites enumerated in §4.4 (kip 114 files, atlas 31, genty-runtime/cli/ui 47, kradle-web 30, adapters-tools 6, commander 51, test:library/test:shared); zero-test packages: adapters-config, adapters-launch, kradle-sdk, kradle-cli; empty file adapters/harness-mock/src/multi-execution.ts (0 lines). 7. **genty shell retirement (D2c):** device shells are 10–25 source files each, L0, ungated — retirement in favor of t3code apps destroys almost no tested functionality; only genty/web-app (Playwright-gated) and genty/ui/tui carry real surface to preserve or map. 8. **Remote access (D12):** zero ssh-tunnel/tailscale/relay code in fabric — the hosted-remote-access work package starts from nothing. 9. **Commander is contracts-complete but mock-only** (apps/commander/README.md; SPEC-LIVE-BACKEND.md unbuilt) — a candidate work package: wire to the live gateway/kradle or descope. 10. **Memory story is still three-way split (WS-7 decision pending):** kip-sdk (no consumers), genty long-term-memory.json (session-module-local), kradle AgentMemory controllers (live). The coverage spec must force the ADR. 11. **Attestation posture:** producers exist but everything is opt-in (POLICY_CONFIG_ROOT_FP, AGENT_MUX_PROXY_ATTESTATION_ENABLED, modelAttestationKey); uncovered dispatches allowed by design (policy-dispatch-gate.ts:67-71). Default-covered/fail-closed flip (WS-3) is unshipped. 12. **Budget enforcement is post-hoc** (orchestration/effects.ts:661,681); campaigns/scheduler/preemption and inference scale-to-zero absent; virtual-model routing on the infer route landed (infer/route.js:36-45). 13. **CI job map to modify for 30-testing.md:** ci.yml jobs {docs-quality:15, test:54, gateway-node-engine:319, workspace-coverage:372, observer-dashboard:459}; publish.yml validate jobs {core:203, mux:276, cloud:457, kradle:517, observer_and_compiler:578}; live workflows {live-stack.yml, live-stack-published.yml, g0-rt-jitsi-e2e.yml, kip-inv12-golden-digest.yml, qa-daily.yml}. 14. **Version hygiene residue for packaging spec:** wildcard "*" workspace deps at atlas/webui/package.json:16, genty/desktop-app/package.json:16, genty/web-app/package.json:15, kradle/web/package.json:21. 15. **Pre-existing gap corpora to reference (not duplicate):** the nine docs in §5, especially docs/harness-features-backlog/gaps/ (149 files) and docs/agent-layer-gaps.md for the coverage spec, and MATURITY-MATRIX.md for the testing spec baseline.