Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
169722f
ci: trigger workflows on PRs to dev branch
Knapp-Kevin Apr 28, 2026
c8f7c47
feat: CodeGenome Phase 3 (#60) — continuity evaluation in link_commit…
Knapp-Kevin Apr 28, 2026
49b8581
docs(#75): add decision-level reference doc + expand schema comment (…
Knapp-Kevin Apr 28, 2026
2714762
fix(#74): make events.writer cross-platform (POSIX fcntl + Windows ms…
Knapp-Kevin Apr 28, 2026
b9faefc
fix(#69): skip tests of removed preflight contracts (#82)
Knapp-Kevin Apr 28, 2026
129015f
fix(#68): normalize Windows backslashes in surrealkv:// URLs (#83)
Knapp-Kevin Apr 28, 2026
f94d74c
fix(#67): validate cwd before subprocess.run to fix Windows WinError …
Knapp-Kevin Apr 28, 2026
5ac9d6f
fix(#72): make binds_to.provenance FLEXIBLE so nested keys persist (#81)
Knapp-Kevin Apr 28, 2026
200dbd5
feat: CodeGenome Phase 4 (#61) — semantic drift evaluation in resolve…
Knapp-Kevin Apr 29, 2026
e3d066d
chore: merge main into dev (v0.13.3 telemetry refactor → dev) (#94)
Knapp-Kevin Apr 29, 2026
695fe39
docs(backlog): B5 — event-sourced ledger RFC (tracks #97) (#98)
Knapp-Kevin Apr 29, 2026
ffbf39b
fix: stale test cluster — 5 orthogonal fixes (#70) (#100)
Knapp-Kevin Apr 29, 2026
c23c1a5
docs: development cycle reference + demos/guides/training scaffolding…
Knapp-Kevin Apr 29, 2026
089266b
feat: local telemetry counters + usage_summary + first-boot consent (…
Knapp-Kevin Apr 29, 2026
4bbe57d
chore: CI Phase 1 — Windows matrix + ruff/mypy + secret scan + merged…
Knapp-Kevin Apr 29, 2026
91b1dd1
feat: preflight telemetry capture loop pieces 1–4 (#65) (#101)
Knapp-Kevin Apr 29, 2026
5f773e6
Preflight eval phase 3 — real-I/O C2/C3 measurement (Jin's review fee…
silongtan Apr 29, 2026
f72e2a4
fix(ci): clear ruff failures on dev post-#96 merge (#105)
Knapp-Kevin Apr 29, 2026
740bf4a
feat: dashboard decision_level surfacing -- amber unclassified badge …
Knapp-Kevin Apr 29, 2026
c478dd5
feat: decision_level classifier + MCP primitives + CLI (v0.16.0, #77)…
Knapp-Kevin Apr 29, 2026
a19ef99
ci: target Dependabot PRs at dev (#99)
Knapp-Kevin Apr 29, 2026
bb2e245
feat(#44): LLM drift judge — uncertain-band sub-protocol (#103)
Knapp-Kevin Apr 29, 2026
77b9ee3
feat(#49): sticky PR-comment drift report — GitHub Action + renderer …
Knapp-Kevin Apr 29, 2026
2e20212
feat: governance contracts + escalation engine (v0.17.0, #108-#110 P1…
Knapp-Kevin Apr 29, 2026
2e9a842
feat(#48): pre-push drift hook + branch-scan CLI subcommand (#117)
Knapp-Kevin Apr 29, 2026
ebdf8db
feat: preflight HITL bypass flow (v0.17.1, #112) (#118)
Knapp-Kevin Apr 29, 2026
8f0253d
docs: governance architecture (v0.17.2, #111) (#119)
Knapp-Kevin Apr 29, 2026
25ce979
fix(ci): merged-to-dev labeller fails loudly on permission errors (#115)
Knapp-Kevin Apr 29, 2026
c233eb1
feat(#97): extend event vocabulary with ratify + supersede emit/repla…
jinhongkuan Apr 30, 2026
b3d93d0
Revert "feat(#97): extend event vocabulary with ratify + supersede em…
jinhongkuan Apr 30, 2026
c9c6c00
docs(dev-cycle): merge-style decision tree + formalize triage lane (§…
jinhongkuan Apr 30, 2026
bd29aac
docs(dev-cycle): drop squash row from §5.1 — squash is disabled at re…
jinhongkuan Apr 30, 2026
e6d4b8f
feat(#97): extend event vocabulary with ratify + supersede emit/replay
jinhongkuan Apr 30, 2026
2a6dd89
fix(ruff): drop unused find_decision_by_canonical_id import from team…
jinhongkuan Apr 30, 2026
ed67a56
fix(ruff): format pass on touched files
jinhongkuan Apr 30, 2026
68108cd
docs: CHANGELOG entry for v0.18.0 (#97 event vocabulary extension)
jinhongkuan Apr 30, 2026
a6eb0b8
docs(dev-cycle): §10.5.3 adaptation clause for diverged-surface cherr…
jinhongkuan Apr 30, 2026
7cfddf7
plan(#124): register link_commit CLI subcommand + harden post-commit …
Knapp-Kevin Apr 30, 2026
a61e59e
plan(#124): v2 audit remediation — F-1/F-2/F-3 closed
Knapp-Kevin Apr 30, 2026
bf64c84
chain(#124): META_LEDGER #21 — audit v2 PASS post-remediation
Knapp-Kevin Apr 30, 2026
431e202
feat(#124): register link_commit CLI subcommand + harden post-commit …
Knapp-Kevin Apr 30, 2026
9bea6e4
chain(#124): META_LEDGER #23 — substantiation seal
Knapp-Kevin Apr 30, 2026
46a2504
docs(dev-cycle): §10.5.0 rationale — why the triage lane + rebase-mer…
jinhongkuan Apr 30, 2026
febb0aa
feat(#135): dashboard tooltip nudges out-of-session committers to /bi…
jinhongkuan Apr 30, 2026
eaf97e2
chain(#135): META_LEDGER #24+#25+#26 — triage audit + impl + substant…
jinhongkuan Apr 30, 2026
2503fe6
feat(#108): end-to-end sim + capture-corrections skill correction
jinhongkuan Apr 30, 2026
d3fb58c
style(#108): ruff format scripts/sim_issue_108_flows.py + docstring sync
jinhongkuan Apr 30, 2026
23bee2c
ci(#108): v0 user flow e2e — Claude Code CLI sessions vs desktop/desktop
jinhongkuan Apr 30, 2026
3e43ab9
fix(#108): e2e asserters look at payload-wrapped tool input + REPO_PA…
jinhongkuan May 1, 2026
489c0fd
style(#108): ruff UP035 — import Callable from collections.abc
jinhongkuan May 1, 2026
966cdcc
chore: untrack #49 sticky drift-report (revert PR #113)
jinhongkuan May 1, 2026
4d47d43
chore: remove local-only simulation scripts
devin-ai-integration[bot] May 1, 2026
8d14aae
ci(#108): demo recording fast-follow — pm.mp4 + dev.mp4 with transiti…
jinhongkuan May 1, 2026
693ca8b
fix(#108): use google-chrome (pre-installed) instead of chromium-brow…
jinhongkuan May 1, 2026
6311a36
feat(#108): e2e — persistent ledger + agentic-layer advisory split
jinhongkuan May 1, 2026
aa0b762
ci(#108): split workflow into assertions + recording stages
jinhongkuan May 1, 2026
2aab73c
ci(#108): make recording job parallel with assertions, not sequential
jinhongkuan May 1, 2026
8a5d8a2
ci(#108): drop record_demo input gate, rely on env approval alone
jinhongkuan May 1, 2026
7aa9880
feat(#108): interactive recording — tmux-driven real claude TUI per s…
jinhongkuan May 1, 2026
9e3c545
fix(#108): interactive recording — drop -p-only flags, fix readiness …
jinhongkuan May 1, 2026
098a477
fix(#108): dismiss first-run theme picker, not just trust dialog
jinhongkuan May 1, 2026
f5b8a4d
fix(#108): pre-populate ~/.claude/.credentials.json from OAuth env var
jinhongkuan May 1, 2026
676183b
fix(#108): recording uses ANTHROPIC_API_KEY; walk first-run picker stack
jinhongkuan May 1, 2026
ff09518
fix(#108): flow 1 ratifies + binds; flow 3 stops re-ingesting
jinhongkuan May 1, 2026
a8b1d31
fix(#108): natural prompts; flow 3 tests auto-fired link_commit hook
jinhongkuan May 1, 2026
c21fbdd
fix(#108): honest harness — chained dev_session, ledger-delta verdict…
jinhongkuan May 1, 2026
26497aa
style: ruff format
jinhongkuan May 1, 2026
ca02b68
fix(skill): resolve preflight auto-fire failure on natural refactor p…
Knapp-Kevin May 2, 2026
79927c7
fix(setup): install preflight UserPromptSubmit hook for end users
jinhongkuan May 2, 2026
80c4219
style: ruff format scripts/hooks/preflight_intent.py
jinhongkuan May 2, 2026
daf9e49
fix(e2e): materialize UserPromptSubmit hook into test target settings
jinhongkuan May 2, 2026
e3250cf
fix(hook): emit hookSpecificOutput envelope so additionalContext reac…
jinhongkuan May 2, 2026
5e8f7c0
test(e2e): split Flow 2 into auto-fire (Flow 2) + correction-capture …
jinhongkuan May 2, 2026
87b996b
style: ruff format tests/e2e/run_e2e_flows.py
jinhongkuan May 2, 2026
d76b419
fix(hooks): SessionEnd hook drift — re-entrancy guard + --auto-ingest…
Knapp-Kevin May 2, 2026
8af60f3
test(e2e): add Flow 4 path-X-(b) ledger validation (#147)
Knapp-Kevin May 2, 2026
17923b6
test(e2e): bootstrap .bicameral/ + pass --mcp-config to SessionEnd su…
Knapp-Kevin May 2, 2026
cd9b7d2
test(e2e): point Flow 4 advisory at #156 (design pivot) instead of #154
jinhongkuan May 2, 2026
48a0e92
refactor(e2e): single source of truth for harness + recording setup
jinhongkuan May 2, 2026
34f2ba2
Merge pull request #120 from Knapp-Kevin/fix/merged-to-dev-labeller-115
Knapp-Kevin May 3, 2026
3be453b
feat(team-server): scaffold + self-managing schema (Phase 1)
Knapp-Kevin May 2, 2026
84fc288
feat(team-server): Slack OAuth + workspace allow-list (Phase 2)
Knapp-Kevin May 2, 2026
9504387
feat(team-server): Slack worker + canonical-extraction cache (Phase 3)
Knapp-Kevin May 2, 2026
c5e09c3
feat(team-server): HTTP /events API + materializer extension (Phase 4)
Knapp-Kevin May 2, 2026
dcd6f46
docs(governance): Priority C v0 plan/research/audit/seal artifacts
Knapp-Kevin May 2, 2026
0180e30
refactor(team-server): cache-contract migration to upsert-per-source_…
Knapp-Kevin May 2, 2026
661e870
feat(team-server): worker-task lifecycle pattern + Slack reference wi…
Knapp-Kevin May 2, 2026
863c5b6
feat(team-server): Notion API client + property serializer (Phase 1)
Knapp-Kevin May 2, 2026
9ce47eb
feat(team-server): Notion ingest worker + per-database watermark (Pha…
Knapp-Kevin May 2, 2026
1365cde
feat(team-server): Notion task registration on lifespan (Phase 3)
Knapp-Kevin May 2, 2026
601dc8d
docs(governance): Priority C v1 plan/audit/seal artifacts
Knapp-Kevin May 2, 2026
484bb88
refactor(team-server): cache contract gets classifier_version axis (P…
Knapp-Kevin May 2, 2026
0f3ca92
feat(team-server): heuristic classifier — pure deterministic Stage 1 …
Knapp-Kevin May 2, 2026
ad6437f
feat(team-server): trigger rules schema + per-channel/db merge (Phase 2)
Knapp-Kevin May 2, 2026
bcdbb49
feat(team-server): real LLM extractor via Anthropic SDK (Phase 3)
Knapp-Kevin May 2, 2026
9f2b869
feat(team-server): pipeline integration — workers route Stage 1 → Sta…
Knapp-Kevin May 2, 2026
0d3af33
feat(team-server): corpus learner — option-c feedback loop (Phase 5)
Knapp-Kevin May 2, 2026
2863fbe
docs(governance): Priority C v1.1 plan/audit/seal artifacts
Knapp-Kevin May 2, 2026
b54fde3
feat(team-server): channel_allowlist startup-time YAML sync (closes #…
Knapp-Kevin May 3, 2026
8e9c2f5
feat(team-server): periodic team-server event consumer + payload brid…
Knapp-Kevin May 3, 2026
38ca001
feat(team-server): materializer dispatch case for team-server JSONL e…
Knapp-Kevin May 3, 2026
238c0ce
docs(governance): v0 release-blockers plan/audit/seal artifacts
Knapp-Kevin May 3, 2026
8f97151
feat(skills): preflight Step 5.6 — capture refinements on contradiction
Knapp-Kevin May 3, 2026
76719e5
feat(events): SessionEnd transcript bridge — propagate parent transcr…
Knapp-Kevin May 3, 2026
3c59a41
docs(governance): Priority B v0 final-blockers plan/audit/seal artifacts
Knapp-Kevin May 3, 2026
a03aebe
style: ruff check --fix + ruff format (CI lint pass)
Knapp-Kevin May 3, 2026
f37bd0b
fix(team-server): satisfy mypy on llm_extractor + app.py
Knapp-Kevin May 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
14 changes: 12 additions & 2 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"hooks": [
{
"type": "command",
"command": "python3 -c \"import json,sys,re; d=json.load(sys.stdin); c=d.get('tool_input',{}).get('command',''); ops=('git commit','git merge ','git pull','git rebase --continue'); [print('bicameral: git write-op detected call bicameral.link_commit(commit_hash=\\'HEAD\\') now to sync the decision ledger') for _ in [1] if any(op in c for op in ops)]\""
"command": "python3 -c \"import json,sys,re; d=json.load(sys.stdin); c=d.get('tool_input',{}).get('command',''); ops=('git commit','git merge ','git pull','git rebase --continue'); [print('bicameral: git write-op detected \u2014 call bicameral.link_commit(commit_hash=\\'HEAD\\') now to sync the decision ledger') for _ in [1] if any(op in c for op in ops)]\""
}
]
}
Expand All @@ -16,7 +16,17 @@
"hooks": [
{
"type": "command",
"command": "[ -d .bicameral ] && claude -p '/bicameral:capture-corrections' || true"
"command": "python3 -m events.session_end_bridge"
}
]
}
],
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "python3 scripts/hooks/preflight_reminder.py"
}
]
}
Expand Down
463 changes: 0 additions & 463 deletions .claude/skills/bicameral-preflight/SKILL.md

This file was deleted.

11 changes: 11 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
target-branch: "dev"
schedule:
interval: "weekly"
labels:
- "flow:feature"
- "dependencies"
- "python"
70 changes: 70 additions & 0 deletions .github/workflows/label-merged-to-dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Apply merged-to-dev label

on:
pull_request:
branches: [dev]
types: [closed]

jobs:
label:
name: Label closed-by-PR issues
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
permissions:
issues: write
pull-requests: read
steps:
- name: Apply merged-to-dev label
uses: actions/github-script@v7
with:
script: |
// Workflow caveat: this job needs Settings -> Actions ->
// General -> Workflow permissions set to "Read and write
// permissions" at the repo level. The job-level
// `permissions: issues: write` block can only NARROW what
// the repo allows, never expand it. If the repo default
// is read-only, addLabels returns 403 "Resource not
// accessible by integration" regardless of the job-level
// grant.
//
// See: #115 (root cause + symptoms) and #104 (admin-side
// fix tracked alongside branch-protection setup).
//
// GitHub close keywords (case-insensitive): close, closes,
// closed, fix, fixes, fixed, resolve, resolves, resolved.
const pr = context.payload.pull_request;
const body = pr.body || "";
const closeRegex = /(?:close[sd]?|fix(?:es|ed)?|resolve[sd]?)\s+#(\d+)/gi;
const matches = [...body.matchAll(closeRegex)];
const issues = [...new Set(matches.map(m => parseInt(m[1])))];

const failed = [];
for (const num of issues) {
try {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: num,
labels: ["merged-to-dev"]
});
console.log(`Labeled #${num}`);
} catch (e) {
console.log(`Failed to label #${num}: ${e.message}`);
failed.push({ num, message: e.message });
}
}

if (failed.length > 0) {
const summary = failed
.map(f => ` - #${f.num}: ${f.message}`)
.join("\n");
throw new Error(
`merged-to-dev labeller could not label ${failed.length} ` +
`issue(s) referenced by PR #${pr.number}:\n${summary}\n\n` +
`Most likely cause: repo Settings -> Actions -> General -> ` +
`Workflow permissions is set to read-only. ` +
`Job-level "permissions: issues: write" cannot expand a ` +
`read-only repo default. See #104 (admin fix) and ` +
`#115 (root cause).`
);
}
24 changes: 24 additions & 0 deletions .github/workflows/lint-and-typecheck.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Lint & Type Check

on:
pull_request:
branches: [main, dev]

jobs:
lint:
name: ruff + mypy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
- name: Install
run: pip install -e ".[test]"
- name: Ruff check
run: ruff check .
- name: Ruff format check
run: ruff format --check .
- name: Mypy
run: mypy .
17 changes: 16 additions & 1 deletion .github/workflows/preflight-eval.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ name: Preflight Failure-Mode Eval

on:
pull_request:
branches: [main]
branches: [main, dev]
paths:
- 'handlers/preflight.py'
- 'handlers/sync_middleware.py'
Expand Down Expand Up @@ -78,6 +78,21 @@ jobs:
-v --tb=short \
--junitxml=test-results/preflight-skill-eval.xml

# Phase 3: §C cost/latency baseline. Asymmetric ±20% regression rule
# against committed baselines in tests/eval/cost_baseline.jsonl, with
# noise floors (10 tokens / 0.5ms) below which deltas are dismissed
# as measurement variance. Cleanly skips per-platform when no
# baseline row exists (e.g. first Linux run with Darwin-only
# baselines committed); record locally with
# BICAMERAL_EVAL_RECORD_BASELINE=1 and commit the row.
- name: Phase 3 — cost/latency baseline
id: phase3
continue-on-error: true
run: |
pytest tests/eval/run_preflight_cost_eval.py \
-v --tb=short \
--junitxml=test-results/preflight-cost-eval.xml

- name: Surface results in step summary
if: always()
uses: test-summary/action@v2
Expand Down
24 changes: 24 additions & 0 deletions .github/workflows/secret-scan.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Secret Scan

on:
pull_request:
branches: [main, dev]

# gitleaks-action@v2 requires a paid license for organizations
# (https://github.com/gitleaks/gitleaks-action#-announcement).
# We use trufflehog instead — free for all repos, equally capable
# detector ruleset, and faster cold-start than spinning up a
# gitleaks container.
jobs:
trufflehog:
name: TruffleHog
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # full history so trufflehog can scan the diff range
- uses: trufflesecurity/trufflehog@main
with:
base: ${{ github.event.pull_request.base.sha }}
head: ${{ github.event.pull_request.head.sha }}
extra_args: --only-verified
23 changes: 19 additions & 4 deletions .github/workflows/test-mcp-regression.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,20 @@ name: MCP Regression Tests

on:
pull_request:
branches: [main]
branches: [main, dev]

env:
PYTHON_VERSION: '3.11'

jobs:
mcp-tests:
name: MCP Regression Suite
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
timeout-minutes: 20
# Needed so ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} / ANTHROPIC_API_KEY
# (environment secrets scoped to `ci-test`) is injected into the M1
# extraction step. The env is gate-free so this does not block
Expand All @@ -19,6 +24,7 @@ jobs:
env:
SURREAL_URL: 'memory://'
REPO_PATH: ${{ github.workspace }}
BICAMERAL_SKIP_CONSENT_NOTICE: '1'
steps:
- uses: actions/checkout@v4

Expand Down Expand Up @@ -46,7 +52,10 @@ jobs:
# ── Clone OSS repos for eval ground truth ────────────────────────
# Only medusa is needed — saleor/vendure were used by eval_code_locator.py
# which was removed in v0.6.4 when search_code was nuked.
# Ubuntu-only: bash function syntax + medusa corpus consumed by
# the Linux-only M1 adversarial eval and E2E report below.
- name: Clone eval repos (shallow, pinned commits)
if: matrix.os == 'ubuntu-latest'
run: |
clone_at_commit() {
local repo_url=$1 dest=$2 commit=$3
Expand Down Expand Up @@ -79,6 +88,7 @@ jobs:
# "secret is not set" from "secret is set to empty string" from
# "secret is set correctly" without ever exposing the key.
- name: M1 secret visibility probe
if: matrix.os == 'ubuntu-latest'
run: |
set +e
if [ -n "${ANTHROPIC_API_KEY}" ]; then
Expand Down Expand Up @@ -108,6 +118,7 @@ jobs:
# as a red "M1 adversarial" step in the job without failing the
# whole build, so the rest of the regression suite still reports.
- name: M1 adversarial corpus eval (warn-only)
if: matrix.os == 'ubuntu-latest'
continue-on-error: true
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
Expand All @@ -119,8 +130,12 @@ jobs:
-o test-results/m1-adversarial.json

# ── Generate rich E2E report from artifacts ────────────────────
# Ubuntu-only: the script consumes the medusa adversarial corpus
# (cloned only on Ubuntu above) plus the Phase 3 E2E artifacts
# the report builds. Windows runs the unit + integration suite
# for cross-platform coverage but skips the corpus-driven E2E.
- name: Generate E2E report
if: always()
if: always() && matrix.os == 'ubuntu-latest'
run: python tests/generate_e2e_report.py

# ── Generate step summary from JUnit XML ───────────────────────
Expand All @@ -136,6 +151,6 @@ jobs:
uses: actions/upload-artifact@v4
if: always()
with:
name: mcp-test-results
name: mcp-test-results-${{ matrix.os }}
path: test-results/
retention-days: 30
2 changes: 1 addition & 1 deletion .github/workflows/test-schema-persistence.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:
- 'tests/test_schema_persistence.py'
- 'pyproject.toml'
pull_request:
branches: [main]
branches: [main, dev]
paths:
- 'ledger/schema.py'
- 'ledger/client.py'
Expand Down
Loading