Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
f7721d4
feat: produce schema-v2 conformance evidence
BunsDev Aug 30, 2026
fecc723
fix: bind schema-v2 evidence to observed checks
BunsDev Aug 30, 2026
fa0d656
test: bind runtime validator handoff
BunsDev Aug 30, 2026
3e73689
style: normalize validator test imports
BunsDev Aug 30, 2026
5307d82
fix: bound large operator state snapshots
BunsDev Aug 30, 2026
2dc5daa
fix: snapshot oversized operator homes safely
BunsDev Aug 30, 2026
0cee696
fix: snapshot operator symlinks without traversal
BunsDev Aug 30, 2026
eb1b45b
fix: bound deep operator state traversal
BunsDev Aug 30, 2026
4040ad7
fix: cover large heterogeneous operator trees
BunsDev Aug 30, 2026
fd1eaf1
fix: isolate schema-v2 observation test sockets
BunsDev Aug 30, 2026
2beb84e
fix: align Chat with passing Cave authority
BunsDev Aug 30, 2026
409ba37
fix: preserve private evidence failure causes
BunsDev Aug 30, 2026
68e7aad
fix: verify packed consumer from producer checkout
BunsDev Aug 30, 2026
65d509b
fix: clean native custody through production forget
BunsDev Aug 30, 2026
90fa37a
fix(conformance): isolate macOS keychain evidence
BunsDev Aug 30, 2026
6534427
fix(conformance): harden isolated keychain mode
BunsDev Aug 30, 2026
2ef4d47
fix(conformance): bind observed test results
BunsDev Aug 30, 2026
704c264
fix(conformance): execute complete observed checks
BunsDev Aug 30, 2026
e5bcc19
fix: harden Phase 1 real-authority conformance (#41)
BunsDev Aug 30, 2026
b236604
feat: integrate schema-v2 conformance evidence
BunsDev Aug 30, 2026
8dda64a
chore: pin integrated Phase 1 harness authority
BunsDev Aug 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
scripts/phase1-conformance-launcher.sh text eol=lf
scripts/phase1-conformance-launcher.ps1 text eol=lf
220 changes: 198 additions & 22 deletions .github/workflows/ci.yml

Large diffs are not rendered by default.

77 changes: 77 additions & 0 deletions .github/workflows/client-v1-conformance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
name: client-v1 conformance
on:
workflow_dispatch:
inputs:
validator_revision:
required: true
type: string
permissions:
contents: read
jobs:
platform-conformance:
name: platform-conformance (${{ matrix.platform }})
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
- platform: darwin-arm64
runner: macos-14
- platform: linux-x64
runner: ubuntu-24.04
- platform: win32-x64
runner: windows-2025
runs-on: ${{ matrix.runner }}
environment: client-v1-conformance
permissions:
attestations: write
contents: read
id-token: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
ref: ${{ github.sha }}
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: 24.18.1
- uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86
with:
version: 10.34.0
- name: Install frozen dependencies
run: corepack pnpm@10.34.0 install --frozen-lockfile --ignore-scripts
- name: Set up frozen Rust
run: rustup toolchain install 1.95.0 --profile minimal && rustup default 1.95.0
- name: Install frozen Linux Secret Service
if: matrix.platform == 'linux-x64'
run: node scripts/phase1-linux-secret-service.mjs --install
- name: Require frozen toolchain
run: 'node --input-type=module --eval "import { execFileSync } from ''node:child_process''; const run = (command, args) => execFileSync(command, args, { encoding: ''utf8'' }).trim(); if (process.version !== ''v24.18.1'' || ''pnpm@'' + run(''pnpm'', [''--version'']) !== ''pnpm@10.34.0'' || !run(''rustc'', [''--version'']).startsWith(''rustc 1.95.0 '') || run(''pnpm'', [''exec'', ''tauri'', ''--version'']) !== ''tauri-cli 2.11.4'') throw new Error(''Frozen toolchain does not match'');"'
- name: Verify frozen harness bytes
run: 'node --input-type=module --eval "import { createHash } from ''node:crypto''; import { lstatSync, readFileSync } from ''node:fs''; const path = ''scripts/phase1-conformance.mjs''; const stats = lstatSync(path); const bytes = readFileSync(path); if (!stats.isFile() || stats.isSymbolicLink() || bytes.byteLength !== 186989 || createHash(''sha256'').update(bytes).digest(''hex'') !== ''a94b76d45f23c4ad1fabf9e08c188c5da3d044e1aa8c1cc2cf1db269df0c3607'') throw new Error(''Frozen harness bytes do not match'');"'
- name: Produce platform evidence
shell: bash
env:
OPENCOVEN_VALIDATOR_REVISION: ${{ inputs.validator_revision }}
run: if [[ "${{ matrix.platform }}" == "linux-x64" ]]; then bash scripts/phase1-linux-secret-service.sh --validator-revision "$OPENCOVEN_VALIDATOR_REVISION" --platform "${{ matrix.platform }}" --output ".artifacts/client-v1-conformance-${{ matrix.platform }}.json"; else node scripts/phase1-conformance.mjs --validator-revision "$OPENCOVEN_VALIDATOR_REVISION" --platform "${{ matrix.platform }}" --output ".artifacts/client-v1-conformance-${{ matrix.platform }}.json"; fi
- name: Validate canonical platform record
run: 'node --input-type=module --eval "import { lstatSync, readFileSync } from ''node:fs''; const sort = (value) => Array.isArray(value) ? value.map(sort) : value !== null && typeof value === ''object'' ? Object.fromEntries(Object.keys(value).sort().map((key) => [key, sort(value[key])])) : value; const path = process.argv[1]; const stats = lstatSync(path); const text = readFileSync(path, ''utf8''); const value = JSON.parse(text); if (!stats.isFile() || stats.isSymbolicLink() || stats.size < 1 || stats.size > 1048576 || value === null || Array.isArray(value) || value.schemaVersion !== 2 || value.platform !== process.argv[2] || JSON.stringify(sort(value), null, 2) + ''\n'' !== text) throw new Error(''Platform record is not canonical'');" ".artifacts/client-v1-conformance-${{ matrix.platform }}.json" "${{ matrix.platform }}"'
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: client-v1-conformance-${{ matrix.platform }}
path: .artifacts/client-v1-conformance-${{ matrix.platform }}.json
if-no-files-found: error
retention-days: 30
overwrite: false
include-hidden-files: true
- uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8
with:
subject-path: .artifacts/client-v1-conformance-${{ matrix.platform }}.json
aggregate-conformance:
name: aggregate-conformance
needs: platform-conformance
runs-on: ubuntu-24.04
permissions: {}
steps:
- name: Confirm protected evidence matrix
run: echo "protected evidence matrix completed"
25 changes: 15 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,10 @@ write-oriented design exploration.
The native host now uses the reviewed `hpke-bound-v1` request and response
binding, and production Coven health uses the producer-backed native adapter.
The immutable runtime gate is documented in
[`docs/phase1-conformance.md`](docs/phase1-conformance.md). It deliberately
reports `blocked` rather than substituting mocks when a locked producer does
not expose a required compatibility or real-keychain fault fixture. Release
evidence still requires complete real-authority runs on the frozen platform
matrix.
[`docs/phase1-conformance.md`](docs/phase1-conformance.md). It emits only
complete SDK #38 platform records and never substitutes mocks for missing
release assertions. Release evidence still requires complete real-authority
runs on the frozen three-platform matrix.

## Prerequisites

Expand Down Expand Up @@ -89,9 +88,10 @@ pnpm exec playwright install chromium
| `pnpm test:e2e` | Run Playwright smoke coverage against a dedicated local preview server on `127.0.0.1:4174` |
| `pnpm test:native-e2e` | Run the feature-gated native RPC subprocess integration tests |
| `pnpm test:contract-canary -- --sdk-root <sdk-root> --cave-root <cave-root>` | Verify reviewed clean checkouts, frozen SDK artifact digests, isolated packed imports, and the Cave authority fixture |
| `pnpm test:phase1-conformance` | Package the revisions in `phase1-conformance.lock.json`, run the real Cave/native/Coven matrix, and retain one secret-scanned JSON report |
| `/bin/sh scripts/phase1-conformance-launcher.sh "$(command -v node)"` | Exercise the exact locked release through the trusted non-Node launcher and retain one SDK-compatible platform record |
| `pnpm cargo:fmt` | Verify Rust formatting |
| `pnpm cargo:check` | Run Rust compile checks |
| `pnpm cargo:check:windows-gnu` | Check all Rust targets for `x86_64-pc-windows-gnu` |
| `pnpm cargo:clippy` | Run Rust lint checks with warnings denied |
| `pnpm cargo:test` | Run Rust smoke tests |
| `pnpm app:dev` | Start the Tauri desktop scaffold in development |
Expand Down Expand Up @@ -172,9 +172,14 @@ Local explicit-root canary runs still use
and the script rejects staged, unstaged, or untracked changes before it
verifies that the checked-out HEADs match the tracked lock.

`phase1-conformance.lock.json` independently pins Chat, SDK, Cave, and Coven
for the packaged real-authority gate. It does not replace or loosen the Phase 0
canary lock.
`phase1-conformance.lock.json` independently pins Chat, the SDK package
candidate and evidence authority, Cave, Coven, and the canonical package
metadata for the real-authority gate. The protected
`.github/workflows/client-v1-conformance.yml` schema-v2 producer takes its
separate immutable SDK validator revision as a required dispatch input, avoiding
a circular pin while retaining both the strict schema-v1 gate and canonical
schema-v2 platform records. Neither replaces or loosens the Phase 0 canary
lock.

## CI coverage

Expand All @@ -189,7 +194,7 @@ canary lock.
- the cross-repository packed-tarball contract canary with explicit SDK and Cave checkouts pinned by `contract-canary.lock.json`
- the macOS packaged real-authority matrix with exact counterpart checkouts
pinned by `phase1-conformance.lock.json`, an isolated keychain, and a
secret-scanned JSON report
secret-scanned SDK platform record
- Rust `fmt`, `check`, `clippy`, and `test`

The Tauri capability schema at `src-tauri/gen/schemas/desktop-schema.json` is
Expand Down
4 changes: 2 additions & 2 deletions contract-canary.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,12 @@
},
"cave": {
"repository": "OpenCoven/coven-cave",
"revision": "2a0ff9237e94e652e477b22f60fd6d721b9e6451",
"revision": "6325fc4c1154c7d7398074a9760a2e2dc323b424",
"artifacts": {
"contractFixture": {
"path": "src/lib/server/client-v1/contract-fixture.json",
"digestPath": "src/lib/server/client-v1/contract-fixture.sha256",
"sha256": "1b78125dab5b77414efd2d34e13315f542b197715ed26c6521f588e299abe61d"
"sha256": "c0b1af2442409f8b26bbf0cf2a5fac467d23e5f56d2c966a9428c4b3e830a186"
},
"hpkeVectors": {
"path": "src/lib/server/client-v1/hpke-bound-v1-vectors.json",
Expand Down
27 changes: 16 additions & 11 deletions docs/developer-toolchains.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,11 @@
dependency.
- Run the local canary with
`pnpm test:contract-canary -- --sdk-root <sdk-root> --cave-root <cave-root>`.
- Run the packaged real-authority matrix with
`pnpm test:phase1-conformance`. Its independent
`phase1-conformance.lock.json` pins Chat, SDK, Cave, and Coven; the harness
creates exact clean detached clones rather than trusting the source
- Run the packaged real-authority matrix through the trusted outer launcher:
`/bin/sh scripts/phase1-conformance-launcher.sh "$(command -v node)"`. Its independent
`phase1-conformance.lock.json` pins Chat, the SDK package candidate, Cave,
Coven, all four frozen SDK artifacts, and the SDK evidence authority; the
harness creates exact clean detached clones rather than trusting source
repositories' current branches.
- CI reads `contract-canary.lock.json`, checks out those exact reviewed SDK and
Cave revisions, rejects dirty SDK or Cave checkouts, and verifies the
Expand All @@ -98,18 +99,22 @@
permissions for the `main` window.
- No shell, filesystem, opener, or network plugin permissions are configured.
- The feature-gated `phase1-native-rpc` binary is a headless conformance-only
NDJSON bridge. It is excluded from default Cargo and Tauri builds, uses an
in-memory test custody instead of the operator keyring, and accepts Cave
launch paths only through its two explicit
NDJSON bridge. It is excluded from default Cargo and Tauri builds. Unit
scenarios default to in-memory custody, while the real-authority runner
explicitly selects the production `NativeKeyring`, restarts the RPC process,
and verifies credential reuse and deletion. Cave launch paths are accepted
only through its two explicit
`OPENCOVEN_PHASE1_CONFORMANCE_NODE_PATH` and
`OPENCOVEN_PHASE1_CONFORMANCE_CAVE_SERVER_PATH` environment variables.
- Run its subprocess integration gate with `pnpm test:native-e2e`; normal
`pnpm app:dev` selects the `opencoven-chat` desktop binary by default.
- CI compiles every Rust target on a native Windows runner in addition to the
macOS Rust checks, so Tauri's Windows resource build is validated with the
platform toolchain it requires.
- Run the persisted Windows GNU cross-target compile gate with
`pnpm cargo:check:windows-gnu`.
- The Phase 1 harness creates mode-`0700` process-owned roots under the real OS
temporary directory, reaps only tracked child processes, scans the completed
report for secrets and private content, and retains only
SDK platform record for secrets and private content, and retains only
`test-results/phase1-conformance/report.json`. See
[`phase1-conformance.md`](phase1-conformance.md).
- Coven conformance starts the real locked daemon and invokes Chat
`phase1-native-rpc` command `coven_health`; it never uses `coven daemon
status` or reimplements producer-owned peer/pipe identity checks.
Loading
Loading