Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
fbe3edf
fix(memory): make the episodic layer actually recall, and close the o…
LeoLin990405 Jul 30, 2026
bb70a21
feat(experiment): trivial baselines to test whether topology explains…
LeoLin990405 Jul 30, 2026
1c72068
feat(judge): quantify the biases the rankings rest on
LeoLin990405 Jul 30, 2026
168f786
Merge branch 'r7/base' into r7/validity
LeoLin990405 Jul 30, 2026
f65264b
Merge branch 'r7/judge' into r7/validity
LeoLin990405 Jul 30, 2026
e7fdb3e
fix(baseline): controls must vary topology only, not persona
LeoLin990405 Jul 30, 2026
2b418e3
docs(readme): reflect the post-v6 validity layer, drop the fake CI badge
LeoLin990405 Jul 30, 2026
b3375d1
feat(topology): type governance-graph nodes (agent/gate/checkpoint/ro…
LeoLin990405 Jul 30, 2026
04cd214
feat(engine): reconstruct the runtime graph and diff it against the d…
LeoLin990405 Jul 30, 2026
e1927ae
ci: add a runnable example, an end-to-end smoke, and a Node matrix
LeoLin990405 Jul 30, 2026
fc60af9
fix(db): make tournament recording idempotent without losing repeated…
LeoLin990405 Jul 30, 2026
a8ac2f2
Merge branch 'r8/graph-nodes' into r7/validity
LeoLin990405 Jul 30, 2026
aec4c26
Merge branch 'r8/runtime-graph' into r7/validity
LeoLin990405 Jul 30, 2026
78550ed
Merge branch 'r8/ci-hardening' into r7/validity
LeoLin990405 Jul 30, 2026
6298983
Merge branch 'r8/robustness' into r7/validity
LeoLin990405 Jul 30, 2026
2adf076
chore: sync README with the R8 merge; keep ESLint out of the CCB runtime
LeoLin990405 Jul 30, 2026
33a1b3d
fix: address Codex review of PR #32 (1 P1, 4 P2, 1 P3)
LeoLin990405 Jul 30, 2026
7841c96
docs(experiments): pre-register E1 before running it
LeoLin990405 Jul 30, 2026
f44177f
experiment(E1): pilot results — the harness, not the topology, dominates
LeoLin990405 Jul 30, 2026
fdaf632
fix(capture): stream the offices' deliberation into the transcript
LeoLin990405 Jul 30, 2026
a154ef6
feat(runtime-graph): office-level reconstruction, and no count that o…
LeoLin990405 Jul 30, 2026
57b3951
feat(R10): judge sees every office, controls staged, docs squared
LeoLin990405 Jul 30, 2026
495fadd
docs(experiments): pre-register the control-arm predictions before ru…
LeoLin990405 Jul 30, 2026
1c94e12
experiment(E1-control): C1 not supported, and the reason is worse tha…
LeoLin990405 Jul 31, 2026
5de6b41
feat(R11): separate "is the wiring better" from "is the wiring adopted"
LeoLin990405 Jul 31, 2026
ddb4cd6
docs: add README.zh-CN.md and bring both READMEs up to the current state
LeoLin990405 Jul 31, 2026
8651a7d
test: pin the plan prompt where it is sent, not only where it is built
LeoLin990405 Jul 31, 2026
6fd42ce
fix: the marker taught to agents was not the marker the engine detects
LeoLin990405 Jul 31, 2026
72de263
fix(baseline): --dest could overwrite a source regime or escape the repo
LeoLin990405 Jul 31, 2026
2c0f732
fix(provenance): structured evidence to the consumers; stop guessing …
LeoLin990405 Aug 3, 2026
9aa0a79
fix(baseline): --dest guard was too strict and broke the end-to-end s…
LeoLin990405 Aug 3, 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
18 changes: 17 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,23 @@ on:

jobs:
backend:
# Matrix rationale (see report R8-3): Node 20 is the current minimum
# declared in package.json engines (Node 20 was the previous CI target
# and remains an active LTS line); Node 22 is the current maintenance LTS
# and is what the frontend job already targets. Both are exercised so a
# regression on either the minimum-supported line or the current LTS is
# caught by CI, without blowing up wall-clock or Actions minutes on a
# wider matrix.
strategy:
fail-fast: false
matrix:
node-version: [20, 22]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
node-version: ${{ matrix.node-version }}
cache: npm
- name: Install dependencies
run: npm ci
Expand All @@ -24,8 +35,13 @@ jobs:
run: npm test
- name: Validate all 57 regimes
run: npm run validate:regimes
- name: End-to-end smoke (topology → metrics → baseline, zero API keys)
run: npm run smoke

frontend:
# Frontend keeps its own single-version pin: 22 is the version the app is
# actually built against and matches the backend's upper matrix leg, so a
# divergence there would still be caught by the backend matrix.
runs-on: ubuntu-latest
defaults:
run:
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,6 @@ SECURITY-AUDIT.md
regimes/**/*.rejected
regimes/**/*.v4.bak
regimes/**/*.new

# CCB project-local runtime (agent panes, worktrees, sockets) — never commit
.ccb/
122 changes: 122 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,127 @@
# 📜 Changelog

## v6.3.0 (unreleased) — Measurement Instruments (R11)

R11 follows the negative E1-control result: the dominant uncontrolled variable
was whether a regime delegated at all. This release adds instruments that
separate voluntary planning from an optional, topology-derived dispatch-roster
requirement while retaining the runtime graph's observability limits. The
changes are currently uncommitted in the `r7/validity` working tree.

### Added

- **Office-participation state:** completed, instrumented streams are classified
as `participation_observed` or `not_observed`; incomplete and legacy-negative
streams remain `unknown`. Counts and office IDs are surfaced in match metadata,
tournament manifests, the runtime-graph CLI, and History Explorer. This is a
categorical participation observation, not a topology execution rate.
- **Pre-enforcement dispatch plan:** the coordinator first records a structured
plan with tools disabled, then execution resumes the same coordinator session.
The neutral prompt explicitly permits zero or fewer offices.
`parsed_nonempty`, `parsed_empty`, and `parse_failed` remain distinct. The plan
event is stored in `events.jsonl` but excluded from judge and skill transcripts.
- **Symmetric roster enforcement:** `--enforce-dispatch` is default-off and
requires each office with an incoming edge in that arm's own topology to
receive an execution-phase subagent dispatch. The same function handles
historical and rewired controls. Compliance is checked once and recorded as
`not_requested`, `enforcement_passed`, or `enforcement_failed`; failures are
not retried, dropped, or converted into a different process exit code.
- **Plan-versus-topology facts:** `runtime-graph --diff` now reports the planned
office sequence, declared planned/omitted offices, undeclared offices, and
duplicates. It emits no coverage ratio or composite deviation score. Directed
edge alignment, edge kind, multiedge coverage, and edge exercise are explicit
unsupported dimensions.
- **E2 pre-registration:** `docs/experiments/E2-preregistration.md` and a
dry-run-by-default launcher freeze three scenarios, five repeats per cell,
ten arms per tournament (15 jobs / 150 arms), the E1 source/control pairs,
anonymization, no-skill mode, and engine-level dispatch enforcement.
No E2 model experiment was run.

### Measurement limits retained

- Claude Code subagents do not call one another. Runtime events directly expose
coordinator→office dispatches and office-attributed turns, not typed
office→office `command` / `review` / `info` / `veto` edges.
- A passed enforcement check proves only that the topology-derived office roster
was dispatched. It does not prove declared wiring executed.
- Because source and seed-42 control topologies preserve office IDs, node-set
plan comparisons may be unable to distinguish adoption of historical versus
rewired edge structure.

---

## v6.2.0 (unreleased) — Measurement Validity and Control Arms

Development status as of 2026-07-31: R7–R9 are on `r7/validity` in open PR
#32. R10 and the E1-control result are committed through `1c94e12`. E1-control
ran on 2026-07-30: historical wiring won no resolved pair, one pair went to the
control, and 13/30 arms never delegated. PR #31 (`r6/integration`) remains a
separate open branch and is not an ancestor of `r7/validity`; its write
API/editor work is therefore not listed as shipped here.

### Added

- **Experimental nulls**: reproducible `solo`, `flat-N` and seeded `random-N`
topology controls under `regimes/_baseline/`. Controls preserve source
offices and persona while changing the coordination flow.
- **Judge calibration telemetry**: multi-pass provider statistics,
same-family/cross-family gap, presentation-order effect and honest
per-transcript verbosity logs are persisted with tournament results.
- **Governance-graph typing**: topology nodes can describe agent, gate,
checkpoint and router roles; metrics and validation understand the expanded
node model.
- **Runtime graph CLI**: `civagent runtime-graph <matchId> [--diff] [--json]`
reconstructs actor/span activity. Office-attributed events now expose office
turn counts plus coordinator dispatch order/counts.
- **E1 validity experiment**: a pre-registration and pilot report document that
the original run was invalidated by missing subagent transcripts. The report
retains the negative result instead of interpreting unsupported rankings.
- **E1 control arm (R10)**: seed-42 random-wiring controls for Qin, Tang,
Athens, Zhou and Ming, plus a dry-run-by-default experiment launcher with
resumable batches and an explicitly estimated AFP window. The arm ran on
2026-07-30; C1 was not supported and scenario-driven non-delegation became
the principal measurement finding.
- **Actor-stratified judge transcript selection (R10)**: long event streams are
sampled by each observed actor's first/middle/last turn, explicit dispatch
turns and the final turn, under the same 6,000-character budget for every
civ. Selection strategy, original/selected lengths, turns and actors are
retained in the manifest.
- **Office-aware match UI (R10)**: History Explorer and Live Court split
`<regime>#<office>` actors at the first `#`, display the office as the role
badge and preserve the regime as context. Legacy actors remain unchanged.

### Changed

- **Full subagent transcript capture**: Claude Code runs with verbose
stream-JSON output, so office deliberation enters `events.jsonl` instead of
only the coordinator's closing message.
- **Constitutional markers are explicit**: veto, edict and impeachment
mechanisms require bracketed protocol markers; ordinary historical prose no
longer triggers a mechanism or grants veto immunity.
- **History and skill feedback**: episodic retrieval ranks across the full
practical history with stable tie-breaking and filtered keywords; tournament
outcomes are stamped onto newly sedimented skills after judging.
- **CI and persistence hardening**: Node 20/22 backend jobs, a blocking frontend
suite, regime validation and smoke checks run in CI; repeated tournament
recording is idempotent without dropping legitimate repeated events.

### Measurement limits retained deliberately

- Coordinator fan-out proves office participation and dispatch, not a typed
office-to-office edge. `unexercised_ratio` therefore remains `null` under
`coordinator_to_office_only` observability even when office ids overlap.
- `caused_by_span_id` alone cannot supply source office, target office, edge
kind, artifact identity or proof that capture was complete. R10 did not add
this field or promote the runtime diff to direct-edge comparability.
- The runtime graph was not added to the HTTP API: the useful participation
view is already derivable from match events, while the declared-edge diff is
still incomparable.
- The production four-level rubric is unchanged. A separately versioned shadow
calibration is proposed for the S3 ceiling effect; old and new score series
must not be spliced or converted.

---

## v6.1.0 (unreleased) — Reconciliation, Write API, R2 Revival 🔀

The v6 hardening line rejoined main (PRs #19–#28) — see PR #29.
Expand Down
Loading
Loading