# Ticket #000025 — 5F battery: Function · Finetuning · Falsification · Formulate · Feedback Loop

**Status:** closed · 2026-05-11 — Phase 1a + 1b.2 + 1c + 1d + 1e + 1f all landed; §10.11 (real shard finetuning chains — persistent SelfModel-chain lineage), §10.13 (Feedback Loop latency + persisted-footprint efficiency on real workload), §10.14 (ForkScore threshold-calibration handoff to #000012) all landed 2026-05-11. Every §10 closure criterion met
**Opened:** 2026-05-07
**Revised:** 2026-05-08 (cross-modality + state-space synthesis
folded in per review response)
**Scope:** Open the 5F battery — Dav1DPrometheus's
operational-quality axis, missing entirely from arborist before
this ticket. Five sub-batteries: **Function** (task alignment),
**Finetuning** (adaptation efficiency), **Falsification** (error
detection + correction), **Formulate** (logical structuring),
**Feedback Loop** (continuous improvement). 5F integrates with
existing arborist surfaces — `providence_cache.falsification_state`,
`audit_events`, `memory_records` (#000017, landed),
`selfmodel_records` (#000014, landed). No new substrate work.
**Audience:** fox + future bench authors. Once 5F lands, 5S + 5T +
5F together form the complete non-embodied AGI evaluation surface
Dav1DPrometheus published.
**Hard constraint:** 5F is text-first in Phase 1a but the fixture
schema is **carrier-aware**. Unsupported non-text carriers MUST
fail or skip explicitly. No LLM-as-judge in any 5F runner. No
schema bump, no governance hash bump. Hidden-channel work stays
defensive (detection only, never generation).

**Source:** Dav1DPrometheus (BasementAGI host) — *"5Fs: Function,
Finetuning, Falsification, Formulate, Feedback Loop."*

---

## 1. Why 5F is the operational bridge

5S evaluates linguistic / sign-structure precision.
5T evaluates temporal / cross-reasoning / logical coverage.
**5F evaluates whether the organism acts, adapts, falsifies,
formulates, and integrates feedback** — the dimensions that turn a
state-space into an *adaptive* state-space.

Without 5F:

```
state-space exists but may not improve.
```

With 5F:

```
state-space becomes an adaptive learning organism.
```

That is the operational gap 5F closes.

---

## 2. State-space / time synthesis

The folded-in correction (2026-05-08 review):

> **SQD + Merkle-AGI v7 + 5S/5T/5F + arborist together instantiate
> an explicit discrete state-space/time in which counting,
> mathematics, and logic become auditable operations over committed
> state — not just text generated by a latent model.**

Define an arborist organism state at time `t`:

```
Ω_t = (
  W_t,        workspace state
  I_t,        invariant objects under π*
  C_t,        concept / semiotic state
  L_t,        claim lattice
  MRoot_t,    memory root
  SMRoot_t,   SelfModel root
  PRoot_t,    policy root
  BRoot_t,    benchmark root
  ARoot_t,    audit root
)
```

A transition is `Ω_{t+1} = T(Ω_t, Δ_t)` where `Δ_t ∈ {new evidence,
new claim, new falsification, new benchmark result, new SelfModel
update, new memory snapshot, new feedback observation, new repair
operation}`. This is a discrete state-space/time — not metaphorical.
The system has states, transitions, invariants, events, memory,
verification, branching, rollback, selection pressure.

5F maps onto the transitions:

| Sub-battery | Transition question |
|---|---|
| Function | Does the transition do the intended operation? |
| Finetuning | Does the organism improve across parent→child states? |
| Falsification | Does the organism reject invalid states? |
| Formulate | Does the organism convert raw input into structured state? |
| Feedback Loop | Does observation at `t` affect state at `t+1`? |

**Counting** emerges over finite committed sets (claims, verifier
passes, memory branches, feedback observations integrated, SelfModel
capability upgrades). **Mathematics** emerges over π*-canonical
invariants. **Logic** emerges from verifier predicates, truthtables,
syllogisms, transitivity, falsification states, admissibility
labels. **Time** emerges from ordered state transitions across
MemoryRoot / SelfModel / BenchmarkRoot.

The break from traditional LLM stacks:

> **Traditional LLMs generate math/logic as behavior. This stack
> externalizes math/logic as committed, verifier-addressable state.**

That is the architectural justification for 5F's existence as a
distinct axis.

---

## 3. Carrier-aware 5F definitions

Common rule:

> A 5F task evaluates whether the organism can operate correctly
> over a carrier, adapt over that carrier, falsify errors in that
> carrier, formulate structure from it, or integrate feedback about
> it.

Phase 1a allowed carriers:

```
text · claim_lattice · providence_record ·
selfmodel_snapshot · memory_snapshot · audit_event
```

Future carriers:

```
code · table · image · audio · video · sensor ·
spatial/world states · tool_action · mixed · hidden_channel
```

Unsupported carriers in v1 → `reason="unsupported_carrier"`,
explicit fail or skip.

---

## 4. Fixture schema

```json
{
  "id": "5f-<sub>-NNN",
  "battery": "5f",
  "sub_battery": "function",
  "version": "v1",

  "carrier": "claim_lattice",
  "domain": "qa_answer",
  "pi_star_ref": "claim-lattice@v1",
  "loss_report_refs": [],
  "modality_notes": "Phase 1a uses text/claim-lattice; future carriers may include image, code, tool traces, world state.",

  "task": { ... }
}
```

---

## 5. Per-sub-battery design

### 5.1 Function

**Definition:** does the system actually perform the designated
operation? Phase 1a: directive → expected output shape →
deterministic predicate.

**Fixture shape:**

```json
{
  "id": "5f-function-001",
  "carrier": "claim_lattice",
  "domain": "qa_answer",
  "pi_star_ref": "claim-lattice@v1",
  "directive": "Return exactly two claim-lattice claims with evidence pointers.",
  "answer_mode": "claim_lattice",
  "expected_shape": {
    "claim_count": 2,
    "pointers_required": true
  },
  "evaluator": "shape_match",
  "expected": "pass"
}
```

**v1 evaluators (deterministic only):**

```
shape_match · pointer_set_match · threshold_on_metric
```

**Future evaluators:** `ast_patch_applies`, `image_region_detected`,
`world_state_updated`, `tool_postcondition_met`.

**Metric:** `function_pass_rate = passed / total`.

### 5.2 Finetuning

**Definition:** measured improvement from parent state to child
state after adaptation. Adaptation includes SelfModel update, policy
update, benchmark-selected patch, π* canonicalizer update,
memory-root update, model-profile change, actual model finetune.

**Fixture shape:**

```json
{
  "id": "5f-finetuning-001",
  "carrier": "selfmodel_snapshot",
  "domain": "capability_transition",
  "pi_star_ref": "pi_selfmodel_v1",
  "parent_selfmodel": "SM_PARENT",
  "child_selfmodel": "SM_CHILD",
  "target_capability": "CAP-5S-SYLLOGISM",
  "parent_measured_value": 0.45,
  "child_measured_value": 0.65,
  "expected_improvement_min": 0.05,
  "resource_budget": {
    "max_compute_ms_delta": 1000,
    "max_storage_delta_bytes": 1000000
  },
  "expected": "pass"
}
```

**Metrics:**

```
adaptation_improvement_rate
adaptation_efficiency = improvement_delta / capital_cost_delta
```

`adaptation_efficiency` hooks into the capital ledger (#000020,
landed) and prepares fitness-cost weighing for v8 fork choice
(#000012).

**Zero-cost guard (per 2026-05-08 fbd99a8 review):** Phase 1a
implements explicit sentinels in :func:`bench.batteries.b_5f._efficiency`:

- `cost > 0` → standard ratio
- `cost == 0, gain > 0` → `EFFICIENCY_INFINITE` (free improvement)
- `cost == 0, gain == 0` → `EFFICIENCY_UNDEFINED` (= 0.0; no signal)
- `cost == 0, gain < 0` → `-EFFICIENCY_INFINITE` (free regression)

Battery-level metrics report `mean_finite` (over finite values
only) plus `infinite_count` and `neg_infinite_count` so consumers
preserve dimensional truth without a single mean polluted by inf.

### 5.3 Falsification

**Definition:** does the system detect and correct errors?

**Fixture shape:**

```json
{
  "id": "5f-falsification-001",
  "carrier": "providence_record",
  "domain": "claim_lattice",
  "pi_star_ref": "claim-lattice@v1",
  "record": "planted_bad_providence_record",
  "expected_reason": "WARRANT_MISSING",
  "verifier_method_root": "...",
  "repair_expected": true,
  "expected": "pass"
}
```

**Metrics:** `error_detection_rate`, `repair_success_rate`.

**Verifier-method-root tag:** every Falsification fixture pins the
`verifier_method_root` it was authored against. If the verifier
shape changes upstream, the bench reports a *mismatch warning*
instead of treating the fixture as a false failure.

**Hidden / alternate-media safety framing:** future carriers
(`carrier: "image"` / `"audio"` / `"hidden_channel"`) enable
defensive Falsification tasks — *detect unexpected carrier*,
*flag projection-loss risk*, *flag hidden-channel suspicion*,
*reject unsupported semantics*. Never generation, never
concealment.

### 5.4 Formulate

**Definition:** turn unstructured input into coherent, interpretable
structure.

Phase 1a: free text → claim lattice.

Future: image → scene graph; table → relational model; code →
AST/dependency-graph; sensor stream → event graph; world state →
object-relation graph; mixed media → cross-modal claim lattice.

**Fixture shape:**

```json
{
  "id": "5f-formulate-001",
  "carrier": "text",
  "domain": "claim_lattice",
  "pi_star_ref": "claim-lattice@v1",
  "input_text": "Document sentence with two claims and two pointers.",
  "expected_lattice": {
    "claim_count": 2,
    "ordered": true,
    "pointer_id_sets": [["E1"], ["E2"]]
  },
  "match_policy": {
    "claim_text": "sorted_approx",
    "pointer_ids": "exact_set",
    "order": "required"
  },
  "expected": "pass"
}
```

**Metric:** `structural_match_rate`.

**Match policy:** structural (sorted-approx claim text +
exact-set pointer IDs + required order), NOT exact-string. Avoids
brittleness without sacrificing determinism.

### 5.5 Feedback Loop

**Definition:** do observations at `t` change downstream
behavior/state at `t+1`?

This is the most important 5F component for recursive
self-improvement. Without Feedback Loop, the state-space exists
but does not learn.

**Fixture shape:**

```json
{
  "id": "5f-feedback-loop-001",
  "carrier": "memory_snapshot",
  "domain": "memory_root",
  "pi_star_ref": "pi_memory_v1",
  "chain": [
    {"operation": "snapshot",      "observation": "claim X is stale"},
    {"operation": "update_memory", "observation": "memory branch marks X stale"},
    {"operation": "snapshot",      "expected_delta": "X appears in stale set"}
  ],
  "expected": "pass"
}
```

**Metrics:**

```
integration_coverage_rate
feedback_latency
downstream_effect_rate
feedback_efficiency = downstream_effect_count / capital_cost_delta
```

`feedback_efficiency` again hooks the capital ledger (#000020).
Same zero-cost-guard semantics as `adaptation_efficiency` — see the
:func:`_efficiency` helper. Phase 1a used chain length (count of
*requested* ops) as the cost-proxy. **§10.13 (2026-05-11)** replaced
that for live chains with the *persisted footprint* —
:func:`bench.batteries.b_5f._persisted_cost` = the audit-event rows
the chain actually wrote + their body bytes / 1e6 (matching
`_capital_cost_delta`'s 1 MB = 1 unit convention) — and finally
implemented `feedback_latency` (listed above since Phase 1a, never
computed): wall-clock seconds to apply a live chain against its temp
shard, surfaced as per-task `feedback_latency_seconds` + battery
`feedback_latency_mean_seconds` (0.0 when a pack has no live tasks)
+ `feedback_live_task_count`. Latency is a wall-clock field
(run-to-run variable, like `BatteryResult.timestamp`) and is **not**
a `fork_score` input — it's for operational observability + the
#000020 ledger. Embedded chains keep `len(chain)` as cost and report
`feedback_latency_seconds = None`.

**Phase 1a uses existing surfaces only:** `memory_records`,
`memory_branch_summaries`, `audit_events`. No new substrate work.

---

## 6. Required file changes

### 6.1 Module + fixtures

```
bench/batteries/b_5f.py                              # new
bench/fixtures/5f/function-v1.jsonl                  # ~10 seed (Phase 1a)
bench/fixtures/5f/finetuning-v1.jsonl                # ~10 seed
bench/fixtures/5f/falsification-v1.jsonl             # ~10 seed
bench/fixtures/5f/formulate-v1.jsonl                 # ~10 seed
bench/fixtures/5f/feedback-loop-v1.jsonl             # ~10 seed
```

Each fixture file carries the standard `_meta` head with
`battery="5f"`.

### 6.2 Runner registration

In `bench/batteries/runner.py`:

```python
_BATTERIES = {
    "5s": b_5s.SUB_BATTERIES,
    "5t": b_5t.SUB_BATTERIES,
    "5f": b_5f.SUB_BATTERIES,    # new
}
```

### 6.3 Make targets

```makefile
bench-5f-function:
	$(PY) -m bench.batteries.runner --battery 5f --sub function \
	    --fixtures bench/fixtures/5f/function-v1.jsonl

bench-5f-finetuning:
	$(PY) -m bench.batteries.runner --battery 5f --sub finetuning \
	    --fixtures bench/fixtures/5f/finetuning-v1.jsonl

bench-5f-falsification:
	$(PY) -m bench.batteries.runner --battery 5f --sub falsification \
	    --fixtures bench/fixtures/5f/falsification-v1.jsonl

bench-5f-formulate:
	$(PY) -m bench.batteries.runner --battery 5f --sub formulate \
	    --fixtures bench/fixtures/5f/formulate-v1.jsonl

bench-5f-feedback-loop:
	$(PY) -m bench.batteries.runner --battery 5f --sub feedback-loop \
	    --fixtures bench/fixtures/5f/feedback-loop-v1.jsonl

bench-5f: bench-5f-function bench-5f-finetuning \
          bench-5f-falsification bench-5f-formulate \
          bench-5f-feedback-loop

bench-5s5t5f: bench-5s bench-5t bench-5f   ## complete Dav1DPrometheus suite
```

`make bench-5s5t5f` becomes the canonical Dav1DPrometheus
non-embodied AGI fitness surface.

---

## 7. Tests

```
test_5f_function_runs
test_5f_finetuning_runs
test_5f_falsification_runs
test_5f_formulate_runs
test_5f_feedback_loop_runs
test_5f_fixture_digest_stable
test_5f_runtime_digest_stable
test_5f_fixture_accepts_carrier_metadata
test_5f_unsupported_future_carrier_fails_cleanly
```

Sub-battery-specific:

```
test_5f_function_shape_match_evaluator
test_5f_function_pointer_set_match_evaluator
test_5f_function_threshold_on_metric_evaluator
test_5f_finetuning_requires_parent_and_child_selfmodel
test_5f_falsification_verifier_method_root_mismatch_warns
test_5f_formulate_pointer_id_set_exact_match
test_5f_feedback_loop_observation_affects_downstream_snapshot
```

---

## 8. Out of scope

- Phase 1b fixture expansion (target 30-50 per sub-battery).
- Cross-battery composite scoring (5S + 5T + 5F aggregation is its
  own concern).
- Calibration of metric thresholds for v8 selection acceptance
  (depends on #000012 v8 paper).
- LLM-as-judge for any 5F task (forbidden by hard constraint).
- Multimodal Phase 1a (text/claim-lattice/memory only; multimodal
  comes after #000013 + #000015 follow-ups land).
- Hidden-channel **generation**. Defensive detection only, in
  Phase 1b+.

---

## 9. Risks & mitigations

| Risk | Mitigation |
|---|---|
| Function evaluator vague | v1 allows only named deterministic evaluator types: `shape_match`, `pointer_set_match`, `threshold_on_metric`. Future evaluators land in follow-ups. |
| Finetuning fakes improvement | Require parent + child SelfModel roots; require measured_value pre/post; require improvement threshold; record capital cost. |
| Falsification fixtures stale | Tag every fixture with `verifier_method_root`. Bench reports mismatch instead of false failure. |
| Formulate exact-string brittle | Structural match only: claim count + order + pointer-ID-set + claim-text approximate/sorted. |
| Feedback Loop needs substrate work | Use existing `memory_records`, `memory_branch_summaries`, `audit_events` surfaces. Phase 1a explicitly forbids new substrate. |
| Premature multimodal scope creep | Carrier metadata in fixtures; non-text carriers fail/skip explicitly. |

---

## 10. Closure criterion

### Phase 1a closes when:

1. `bench/batteries/b_5f.py` lands.
2. All five sub-battery runners are non-stub.
3. Each sub-battery has ≥10 deterministic seed fixtures.
4. Fixture metadata includes `carrier` / `domain` / `pi_star_ref`
   / `loss_report_refs` / `modality_notes` fields.
5. `make bench-5f` passes end-to-end.
6. `make bench-5s5t5f` exists and runs the complete Dav1DPrometheus
   suite.
7. Runtime + fixture digests are deterministic across repeated
   runs.
8. No schema, governance hash, or canonicalization-version changes.
9. No LLM-as-judge anywhere in 5F runners.

### Phase 1b keeps the ticket in-progress until:

10. 30-50 fixtures per sub-battery.
11. Real shard-based Finetuning chains (replacing synthetic
    parent→child SelfModel pairs from Phase 1a).
12. Expanded Falsification planted-error suite covering every
    documented failure-motif tag.
13. Feedback Loop latency / efficiency metrics calibrated against
    real workload data.
14. Threshold calibration for v8 selection acceptance handed off
    to ticket #000012.

### Phase 1b.2 — all five sub-batteries bridged synthetic → live (2026-05-08)

Every 5F sub-battery now has an embedded (Phase 1a) AND a live
(Phase 1b.2) path. Per-task `detail.source` reports `"embedded"`
or `"live"` so bench output distinguishes synthetic from live
signal. Embedded fixtures keep their digests stable; live fixtures
ship in dedicated `*-live-v1.jsonl` files.

| Sub-battery | Live surface | Live fixtures |
|---|---|---|
| Formulate | `arborist.qa.parse_claims.parse_pointer_claims` | 15 |
| Feedback Loop | `arborist.store.append_audit` + `arborist.memory.snapshot` (temp shard) | 12 |
| Function | `parse_pointer_claims` + Phase-1a shape evaluators | 12 |
| Finetuning | `arborist.selfmodel.store_snapshot` + `claims_for` round-trip (temp shard) | 10 |
| Falsification | `arborist.qa.verify.verify_quotes` (real verifier) | 12 |

Live signals for Falsification surface the verifier's actual
classification (`UNGROUNDED`, `STRICT_<method>`, `HYBRID_<method>`,
`UNVERIFIED_QUOTE`). One fixture (5f-fal-live-003) deliberately
documents a known soft-signal gap: verify_quotes' entity strategy
treats "Insulin/Penicillin" as the same claim because both share
"Alexander Fleming." The title-relevance hard check + claim-lattice
verifier catch this in production; the fixture flags the soft path's
limit.

`make bench-5f-live` aggregates all five live fixtures.

### Phase 1e — motif coverage (2026-05-10)

§10.12 closure: every documented failure-motif tag has at least one
falsification fixture as `expected_reason`. Pre-Phase-1e the
falsification-v1.jsonl pack covered 10 motifs (the high-traffic
warrant/title/anchor/format set); Phase 1e adds 12 fixtures
(`5f-fal-051..062`) for the previously-uncovered motifs surfaced by
auditing `arborist/qa/verify.py:violations.append` callsites + the
`_SOFT_DEMOTE_VIOLATION_KINDS` registry in `arborist/cli.py`:

```
CITATION_MISMATCH            DEFLECTION_DETECTED
MANUAL_QUOTE_VIOLATION       SCHEMA_INVALID
SOURCE_ROLE_BLOCKED          SUBJECT_TOKENS_ABSENT
TOO_MANY_EVIDENCE_IDS        UNKNOWN_EVIDENCE_ID
BROAD_QUANTIFIER_RUNAWAY     BROAD_QUANTIFIER_CAP_APPLIED
BROAD_QUANTIFIER_SCOPE_UNBOUND  BROAD_QUANTIFIER_REJECTED
```

Pack now covers 22 unique motif tags across 62 fixtures (was
10/50). `test_5f_falsification_covers_every_documented_motif` in
`tests/test_bench_batteries.py` pins the motif set against the
verifier + soft-demote registries so adding a new violation
upstream surfaces here as a missing fixture (loud signal, no silent
drift).

Phase 1e closes §10.12. Remaining open: §10.11 (real shard
finetuning chains), §10.13 (Feedback Loop latency/efficiency
against real workload), §10.14 (threshold handoff to #000012).

---

## 11. Status

**As of 2026-05-11: closed — all §10 closure criteria met.**

- **Phase 1a** (Function + Finetuning seed): landed.
- **Phase 1b.2** (Falsification curated fixtures): landed.
- **Phase 1c** (5F synthetic side expanded 10 → 30): landed
  2026-05-09 per #000025 §10.11 cross-reference.
- **Phase 1d** (synthetic side 30 → 50): landed 2026-05-09.
- **Phase 1e** (falsification motif coverage 50 → 62 covering
  every documented failure-motif tag): landed 2026-05-10, closes
  §10.12.
- **Phase 1f** (corpus-derived falsification harvest): landed
  2026-05-10 in commit `ff1752c`. Closes the controller → battery
  loop fox designed in #000037 §3: Phase 1 controller emits
  `FalsificationFixtureProposal` records from high-divergence
  `providence_cache` rows (witness_divergence ≥ 0.5);
  `bench/scripts/harvest_falsification_proposals.py` stratifies
  top-20-by-cache_key per audit_mode and writes
  `bench/fixtures/5f/falsification-harvested-v1.jsonl`
  (<!--AUTOCOUNT:fixture-rows:bench/fixtures/5f/falsification-harvested-v1.jsonl-->41<!--/AUTOCOUNT-->
  rows = 1 `_meta` header + 40 fixtures, stratified 20 HYBRID +
  20 UNGROUNDED). The 5F battery exercises them every test run;
  `test_5f_falsification_harvested_pack_runs_clean` asserts
  `error_detection_rate == 1.0` (every harvested row IS a
  falsification by construction). Self-amplifying coverage —
  the pack grows with the corpus + controller, not with
  hand-curation. Every fixture row carries `_harvest_meta` with
  source `cache_key`, `witness_divergence` at harvest time,
  `audit_mode_at_harvest`, `harvest_threshold`, and
  `source_ticket: "#000037 §13 step 11"` for full traceability.
  Regenerate via `make bench-5f-harvest`.
- **Phase 1g** (§10.13 — Feedback Loop latency / real-workload
  efficiency): landed 2026-05-11. `run_feedback_loop` now computes
  `feedback_latency` (listed in §5.5 since Phase 1a, never
  implemented) — wall-clock seconds to apply a live chain against its
  temp shard, surfaced per-task (`feedback_latency_seconds`) +
  battery (`feedback_latency_mean_seconds`, `feedback_live_task_count`).
  For live chains `feedback_efficiency`'s cost denominator switched
  from `len(chain)` (count of *requested* ops) to the *persisted
  footprint* `_persisted_cost` = audit-event rows the chain actually
  wrote + their body bytes / 1e6. Embedded chains keep `len(chain)`
  and report `feedback_latency_seconds = None`. Latency is a
  wall-clock field (run-to-run variable, like
  `BatteryResult.timestamp`) and is **not** a `fork_score` input.
  Tests: 3 new in `tests/test_bench_batteries.py`
  (`_persisted_cost` helper; embedded reports no latency; live
  reports latency + persisted cost + the `efficiency = 1/cost`
  identity).
- **Phase 1h** (§10.14 — ForkScore threshold-calibration handoff to
  #000012): landed 2026-05-11. `bench/scripts/fivef_threshold_calibration.py`
  (run via `make bench-5f-threshold-calibration`) runs the canonical
  5S/5T/5F packs + the 5F live packs and reports baseline rates,
  observability granularity (1/n), and `fork_score` verdicts on the
  parent vs synthetic perturbations →
  `bench/results/5f-threshold-calibration-2026-05-11.md`. Findings
  written into #000012 §8: keep `SIGNAL_FLOOR` / `HARD_REGRESSION_FLOOR`
  at 0.05; the small 5S packs (`syntax` n=10, `semantics` n=8) are
  *coarser* than the floors so any regression there trips hard-reject
  (intended zero-tolerance); the 5× averaging dilution in `_delta_*`;
  ceiling saturation (every pack at 1.0 → Δ-rate terms ≤ 0, so fork
  *acceptance* is carried by the efficiency bonuses + non-bench
  terms until a harder fixture tier lands). No constant change
  shipped — that's #000012's call. Tests: 6 in
  `tests/test_fivef_threshold_calibration.py`.
- **Phase 1i** (§10.11 — real shard finetuning chains): landed
  2026-05-11. `bench/scripts/selfmodel_chain_snapshot.py`
  (`make bench-5f-selfmodel-snapshot`) appends ONE chained SelfModel
  snapshot per run to a persistent shard
  (`~/.arborist/shards/selfmodel-chain.db`, override via
  `ARBORIST_SELFMODEL_CHAIN_DB`) with one `CapabilityClaim` per
  sub-battery (`metric = "5S-syntax"` etc., `measured_value` = that
  pack's rate, `eval_digest` = the pack's fixture digest, `threshold`
  = `fork_score.SIGNAL_FLOOR`). `snapshot()` auto-parents, so the
  distinct parent makes each snapshot a distinct root and the
  lineage grows by one per run. `run_finetuning` gains a third
  dispatch mode — **shard-chain** (gated on a task's `selfmodel_shard`
  key) — via `_chain_finetuning_measure`: reads the two most-recent
  snapshots (`latest()` = child, its `parent_selfmodel_root` =
  parent) and measures improvement on `target_capability` between
  them. This is the real lineage replacing Phase-1a's synthetic
  parent→child pairs; the chained Δ reflects genuine cross-run drift
  (0.0 today — the embedded packs are at ceiling). Operator pack
  `bench/fixtures/5f/finetuning-shardchain-v1.jsonl` (6 tasks) +
  `make bench-5f-finetuning-shardchain`; NOT in `make bench-5f`,
  `make test`, or a fresh checkout (a missing/too-short chain fails
  honestly). The real chain shard was bootstrapped 2-deep on
  2026-05-11; `make chain-check-shards` reports 0 breaks on it.
  Tests: 10 in `tests/test_selfmodel_chain.py`.

**All §10 closure criteria met (2026-05-11).** §10 Phase 1a criteria
1–9 + Phase 1b criteria 10–14 are satisfied:
- 10 (30–50 fixtures per sub-battery): 5F embedded packs at 50 each
  (62 for falsification per Phase 1e).
- 11 (real shard finetuning chains): Phase 1i above.
- 12 (motif coverage): Phase 1e.
- 13 (Feedback Loop latency/efficiency on real workload): Phase 1g.
- 14 (threshold calibration handed to #000012): Phase 1h.

Larger surface than #000023 / #000024 (five sub-batteries vs three / four).

The synthesis statement that justifies 5F's existence as a distinct
axis:

> **SQD gives the invariant projection and verifier model.
> Merkle-AGI v7 gives multimodal committed DAG structure. 5S gives
> sign/meaning/derivation fitness. 5T gives transfer, logic,
> triangulation, and time. 5F gives operation, adaptation,
> falsification, formulation, and feedback. Together they
> instantiate an explicit discrete state-space/time in which
> counting, mathematics, and logic become auditable operations over
> committed state — not just text generated by a latent model.**

5F is the operational layer that turns the substrate into an
adaptive learning organism. Without it, the state-space exists
but does not improve.
