Skip to content

Commit 2c12def

Browse files
authored
Add ECP-8 Batch 1 surplus-capacity study (#31)
Preregister and run the sealed three-arm capacity study, record its valid negative result, and add full fixed-length global-channel integrity auditing.
1 parent 34f2adb commit 2c12def

16 files changed

Lines changed: 696 additions & 18 deletions

‎AGENTS.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,6 @@ python3.12 -m venv .venv
4141
- Keep existing ECP-0 through ECP-6 configurations reproducible.
4242
- Document new experiments in three stages: preregistration, sealed development log, confirmatory results.
4343
- Write new configurations, documentation, reports and user-facing output in English.
44-
- When proposing ECP-7, prefer a single falsifiable intervention over several simultaneous architecture changes.
44+
- Preserve the completed ECP-8 Batch 1 capacity isolation and its sealed confirmatory split. Any Batch 2 must keep the 16-bit arm fixed and preregister exactly one structure-induction mechanism.
4545

46-
The recommended next research question is whether compositional structure still emerges when the explicit one-factor-per-slot architectural bias is weakened.
46+
ECP-8 Batch 1 found that surplus capacity nearly removes collisions but does not reach injectivity or compositional validation. Do not continue a channel-size search.

‎README.md‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ configuration was frozen and its confirmatory split was never opened. See
7373
The compact synthesis is in
7474
[`docs/ecp7-development-conclusion.md`](docs/ecp7-development-conclusion.md).
7575

76+
ECP-8 Batch 1 is a valid negative sealed-development result. It tested whether
77+
the strongest generic ECP-7 architecture becomes injective when all four
78+
positions may use the complete 16-symbol vocabulary: 16 fixed bits instead of
79+
the 14-bit lower bound. Compared with the paired 14-bit control, mean train
80+
exactness rose from 79.55% to 98.76%, worst-link validation from 64.84% to
81+
73.34%, and the minimum codebook from 12,048 to 15,095 messages. The arm still
82+
had 225–265 collisions per sender and failed both 80% validation thresholds.
83+
The ECP-8 confirmatory split remains sealed. See
84+
[`docs/development-log-ecp8.md`](docs/development-log-ecp8.md).
85+
7686
## Build on this work
7787

7888
A new developer or fresh AI agent can start with no previous chat context. First read [`AGENTS.md`](AGENTS.md) for the binding research rules and then follow [`docs/AI_AGENT_START.md`](docs/AI_AGENT_START.md) for installation, architecture overview, reproduction and proper setup of ECP-7.
@@ -112,6 +122,8 @@ Do not translate those artifacts in place. New experiment configurations and all
112122
- [`docs/research-design-ecp7.md`](docs/research-design-ecp7.md) — preregistered weak-structure question, paired control and sealed split.
113123
- [`docs/development-log-ecp7.md`](docs/development-log-ecp7.md) — the first negative weak-structure batch and integrity checks.
114124
- [`docs/ecp7-development-conclusion.md`](docs/ecp7-development-conclusion.md) — sealed development synthesis and closure after 29 variants.
125+
- [`docs/research-design-ecp8.md`](docs/research-design-ecp8.md) — preregistered surplus-capacity question, fresh split and three-arm gate.
126+
- [`docs/development-log-ecp8.md`](docs/development-log-ecp8.md) — sealed ECP-8 development record.
115127
- [`config/ecp7-development.yaml`](config/ecp7-development.yaml) — sealed weak-structure intervention configuration.
116128
- [`config/ecp7-b2-development.yaml`](config/ecp7-b2-development.yaml) — factor-agnostic soft code-utilization intervention.
117129
- [`config/ecp7-b3-development.yaml`](config/ecp7-b3-development.yaml) — the same utilization formula on straight-through hard messages.
@@ -142,6 +154,10 @@ Do not translate those artifacts in place. New experiment configurations and all
142154
- [`config/ecp7-b28-development.yaml`](config/ecp7-b28-development.yaml) — Batch 25 with one zero-initialized shared residual sender interaction.
143155
- [`config/ecp7-b29-development.yaml`](config/ecp7-b29-development.yaml) — Batch 28 with residual parameters frozen through step 30,000.
144156
- [`config/ecp7-positive-control-development.yaml`](config/ecp7-positive-control-development.yaml) — ECP-6 positive control on the ECP-7 split.
157+
- [`config/ecp8-positive-control-development.yaml`](config/ecp8-positive-control-development.yaml) — factorized 14-bit positive control on the fresh ECP-8 split.
158+
- [`config/ecp8-control-development.yaml`](config/ecp8-control-development.yaml) — paired 14-bit weak-structure control.
159+
- [`config/ecp8-development.yaml`](config/ecp8-development.yaml) — four-global-position 16-bit intervention.
160+
- [`evidence/ecp8-development/batch1-manifest.json`](evidence/ecp8-development/batch1-manifest.json) — compact sealed Batch 1 evidence and artifact hashes.
145161
- [`config/ecp0.yaml`](config/ecp0.yaml) — machine-readable configuration from step 1.
146162
- [`config/ecp1.yaml`](config/ecp1.yaml) — frozen configuration of the population trial.
147163
- [`config/ecp3.yaml`](config/ecp3.yaml) — frozen configuration of the first successful base model.

‎config/ecp8-base-development.yaml‎

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
extends: ecp6-development.yaml
2+
3+
experiment:
4+
id: ecp8
5+
title: ECP-8 shared sealed development base
6+
status: development_test_sealed
7+
frozen_at_utc: null
8+
parent_experiment: ecp7
9+
arm: shared_sealed_base
10+
objective: >-
11+
Test whether two surplus unallocated channel bits let a weak-structure
12+
population learn an injective compositional protocol without restoring a
13+
factor-to-slot binding.
14+
15+
reproducibility:
16+
dataset_seed: 18072058
17+
18+
dataset:
19+
split_strategy: dual_explicit_fresh_color_shape_matchings
20+
train_meanings: 14336
21+
validation_meanings: 1024
22+
compositional_test_meanings: 1024
23+
holdout_factors: [color, shape]
24+
held_out_factor_pairs: 16
25+
validation_held_out_factor_pairs: 16
26+
variants_per_held_out_pair: 64
27+
excluded_factor_pairs: []
28+
explicit_validation_factor_pairs:
29+
- {color: 0, shape: 12}
30+
- {color: 1, shape: 13}
31+
- {color: 2, shape: 14}
32+
- {color: 3, shape: 15}
33+
- {color: 4, shape: 0}
34+
- {color: 5, shape: 1}
35+
- {color: 6, shape: 2}
36+
- {color: 7, shape: 3}
37+
- {color: 8, shape: 4}
38+
- {color: 9, shape: 5}
39+
- {color: 10, shape: 6}
40+
- {color: 11, shape: 7}
41+
- {color: 12, shape: 8}
42+
- {color: 13, shape: 9}
43+
- {color: 14, shape: 10}
44+
- {color: 15, shape: 11}
45+
explicit_test_factor_pairs:
46+
- {color: 0, shape: 13}
47+
- {color: 1, shape: 14}
48+
- {color: 2, shape: 15}
49+
- {color: 3, shape: 0}
50+
- {color: 4, shape: 1}
51+
- {color: 5, shape: 2}
52+
- {color: 6, shape: 3}
53+
- {color: 7, shape: 4}
54+
- {color: 8, shape: 5}
55+
- {color: 9, shape: 6}
56+
- {color: 10, shape: 7}
57+
- {color: 11, shape: 8}
58+
- {color: 12, shape: 9}
59+
- {color: 13, shape: 10}
60+
- {color: 14, shape: 11}
61+
- {color: 15, shape: 12}
62+
63+
outcome_thresholds:
64+
paired_control_required: true
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
extends: ecp7-b25-development.yaml
2+
3+
experiment:
4+
id: ecp8
5+
title: ECP-8 14-bit weak-structure paired control
6+
status: development_test_sealed
7+
frozen_at_utc: null
8+
parent_experiment: ecp7
9+
arm: local_capacity_14_bit_control
10+
objective: >-
11+
Measure the strongest ECP-7 weak-structure system on the fresh ECP-8 split
12+
before changing only its channel capacity allocation.
13+
14+
reproducibility:
15+
dataset_seed: 18072058
16+
17+
dataset:
18+
split_strategy: dual_explicit_fresh_color_shape_matchings
19+
train_meanings: 14336
20+
validation_meanings: 1024
21+
compositional_test_meanings: 1024
22+
holdout_factors: [color, shape]
23+
held_out_factor_pairs: 16
24+
validation_held_out_factor_pairs: 16
25+
variants_per_held_out_pair: 64
26+
excluded_factor_pairs: []
27+
explicit_validation_factor_pairs:
28+
- {color: 0, shape: 12}
29+
- {color: 1, shape: 13}
30+
- {color: 2, shape: 14}
31+
- {color: 3, shape: 15}
32+
- {color: 4, shape: 0}
33+
- {color: 5, shape: 1}
34+
- {color: 6, shape: 2}
35+
- {color: 7, shape: 3}
36+
- {color: 8, shape: 4}
37+
- {color: 9, shape: 5}
38+
- {color: 10, shape: 6}
39+
- {color: 11, shape: 7}
40+
- {color: 12, shape: 8}
41+
- {color: 13, shape: 9}
42+
- {color: 14, shape: 10}
43+
- {color: 15, shape: 11}
44+
explicit_test_factor_pairs:
45+
- {color: 0, shape: 13}
46+
- {color: 1, shape: 14}
47+
- {color: 2, shape: 15}
48+
- {color: 3, shape: 0}
49+
- {color: 4, shape: 1}
50+
- {color: 5, shape: 2}
51+
- {color: 6, shape: 3}
52+
- {color: 7, shape: 4}
53+
- {color: 8, shape: 5}
54+
- {color: 9, shape: 6}
55+
- {color: 10, shape: 7}
56+
- {color: 11, shape: 8}
57+
- {color: 12, shape: 9}
58+
- {color: 13, shape: 10}
59+
- {color: 14, shape: 11}
60+
- {color: 15, shape: 12}

‎config/ecp8-development.yaml‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
extends: ecp8-control-development.yaml
2+
3+
experiment:
4+
title: ECP-8 global-capacity intervention development
5+
arm: global_capacity_16_bit_intervention
6+
objective: >-
7+
Test whether four unrestricted 16-symbol positions eliminate hard-code
8+
collisions in the unchanged weak-structure architecture and training setup.
9+
10+
channel:
11+
type: discrete_fixed_length
12+
vocabulary_size: 16
13+
symbol_min: 0
14+
symbol_max: 15
15+
message_length: 4
16+
bits_per_symbol: 4
17+
bits_per_message: 16
18+
factor_alphabet_sizes: null
19+
bits_per_symbol_by_factor: null
20+
slot_alphabet_sizes: null
21+
bits_per_symbol_by_slot: null
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
extends: ecp8-base-development.yaml
2+
3+
experiment:
4+
title: ECP-8 factorized positive-control development
5+
arm: ecp6_factorized_positive_control
6+
objective: >-
7+
Verify that the frozen ECP-6 architecture solves the fresh ECP-8
8+
validation matching at the information-theoretic 14-bit lower bound.

‎docs/AI_AGENT_START.md‎

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ python3.12 -m venv .venv
4141
.venv/bin/ecp6 --config config/ecp6.yaml validate
4242
```
4343

44-
Expected baseline: 133 passing tests and split sizes `14336/1024/1024`.
44+
Expected baseline: 138 passing tests and split sizes `14336/1024/1024`.
4545

4646
## 4. Reproduce ECP-6
4747

@@ -69,7 +69,7 @@ Then verify hashes, channel constraints and topographic null models:
6969

7070
This reruns a known experiment. It must not be presented as a new independent confirmatory test.
7171

72-
## 5. Continue ECP-7 scientifically
72+
## 5. Preserve the completed ECP-7 series
7373

7474
Do not modify ECP-0 through ECP-6 or the completed ECP-7 Batch 1 through Batch 29
7575
configs. ECP7-B1-I collapsed to 130–139 hard messages. ECP7-B2-I improved its
@@ -192,12 +192,26 @@ ECP-7 development is closed after 29 sealed variants. Do not continue a
192192
residual schedule, collision coefficient, replay route or horizon search, and
193193
do not open the unused ECP-7 confirmatory split.
194194

195-
Start ECP-8 with a separate preregistration that chooses exactly one new
196-
question. Plausible directions include learned compositional structure without
197-
fixed slots, variable-length coding efficiency, interactive negotiation, or
198-
transfer across altered synthetic worlds. These are different hypotheses:
199-
select one, define its channel and baselines, generate a fresh deterministic
200-
split, and register the development and confirmatory gates before training.
195+
ECP-8 Batch 1 is a separate preregistration that selects the learned-structure
196+
direction through one narrow capacity question. Read
197+
`docs/research-design-ecp8.md` and
198+
`docs/development-log-ecp8.md`. Three seed-11 arms were registered before
199+
training: a factorized 14-bit positive control, the strongest weak-structure
200+
14-bit paired control, and the identical weak system with four unrestricted
201+
16-symbol positions. Do not change their split, seed, architecture, training,
202+
channel or gates, and never add `--unseal-test` during development.
203+
204+
After all three sealed runs, record the result even if it is negative. A passed
205+
development gate only permits a later freeze decision; it does not itself
206+
authorize confirmatory test access.
207+
208+
Batch 1 is complete and negative. The 16-bit arm reached 98.76% mean train,
209+
74.46% mean validation, 73.34% worst-link validation and 81.05% translator
210+
validation with 15,095–15,135 unique messages. It failed injectivity and both
211+
80% validation gates; the confirmatory split remains sealed. Do not search
212+
larger channels. At most one Batch 2 structure-induction intervention is
213+
justified at the unchanged 16-bit capacity. Preregister it before training and
214+
do not combine it with a slot binding or another objective change.
201215

202216
## 7. Definition of done for any contribution
203217

‎docs/development-log-ecp8.md‎

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# ECP-8 Sealed Development Log
2+
3+
The ECP-8 confirmatory split is sealed. This log records every development arm,
4+
including negative results, before any possible confirmatory access.
5+
6+
## Batch 1 preregistration — Global channel capacity
7+
8+
Preregistered: July 18, 2026 at 19:58:58 UTC<br>
9+
Seed: `11`<br>
10+
Test unsealed: **no**<br>
11+
Split SHA-256: `241acd2ee42ff658ddf0c8c897d4e4df0f52a18098b3ef68c009c74c2134592a`
12+
13+
| Arm | Configuration | Raw SHA-256 | Effective SHA-256 |
14+
|---|---|---|---|
15+
| ECP8-B1-P | `config/ecp8-positive-control-development.yaml` | `e996bf66c30b3e699b27046e9824c13c7ecf3f2cb9831c4b9f0528d17b7b5f05` | `3a8e55ee262418f1005405afec3eeee7ebaaad164cb83274bd95c95e2c0939c3` |
16+
| ECP8-B1-C | `config/ecp8-control-development.yaml` | `9e3c865fcec9698bb95fcfc3ad429a354e26ffd39f2533dd7dc836dfdd3ab34a` | `fcaf5e8f39df2349cb3dedefcc233e5a08d813763a5b644d6a2ed2c050748f06` |
17+
| ECP8-B1-I | `config/ecp8-development.yaml` | `f6219110ebfe8f26248d9dbd646d80e1033f63d618a2524f7b96668ebd7fdaea` | `0572857aa786e0a41995aedd1cee8c2bb6dbdbc47f46025411bb8c06615b9693` |
18+
19+
ECP8-B1-C reruns the strongest ECP-7 weak-structure setup on the fresh ECP-8
20+
split. ECP8-B1-I changes only the local channel capacities: `[16,16,8,8]`
21+
becomes `[16,16,16,16]`, increasing fixed payload size from 14 to 16 bits.
22+
The sender still has one generic joint context and four position heads; neither
23+
sender nor receiver receives a factor-slot binding.
24+
25+
The full decision gate is fixed in `docs/research-design-ecp8.md`. In addition
26+
to the existing train, validation and translator thresholds, the intervention
27+
must be injective over all 15,360 accessible meanings, improve the paired
28+
control's minimum codebook, and preserve both mean and worst-link validation.
29+
Only these three seed-11 runs are admitted. The confirmatory test remains
30+
unauthorized regardless of a single development result.
31+
32+
## Batch 1 results
33+
34+
Positive-control run: `runs/ecp8-batch1-positive-control-development/20260718T200136Z-ecp8-development`<br>
35+
Paired-control run: `runs/ecp8-batch1-control-development/20260718T200256Z-ecp8-development`<br>
36+
Intervention run: `runs/ecp8-batch1-intervention-development/20260718T200637Z-ecp8-development`<br>
37+
Test unsealed: **no**
38+
39+
| Metric | Positive control | 14-bit control | 16-bit intervention |
40+
|---|---:|---:|---:|
41+
| Population train, mean | 100% | 79.5476% | 98.7566% |
42+
| Population train, worst link | 100% | 78.6551% | 98.6886% |
43+
| Population validation, mean | 100% | 70.2698% | 74.4629% |
44+
| Population validation, worst link | 100% | 64.8438% | 73.3398% |
45+
| Universal translator, validation | 100% | 75.1953% | 81.0547% |
46+
| Exact sender-message agreement | 100% | 93.74% | 77.56% |
47+
| Unique messages per sender | 15,360 | 12,048–12,255 | 15,095–15,135 |
48+
| Collision meanings per sender | 0 | 3,105–3,312 | 225–265 |
49+
| Message entropy | 13.91 bits | 13.45–13.48 bits | 13.87–13.88 bits |
50+
| Declared payload | 14 bits | 14 bits | 16 bits |
51+
| Registered development gate | pass | fail | **fail** |
52+
53+
The positive control passes every validity requirement at 100%, proving that
54+
the fresh split remains fully solvable under the factorized 14-bit protocol.
55+
The paired weak-structure control selects step 7,400 and stops at the registered
56+
15,000-step minimum. The 16-bit intervention keeps improving, selects step
57+
16,200 and stops at step 21,200.
58+
59+
The extra two bits have a large isolated effect. Mean train exactness improves
60+
by 19.21 percentage points and worst-link train by 20.03 points. Mean
61+
validation improves by 4.19 points, worst-link validation by 8.50 points and
62+
translator validation by 5.86 points. The minimum sender codebook gains 3,047
63+
occupied messages and the final all-link hard-error replay pool falls from
64+
1,953 to 119.
65+
66+
Capacity is nevertheless insufficient. The intervention retains 225–265 hard
67+
collisions per sender, so none is injective. Mean and worst-link validation are
68+
74.46% and 73.34%, below their registered 80% thresholds. The intervention
69+
passes both train thresholds, the translator threshold and both paired
70+
non-regression checks, but fails injectivity and both validation thresholds.
71+
72+
The error pattern also distinguishes memorization from learned compositional
73+
structure. The 16-bit arm reaches near-perfect training and perfect texture
74+
validation, while held-out color and shape remain at 94.66% and 79.77% factor
75+
accuracy. Sender agreement falls from 93.74% to 77.56%, and sender topographic
76+
correlations fall from 0.761–0.771 to 0.693–0.700. The surplus code space lets
77+
independent senders separate most training meanings, but it does not induce a
78+
shared compositional organization for the withheld relation.
79+
80+
All three post-hoc analyses verify 65 artifact hashes, 16,384 validation-only
81+
episodes, absent confirmatory-test metrics and valid hard messages. The global
82+
channel audit checks every intervention message for four symbols in `0..15`
83+
and exactly 16 declared bits.
84+
85+
## Batch 1 decision
86+
87+
ECP8-B1-I is a valid negative development result. Two surplus unallocated bits
88+
substantially reduce the hard-code bottleneck and improve every joint accuracy
89+
metric, but they do not produce an injective or sufficiently compositional
90+
protocol. The pure-capacity hypothesis is rejected, and the ECP-8 confirmatory
91+
split remains sealed.
92+
93+
Do not continue with an 18-bit, 20-bit or longer fixed message search. A Batch
94+
2, if attempted, must keep the 16-bit channel and Batch 1 training fixed while
95+
preregistering exactly one structure-induction mechanism. The most direct
96+
candidate is the previously defined context-invariant transition objective,
97+
because Batch 1 now supplies the code capacity that was missing when that
98+
objective collapsed in ECP7-B8. It must be tested without a slot binding or
99+
additional simultaneous change.

0 commit comments

Comments
 (0)