Skip to content

feat: build the native macOS evidence workbench - #203

Closed
sarthakagrawal927 wants to merge 38 commits into
mainfrom
feat/native-macos-evidence-workbench
Closed

feat: build the native macOS evidence workbench#203
sarthakagrawal927 wants to merge 38 commits into
mainfrom
feat/native-macos-evidence-workbench

Conversation

@sarthakagrawal927

Copy link
Copy Markdown
Member

Summary

  • builds the AppKit/SwiftUI macOS Evidence Workbench on the shared Rust verification core while keeping Tauri operational
  • synchronizes native UI, CLI, MCP, capability glossary, receipts, testing, performance, settings, runs, and Repo Unpack contracts
  • adopts bounded external quality, test-result, performance, MCP, and local collector integrations without ceding verdict authority
  • adds independent Claude/Codex cross-review with fail-closed reconciliation and a reproducible 27-case provider benchmark
  • adds deterministic 35-state owner-review evidence, background-safe native checks, package/readiness inspectors, and protected production qualification

Evidence

  • Rust: 1,068 passed, 31 ignored; CLI 34 passed; main 5 passed; MCP stdio 3 passed
  • frontend: 680 passed, 1 skipped; 20 live warm scenarios passed
  • native local: 83 Swift package tests and Debug app build passed through XcodeBuildMCP
  • cross-review corpus: Claude 29/29 labels, Codex 28/29, union 29/29; union remains optional because it emitted 99 findings and averaged 187.5 seconds/case
  • Linux CI succeeded on run 33635216889
  • hosted native retry passed background/render gates and 9/10 XCUITests; the remaining segmented-control assertion was replaced with the resulting contract-state assertion on this final head

Release boundary

This PR is intentionally draft. It does not merge, release, retire Tauri, publish an updater, or claim production signing/notarization. Protected native production qualification correctly stops while the eight Apple/Sparkle repository secrets are absent. Owner visual acceptance and the final exact-head hosted run remain gates.

Tracks #193, #198, #199, #200, #201, and #202.

sarthakagrawal927 and others added 30 commits August 30, 2026 13:39
knip:strict runs in CI (ci.yml "Code health") but was analyzing zero files:
knip.json declared root-relative entry paths while pnpm-workspace.yaml sets
packages: apps/*, so knip resolved the apps as separate workspaces and every
entry/project pattern matched nothing. `knip --reporter json` returned
{"issues":[]}. The unused-code gate has been passing vacuously.

Rewrite the config workspace-aware (., apps/desktop, apps/landing-page-astro)
and strip the suppression that hid real findings — ignoreDependencies drops
from ~24 entries to 2, and the blanket ignore list is gone entirely.

With the gate live it reported six genuinely unused dependencies, verified by
hand as having zero imports anywhere in the desktop app. They were invisible
because the old config named @xterm/* and react-resizable-panels in
ignoreDependencies. They are leftovers from the removed agent terminal UI.

ignoreIssues now whitelists the warm-verification / scenario-compiler contract
modules file-by-file rather than by directory glob, so a new dead module in
those directories still fails the gate. Verified by canary: adding an unused
export is detected.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
.impeccable/ and .claude/projects/ had zero inbound references anywhere in the
repo — they are local tool output, not shared repo content. Untrack them (kept
on disk) and gitignore them.

.claude/settings.local.json was tracked despite already being listed in
.gitignore. Its contents are stale per-developer state: every path points at
/Users/sarthakagrawal/Desktop/code-reviewer/ with a packages/ + workers/
layout that no longer exists, plus Vercel permissions from before the move to
Cloudflare Pages.

research/ held one real document — a survey of codebase-context tooling — so
move it to docs/knowledge/ with the frontmatter check-docs.mjs requires rather
than dropping it.

Also drop gitignore entries for a layout that no longer exists: the
"Action runtime bundle" dist/* + !dist/index.js pair (there is no action.yml
in this repo), packages/*, workers/* and .vercel. dist/* becomes dist/ rather
than being deleted, since it matches at any depth and is what keeps
docs-site/dist and apps/landing-page-astro/dist out of the index.

This commit also carries the gitignore lines for the corpus and evidence moves
in the two commits that follow, since they share one file.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
benchmark/ and benchmarks/ differed by a single character while holding
different things: the public hand-labeled catch-rate corpus, and the internal
evaluation corpora (agent-prs, agent-tasks, runtime-challenges, context-*,
performance-lab). Move the former to benchmarks/public-catch-rate/ so there is
one corpus root and no singular/plural ambiguity.

The published surface is unchanged. scripts/generate-benchmark-dataset.mjs
still emits apps/landing-page-astro/public/benchmark/codevetter-benchmark-v1.json
and the site still serves /benchmark/... — only the repo-root source directory
moved. Verified: pnpm bench:public scores all 27 cases from the new path, the
generator reads it, and the Astro build produces all 24 pages.

Deliberately not rewritten: the pinned-SHA GitHub raw URLs in Bento.astro
(they resolve against commit 006c2e5, where the old path still exists), the
public /benchmark/ URLs in agent-markdown.ts and benchmark.astro, and
docs/development/performance.md's --target benchmark/parser.mjs, which is an
unrelated perf example rather than the corpus.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… root

Evidence was spread across four locations: artifacts/, .fleet/evidence/,
.fleet/design-reviews/, and apps/desktop/artifacts/. The split was actively
lossy — .fleet/evidence/landing-audit/ held the scorecard and performance
report while artifacts/design/landing-audit/ held the screenshots of the same
audit. They now sit together.

artifacts/ also had two incompatible jobs: committed design evidence, and the
scratch output path the docs tell users to write to (--out artifacts/... in
docs/development/verification-receipts.md, benchmark.md and performance.md).
Splitting them resolves that — artifacts/ is now gitignored scratch, and those
existing doc examples become correct rather than ambiguous.

Layout:
  evidence/design/      screenshots, landing-audit, changelog, probes, reviews
  evidence/performance/ performance-lab results and manifests
  evidence/reviews/     PR review captures

All moves use git mv so rename history survives.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The documented structure had drifted from the tree:

- agents.md's "Repo structure" block omitted benchmarks/, artifacts/,
  docs-site/ and research/, and listed benchmark/ which has moved.
- README.md's "Monorepo Structure" listed openspec/, which does not exist.
- Both agents.md and docs/development/docs.md placed blume.config.ts at the
  repo root. It actually lives at docs-site/blume.config.ts.

Also state the artifacts/ vs evidence/ split so the convention is discoverable
rather than folklore.

Verified with node scripts/check-docs.mjs (77 files, no broken links).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The scan covered sk-, ghp_, gho_, AKIA, AIzaSy, xoxb- and PEM headers but not
pk_, so the projectKey committed in foundry.json never tripped it. Add a
pk_[A-Za-z0-9]{32,} pattern so this class of key cannot leak again.

foundry.json is excluded for now, with a comment saying why: the key already in
it predates the pattern, and blocking every push until it is rotated would be
worse than tracking it. That exclusion should be removed once the key is
rotated at the provider and moved out of the tracked file — redacting it now
would not unpublish it, since it is already in committed history.

Also repoints the corpus exclusion at benchmarks/public-catch-rate/.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Bank the tooling research so it survives the session that produced it. Four
category pages plus a hub, all reachable from docs/index.md:

- tooling-decisions.md — adopt/reject summary and the constraints behind it
- tooling-secrets-and-supply-chain.md
- tooling-coverage.md
- tooling-agent-benchmarks.md
- tooling-documentation.md — the DeepWiki reject

Findings are dated 2026-08-30 and cite primary sources. Items the research
could not confirm are marked UNVERIFIED rather than stated as fact — notably
Devin/ACU pricing (429s on fetch), Socket pricing (403s), and whether
Grype/Syft carry telemetry.

Also adds a failed-approaches entry for the reason this was needed: the
DeepWiki question was researched twice, in April and August 2026, reaching the
same verdict both times, because the April survey sat in a top-level research/
directory that nothing linked to and check-docs never validated. That file is
now in docs/knowledge/ and indexed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ation

Completes the tooling research the first agent died before delivering. Adds
tooling-sandboxing.md and wires it into the hub and index.

Recommendation: libkrun (Apache-2.0, Rust, Hypervisor.framework) embedded
in-process in src-tauri/, with apple/containerization as the upgrade path once
a Swift sidecar is acceptable — it is the only option with native VM state
save/restore, the actual warm-start mechanism.

Three findings that overturn common assumptions, all recorded:
- Firecracker and gVisor do not run on macOS at all (KVM / Linux platforms
  only). Any plan built on them is dead on arrival.
- Docker Desktop is a licensing gate, not just an install burden — free only
  under 250 employees AND under $10M revenue.
- CodeQL is legally disqualified for this product: its license forbids use on
  non-open-source codebases and automated analysis without paid GHAS, and
  CodeVetter exists to run against private repos.

Also notes that Semgrep's engine (LGPL-2.1) and its registry rules (a separate
restrictive license forbidding redistribution) are licensed differently, and
that observability needs no new dependency — the existing SQLite tables cover
per-run cost and latency.

Open questions are marked UNVERIFIED, notably the Virtualization.framework
entitlement question, which needs a direct check against Apple's docs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
agents.md still advertised "Nav (7 tabs)" including Work (/agents) and Board
(/board). Both were retired on 2026-08-16 — docs/product/surfaces.md records
the retirement audit — and App.tsx now redirects them to "/". The sidebar ships
six tabs, and Performance (/performance) was missing from the list entirely.

This is the same block corrected earlier in this branch for repo structure; the
nav line three rows below it was missed on that pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Implements the Swift/AppKit migration, Rust parity bridges, deterministic owner evidence, package qualification, and isolated hosted acceptance workflow for #201.
Route opt-in native qualification through the existing CI dispatcher until the reusable workflow reaches the default branch.
This was referenced Sep 2, 2026
@sarthakagrawal927

Copy link
Copy Markdown
Member Author

Superseded by the dependency-ordered, policy-compliant draft stack in #204 through #238. The top tree is byte-identical to this qualified snapshot; closing this oversized draft avoids duplicate CI and review state. No merge, release, signing, notarization, or cutover was performed.

@sarthakagrawal927

Copy link
Copy Markdown
Member Author

Stack update: the independent Claude review found a real CLI shutdown/process-tree bug. The correction is isolated in draft PR #240, so the complete review stack is now #204 through #240 (37 bounded layers). No layer has been merged or released.

@sarthakagrawal927

Copy link
Copy Markdown
Member Author

Stack correction: PR #239 was closed as superseded after moving the Cargo test-module fix to its first affected layer (#220/#227). The active bounded stack is #204 through #238, followed by #240 as layer 36/36. No layer has been merged or released.

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.

2 participants