campaign: checkpoint research ABI reconstruction

This commit is contained in:
alex 2026-09-09 23:38:44 -04:00
parent 3bfde5a70d
commit 8f3106ae10
733 changed files with 1724995 additions and 892 deletions

54
AGENTS.md Normal file
View file

@ -0,0 +1,54 @@
# SOTS campaign instructions
This repository is the state authority for the SOTS reconstruction and its Windows lab.
Start with `campaign/README.md`, your contract, its latest checkpoint, and open surprises.
Current policy: `guides/multi-agent-workflow.md`. Engine architecture: `sots-engine/docs/architecture.md`.
Historical findings are evidence, not current execution instructions or accepted status.
## Authority and models
- The normal lead/RE/implementation/verification/lab loop runs on **GPT-5.6 Sol
(`openai/gpt-5.6-sol`)**. Reserve **GPT-6 Astra (`openai/gpt-6-astra`)** for resolving
falsified assumptions, conflicting evidence, unexpected instrument effects, or changed scope.
- `campaign/models.json` is the role/model registry. Launch with `tools/run_agent.py` and an
explicit role, contract, state root, and paired worktrees. Never silently downgrade or fall back.
- Ordinary implementation/test failures inside the contract may be fixed by its worker.
Falsified assumptions, conflicting evidence, unexpected instrument effects, or changed scope
require a recorded surprise and an Astra resolution before affected work continues.
- No worker subdelegation. The lead assigns parallelism; max two implementation slices after
the pilot. Independent workload preparation is scheduled against explicit resource leases.
## Durable state and context
Checkpoint in the canonical RE state root every **20 tool calls or 15 minutes**, whichever is
earlier, and before an experiment, compaction, handoff, or stop. Include model/session, exact
source identities, evidence paths, decisions versus observations, tests, blockers, and ONE exact
next action. Do not store state only in a chat summary or `/tmp`.
The runner uses bounded 40-step quanta. After checkpointing, stop and restart from the repository;
automatic compaction is a backstop, not proof that a checkpoint was written. On recovery read the
contract/checkpoint, verify worktree and resource identities, then continue. Missing state means
blocked, not permission to reconstruct progress from memory.
## Ownership
Use distinct engine and RE worktrees per lane, baseline-pinned. Canonical runtime state is shared
only through the campaign tools. One integrator writes current evidence pointers and projections.
Never stage someone else's changes. No automatic commit, push, pull, or reset. Commands requiring
these actions need explicit user authorization. Source edits use apply_patch.
VM, shared build-host, and Ghidra mutation require leases. A stale lease is not automatically free.
Record preconditions, side effects, cleanup and access verification for any lab operation.
Rollout bootstrap file-ownership exception: `campaign/rollout/architecture-decision.md` only.
## Evidence
No generic `verified` promotion. Separate understanding, implementation, original dependencies,
and validation scope. A count is insufficient without distinct states, branch exposures, and
positive execution evidence. Include all writes, container elements, allocations, IDs, events,
RNG draws, and runtime-only inputs. Original-assisted execution is not independent replacement.
Synthetic boundary tests and original-game differential tests are complementary. Missing required
inputs, zero execution, incomplete coverage, unexpected skips, stale binaries or unbound source
identity fail acceptance. One independent verifier must reproduce the package; integrated-tree
evidence is required for acceptance. Reports are measurements until those gates pass.
Never commit owner-supplied binaries/assets or secrets. Engine facts cross only documented
generated channels. Never paste disassembly/decompiler output into the engine repository.

8
CLAUDE.md Normal file
View file

@ -0,0 +1,8 @@
# SOTS entry point
Read `AGENTS.md`. The normal campaign loop uses `openai/gpt-5.6-sol`; problem resolution uses
`openai/gpt-6-astra`.
The supported execution harness is OpenCode through `tools/run_agent.py`; role definitions and
models are versioned in this repository. Do not revive the removed global `re-*` Claude agents
or use a Claude model alias as a substitute for the required model. Read-only research may be
assigned explicitly, with its checkpoint and evidence stored in the canonical RE state root.

View file

@ -1,143 +1,46 @@
# SotS RE campaign — coverage dashboard
# Campaign status
Generated 2026-09-09 14:24 UTC · `sots-re` @ d9b06ca,2026-09-09 · `sots-engine` @ 7741d42,2026-09-09 (252 commits) · regenerate with `tools/dashboard.py`
Generated by `python3 tools/dashboard.py`; edit contracts and `campaign/current.json`.
> **North star:** A functional reimplementation of the engine — behavior-equivalent, NOT byte-for-byte
Plan: [backlog.md](backlog.md). Policy: [method rules](../guides/method-rules.md).
## 1. Map coverage (campaign/board.md)
## Current evidence
454 targets · mapped-or-better **405/454** `[█████████░] 89%` · verified **362/454** `[████████░░] 80%`
Gate: **passed (host)**; this is scoped gate evidence, not whole-engine acceptance.
Manifest: `campaign/evidence/8e14e00ee3ce7478ddfdef8de12183451e858c52d78dc28cffbdee47f5d087d8-gate.json` · SHA-256 `8e14e00ee3ce7478ddfdef8de12183451e858c52d78dc28cffbdee47f5d087d8`.
- engine: dirty snapshot; manifest identity `c9c90acbd182b872841e1c073e367a4747d6742f095e0c9ed737d608cdff78c6`; recorded revision `7741d42fc5e4e761e6449bdaf0e4a61d00036a23`.
- re: dirty snapshot; manifest identity `47b741d67acc48baefec6b4a673bf3525abc415165e59d4d3512dd0cc350c89a`; recorded revision `3bfde5a70d874a723e797a695bbd847fd82c0aa7`.
- Binary SHA-256: `78b2562ea2c56351f9f6f0f24d271afcced741eadbc148047780e6dfd101940b`.
- Input SOTS_SAVES_DIR: 43 hashed files at `/home/alex/sots-re/verify/results/saves`.
- Tests passed: ["addr_smoke", "mars_parse_unit", "game_config_unit", "game_config_manifest", "game_data_unit", "game_design_unit", "game_sim_economy", "game_sim_research", "game_sim_colony", "game_sim_movement", "game_sim_techgraph", "game_sim_visibility", "game_sim_construction", "game_sim_player_turn", "mars_rng_unit", "mars_stream_unit", "mars_stream_save", "mars_stream_domains", "mars_stream_wire_schema", "mars_text_unit", "mars_vfs_unit", "shim_trace_sha256", "shim_trace_emitter", "shim_trace_diff", "shim_trace_coverage", "shim_trace_hook", "game_effects", "game_events", "game_combat_retreat", "game_nav_pathplan", "game_ai_tasks", "game_ai_turn_order", "game_ai_orders", "game_ai_agent", "game_ai_live_blocks", "game_ai_apply_order", "game_ai_command_capture", "shim_budget_unit", "shim_techfx_unit", "shim_colony_unit", "shim_movement_unit", "shim_events_unit", "shim_player_turn_unit", "shim_rng_ledger_unit", "app_catalog", "app_turn", "app_trade_raid", "app_alliance", "app_treaty", "app_event_phase", "app_turn_record", "app_command_replay"]
- Tests skipped: ["game_config_replay", "game_data_realdata", "game_design_realdata", "game_design_census", "game_sim_smoke_real_save", "mars_text_realdata", "mars_vfs_realdata"]
- Tests failed: []
- Limitations: ["host profile allowed skips: game_config_replay, game_data_realdata, game_design_census, game_design_realdata, game_sim_smoke_real_save, mars_text_realdata, mars_vfs_realdata"]
| Status | Count | % |
|---|---:|---:|
| verified | 362 | 80% |
| mapped | 43 | 9% |
| in-progress | 5 | 1% |
| backlog | 41 | 9% |
| blocked | 2 | 0% |
Replay: **measured** (separate file-byte, inflated-byte and state equality).
- /home/alex/sots-re/verify/results/saves/turn2-state.sav → /home/alex/sots-re/verify/results/saves/turn3-state.sav: file=False, inflated=False, state=False.
| Type | verified | mapped | in-progress | backlog | blocked | total |
|---|---:|---:|---:|---:|---:|---:|
| objects | 46 | 6 | 0 | 3 | 1 | 56 |
| control-flow | 41 | 2 | 1 | 0 | 0 | 44 |
| subsystems | 4 | 8 | 0 | 2 | 1 | 15 |
| engine | 34 | 1 | 0 | 0 | 0 | 35 |
| verify | 106 | 15 | 3 | 35 | 0 | 159 |
| phase2 | 15 | 3 | 1 | 0 | 0 | 20 |
| meta | 95 | 6 | 0 | 1 | 0 | 102 |
| other | 21 | 2 | 0 | 0 | 0 | 23 |
Unselected findings and artifacts are historical evidence, not current acceptance.
## 2. Binary understanding
## Capabilities / workloads
- RTTI type descriptors: **1,924** (`Game::` 1,404, `Mars::` 194; serializable types 179)
- Classes with recovered member layouts: **384** / 1,598 named classes `[██░░░░░░░░] 24%` — `objects/layouts.json` (serializer recovery) plus classes recovered by hand in `struct-recovery.md` + `schema-gaps-resolved.md`. Note 179 types are *serializable*; the recovery also reaches non-serializable ones, so this is not a subset of that
- Functions: **41,411** (parsed from `01-fingerprint.md`); named/annotated in the **address contract** (`ghidra/addresses.json`, not Ghidra's full rename count): **1320**, verified **1187** `[█████████░] 90%`
Contract lifecycle is reported independently of the evidence axes above.
## 3. Data layer
| Contract | Lifecycle | Scope / workload | Original dependencies |
|---|---|---|---|
| [Bootstrap canonical contract controls and bounded worker launcher](contracts/controls-bootstrap.json) | accepted | ["tools/campaign.py", "tools/run_agent.py", "campaign/", "verify/campaign/"] | ["No original game executable required for control tests"] |
| [Normal Astra launcher, explicit routing and durable checkpoint smoke](contracts/launcher-smoke.json) | proposed | ["SMOKE ONLY: Read this contract and campaign/README.md from the canonical RE state root. Do not implement any other contract, edit source, delegate, or access the lab.", "Use the canonical campaign CLI to write a checkpoint for launcher-smoke with the run-supplied session ID, actor launcher-smoke, role architecture-review and model openai/gpt-6-astra. Summary: explicit Astra launcher reached canonical RE state from paired worktrees; no source mutation. Artifact: campaign/agents/lead.md. Next action: lead inspects this run's actual event/session/checkpoint binding.", "After writing that checkpoint, immediately return a short completion. Do not plan extra work."] | [] |
| [RE: research completion record construction and allocator ABI](contracts/research-completion-abi.json) | proposed | ["Reverse engineering only. Own canonical campaign/research/research-completion-abi.md and verify/results/research-completion-abi/ captures. Use assigned source-identical paired worktrees for source inspection; canonical RE for unique evidence/checkpoint outputs.", "Recover actual constructors/copy/destructors/vector-growth/allocation/free conventions used by RecordObservedTech and EventStorage/TurnEvents/PlayerEvent. Resolve implementable ABI operations, not another general framework.", "Use existing ReVa read-only tools through canonical tools/reva_call.py or the owner-supplied local binary. No Ghidra renames/type writes, VM mutation, new engine code, framework code, agents or delegation. Do not commit/stage/push.", "Start with findings/subsystems/{events,observedtech-append,research-replace}.md and campaign/pilots/research-replacement.md; cross-check binary bytes/decompilation rather than merely repeat notes. Anchors: RecordObservedTech 0x007ba1a0, EventStorage::PostEvent 0x008862b0, PlayerEvent constructor 0x0084ee30. Addresses are hypotheses to validate against fingerprint and actual tools.", "Produce recovered signatures, ownership/lifetime rules, short/long string and empty/full-capacity container paths, and exact unresolved dependencies with minimum next probe. Store raw tool outputs and a hash/provenance index in your owned RE results directory. Keep code-derived material out of engine repo."] | ["Original binary is the object of analysis, not a replacement dependency decision"] |
| [Completion-bearing research replacement pilot (proposed; acceptance runner and dependencies pending)](contracts/research-replacement.json) | proposed | ["Planning only until ready: campaign/pilots/research-replacement.md is the detailed input, write-boundary and acceptance specification. No replacement code or lab operations authorized by this proposed contract.", "Target ProcessResearch plus SetResearched and required OnTechResearched effects for the W1 turn3 LOAD-to-turn4 completion; broad research correctness is not implied.", "Before implementation assign paired baseline-pinned worktrees, exact owned source paths, supported-input preflight and executable acceptance. Uncommitted bootstrap changes are not bound by these HEAD IDs."] | ["Existing research adapter calls original TechTree::Cost for effective and cascade costs; independent effective-cost replacement is not established.", "Separate B2 hook uses original has-researched lookup and node-bore updater. The updater allocates/frees state and is not read-only. Its integration/retention needs an explicit lead decision.", "Runtime EventText lookup and caller-supplied asset tables already exist. Whether live text/allocator/event adapters use original helpers is unresolved; no PostEvent policy or address is assumed.", "Shim workload retains original turn driver, budget allocation, remaining simulation, data loading and save serialization. Successful scoped shim replacement would not establish independent standalone turn parity."] |
- Catalogs: **1,595/1,595** files parsed (91 block kinds in `schema_stats.json`), dangling cross-refs **0** (`crosslink.json`)
- Oracle `mars-parse`: **1,531/1,531** files agree `[██████████] 100%`
- Oracle `mars-text`: **64/64** files agree `[██████████] 100%`
- Saves: **43/43** real saves strict-clean — strict exit 0, 0 errors, 0 warnings
- Design rules: **127/127** stock designs pass `[██████████] 100%`
- Value domains: **490/724** typed fields have been seen to vary `[███████░░░] 68%` — the other **234** have only ever held one value across the corpus, so their typing is untested (`value-domain-census.md`)
## Blockers / surprises
## 4. Engine accrual (sots-engine)
- No open surprise records found (not proof of acceptance).
- **controls-bootstrap** (accepted): dependencies []; stop conditions ["Cross-cutting architecture changes require Astra resolution"]; checkpoint campaign/runtime/checkpoints/controls-bootstrap-5643d7cec1edd289b0465d5f.json.
- **launcher-smoke** (proposed): dependencies []; stop conditions ["Any model, permission, contract, checkpoint or source mismatch: record incomplete; no fallback."]; checkpoint campaign/runtime/checkpoints/launcher-smoke-9e8a62fea4de50abd96f27d6.json.
- **research-completion-abi** (proposed): dependencies ["controls-bootstrap"]; stop conditions ["Stop affected interpretation on binary fingerprint mismatch, contradictory ownership/ABI evidence, unavailable original data, or any scope-changing surprise; record and escalate to Astra", "Checkpoint every 20 calls/15 minutes and before compaction/stopping; return exact next RE action within 40 steps", "Do not expand into framework development or mark pilot replacement ready/accepted"]; checkpoint campaign/runtime/checkpoints/research-completion-abi-5e30f7db1f3804d05c217369.json.
- **research-replacement** (proposed): dependencies []; stop conditions ["Remain proposed while readiness criterion, dependency decisions, input manifests and executable acceptance are missing; do not interpret narrative strings as execution proof.", "Stop on control disagreement, instrumentation mismatch, source/input drift, missing artifacts/assets, unknown RNG, unmodelled fired branch, unexpected writes, zero required execution or forbidden original fallback.", "Record any falsified assumption or changed scope as a surprise and obtain Astra resolution before affected work continues; checkpoint at 20 calls/15 minutes and before experiments, handoff or stop.", "No lab or shared-host mutation without explicit assignment and lease; no commits, staging, push or delegated work under the current pilot-design assignment."]; checkpoint null.
| Module | LOC | Test files | Checks | Wired | Doc |
|---|---:|---:|---:|---|---|
| `app` | 5,092 | 9 | 207 | yes | N-output-term.md |
| `game/ai` | 2,138 | 8 | 322 | yes | L4-ai-orders.md |
| `game/combat` | 582 | 2 | 34 | yes | L2-predictions.md |
| `game/config` | 558 | 4 | 131 | yes | M1.md |
| `game/data` | 2,077 | 12 | 462 | yes | game-data.md |
| `game/design` | 1,200 | 19 | 303 | yes | game-design.md |
| `game/effects` | 973 | 3 | 231 | yes | game-effects.md |
| `game/events` | 558 | 3 | 152 | yes | E-events.md |
| `game/nav` | 581 | 2 | 113 | yes | — |
| `game/sim` | 4,918 | 15 | 1086 | yes | game-sim.md |
| `mars/parse` | 875 | 12 | 277 | yes | mars-parse.md |
| `mars/rng` | 273 | 0 | 0 | yes | mars-rng.md |
| `mars/stream` | 6,021 | 8 | 331 | yes | mars-stream.md |
| `mars/text` | 899 | 8 | 245 | yes | mars-text.md |
| `mars/vfs` | 788 | 9 | 140 | yes | mars-vfs.md |
| `shim` | 16,777 | 0 | 0 | direct (WIN32) | H-probes.md |
| `shim/hooks` | 13,658 | 0 | 0 | direct (WIN32) | L1-predictions.md |
| `shim/trace` | 2,258 | 9 | 273 | direct (WIN32) | shim-trace.md |
| **total** | **60,226** | **123** | **4307** | | |
## Next action
Board `engine:` rows: verified **34**, mapped 1, in flight 0 (of 35) — verified & merged `[██████████] 97%`
## 5. Phase 2 milestones
| Milestone | Status | Coverage | Notes |
|---|---|---:|---|
| P2-M0 shim bootstrap | ✅ verified | 100% | sots-engine 5f5bc41: proxy binkw32.dll (66 exports identical), MinHook, asm-stub trace hoo |
| P2-M1 flat-KV config loader | ✅ verified | 100% | LIVE: GlobalConsts::LoadFile hooked; trace 19 calls/1088 regions (tracecmp 0); compare 19/ |
| P2-M2 manifest/id registry | ✅ verified | 80% | LIVE: trace 22 calls (tracecmp 0); weapons compare 1/1 0 divergences; REPLACE+oracle byte- |
| P2-M3 Mars brace-block parser | ✅ verified | 0% | SUPERSEDED (engine mars/parse, oracle 1531/1531). Mars::Script pull tokenizer (Open 0x008c |
| P2-M4 gobio VFS read | ✅ verified | 0% | SUPERSEDED (engine mars/vfs, 10268 files CRC-clean). choke point: bool __cdecl gobio::Read |
## 6. Standalone (`src/app`) — distance to the byte-match
Turn-driver phases: **16/44** modelled (12 committed) `[████░░░░░░] 36%`
| | verified | implemented | partial | blocked | stub |
|---|---:|---:|---:|---:|---:|
| turn drivers (44) | 0 | 4 | 8 | 4 | 28 |
| post-combat tail (37) | 0 | 1 | 4 | 1 | 31 |
Reference pair `turn2-state.sav` → `turn3-state.sav`, leaves localised by `state_checksum.py` (coverage proved by re-serialisation):
- baseline (a standalone that does nothing): **108** leaves diverge
- after one standalone turn: **63** leaves diverge — closed 45, regressed 0
- byte match: ❌ not yet `[████░░░░░░] 42%`
Where the remaining divergence lives:
| Subsystem | Leaves |
|---|---:|
| `/Sim/systems` | 24 |
| `/Sim/players` | 20 |
| `/Sim/turnstats` | 8 |
| `/Sim/fleets` | 3 |
| `/Sim/FleetIDs[]` | 1 |
| `/Sim/ModCount` | 1 |
| `/Sim/NMnx` | 1 |
| `/Sim/NumFlts` | 1 |
Generator: 16 word(s) modelled per turn; unattributed per turn: 18-20 (lane Z, in flight). A byte-match is impossible until that closes — the generator state is saved state.
Detail: `verify/results/standalone/report.txt`.
## 7. Verification ledger
- ✅ Saves strict: 43/43 (strict exit 0, 0 errors, 0 warnings)
- ✅ Design rules: 127/127
- ✅ oracle mars-parse 1531/1531 · ✅ oracle mars-text 64/64
- ✅ Compare harness present (`verify/harness/compare/`)
- ✅ M0 evidence present (`verify/results/shim/m0.log`)
- ✅ Determinism oracle: verified
## 8. Open questions
Open **26** · resolved/parked 11 · backlog items: 1. The engine today 0, 2. The milestone, restated — 2026-09-09 7, 2-old. The milestone as restated 2026-09-08 5, 3. The plan — three tracks, in priority order 0, 4. Future engine modules 5, 5. Workloads to manufacture 7, 6. Multiplayer revival 4, 7. Method and infrastructure 5, Parked 2
Most recent open:
- Some truths are unreachable by compare — B3's draw-divisor bug differed on 0.78% of draws yet flip…
- x87 precision-control mode at runtime — 53-bit MSVC default vs 24-bit if D3D9 grabbed the FPU; mov…
- Struct-modelling hazard (found by M2) — an MSVC-2010 `std::vector` member is three words, so a…
- SAVE_FORMAT tag corrections (fix Python reader + spec) — real on-disk tags: `otnF` (not `ontF`) in…
- Not traced end-to-end — `Species/_NPC/weapons/*.weapon` loading and the `.effect` dictionary entry…
## 9. Delta since previous dashboard
- verified targets: 361 → 362 (+1) · mapped-or-better: 404 → 405 (+1)
- engine LOC: 59,834 → 60,226 (+392) · test files: 122 → 123 (+1) · checks: 4,259 → 4,307 (+48)
- addresses verified: 1,179 → 1,187 (+8) · recovered layouts: 384 → 384 (+0) · open questions: 26 → 26 (+0)
- standalone leaves closed: 45 → 45 (+0) · leaves still diverging: 63 → 63 (+0)
---
warnings: board.md line 459: unknown status 'open' for '**A replace of `ProcessResearch` is gated on `ServerPlayer::OnTechResearched`, and partly on a policy question**'; board.md: unknown types engine + gate, subsystems, tooling; mars-rng.md: no oracle total row parsed; mars-stream.md: no oracle total row parsed; mars-vfs.md: no oracle total row parsed
<!-- dashboard-metrics {"verified": 362, "mapped_plus": 405, "targets": 454, "loc": 60226, "tests": 123, "checks": 4307, "addr_verified": 1187, "addr_total": 1320, "layouts": 384, "open_q": 26, "sa_closed": 45, "sa_left": 63} -->
Framework complete; reverse engineering active. First research-completion ABI pass recovered constructors/copy/ownership and callback ordering. Continue with nested event buckets, duplicate/prune and exceptional cleanup, then a scoped live-record adapter experiment. See campaign/research/NEXT.md.

223
campaign/README.md Normal file
View file

@ -0,0 +1,223 @@
# Canonical campaign controls
`sots-re/campaign/` is the state authority. Start with your contract, its checkpoint, open
surprises, and [current policy](../guides/multi-agent-workflow.md). Board/dashboard are generated
projections. Historical evidence is not current acceptance. No automatic commits or lab operations.
Framework development is complete. The `controls-bootstrap` contract reached scoped acceptance;
see [rollout result](rollout/RESULT.md) and its current contract/verdict for source-bound evidence.
Active work is reverse engineering. Change tooling only to unblock a named RE experiment.
## Contract format
`contract.schema.json` is strict JSON Schema (unknown fields and duplicate JSON keys fail).
The standard-library validator implements the schema's used subset. A populated example is
[contracts/controls-bootstrap.json](contracts/controls-bootstrap.json); its lifecycle is in the record.
Required fields:
| Field | Structure |
|---|---|
| `id`, `title`, `status` | Slug, short title, lifecycle state |
| `owner` | `{ "name": "worker-identity", "role": "implementer" }` |
| `baseline` | `{ "engine": {"path":"/absolute/canonical/engine","commit":"full-commit-id"}, "re": {"path":"/absolute/canonical/re","commit":"full-commit-id"} }` |
| `scope`, `inputs`, `effects` | Arrays of explicit nonempty strings; include full write set and runtime inputs |
| `original_dependencies` | String array, including original-assisted portions and unavailable inputs |
| `dependencies` | Array of other contract IDs; all must be accepted before ready/implementing |
| `acceptance` | Array of `{ "id": "unique-criterion", "axis": "validation-scope", "criterion": "executable requirement" }` |
| `predictions`, `stop_conditions` | String arrays of predictions and conditions that halt work |
| `checkpoint` | `null` or `campaign/runtime/checkpoints/<id>.json` |
Optional `evidence` is an array of
`{id,axis,path,sha256,source,integrated,source_binding,binaries,inputs,outcomes}`.
`path` is an existing canonical RE-relative artifact; `sha256` hashes its actual bytes; `source`
equals the contract's complete baseline object. Store understanding,
implementation, original dependencies, and validation scope as separate acceptance/evidence axes.
There is no generic `verified` scalar. Baseline commit IDs describe starting repositories;
dirty source identity is machine-bound by `source_binding`, never inferred from those commits.
Criteria need distinct states, branch exposure, positive execution, complete writes/elements,
allocations/IDs/events/RNG/runtime inputs, synthetic and original-game differentials as applicable.
The CLI checks package identity and declared axes; the independent reviewer evaluates the actual
criteria, gate outcomes, full manifests and integrated reproduction. A passing measurement alone
does not establish acceptance.
### Source-bound evidence interface (R4)
`source_binding` is `{engine:{path,commit,sha256},re:{path,commit,sha256}}`. Generate it with:
```sh
python3 tools/campaign.py --state-root /home/alex/sots-re source-binding research-replacement --engine-worktree /absolute/candidate-engine --re-worktree /absolute/candidate-re
```
Omit both worktree arguments to bind the canonical integrated trees. Paths must be Git worktree
roots in the respective baseline repositories. `commit` is the actual current HEAD; `sha256`
is the deterministic digest of the actual file manifest, including dirty/untracked nonignored
files, deleted tracked paths (`null`), file bytes and Unix modes. Symlinks/submodules fail closed.
The fixed manifest policy uses `git ls-files --cached --others --exclude-standard`; ignored
untracked build/output files are not source. Python cache directories are excluded. In RE only,
`verify/results/` and `campaign/` are excluded **except** `campaign/models.json`,
`campaign/contract.schema.json`, and `campaign/agents/**`. These exclusions prevent mutable
contracts/checkpoints/evidence/projections from hashing themselves. Relevant RE tools, tests,
generated facts and guides remain bound. Any consumed item outside that source inventory must
appear among immutable input/binary artifacts. The independent reviewer checks inventory adequacy.
`binaries` and `inputs` are nonempty arrays of `{path,sha256}` artifact references; for tooling
contracts, bind the executable scripts/interpreter identity package and fixture input package.
`outcomes` exactly covers the acceptance criterion IDs for that evidence axis, with entries
`{criterion,status,artifact:{path,sha256}}`; promotion requires `status: "pass"`. Outcome artifacts
contain positive execution, branch/state exposures, reproduction recipe and required effect/input
accounting. The CLI checks identities, hashes and declared outcomes, **not arbitrary criterion
semantics**. The independent verifier must reproduce and challenge those claims.
For example, an outcome for the bootstrap contract is:
```json
{"criterion":"controls-negative-paths","status":"pass","artifact":{"path":"verify/results/controls/result.json","sha256":"<actual 64-hex artifact hash>"}}
```
Capture bindings when producing evidence; do not attach a fresh source hash to old measurements.
Every evidence/verdict/promotion check rehashes referenced sources and artifacts. Same-HEAD byte
changes reject old evidence and verdicts. Integrated records require canonical paths, lead in
integration state, and one identical binding across **all** final integrated evidence. A lead's
`integrated` boolean cannot substitute for this check. Verdicts bind the full evidence array and
the source-binding array; old verdicts lacking these identities must be reproduced.
This contract wrapper is separate from gate measurement schema **`sots-gate/1`**, whose `source`
still has `engine`/`re`. Reference its immutable manifest/binary/input package; do not rename its
fields to match contract `source`. Reporter output is measured evidence, with `--require-match`
for required equality, and gains acceptance only through independent contract/integration gates.
## State and transactions
Every command requires `--state-root /absolute/canonical/sots-re` (the repository, not `campaign/`).
No sibling inference. Control records stay below canonical `campaign/runtime/`; contracts remain
in `campaign/contracts/`. Immutable hashed artifacts may be referenced anywhere inside canonical
RE, including existing `verify/` corpora, without copying them. Absolute/traversing artifact paths,
outside symlinks, Git internals and named secret/private-key locations are rejected; aliases are
checked after resolution too. Never reference secrets or commit owner-supplied binaries/assets.
JSON writes are atomic and fsynced; a canonical `flock` serializes
CLI mutations, WIP decisions, and resource acquisition. Do not hand-edit active state concurrently
with commands. Interrupted multi-file operations retain blocking records and require inspection.
Runtime APIs (JSON files; no server):
- `runtime/checkpoints/*.json`: `sots-checkpoint/1`, contract, actor/role/model/session, timestamp,
contract `basis` digest, bounded summary (6000 characters), up to 32 `{path,sha256}` artifacts,
and one `next_action` (2000 characters). Include observations versus decisions, source identities,
tests, blockers, resources/access/cleanup, exact next action in the summary/artifacts.
Do not attach the checkpoint's own contract as an artifact: saving the pointer changes that
file. Its task metadata is already covered by `basis`; the CLI rejects this self-reference.
- `runtime/surprises/*.json`: `sots-surprise/1`, id, contract, `status: open|resolved`, summary,
discriminating probe, actor/model/session provenance where applicable, optional decision ID.
- `runtime/decisions/*.json`: `sots-decision/1`, Astra resolution, explanation/probe, invalidated
evidence and checkpoint; prior verdict is marked invalidated. Resolution returns needs-revision
only when all surprises are closed. Re-probe and rebuild evidence; resolution is not acceptance.
- `runtime/verdicts/<contract>.json`: independent verifier actor/session/model, pass/fail,
explanation, contract basis, complete evidence digest and source-bindings digest.
- `runtime/transitions/*.json`: actor/model, previous/next lifecycle state, timestamp.
- `runtime/leases/<resource>.json`: owner, random token, held/released, acquisition/release provenance.
- `runtime/runs/run-*.json`, `.jsonl`, `.stderr.log`: requested model/config, command, worktree
manifests before/after, expanded prompt hash, effective configuration hashes, canonical config
file hashes, actual events/session/model when emitted, completion/checkpoint status. Effective
provider config is hashed rather than persisted because it can contain credentials.
`active-<contract>.json` reserves the contract. Interrupted running reservations never auto-expire.
Lifecycle: `proposed -> ready -> implementing -> verification -> integration -> accepted`.
Blocked and needs-revision edges support repairs; no skipping stages. Ready requires scope,
inputs, acceptance, stop conditions, valid pinned baseline and accepted dependencies. Implementing
is atomically capped at two concurrent contracts; lead schedules only one pilot before enabling
two independent slices. Verification requires fresh checkpoint/artifacts after implementation start.
Integration requires lead plus independent passing verifier bound to current source/evidence.
Accepted requires every declared axis in integrated evidence, passing independent verdict over
that final package, and no open surprises. Adding integrated evidence changes the evidence digest:
the verifier must attest the integrated package again. Handoff/promotion/end checkpoints must be
within 15 minutes; recovery start has no age limit.
Role/model registry: lead/architecture-review/analyst/implementer/verifier/lab =
`openai/gpt-5.6-sol`; resolver = `openai/gpt-6-astra`.
CLI identity fields are **claims, not authenticated model authority**. The runner requests the
registry model explicitly and records emitted provenance. Editable JSON, agent permissions and
shell-accessible tooling are not a security boundary. No silent routing fallback.
## Commands
Run from either repository using the canonical tool path when necessary. Examples:
```sh
python3 tools/campaign.py --state-root /home/alex/sots-re validate
python3 tools/campaign.py --state-root /home/alex/sots-re list
python3 tools/campaign.py --state-root /home/alex/sots-re status research-replacement
python3 tools/campaign.py --state-root /home/alex/sots-re checkpoint controls-bootstrap --actor controls-architect --role architecture-review --model openai/gpt-6-astra --session rollout-controls --summary 'Source identities, observations, decisions, tests and blockers are in the attached checkpoint.' --artifact campaign/rollout/controls-worker-state.md --next-action 'Run the independent controls review.'
python3 tools/campaign.py --state-root /home/alex/sots-re transition controls-bootstrap ready --actor controls-architect --role architecture-review --model openai/gpt-6-astra
```
`surprise CONTRACT --summary TEXT --probe TEXT` blocks immediately. `resolve SURPRISE_ID
--explanation TEXT --probe TEXT` requires claimed Astra lead/resolver. Both also require
`--actor NAME --role ROLE --model MODEL`. `evidence CONTRACT --record campaign/path.json`
uses the same identity flags; record format is the evidence object above. Integrated records
require lead and integration state. `verdict CONTRACT --session SESSION --verdict pass|fail
--explanation TEXT` requires verifier identity flags and independent actor/session.
```sh
python3 tools/campaign.py --state-root /home/alex/sots-re lease acquire windows-vm --actor lab-one --role lab --model openai/gpt-5.5
python3 tools/campaign.py --state-root /home/alex/sots-re lease show windows-vm
python3 tools/campaign.py --state-root /home/alex/sots-re lease release windows-vm --actor lab-one --role lab --model openai/gpt-5.5 --token TOKEN_FROM_ACQUIRE
python3 tools/campaign.py --state-root /home/alex/sots-re lease release windows-vm --actor lead --role lead --model openai/gpt-6-astra --lead-release --reason 'Confirmed prior operator stopped; access and cleanup checked.'
```
No stale lease stealing. Explicit lead release requires an explanation and lab preconditions,
side effects, cleanup, and access verification in the operator checkpoint. Treat lease tokens
as local owner capabilities, not secrets to put in a board/dashboard.
## Fresh bounded launches
Prepare **two actual linked worktrees**, each distinct from its canonical source repository,
at the contract's full baseline commit. No auto commits/worktree creation. Launch uses explicit
canonical `OPENCODE_CONFIG`, checks matching repo-local agent/model/40 steps, and sets the final
environment overlay to bind requested role/model/steps. Other inherited config overrides are
cleared. `opencode models` must list the exact requested model even for dry runs.
```sh
python3 tools/run_agent.py --state-root /home/alex/sots-re --role implementer --actor worker-one --contract slice-one --engine-worktree /home/alex/worktrees/slice-one-engine --re-worktree /home/alex/worktrees/slice-one-re --cwd engine --dry-run
```
Remove `--dry-run` to execute. Normal worker launch requires a valid durable checkpoint, matching
owner/role/status, no open surprises, baseline HEADs and canonical Git common-directory identity.
Recovery checks checkpoint identity/basis and artifact hashes regardless of age, rechecks any
source-bound evidence, and validates paired Git worktree/baseline identity. Missing ordinary-worker
state still blocks. Bootstrap lead/architecture-review can start without a checkpoint; they still
need paired worktrees. Astra lead/resolver may launch a blocked contract with open surprises and
without a worker checkpoint in **resolution-only** scope: read evidence and write decisions/state,
no implementation. Its prompt and permission overlay carry that limit, and worktree source changes
fail completion. Ordinary affected workers stay blocked. Other Astra architecture actors receive
explicit architecture authority within their owned scope. Each run is a fresh
`opencode run --format json --model ... --agent ...`; no resume/continue option is used. The prompt
supplies the run ID to use as checkpoint `--session`; actual OpenCode session IDs are captured
separately when emitted. On exit, a checkpoint after start matching actor/role/model/run ID is
mandatory or the run is marked incomplete. Completion additionally requires a zero exit, no
`type:error`, a successful `step_finish` with `part.reason: "stop"`, one nonempty actual session ID,
and consistent explicitly emitted model IDs. Text/tool-call/length events alone cannot complete a
run. Missing model emission is recorded `observed_model_status: "unavailable"`, never invented.
The runner checks the exact Git baseline again under reservation lock, rejects intervening contract
changes, and checks canonical model/prompt/config files and effective configuration for drift at
completion. Expanded role prompt/model/steps are frozen in the last-layer environment overlay.
`opencode debug config` runs in the actual launch cwd with the actual environment before execution
and again at completion. Permissions explicitly allow read/search, ordinary worker shell commands,
and external-directory access to the assigned paired trees plus canonical RE; role-specific edit
denies survive. Task delegation and interactive questions are denied. No `--auto` is required.
Noninteractive command/environment tests and a live loader check cover this overlay; an actual
normal worker launch smoke is a separate lead integration check. Permissions and before/after
checks are operational guards, not a sandbox or continuous filesystem audit.
Compaction is a backstop; no token threshold or machine-enforced 20-tool-call claim.
## Local verification
```sh
python3 -m unittest discover -s verify/campaign -p 'test_*.py' -v
python3 tools/campaign.py --state-root /home/alex/sots-re validate
```
Tests create commits only in disposable fixture repositories, linked worktrees and fake OpenCode processes; they do
not launch agents or touch the lab. Historical rollout artifacts retain the scope and source identity
of their runs; consult the accepted contract and current evidence, not an old handoff's status prose.

View file

@ -0,0 +1,15 @@
You are the SOTS RE analyst. Read canonical RE AGENTS.md, campaign/README.md, your contract,
checkpoint and open surprises. Follow the launcher-selected model; never choose a fallback.
Recover one bounded behavior: complete inputs, predicates, ordering, precision, allocations,
transitive writes, container elements, event records and RNG. Distinguish static facts, measured
observations and hypotheses. Use domain findings as evidence, not unquestioned specifications.
Specify original-helper dependencies and missing runtime inputs. Work with the independent
verifier on falsifiers and distinct-state/branch coverage. Synthetic boundary fixtures are useful;
coherent parsing alone cannot prove field semantics. Do not promote your own claim.
Own only assigned files/worktrees. No architecture/planning changes, delegates, dashboard writes
or unleased Ghidra/VM mutations. A surprise that changes scope or standing claims blocks the
affected work and goes to Astra with concrete evidence and a proposed discriminating check.
Checkpoint every 20 calls/15min and before compaction, experiment, handoff or stop. A bounded
40-step session ends with a repository checkpoint, exact next action and held-resource inventory.

View file

@ -0,0 +1,14 @@
You are the SOTS implementation engineer. Read canonical RE AGENTS.md, campaign/README.md,
your ready contract/checkpoint, and engine CONTRIBUTING.md/docs/architecture.md. Implement only
the approved input/effect domain. Keep reusable rules outside live-process adapters. Do not
replace unknown inputs with zero, hide original-helper execution or update counts without records.
Preserve RNG values/save layout and declared numeric precision. Write meaningful negative and
boundary tests, then execute the required checks. Never certify your own fidelity. Provide the
independent verifier source identity, full commands, input/artifact hashes and residuals.
No architecture changes, scope expansion, nested delegates, shared status writes, automatic
commits/pushes or unleased remote operations. Unexpected evidence changing the plan goes to Astra
via a surprise record; fix ordinary in-contract implementation bugs yourself.
Checkpoint every 20 calls/15min and before compaction, experiment, handoff or stop. End a 40-step
quantum with exact changed files/tests/next action persisted to canonical RE, not only chat.

15
campaign/agents/lab.md Normal file
View file

@ -0,0 +1,15 @@
You are the SOTS lab/workload operator. Read canonical RE AGENTS.md, campaign/README.md, the
contract/checkpoint, relevant infrastructure instructions and current leases. Confirm actual guest
identity and live activity; old FREE text is not ownership. Acquire a lease before mutation.
Capture controls before instrumented runs. Record procedure including load-versus-continuation,
source/binary/config/input hashes, branches that fired, distinct states and output artifacts.
Preserve raw output and positive execution evidence. Never infer a run succeeded from quiet logs.
Run only the assigned workload. Do not change FPU/game/config settings outside the experiment.
For authorized housekeeping preserve game/assets/saves, guest agent, networking, runtimes,
graphics and lab tools. Verify unattended console login plus authenticated administration; no
blank passwords or secrets in logs/repositories. Reboot only free guests with recorded recovery.
Unexpected interference or access changes go to Astra before broadening work. No delegates.
Checkpoint every 20 calls/15min and before compaction, experiments, reboots, handoff or stopping.
At a 40-step boundary persist per-VM status, held leases, artifacts and exact next action.

22
campaign/agents/lead.md Normal file
View file

@ -0,0 +1,22 @@
You are the SOTS lead/integrator, running GPT-5.6 Sol. Read AGENTS.md, campaign/README.md,
guides/multi-agent-workflow.md, selected contracts, latest checkpoints and open surprises.
State lives in the explicitly selected canonical RE repository. Do not reconstruct it from chat.
Own architecture, task boundaries, model allocation, independent acceptance and integration.
Select work by dependencies unlocked and complete write sets, not row/leaf counts. At most two
implementation slices after the pilot. Delegate through tools/run_agent.py with explicit role,
contract, state root and paired worktrees. No nested worker delegation or implicit model fallback.
Validate model availability before assigning work. Astra problem-resolution sessions are
allowed when explicitly allocated. Keep exclusive file and resource ownership clear.
Write acceptance before implementation. Require independent verification and integrated source-
bound evidence. Only you publish current pointers/projections. Never promote a historical claim
without the stated workload, identity, coverage and reproduction. Host passed != full acceptance.
Handle surprises as experiments: record evidence, block affected work, examine instrument/source
identity, list surviving/qualified/overturned claims, choose one discriminating check, update
contracts and invalidate affected results. Do not hide contradictions in appended caveats.
Checkpoint every 20 tool calls/15min and before compaction, experiments, handoff or stop. At a
40-step quantum boundary persist exact next action and finish; next session resumes from RE state.
Follow explicit user authorization for commits/pushes; this rollout authorizes neither.

View file

@ -0,0 +1,14 @@
You are the SOTS resolver, running GPT-6 Astra. Read canonical RE AGENTS.md, campaign/README.md,
the surprise, affected contracts, checkpoints and raw evidence. First state the observation and
its provenance. Check source/binary/input identity, positive execution and instrument neutrality
before interpreting game behavior. Do not diagnose a stale build as a game mechanism.
For every affected claim record survives / qualified / overturned and exact domain. Name the
cheapest discriminating experiment, revised scope/dependencies and affected evidence that must
be invalidated. Resolve through campaign controls with a durable Astra decision. Never silently
waive acceptance or treat untested inference as measurement. Leave blocked work blocked until
the decision supplies a valid next action. No autonomous lab mutation or nested delegation.
Checkpoint every 20 calls/15min and before compaction, handoff or stop. Use short bounded sessions;
the repository carries decisions, not chat memory. Do not create another explanatory history in
the live board: link the actual decision and regenerate projections after integration.

View file

@ -0,0 +1,16 @@
You are the independent SOTS verifier, a separate execution from the implementation author.
Read canonical RE AGENTS.md, campaign/README.md, the contract, raw evidence and checkpoint.
Challenge the interpretation, boundary and instrument, not just the implementation syntax.
Before coding starts define falsifiers, required branch exposures and distinct states. Afterward
reproduce from the handoff alone and challenge at least one assumption with a held-out workload,
boundary, negative control or ablation. Check actual state/RNG independently of reported counters.
Reject missing/invalid inputs, zero execution, unexpected skips, truncated coverage, stale binary
identity and self-certified evidence. Separate original-assisted, partial compare, full compare,
independent replacement and integrated replay. Whole-state equality on one workload has that
workload's scope. Record failed predictions and residuals without converting them into success.
Own verification artifacts only; no edits to implementation to make tests pass, architecture
changes, delegates, shared status or unleased lab actions. Plan-changing surprises require Astra.
Checkpoint every 20 calls/15min and before compaction, experiments, handoff/stop. Finish each
40-step quantum with reproduction commands/results and exact next action in canonical RE.

View file

@ -1,265 +1,32 @@
# Roadmap
# Campaign plan
Groomed 2026-09-08. Replaces the phase-0/phase-2 backlog, all of which shipped. The board
(`board.md`) is the ledger of findings; this is the plan. **The product is `sots-engine` — our
code.** RE findings are inputs to it, and the measure of progress is how much of the game runs in
our engine, verified against the original. Every number here is measured; the source is named.
Goal: a behavior-equivalent engine reading owner-supplied original assets. The next end-to-end
milestone is a strategic turn reproduced under an explicit load/continuation procedure and
recorded command stream, with file-byte, inflated-byte and state equality reported separately.
## 1. The engine today (`sots-engine` main, ~33k LOC, ctest 46/46, 1,031 addresses, clean-room, MIT)
## Priority order
| module | LOC | what it is | verification |
|---|---:|---|---|
| `mars/parse`, `mars/text` | 1,774 | brace-block + flat-KV + CSV readers (the `Mars::Script` pull tokenizer, first-wins keys) | oracle 1,531/1,531 + 64/64 |
| `mars/vfs` | 788 | `.gob` ZIP + native-override VFS (the `./Mods` mechanism) | 10,268 files CRC-clean |
| `mars/stream` | 5,407 | save reader/writer, 386-class wire schema, `SchemaProbe`, `CoverageArchive` | **100% named coverage, byte-identical round-trip, 11 saves** |
| `mars/rng` | 244 | MT19937 + all seven entry points (`NextFloat/NextInt/Chance/NextUInt/FloatRange/IntRangeBell/GaussianRange`) | live: every draw of a turn attributed |
| `game/data`, `game/design`, `game/config` | 3,835 | weapons/sections/tech/strings catalogs, design rules, hull class, tuning | 229,042 values 0 diffs; 127/127 designs |
| `game/effects`, `game/events` | 1,531 | tech effects, `EventStorage` (turn-bucketed, dedup) | live: research slice 35 calls / 0 div |
| `game/sim` | 3,382 | economy (`ComputeBudget`, output term), research + unlock cascade, colony, movement | live: budget 4,437 / output 24,357 / research 35 / movement 45 calls — all 0 div on declared regions |
| `game/nav`, `game/combat` | 1,163 | route classifier + failure bits; retreat **planner** | offline vs 58 waypoints / 46 plans, 0 failures; retreat never instrumented |
| `app` (`sots_turn`) | 1,754 | **the standalone**: load save → walk all three drivers' phase order → write save; divergence + completion metric | 11/11 saves run; ref pair **209 → 158** leaves, closed 51 / regressed 0 |
| `shim` | 769 + hooks | proxy `binkw32.dll` + MinHook trace/compare/replace harness — **scaffolding, to be displaced** | it is the instrument, not the product |
1. **Establish rollout baseline.** Finish campaign controls, source-bound gate and reporter,
honest execution accounting, and generated publishing. Select reproducible evidence explicitly
in `current.json`; missing baseline means not established. Independent reproduction and
integrated-tree evidence precede acceptance.
2. **Complete research write-set replacement pilot.** Proposed/blocked until its contract has
executable acceptance criteria, complete inputs, workload/branch exposures, and lease/control
evidence. Include tech-tree writes, player effects, container elements, allocations, IDs,
events and RNG state. Existing compare runs and partial replacement attempts are historical
evidence, not a completed pilot. Start with [research findings](../findings/subsystems/research-replace.md).
3. **Command payload semantics and ship construction.** After the pilot, admit at most two
independent slices with explicit dependencies and paired worktrees. Resolve runtime inputs,
complete command payload effects, construction allocations/IDs and write boundaries before
interpreting a replay result. See [construction findings](../findings/subsystems/ship-construction.md).
4. **Recorded-command standalone replay.** Reproduce explicitly identified workload pairs with
bound commands, assets, route, seeds and visit order. Report residuals and original dependencies;
consuming a stream or parsing a save is not behavioral equivalence.
What the engine can do end to end today: read every shipped asset and every save byte-for-byte,
run the economy/research/movement/output pieces to the original's numbers, and step a turn with
**16 of 44** driver phases and **5 of 37** tail phases modelled (10 committed). It cannot yet
reproduce a turn.
## How work advances
## 2. The milestone, restated — 2026-09-09 (after the determinism arc)
> `sots_turn` loads a save, runs one strategic turn, and writes an autosave that byte-matches
> the original's — **for a stated procedure and route**.
Two days of lanes went into determinism and the foundation is now laid. What is *measured*:
- **The sim is deterministic given the command stream.** Every draw of a turn attributed by
return address; the strategic generator's residual is 0 on every measured turn.
- **The AI is deterministic given (seeds, visit order).** Its per-process seed is one word per
client, minted from the global generator — which does *nothing else* on an encounter-free turn.
Pinning the seeds collapses a rich turn's divergence from 94 leaves to **one transposition**, and
that transposition is the **order of two heap pointers**: the fleet-assignment pass walks a
container keyed on `fleet->Location`. There is **no original order to match**; we choose one
member of its outcome set and say so (`orders.h`). The visit order is *written into the block*
(list 10), so a captured run carries its own.
- **The route is part of the procedure.** The same turn reached by continuation and by load gives
different, individually reproducible results, because a `Colonize` task alive in the AI agent by
continuation is *absent* after a load. Certified pairs live in `verify/results/saves/certified-pairs.md`
as `(save, procedure, route, hashes, processes, masks)`; a hash without its route is not a claim.
- **Exposure is a screen, not a decision procedure** (rule 26(c)): it says a control is *likely* to
vary; it cannot certify one will agree.
**So the rungs stand as written below, with one scope line each:**
- **Rung A** — byte-match modulo the command stream, **on a load→turn procedure**. Canonical pair
`ref-turn2 → turn3`. 204 leaves open; the RE for them is done (§3-old items 1b/1c/7).
- **Rung B** — byte-match given the recorded stream. **Climbed to outcome 3 on the first rich turn
(lane CV):** the replay runs and consumes the whole stream; the result is a **ranked leaf list of
thirteen named subsystems, zero ungrouped** — 1,092 leaves. Two blockers sit *upstream* of the
turn (§3, track 0). The tail's sim draw fires on this workload (`tscr = 253`), so Rung B needs
the same generator model as Rung A — that correction is load-bearing here.
- **Rung C** — `game/ai` deterministic given (save, seeds, visit order). **C-exact survives
literally** on that basis; the comparison side (`--relabel-new-ids`) ships with both acceptance
halves. The engine side is not built: `game/ai` mints no fleet ids yet.
**What stops now.** Further RNG/determinism lanes, unless a rung is actually blocked by one. Board
row count as a success signal — 89% of 444 rows measures campaign activity, not the product. The
value-domain census as a work generator — it is a screen; use it when a lane needs a corpus count.
**What the headline is.** Displacement (`tools/displacement.py`): **3 replaced / 7 compared /
7 modelled / 3 mapped**, unmoved for two days. And the phase catalogue: 14 of 44 driver phases,
2 of 37 tail. Those two numbers are the product.
## 2-old. The milestone as restated 2026-09-08 (kept for the record)
> `sots_turn` loads a save, runs one strategic turn, and writes an autosave that byte-matches
> the original's.
**Lane L5 showed the original cannot always do this itself.** Three runs of `turn1-state → turn2`
gave three different autosaves, differing in exactly four leaves — one AI empire's research pick and
the derived checksum — with the instrument exonerated (two runs had identical hooks and still
differed; `hooks=off` was a third value). The oracle stands on `ref-turn2 → turn3`, where every AI
already holds a target; it fails on the neighbour, where three AI players must *choose* one.
This is not a contradiction of the lockstep multiplayer design — it is the reason for it. The AI is a
`StrategyClient`, not part of the sim: it decides **once**, on one machine, and its decisions travel
as `TurnCommands` through the same host relay as a human's. Peers reproduce the sim's response to a
command, never the decision. The sim is deterministic (lane Z's zero-residual ledger is the strategic
generator, which the AI never touches); the decision layer is not, and does not need to be.
So the rungs are:
- **Rung A — byte-match modulo the command stream.** Every leaf except `ModCount`,
`Summary.Checksum`, and what the AI's own orders touch. No AI needed. **Canonical reference pair
is now `turn2-state → turn3-state`** — deterministic, oracle-hashed. `turn1-state → turn2` stays
as a secondary pair with its four non-deterministic leaves masked.
- **Rung B — byte-match given a recorded command stream.** `sots_turn --turn-commands <blocks>`
replays the AI's (and human's) orders captured from a real turn, and the output must match that
turn's autosave byte-for-byte. This is what "the engine is the game" means when the game's own
decision layer is not reproducible from a save. Lane AI1's fallback becomes the primary path.
**Correction 2026-09-09.** I previously told lane RB that Rung B was insulated from the strategic
generator "because replay runs no AI". That was wrong, and the resolver caught it. Replay **does**
run the post-combat tail (`command_replay.h:83`), and lane AC has now measured a **sim** draw in
that tail — on `S+0x16c`, gated on a predicate over save fields, nothing to do with the AI. So
**Rung B needs the same generator model as Rung A**: the tail's draws are ours to reproduce in
both. The canonical pair is untouched by the predicate (`tscr = 252`, no fleet at a trade sector),
so nothing already measured is invalidated — but a replay of any raid turn would have diverged
silently under the reasoning I gave.
- **Rung C — `game/ai` as a deterministic function of (save, per-client seed).** The original's AI
is not non-deterministic: it is MT19937 from **one 32-bit word per AI client**, drawn once at
construction from a per-process global generator — and that generator is one we already own bit
for bit. Two strengths:
- **C-exact.** Given the seeds captured from an original run (`sots_turn --ai-seed <netid>=<hex>`),
our AI's block equals that run's block element for element and the autosave byte-matches, on
**every** captured run. This is the user's framing made literal: make the AI deterministic and
the old approach still pays. **Precondition:** `game/ai` must consume the client stream in the
original's order and count, *including draws whose result never reaches the save* — a per-client
draw ledger is the prerequisite (the site table already shows ~8 words/turn on these boards).
- **C-set.** Where seeds were never captured — the historical `turn2-state.sav`, which **no
process including the original can reproduce** — our canonical pick must be a member of the
outcome set of the one seed-sensitive decision. Lane L4 has the XNC arm (k = 6, four observed,
all inside) and **one arm unaccounted for (`BIO_GnMod`, 2 of 6)**, so "we can name all k" is
**to prove**, not proved. The set is the support of a random draw, not a set of equal-score
candidates.
Mechanism, **measured** (lane L1, not inferred): the per-client generator at `StrategyClient+0x134`
is seeded from `NextUInt` on the global generator at `0x00af6e58`, which is **live and per-process**;
the seed is in no save. Only one of three empires *shows* the effect because only one reaches the
candidate walk (lane L4) — the other two are stream-insensitive **by code path**. My earlier
"pointer-ordered tie under ASLR" inference was wrong and is **withdrawn**.
Rung B is unaffected: `--turn-commands` replay stays the no-AI path, and the canonical pair stays
`turn2-state → turn3-state` until the pin probe promotes the creation turn.
## 3. The plan — three tracks, in priority order
### Track 0 — make the gate honest, then clear the two upstream blockers
The gate reported 59/59 for a day while the corpus tests **skipped** (`SOTS_SAVES_DIR` unset on
CT111). With the corpus it is **57/59**: the coverage ratchet broke when the corpus grew 22 → 43
(rule 27, as designed), and a writer defect appeared. `tools/gate.sh --fresh` is now the gate and
it fails if a corpus test skips.
| # | item | module | evidence | why first |
|---|---|---|---|---|
| 0a | **`ProjectName` reads `usnc` as one item; the wire is a `usp`/`usc` pair.** 12 of 43 saves round-trip 12 bytes short. | `mars/stream` | lane CV; `ad-turn27` has `usnc == 1` | no byte-match claim is possible on the `ad-*`/`ar-*` family until the writer is exact; re-prove byte-neutrality after |
| 0b | **Re-type what the ratchet caught** — the spy saves (`ap-*`) and whatever else dropped `pct` below 99.99. | `mars/stream` | `tools/gate.sh` output | the ratchet did its job; honour it |
| 0c | **List-5 applier cannot fire** because the memory capture cannot type 7 of 8 fields. One UI run (two sliders, two values) settles it. | shim capture | lane CV | the only list with an applier, at zero |
### Track 1 — displacement: `compared → replaced`, then `modelled → compared`
**Pick the replace unit by its WRITE SET, not by its name.** Lane CR's failure is the rule's
source: our code replaced `ProcessResearch` and produced **all 13** tech-tree leaves the turn moves
— the model was right — and the oracle still missed by 16, every one written by
`OnTechResearched`, a neighbouring function. A replace boundary that splits a write set cannot
pass an oracle no matter how correct the model is. So before attempting one, enumerate the leaves
the turn moves in that area and ask which functions write them; if the answer is more than one,
the unit is the union or the attempt is wasted. The compare mode's guard spans already name the
write set — CR's five spans predicted exactly the five fields the oracle later billed.
Only `replaced` means the original's code did not run. The bar, written once: an un-instrumented
oracle first (`certified-pairs.md` format), then the same procedure with the hook in `replace`
mode and the **same hashes**, with a count from the hook proving the path executed (rule 1).
| # | module | today | evidence for the attempt | target |
|---|---|---|---|---|
| 1a | `TechTree::ProcessResearch` + unlock cascade | compared | 35 calls / 3 workloads / 0 div; advance prediction held on a changed workload | **stays `compared`** (lane CR, 2026-09-09): our code displaced all 13 tech-tree leaves live, oracle missed by **16**, every one written by `OnTechResearched` — a different function. Next: the write-back |
| 1b | `ServerSystem::ComputeTotalOutput` + `GroupOutput` | compared | 24,357 calls, 0 undeclared writes — but **13 distinct states** (rule 23) | replaced, after widening the state set |
| 1c | `ServerSystem::ProcessTurn` (colony) | compared | 36 calls 0 div; 3 owned systems, gates all zero | replaced, on a save with gate traffic |
| 1d | `game/nav`, `game/design`, `game/combat` retreat, `mars/vfs` | modelled, **never hooked** | host-tested only | compared — one lane each |
**Ruling (2026-09-09, on lane CR's policy question).** Reaching `replaced` on research needs two
event *records* whose text comes from the game's string table. That text is **game data**, not
engine code: the engine already reads every catalogue, tech name and design from the user's own
install through `$SOTS_DATA_DIR` / the VFS, and a string table is no different. So the answer is
**not** "call the game's `PostEvent` and take a QUALIFIED caveat" — it is **load the string table
through the same VFS path everything else uses** and construct the record clean. We ship no
strings; the user's copy supplies them. That is the same clean-room posture as every other data
dependency, and it turns the last research residual into ordinary engine work rather than a
policy exception. Track 1a, next lane: `OnTechResearched` write-back (~90 tech-effect fields) +
`ObservedTech` element + the two event records via the VFS string table.
### Track 2 — Rung B worklist, ranked against a real rich turn (lane CV, residual 0)
| leaves | subsystem | note |
|---:|---|---|
| 539 | morale event ring `cme2` | **not a module** — a fixed 11-slot ring shifted by 27 appended events of three kinds (colonisation, savings band, population). It is the reporting surface of the next three rows and closes when they do |
| 154 | colony growth / repair / bonuses | §3-old 1b/1c — `Pv*` is **mixed**: `PvPop`/`PvInfra` hold the uncapped projection, `PvSuit`/`PvRes` the pre-turn current |
| 150 | fleet objects | needs the gather/mint (Rung C engine side) |
| **79** | **`T34 RecordObservedDesigns`** | **largest independently closable stub, no upstream dependency — do this one first** |
| 30 | player money + counters | §3-old item 1 chain |
| 23 | `TShn` | watchpoint specified (§3-old 4) |
| 23 | system↔fleet membership | with fleet objects |
| 20 / 20 / 15 / 13 / 10 / 8 / 6 | ShipRecs · build queues · other system · crep/CD · id lists+generator · turnstats · trade manager | |
| 5 of 6 regressions | one `ntdev` predicate | cheapest fix in the list |
`ModCount` residual 2 is localised to lists 1/7/12; the only uniform reading is list 7 at 2 bumps —
a prediction fitted to one observation, falsified by any capture with a colonize count ≠ 2.
### §3-old — Rung A leaf ranking (still valid for the items it names)
| # | engine deliverable | module | RE input (done unless noted) | closes |
|---|---|---|---|---|
| 1 | ~~income chain~~ / ~~`ComputeOutput` turn path~~ **BOTH DONE** (lanes E1, C3) — the oracle hit 25/25 and the turn path is modelled (+1 leaf, 0 regressed; unspent construction cascades **two hops** into money). **The blocker moved upstream: `S11` civilian growth.** One input — imperial carrying capacity — gates the human's `Sav`, `PvSav`, `BnkEl` and `BnkPr` on both pairs. | `game/sim` | lanes E1/C3 | the budget leaves + unblocks T36 |
| 1b | **`S11` civilian growth** — the new item 1 | `game/sim` | needs imperial carrying capacity | the human budget cluster |
| 1c | **`Ship::RepairCost` 0x00815180** — the ninth output input, unread; taken as 0, so a colony with a damaged fleet reads high | `game/sim` | unread | output accuracy |
| 2 | ~~wire `ShipCensus` + alliance mask into `BuildTurnRecord`~~ **DONE** (lane E2). T36 still blocked on two named things: the budget (item 1) and **ship construction** — a new blocker found by E2's *falsified* prediction (one census leaf short by exactly one destroyer on both pairs; no phase we run builds a ship). | `app` | lanes D2/A2 | +24 turnstats leaves when item 1 lands |
| 3 | **encounter-detection draws** in the generator model | `game/sim` + `app` | lane I bound; **lane H measuring now** | last 2 RNG words |
| 4 | ~~`nve` visibility record~~ **DONE** (lane E3): **closed 51, regressed 0** on the reference pair; validated on three pairs it was never fitted to — 128 leaves across five pairs, 0 regressed. The gate is `AFlags`, not `VFlags`/`EFlags`, and all three agree on nearly every corpus system so the wrong one *looks right*. Remainder: `TShn` (10/pair, gate proven NOT `AFlags`, watchpoint specified), `rcex` (6/pair, unexplained). | `game/sim` | lane E3 | **51 leaves closed** |
| 5 | **post events into the save's turn bucket** (P11 + tail event phases) | `app` + `game/events` | model exists; wiring only | events subtree |
| 6 | ~~`Player.Status` restore~~ **PREMISE REFUTED** (lane T2): there is **no writer between tail 31 and the autosave**. A whole-image scan finds three stores to `+0x164` — `ProcessTurn`'s encounter loop writes 1, `ResumePlaying` writes 0 on load, and `MarkPlayerTurnEnded` writes 4 from the End-Turn **submission** paths, *before* the turn runs. It needs **one predicate**, not a watchpoint — and only two corpus saves carry a non-zero `Status`, so an entry probe should name the set (rule 20). | `app` | lane T2 | S31 regression |
| 7 | **tail phases** — bankruptcy decision half, turn results outbox swap, per-player sync | `game/sim` + `app` | lane K map; 34/37 stubs | tail subtree |
| 8 | Rung B: **`--turn-commands` replay** from a captured block (then Rung C: `game/ai` behavioural equivalence) | `app`, then `game/ai` | lanes AI1–AI4, L4 | `ModCount`, Checksum given the stream |
Rules that hold for every item: formula-held-inputs-missing is **evaluated and reported, not
written**; `closed` and `regressed` reported separately, never netted; `verified` in the phase
table means compared against the live game and the build fails if it drifts silently.
## 4. Future engine modules (breadth, ranked by what it unblocks)
1. **`game/ai`** — `AIPlayer`, fuzzy `IAIRule`, `StrategyAIAgent`. Essentially unread; **proven
to gate Rung B**. Known: `AISystem::Write` emits nothing; the 3 `AIAgent` save blocks are cache
state (typed, 10 element layouts unexercised).
2. **`game/combat`** beyond the planner — resolver (7,641 B, orchestration only) and retreat are
mapped; the six pipeline callees and the tanker fold are unread; **nothing here has run under
an instrument**. Combat *simulation* (`GameCombatSim`) stays parked.
3. **trade + spy managers** — all 11 virtual targets named; four can draw RNG and none has fired
(no trade routes / spy program in the corpus).
4. **`net/`** — the lockstep protocol. Direct IP works in the original without GameSpy; our engine
inherits determinism to the word, so a lockstep peer is mostly serialization we already own.
5. **UI** and **renderer** — not on any path; DXVK carries rendering for the original.
## 5. Workloads to manufacture (an unexercised path is a hypothesis)
- **orders save → End Turn → autosave** — the Rung-A reference (human commands in-file).
- **trade routes + spy program** — the four tail draw sites; `spies2`/`SysMem`/`mts` elements.
- **a cruiser** (2 census leaves), **a DN platform** (the third).
- **a Liir fleet** — waypoint type 2 is the Liir drive, not a node line; **a Hiver game** — types 4/5.
- **a battle with `res->+4` clear and a partial retreat** — resolver + retreat instrumented; tests
the `NMnx` prediction and the predicted zero-ship-fleet bug in the original.
- `ResErrRoll` true entering `ProcessResearch` — save exists; needs one turn funding > ½ a tech.
- expense sliders / debtor / aid — likely dead in 1.8; debtor ≈ 35 turns. Low priority.
## 6. Multiplayer revival (lane G2)
- **Tier 0 (hours):** `/concurrent /join 127.0.0.1:3369` — two clients on one VM, no server.
Predictions written; queued behind lane H for VM140.
- **Tier 1:** availability responder, byte-specified; probably a no-op (fails open on DNS failure).
- **Tier 3 (config, not code):** self-hosted OpenSpy/UniSpy with the `swordots`/`Z5gR9Z`/1381
row; fix queryport 3369 (not 6500) and add the 16 custom QR2 keys (ids 50–65).
- No CD-key code exists; 333networks ruled out (v0 only).
## 7. Method and infrastructure
- `guides/method-rules.md` (18 rules) is the contract for every lane brief. Rule 18 — *measure
first, the lab exists* — is why the RNG ledger closed in one VM session after three static lanes.
- Reachability claims older than lane V2 are **lower bounds**; re-check "no caller" findings with
`tools/vtable_map.py`. Never trust Ghidra's function end (five lanes bitten).
- Regenerate the determinism-oracle autosaves on VM140 (lane N overwrote them; lane H doing it).
- Board rows superseded by later rows are marked `SUPERSEDED` at integration — keep doing it.
- Displace the shim: each hook that reaches `replace` with 0 divergences is code the original no
longer runs. Track that count; it is the honest "how much of the game is ours" number.
## Parked
- Battle-load bug (thread contention) — resume only with a reason.
- Renderer — after the sim byte-matches.
`contracts/*.json` owns scope and lifecycle. `board.md` and `DASHBOARD.md` are generated views.
The integrator alone selects current evidence. Historical domain findings remain in `findings/`;
they do not schedule work or establish current status. New evidence that changes the plan requires
a recorded surprise and Astra resolution. Operational policy: [campaign README](README.md),
[workflow](../guides/multi-agent-workflow.md), [method rules](../guides/method-rules.md).

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,41 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "sots-contract/1",
"type": "object",
"additionalProperties": false,
"required": ["id", "title", "status", "owner", "baseline", "scope", "inputs", "effects", "original_dependencies", "dependencies", "acceptance", "predictions", "stop_conditions", "checkpoint"],
"properties": {
"id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9-]{0,79}$"},
"title": {"type": "string", "minLength": 1, "maxLength": 240},
"status": {"enum": ["proposed", "ready", "implementing", "verification", "integration", "accepted", "blocked", "needs-revision"]},
"owner": {"type": "object", "additionalProperties": false, "required": ["name", "role"], "properties": {"name": {"type": "string", "minLength": 1, "maxLength": 120}, "role": {"enum": ["lead", "resolver", "architecture-review", "analyst", "implementer", "verifier", "lab"]}}},
"baseline": {"$ref": "#/$defs/baseline"},
"scope": {"$ref": "#/$defs/strings"},
"inputs": {"$ref": "#/$defs/strings"},
"effects": {"$ref": "#/$defs/strings"},
"original_dependencies": {"$ref": "#/$defs/strings"},
"dependencies": {"type": "array", "uniqueItems": true, "items": {"type": "string", "pattern": "^[a-z0-9][a-z0-9-]{0,79}$"}},
"acceptance": {"type": "array", "items": {"type": "object", "additionalProperties": false, "required": ["id", "axis", "criterion"], "properties": {"id": {"type": "string", "minLength": 1}, "axis": {"type": "string", "minLength": 1}, "criterion": {"type": "string", "minLength": 1}}}},
"predictions": {"$ref": "#/$defs/strings"},
"stop_conditions": {"$ref": "#/$defs/strings"},
"checkpoint": {"type": ["string", "null"], "pattern": "^campaign/runtime/checkpoints/[a-zA-Z0-9_.-]+\\.json$"},
"evidence": {"type": "array", "items": {"$ref": "#/$defs/evidence"}}
},
"$defs": {
"strings": {"type": "array", "uniqueItems": true, "items": {"type": "string", "minLength": 1, "maxLength": 2000}},
"repository": {"type": "object", "additionalProperties": false, "required": ["path", "commit"], "properties": {"path": {"type": "string", "pattern": "^/"}, "commit": {"type": "string", "pattern": "^[0-9a-f]{40}([0-9a-f]{24})?$"}}},
"baseline": {"type": "object", "additionalProperties": false, "required": ["engine", "re"], "properties": {"engine": {"$ref": "#/$defs/repository"}, "re": {"$ref": "#/$defs/repository"}}},
"artifact": {"type": "object", "additionalProperties": false, "required": ["path", "sha256"], "properties": {"path": {"type": "string", "minLength": 1}, "sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"}}},
"sourceTree": {"type": "object", "additionalProperties": false, "required": ["path", "commit", "sha256"], "properties": {"path": {"type": "string", "pattern": "^/"}, "commit": {"type": "string", "pattern": "^[0-9a-f]{40}([0-9a-f]{24})?$"}, "sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"}}},
"sourceBinding": {"type": "object", "additionalProperties": false, "required": ["engine", "re"], "properties": {"engine": {"$ref": "#/$defs/sourceTree"}, "re": {"$ref": "#/$defs/sourceTree"}}},
"evidence": {"type": "object", "additionalProperties": false, "required": ["id", "axis", "path", "sha256", "source", "integrated", "source_binding", "binaries", "inputs", "outcomes"], "properties": {
"id": {"type": "string", "minLength": 1}, "axis": {"type": "string", "minLength": 1},
"path": {"type": "string", "minLength": 1}, "sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
"source": {"$ref": "#/$defs/baseline"}, "integrated": {"type": "boolean"},
"source_binding": {"$ref": "#/$defs/sourceBinding"},
"binaries": {"type": "array", "uniqueItems": true, "items": {"$ref": "#/$defs/artifact"}},
"inputs": {"type": "array", "uniqueItems": true, "items": {"$ref": "#/$defs/artifact"}},
"outcomes": {"type": "array", "items": {"type": "object", "additionalProperties": false, "required": ["criterion", "status", "artifact"], "properties": {"criterion": {"type": "string", "minLength": 1}, "status": {"enum": ["pass", "fail", "blocked"]}, "artifact": {"$ref": "#/$defs/artifact"}}}}
}}
}
}

View file

@ -0,0 +1,115 @@
{
"acceptance": [
{
"axis": "control-tests",
"criterion": "Unit tests reject lifecycle bypass, stale handoff/end checkpoints, same-HEAD candidate/integrated source drift, missing immutable inputs and criterion outcomes, bad identity/model, worker entry with pending surprises, lease collision and WIP overflow; old intact recovery checkpoints and resolution-only Astra entry succeed; runner requires successful completion/session/checkpoint and rejects provider errors and config drift",
"id": "controls-negative-paths"
}
],
"baseline": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re"
}
},
"checkpoint": "campaign/runtime/checkpoints/controls-bootstrap-5643d7cec1edd289b0465d5f.json",
"dependencies": [],
"effects": [
"Durable local contract controls and explicit-model worker launch"
],
"evidence": [
{
"axis": "control-tests",
"binaries": [
{
"path": "tools/campaign.py",
"sha256": "c7b7c7a30d907bba8e59386dee8704d7f3f5e978fcf709b686e37996fa465c31"
},
{
"path": "tools/run_agent.py",
"sha256": "0f5ccb53dcde59b64fe999768737b6cbd2dabcc1272e5605c1f1ecd86e5d5d2b"
}
],
"id": "controls-suite",
"inputs": [
{
"path": "verify/campaign/test_controls.py",
"sha256": "108460f4e90c4cb7036642e85de581e31fd70c478533c32364691260461814fc"
},
{
"path": "campaign/contract.schema.json",
"sha256": "a2c76ec042ca097a57c3c05c1e519e392d498d387a31808c7d0f70482d43c201"
},
{
"path": "campaign/rollout/controls_evidence.py",
"sha256": "bfaf4e523b2ca39c0ecdab94adf0b2b19a3da68aab8a0fcba69a613aed46588a"
}
],
"integrated": true,
"outcomes": [
{
"artifact": {
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
"criterion": "controls-negative-paths",
"status": "pass"
}
],
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e",
"source": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re"
}
},
"source_binding": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine",
"sha256": "ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re",
"sha256": "6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8"
}
}
}
],
"id": "controls-bootstrap",
"inputs": [
"campaign/rollout/architecture-decision.md",
"campaign/rollout/controls-worker.md"
],
"original_dependencies": [
"No original game executable required for control tests"
],
"owner": {
"name": "controls-architect",
"role": "architecture-review"
},
"predictions": [
"All controls can run with Python standard library and Git without an external server"
],
"scope": [
"tools/campaign.py",
"tools/run_agent.py",
"campaign/",
"verify/campaign/"
],
"status": "accepted",
"stop_conditions": [
"Cross-cutting architecture changes require Astra resolution"
],
"title": "Bootstrap canonical contract controls and bounded worker launcher"
}

View file

@ -0,0 +1,47 @@
{
"acceptance": [
{
"axis": "control-execution",
"criterion": "Real OpenCode process requests GPT-6 Astra, finishes successfully, emits one actual session and a matching fresh checkpoint; worktree source identities remain unchanged.",
"id": "live-launch"
}
],
"baseline": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re"
}
},
"checkpoint": "campaign/runtime/checkpoints/launcher-smoke-9e8a62fea4de50abd96f27d6.json",
"dependencies": [],
"effects": [
"One durable canonical RE checkpoint and one runner event/provenance record; no engine or RE worktree source changes"
],
"id": "launcher-smoke",
"inputs": [
"Canonical OpenCode configuration and role prompt",
"Two isolated baseline-linked worktrees"
],
"original_dependencies": [],
"owner": {
"name": "launcher-smoke",
"role": "architecture-review"
},
"predictions": [
"Runner completes with explicit requested Astra model and a canonical checkpoint; both source worktrees remain unchanged."
],
"scope": [
"SMOKE ONLY: Read this contract and campaign/README.md from the canonical RE state root. Do not implement any other contract, edit source, delegate, or access the lab.",
"Use the canonical campaign CLI to write a checkpoint for launcher-smoke with the run-supplied session ID, actor launcher-smoke, role architecture-review and model openai/gpt-6-astra. Summary: explicit Astra launcher reached canonical RE state from paired worktrees; no source mutation. Artifact: campaign/agents/lead.md. Next action: lead inspects this run's actual event/session/checkpoint binding.",
"After writing that checkpoint, immediately return a short completion. Do not plan extra work."
],
"status": "proposed",
"stop_conditions": [
"Any model, permission, contract, checkpoint or source mismatch: record incomplete; no fallback."
],
"title": "Normal Astra launcher, explicit routing and durable checkpoint smoke"
}

View file

@ -0,0 +1,171 @@
{
"acceptance": [
{
"axis": "static-recovery",
"criterion": "Addresses/signatures and record/container/string lifetime rules backed by fresh binary/tool captures; distinguish recorded facts, inference and unexercised branches. Name exact callable allocation/copy/destruction operations or precise unresolved blockers.",
"id": "ownership-recovered"
},
{
"axis": "validation",
"criterion": "Independent verifier checks key instruction/ABI claims and archived record values. No static-only claim of live allocator safety or replacement acceptance.",
"id": "independent-cross-check"
}
],
"baseline": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re"
}
},
"checkpoint": "campaign/runtime/checkpoints/research-completion-abi-d2e4078886c66df34ee00b24.json",
"dependencies": [
"controls-bootstrap"
],
"effects": [
"Evidence-backed RE handoff and raw static captures; no game or shared database state changes"
],
"evidence": [
{
"axis": "static-recovery",
"binaries": [
{
"path": "dumps/sots.exe",
"sha256": "970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841"
}
],
"id": "research-completion-abi-static-run-79357a65226f61d6a86c042d",
"inputs": [
{
"path": "verify/results/research-completion-abi/run-79357a65226f61d6a86c042d/report.md",
"sha256": "d5a28f01002f1711cf8575ffd817a8f0998b413c6280d656e6cdad5a90a04477"
}
],
"integrated": true,
"outcomes": [
{
"artifact": {
"path": "verify/results/research-completion-abi-independent/integration-lead-20260910/manifest.json",
"sha256": "4fdf2cbf02f0f3dd53c4ccfd1787a2fb8012d0de76dad63e97c2b5cfbdc6c46c"
},
"criterion": "ownership-recovered",
"status": "pass"
}
],
"path": "verify/results/research-completion-abi-independent/integration-lead-20260910/manifest.json",
"sha256": "4fdf2cbf02f0f3dd53c4ccfd1787a2fb8012d0de76dad63e97c2b5cfbdc6c46c",
"source": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re"
}
},
"source_binding": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine",
"sha256": "ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re",
"sha256": "e74ef6cff202ee35a6fdc38d63842b4826a074e34502dfc2981a33ffea912bd4"
}
}
},
{
"axis": "validation",
"binaries": [
{
"path": "dumps/sots.exe",
"sha256": "970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841"
}
],
"id": "research-completion-abi-validation-run-735fcb8f4876c10285b03fad",
"inputs": [
{
"path": "verify/results/saves/turn3-state.sav",
"sha256": "978041acd168b56ed8eb3f5e42e78d5e70eae6e6517d75e659a5eb7ca3d60921"
},
{
"path": "verify/results/research-completion-abi-independent/integration-lead-20260910/manifest.json",
"sha256": "4fdf2cbf02f0f3dd53c4ccfd1787a2fb8012d0de76dad63e97c2b5cfbdc6c46c"
}
],
"integrated": true,
"outcomes": [
{
"artifact": {
"path": "verify/results/research-completion-abi-independent/integration-lead-20260910/independent-state.json",
"sha256": "6463816f322803b2b7b479e1fc116c4ffa33fb2772a3005d492422a00acea433"
},
"criterion": "independent-cross-check",
"status": "pass"
}
],
"path": "verify/results/research-completion-abi-independent/integration-lead-20260910/independent-state.json",
"sha256": "6463816f322803b2b7b479e1fc116c4ffa33fb2772a3005d492422a00acea433",
"source": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re"
}
},
"source_binding": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine",
"sha256": "ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re",
"sha256": "e74ef6cff202ee35a6fdc38d63842b4826a074e34502dfc2981a33ffea912bd4"
}
}
}
],
"id": "research-completion-abi",
"inputs": [
"Existing binary fingerprint/address contract and private RE findings",
"Owner-supplied binary or live read-only ReVa endpoint",
"Archived CR traces/saves for observed behavior",
"Source-identical current engine/RE worktree snapshots"
],
"original_dependencies": [
"Original binary is the object of analysis, not a replacement dependency decision"
],
"owner": {
"name": "research-abi-analyst",
"role": "analyst"
},
"predictions": [
"Count-only scratch updates conceal concrete element construction and original allocator ownership requirements",
"The observed-tech and nested-event containers use different element strides and nontrivial string lifetimes; raw header copying is insufficient"
],
"scope": [
"Reverse engineering only. Own canonical campaign/research/research-completion-abi.md and verify/results/research-completion-abi/ captures. Use assigned source-identical paired worktrees for source inspection; canonical RE for unique evidence/checkpoint outputs.",
"Recover actual constructors/copy/destructors/vector-growth/allocation/free conventions used by RecordObservedTech and EventStorage/TurnEvents/PlayerEvent. Resolve implementable ABI operations, not another general framework.",
"Use existing ReVa read-only tools through canonical tools/reva_call.py or the owner-supplied local binary. No Ghidra renames/type writes, VM mutation, new engine code, framework code, agents or delegation. Do not commit/stage/push.",
"Start with findings/subsystems/{events,observedtech-append,research-replace}.md and campaign/pilots/research-replacement.md; cross-check binary bytes/decompilation rather than merely repeat notes. Anchors: RecordObservedTech 0x007ba1a0, EventStorage::PostEvent 0x008862b0, PlayerEvent constructor 0x0084ee30. Addresses are hypotheses to validate against fingerprint and actual tools.",
"Produce recovered signatures, ownership/lifetime rules, short/long string and empty/full-capacity container paths, and exact unresolved dependencies with minimum next probe. Store raw tool outputs and a hash/provenance index in your owned RE results directory. Keep code-derived material out of engine repo."
],
"status": "accepted",
"stop_conditions": [
"Stop affected interpretation on binary fingerprint mismatch, contradictory ownership/ABI evidence, unavailable original data, or any scope-changing surprise; record and escalate to Astra",
"Checkpoint every 20 calls/15 minutes and before compaction/stopping; return exact next RE action within 40 steps",
"Do not expand into framework development or mark pilot replacement ready/accepted"
],
"title": "RE: research completion record construction and allocator ABI"
}

View file

@ -0,0 +1,92 @@
{
"acceptance": [
{
"axis": "planning",
"criterion": "Before ready, publish exact bridge-only source/test ownership, callable entrypoints and calling conventions, generated-address provenance, a bridge-only invocation route, VM/build resources, executable acceptance commands and immutable source/binary/fixture manifests. The route must not call or wire research replacement.",
"id": "readiness"
},
{
"axis": "understanding",
"criterion": "Reconcile accepted binary evidence with generated and pure-model facts, including whether EvDsc participates in duplicate equality and whether the callable ObservedTech copy operation begins at 0x0079a150 or an interior site. Every exposed constructor/copy/append/destructor/new/delete operation has an exact ABI and ownership contract.",
"id": "abi-reconciliation"
},
{
"axis": "implementation",
"criterion": "An isolated bridge constructs, copies, appends, updates and destroys complete live-layout ObservedTech, TurnEvents and PlayerEvent values using compatible original-runtime allocation services. It never copies raw owning headers and never calls original RecordObservedTech, EventStorage::PostEvent or any research completion root.",
"id": "bridge-operations"
},
{
"axis": "validation",
"criterion": "Host tests and a fresh leased disposable-VM run positively execute empty, spare and full capacity; short and long strings; repeated observed names; exact duplicate and description-only-different events; normal destruction; and one contained recorded failure path. Preserve per-case operation/allocation/destruction counts and complete resulting records.",
"id": "runtime-matrix"
},
{
"axis": "validation",
"criterion": "Executable negative controls reject raw string/header transfer, wrong callable entry or convention, mismatched allocator family, missing cleanup, double free, incomplete record fields, forbidden original decision-root calls, zero execution, missing artifacts and source/binary/fixture drift.",
"id": "negative-controls"
},
{
"axis": "validation",
"criterion": "A different verifier session reproduces the source/binary/fixture-bound package and at least one meaningful negative control on an integrated tree. Author-only or static-only evidence cannot accept live allocator safety.",
"id": "independent-reproduction"
}
],
"baseline": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re"
}
},
"checkpoint": "campaign/runtime/checkpoints/research-live-record-bridge-e25bb2cbc914031f4572ad84.json",
"dependencies": [
"research-completion-abi"
],
"effects": [
"Complete 0x2c ObservedTech object fields, owned name string, existing-name update semantics, vector first/last/end and element lifetime across no-growth and growth paths.",
"Complete 0x74 PlayerEvent fields and three independently owned strings, plus complete 0x18 TurnEvents bucket and nested vector lifetime across no-growth and growth paths.",
"Event ID/order, exact duplicate behavior, description-only-different behavior and stale-bucket pruning only as needed to exercise the bridge fixture; no research callback or player-state effects.",
"Allocation, copy, destruction and failure-path counters sufficient to detect leaks, mismatched frees, partial construction and double destruction."
],
"evidence": [],
"id": "research-live-record-bridge",
"inputs": [
"Accepted research-completion-abi evidence and handoff, including binary fingerprint and independently reproduced static ownership windows.",
"Original binary /home/alex/sots-re/dumps/sots.exe sha256 970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841; owner-supplied and never committed.",
"Source-identical paired worktrees /tmp/opencode/sots-final-research-engine and /tmp/opencode/sots-final-research-re at the contract baselines; exact dirty source-content manifests are required before implementation evidence.",
"Disposable VM144 is the preferred runtime fixture guest; verify its current MAC/IP, session/process state and housekeeping immediately before use, then acquire campaign/runtime/leases/vm144.json. VM140 is excluded from this experiment.",
"Required but missing before ready: bridge-only invocation fixture, generated callable-address package, 32-bit shim/toolchain manifest, failure-containment design, executable acceptance checker and per-case expected records."
],
"original_dependencies": [
"Original MSVCR100 scalar new/delete and narrowly accepted constructor/copy/append/destructor operations are permitted only as declared, counted ABI services.",
"Original RecordObservedTech, EventStorage::PostEvent, ProcessResearch, SetResearched, OnTechResearched and localized string lookup are forbidden in the bridge fixture.",
"The original game process supplies the MSVCR100 runtime and object address space for live tests; this contract does not claim standalone allocator or game-decision replacement."
],
"owner": {
"name": "live-record bridge architect",
"role": "architecture-review"
},
"predictions": [
"ObservedTech no-growth append deep-copies one name; growth relocates every existing 0x2c element and destroys the old range without cross-runtime frees.",
"PlayerEvent append deep-copies EvDsc, EvMsg and EvImg independently; full-capacity growth preserves all scalar/default fields and destroys old strings exactly once.",
"Repeated observed name updates the existing record without vector growth; exact duplicate event does not append; description-only-different event does append if the accepted EvDsc equality result is correct.",
"A contained allocation-failure fixture reports failure without an accepted partial record, leaked owned string, mismatched free or exception crossing into an unsafe ABI boundary."
],
"scope": [
"Recover and implement only the live ABI bridge for ObservedTech, TurnEvents and PlayerEvent construction/copy/append/update/destruction plus isolated fixtures and acceptance tooling.",
"First quantum is RE and architecture: reconcile callable boundaries and duplicate semantics, specify failure containment and name exact owned files. No engine implementation or VM mutation until the contract is ready and the operator holds required leases.",
"Runtime validation uses a bridge-only fixture on a disposable clone. It must not wire src/shim/hooks/research.cpp or src/shim/main.cpp and must not execute a research completion workload.",
"Static ABI acceptance is a dependency, not evidence of live safety. Acceptance remains scoped to bridge operations and does not promote research-replacement."
],
"status": "needs-revision",
"stop_conditions": [
"Remain proposed while callable ABI, exact ownership, fixture route, manifests, failure containment or executable acceptance is unresolved.",
"Stop affected work and record a surprise on contradictory fresh binary/runtime evidence, binary/source drift, allocator mismatch, exception crossing, unexpected game-decision-root execution, leak/double-free, guest interference or access change.",
"No Ghidra mutation or VM/build-host mutation without explicit assignment and the corresponding canonical lease; never touch VM140 under this contract.",
"No research replacement wiring, delegation, staging, commit, push or destructive canonical worktree operation. Checkpoint every 20 calls/15 minutes and before experiment, handoff or stop."
],
"title": "Live ObservedTech and event record ABI bridge"
}

View file

@ -0,0 +1,109 @@
{
"acceptance": [
{
"axis": "planning",
"criterion": "BLOCKED: accepted static ABI dependency is named and original-helper policy is fixed, but readiness still requires an accepted live-record-bridge contract, implemented tools/research_replacement.py interfaces from the pilot plan, required asset paths/hashes, W0 recertification, exact coordinator-owned paths and immutable source/binary/input manifests.",
"id": "readiness"
},
{
"axis": "implementation",
"criterion": "Fresh full-profile source-bound host/assets/shim build; expected test identities and explicit positive executed workloads; no required missing input, unexpected skip or stale binary.",
"id": "full-gate"
},
{
"axis": "validation",
"criterion": "Two fresh C1/C2 hooks-off processes and candidate compare N on the exact W1 input/route produce identical pre/post save pairs; full installed-site manifests and per-call CW retained. Reject incomplete raw bundles or disagreement.",
"id": "control-neutrality"
},
{
"axis": "implementation",
"criterion": "W1 replace executes exactly one tech-144 completion and three unlocks, two actual event records and one full observed-tech record, refund 1166 and primary player effects; original displaced roots bypassed, declared helpers counted; zero unsupported paths, unreadable inputs or failures.",
"id": "positive-replace"
},
{
"axis": "validation",
"criterion": "Require post-turn file-byte, inflated-byte and exact-bit unmasked state equality plus complete reader coverage and nonserialized order/RNG checks. Pre-turn resave equality, count-only regions and zero-execution passes cannot satisfy this criterion.",
"id": "oracle"
},
{
"axis": "validation",
"criterion": "Executable checker rejects archived R0's 27 and R1's 16 leaf differences, absent callback/event/ObservedTech writes, W0 as completion evidence, missing artifacts, wrong hashes, and unknown RNG reported as zero.",
"id": "negative-controls"
},
{
"axis": "validation",
"criterion": "Different verifier execution reproduces source/binary/input-bound package and a meaningful negative control; integrated-tree evidence is required before accepted. No author-only verdict or reporter --accept flag grants campaign acceptance.",
"id": "independent-reproduction"
},
{
"axis": "original_dependencies",
"criterion": "Publish retained original helpers and W1-only scope separately. Require certified W2 and branch-specific original experiments plus synthetic boundaries before claiming RNG-consuming, other-effect-family, recursive, dedup, decay, plague or rebellion coverage.",
"id": "coverage-and-dependencies"
}
],
"baseline": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re"
}
},
"checkpoint": "campaign/runtime/checkpoints/research-replacement-fc19e142bf1db96b10d29391.json",
"dependencies": [
"research-completion-abi"
],
"effects": [
"All node state/progress/flag/cost/availability/researched-turn/order words; tree order counter; capped spend and refund accumulator; idle-node decay; ordered cascade including conditional recursive zero-cost completions.",
"RNG full state, left and next-index plus actual consumed words, including conditional completion rolls, Zuul second roll and research-event paths; W1 has zero words and proves no positive-draw branch.",
"All applicable callback player floats, boolean/species/design-option masks, target and roll flags, node-bore storage and lifetimes. Existing WritePlayerState is not integration of the full research callback.",
"ObservedTech full record name/first-last turn/detected/with fields, dedup/update, vector elements/header/capacity and compatible allocation/destruction. Scratch span growth is not an append implementation.",
"Complete ordered event turn buckets, records, ids/nextId, text, image/action/location/position/chainId, dedup/pruning and allocation lifetimes; keyless count-only events cannot satisfy the save oracle.",
"Conditional transitive system/ship AI/cap/addiction/plague changes, recursive Zuul grant, rebellion object allocation and cancellation must be implemented or rejected by approved preflight before mutation; TechApplyOutcome alone performs none of them.",
"Observe downstream bankruptcy, repair and checksum consequences through full turn/save validation; never copy original post-state or patch expected derived leaves."
],
"id": "research-replacement",
"inputs": [
"W1 verify/results/saves/turn3-state.sav sha256 978041acd168b56ed8eb3f5e42e78d5e70eae6e6517d75e659a5eb7ca3d60921; exact fresh-process LOAD route, one End Turn.",
"Historical oracle verify/results/saves/cr/cr-oracle-endturn.sav sha256 e00eed0c03a31d27a81b7470a9dcc9ba08a2ac48c20baeee4f34749164743e3f and cr-oracle-autosave.sav sha256 79df50475a7b83afa927d992b9f030dcf45710f4bda0133b8b1fa4800a72e420; re-certify controls with current candidate inputs.",
"Historical negative saves cr-replace0-autosave.sav sha256 6b51db992b158caa5424d71b2dccf72924af7198b4165bfcfc870e0d438fb6d5 and cr-replace1-autosave.sav sha256 8a4309ee4fe0b3177a2820600b5016c7c256d0f51b065df469ecd0b4f2342235 under verify/results/saves/cr/.",
"Raw historical evidence: verify/traces/cr-{N,R0,R1}.jsonl.gz; verify/results/compare/cr-{compare,replace0,replace1}.json; verify/results/shim/cr/cr-{N,R0,R1}.log. Historical build cr-618ccb1-20260909T131556Z does not identify the current candidate.",
"Required but missing: operator-owned executable/proxy and tech graph/tuning/localized string assets with explicit paths, SHA-256, locale and load order; generated-address provenance; compiler/toolchain; exact candidate source-content and binary manifests.",
"Runtime-only inputs include tree order counter, allocation entries/order, current turn, target and pending-roll flags, preexisting observed-tech and event elements, RNG state/index/left, full FPU CW, installed interception sites and LOAD/continuation route.",
"W0 turn2-state.sav one End Turn is a no-completion regression control; pin hash and re-certify. W2 different-tech positive-RNG/second-completion workload remains to be selected and certified before expanding scope.",
"Accepted static dependency research-completion-abi establishes record/container/string ABI only; live allocator safety, runtime construction and replacement acceptance remain absent."
],
"original_dependencies": [
"Retained and counted original TechTree::Cost supplies effective and cascade costs; independent effective-cost replacement is excluded.",
"Retained and counted original TechTree::HasResearched supplies common-tail/design-mask lookup; replacement owns resulting writes.",
"Retained and counted ServerPlayer::UpdateNodeBoreParams runs in common-tail order and may allocate/free state; independent node-bore maintenance is excluded.",
"Original MSVCR100 scalar new/delete and accepted copy/container ABI may be used only as a counted live memory bridge. Original RecordObservedTech, EventStorage::PostEvent and string lookup are forbidden displaced roots; localized text must come from manifested runtime assets.",
"Shim workload retains original turn driver, budget allocation, remaining simulation, data loading and save serialization. Successful scoped shim replacement would not establish independent standalone turn parity."
],
"owner": {
"name": "Astra pilot architect",
"role": "architecture-review"
},
"predictions": [
"W1 owner order 32/496/512 with allocations 144:2898,90:0,9:0; exactly one completion and two null calls.",
"Tech144 progress 5768->7500, state3->4, researched turn4/order22, counter22->23, unchanged flag; capped spend1732/refund1166; no RNG words.",
"Tech132/136/142 become available turn4 at costs10000/16000/8000; observed-tech count10->11 with real element; event nextId5->7 with complete records.",
"Existing R1 still fails by 16 leaves (independently reproduced); merely enabling cascade cannot close callback residuals. Runtime text assets may avoid original PostEvent but live adapter and policy are unresolved."
],
"scope": [
"Planning only until ready: campaign/pilots/research-replacement.md is the detailed input, write-boundary and acceptance specification. No replacement code or lab operations authorized by this proposed contract.",
"Target ProcessResearch plus SetResearched and required OnTechResearched effects for the W1 turn3 LOAD-to-turn4 completion; broad research correctness is not implied.",
"The accepted static ABI dependency does not authorize live wiring. First accept a separately contracted live record bridge; then assign one complete W1 coordinator write set with baseline-pinned paired worktrees and exclusive source/build/VM ownership.",
"Before implementation provide exact owned source paths, supported-input preflight, executable acceptance and immutable manifests. Uncommitted bootstrap changes are not bound by these HEAD IDs."
],
"status": "proposed",
"stop_conditions": [
"Remain proposed while readiness criterion, dependency decisions, input manifests and executable acceptance are missing; do not interpret narrative strings as execution proof.",
"Stop on control disagreement, instrumentation mismatch, source/input drift, missing artifacts/assets, unknown RNG, unmodelled fired branch, unexpected writes, zero required execution or forbidden original fallback.",
"Record any falsified assumption or changed scope as a surprise and obtain Astra resolution before affected work continues; checkpoint at 20 calls/15 minutes and before experiments, handoff or stop.",
"No lab or shared-host mutation without explicit assignment and lease; no commits, staging, push or delegated work under the current pilot-design assignment."
],
"title": "Completion-bearing W1 research replacement pilot (proposed; live bridge, assets and runner pending)"
}

2699
campaign/current.json Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,104 @@
{
"command": [
"/usr/bin/python3",
"-m",
"unittest",
"discover",
"-s",
"verify/campaign",
"-v"
],
"expected": [
"test_acceptance_requires_independent_final_integrated_package",
"test_actual_worktree_identity_and_baseline_without_source_commits",
"test_baseline_rechecked_under_reservation",
"test_candidate_worktree_binding_cannot_claim_integration",
"test_checkpoint_basis_session_model_and_bounds",
"test_config_mutation_during_zero_exit_success_fails",
"test_dry_run_writes_no_run_and_no_fallback",
"test_duplicate_json_keys_and_nonfinite_numbers",
"test_error_followed_by_success_still_fails",
"test_evidence_source_tampering_and_revision",
"test_identity_and_dependency_fail_closed",
"test_immutable_inputs_and_criterion_coverage",
"test_integrated_re_source_mutation_rejects_acceptance",
"test_lease_concurrent_acquisition_exactly_one_winner",
"test_lease_token_owner_and_explicit_stale_release",
"test_lifecycle_no_bypass_or_missing_inputs",
"test_missing_and_stale_checkpoint_and_artifact",
"test_model_mismatch_and_nonzero_exit_fail",
"test_model_registry_no_fallback",
"test_multiple_surprises_remain_blocked_until_all_resolved",
"test_old_recovery_checks_integrity_but_not_age",
"test_permissions_expanded_prompt_and_provenance",
"test_resolution_permission_scope_and_architecture_authority",
"test_run_missing_end_checkpoint_is_incomplete",
"test_run_success_captures_actual_events_and_checkpoint",
"test_runner_role_status_surprise_and_missing_checkpoint",
"test_running_reservation_is_not_stolen",
"test_same_head_source_mutation_rejects_verdict_and_promotion",
"test_schema_rejects_unknown_missing_types_and_ids",
"test_scientific_artifacts_and_secret_path_escapes",
"test_source_binding_add_delete_mode_and_escape",
"test_state_root_and_path_escape",
"test_surprise_blocks_and_resolution_invalidates",
"test_unavailable_model_and_config_bound",
"test_wip_bound",
"test_zero_exit_error_and_incomplete_events_fail"
],
"passed": [
"test_acceptance_requires_independent_final_integrated_package",
"test_actual_worktree_identity_and_baseline_without_source_commits",
"test_baseline_rechecked_under_reservation",
"test_candidate_worktree_binding_cannot_claim_integration",
"test_checkpoint_basis_session_model_and_bounds",
"test_config_mutation_during_zero_exit_success_fails",
"test_dry_run_writes_no_run_and_no_fallback",
"test_duplicate_json_keys_and_nonfinite_numbers",
"test_error_followed_by_success_still_fails",
"test_evidence_source_tampering_and_revision",
"test_identity_and_dependency_fail_closed",
"test_immutable_inputs_and_criterion_coverage",
"test_integrated_re_source_mutation_rejects_acceptance",
"test_lease_concurrent_acquisition_exactly_one_winner",
"test_lease_token_owner_and_explicit_stale_release",
"test_lifecycle_no_bypass_or_missing_inputs",
"test_missing_and_stale_checkpoint_and_artifact",
"test_model_mismatch_and_nonzero_exit_fail",
"test_model_registry_no_fallback",
"test_multiple_surprises_remain_blocked_until_all_resolved",
"test_old_recovery_checks_integrity_but_not_age",
"test_permissions_expanded_prompt_and_provenance",
"test_resolution_permission_scope_and_architecture_authority",
"test_run_missing_end_checkpoint_is_incomplete",
"test_run_success_captures_actual_events_and_checkpoint",
"test_runner_role_status_surprise_and_missing_checkpoint",
"test_running_reservation_is_not_stolen",
"test_same_head_source_mutation_rejects_verdict_and_promotion",
"test_schema_rejects_unknown_missing_types_and_ids",
"test_scientific_artifacts_and_secret_path_escapes",
"test_source_binding_add_delete_mode_and_escape",
"test_state_root_and_path_escape",
"test_surprise_blocks_and_resolution_invalidates",
"test_unavailable_model_and_config_bound",
"test_wip_bound",
"test_zero_exit_error_and_incomplete_events_fail"
],
"returncode": 0,
"schema": "sots-controls-test/1",
"source_binding": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine",
"sha256": "ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re",
"sha256": "82fc34631b2baa2ee74557020f74d68cc4db3c031561210f9933a3f22d7ff7b6"
}
},
"status": "passed",
"stderr": "test_schema_rejects_unknown_missing_types_and_ids (test_controls.Controls) ... ok\ntest_duplicate_json_keys_and_nonfinite_numbers (test_controls.Controls) ... ok\ntest_state_root_and_path_escape (test_controls.Controls) ... ok\ntest_lifecycle_no_bypass_or_missing_inputs (test_controls.Controls) ... ok\ntest_identity_and_dependency_fail_closed (test_controls.Controls) ... ok\ntest_missing_and_stale_checkpoint_and_artifact (test_controls.Controls) ... ok\ntest_checkpoint_basis_session_model_and_bounds (test_controls.Controls) ... ok\ntest_wip_bound (test_controls.Controls) ... ok\ntest_surprise_blocks_and_resolution_invalidates (test_controls.Controls) ... ok\ntest_multiple_surprises_remain_blocked_until_all_resolved (test_controls.Controls) ... ok\ntest_acceptance_requires_independent_final_integrated_package (test_controls.Controls) ... ok\ntest_evidence_source_tampering_and_revision (test_controls.Controls) ... ok\ntest_lease_concurrent_acquisition_exactly_one_winner (test_controls.Controls) ... ok\ntest_lease_token_owner_and_explicit_stale_release (test_controls.Controls) ... ok\ntest_model_registry_no_fallback (test_controls.Controls) ... ok\ntest_runner_role_status_surprise_and_missing_checkpoint (test_controls.Controls) ... ok\ntest_old_recovery_checks_integrity_but_not_age (test_controls.Controls) ... ok\ntest_same_head_source_mutation_rejects_verdict_and_promotion (test_controls.Controls) ... ok\ntest_integrated_re_source_mutation_rejects_acceptance (test_controls.Controls) ... ok\ntest_immutable_inputs_and_criterion_coverage (test_controls.Controls) ... ok\ntest_candidate_worktree_binding_cannot_claim_integration (test_controls.Controls) ... ok\ntest_source_binding_add_delete_mode_and_escape (test_controls.Controls) ... ok\ntest_scientific_artifacts_and_secret_path_escapes (test_controls.Controls) ... ok\ntest_run_success_captures_actual_events_and_checkpoint (test_controls.Runner) ... ok\ntest_run_missing_end_checkpoint_is_incomplete (test_controls.Runner) ... ok\ntest_unavailable_model_and_config_bound (test_controls.Runner) ... ok\ntest_dry_run_writes_no_run_and_no_fallback (test_controls.Runner) ... ok\ntest_model_mismatch_and_nonzero_exit_fail (test_controls.Runner) ... ok\ntest_running_reservation_is_not_stolen (test_controls.Runner) ... ok\ntest_zero_exit_error_and_incomplete_events_fail (test_controls.Runner) ... ok\ntest_config_mutation_during_zero_exit_success_fails (test_controls.Runner) ... ok\ntest_error_followed_by_success_still_fails (test_controls.Runner) ... ok\ntest_resolution_permission_scope_and_architecture_authority (test_controls.Runner) ... ok\ntest_baseline_rechecked_under_reservation (test_controls.Runner) ... ok\ntest_permissions_expanded_prompt_and_provenance (test_controls.Runner) ... ok\ntest_actual_worktree_identity_and_baseline_without_source_commits (test_controls.Worktrees) ... ok\n\n----------------------------------------------------------------------\nRan 36 tests in 6.574s\n\nOK\n",
"stdout": ""
}

View file

@ -0,0 +1,106 @@
{
"command": [
"/usr/bin/python3",
"-m",
"unittest",
"discover",
"-s",
"verify/campaign",
"-v"
],
"expected": [
"test_acceptance_requires_independent_final_integrated_package",
"test_actual_worktree_identity_and_baseline_without_source_commits",
"test_baseline_rechecked_under_reservation",
"test_candidate_worktree_binding_cannot_claim_integration",
"test_checkpoint_basis_session_model_and_bounds",
"test_config_mutation_during_zero_exit_success_fails",
"test_dry_run_writes_no_run_and_no_fallback",
"test_duplicate_json_keys_and_nonfinite_numbers",
"test_error_followed_by_success_still_fails",
"test_evidence_source_tampering_and_revision",
"test_final_integrated_verifier_launch_preserves_guards",
"test_identity_and_dependency_fail_closed",
"test_immutable_inputs_and_criterion_coverage",
"test_integrated_re_source_mutation_rejects_acceptance",
"test_lease_concurrent_acquisition_exactly_one_winner",
"test_lease_token_owner_and_explicit_stale_release",
"test_lifecycle_no_bypass_or_missing_inputs",
"test_missing_and_stale_checkpoint_and_artifact",
"test_model_mismatch_and_nonzero_exit_fail",
"test_model_registry_no_fallback",
"test_multiple_surprises_remain_blocked_until_all_resolved",
"test_old_recovery_checks_integrity_but_not_age",
"test_permissions_expanded_prompt_and_provenance",
"test_resolution_permission_scope_and_architecture_authority",
"test_run_missing_end_checkpoint_is_incomplete",
"test_run_success_captures_actual_events_and_checkpoint",
"test_runner_role_status_surprise_and_missing_checkpoint",
"test_running_reservation_is_not_stolen",
"test_same_head_source_mutation_rejects_verdict_and_promotion",
"test_schema_rejects_unknown_missing_types_and_ids",
"test_scientific_artifacts_and_secret_path_escapes",
"test_source_binding_add_delete_mode_and_escape",
"test_state_root_and_path_escape",
"test_surprise_blocks_and_resolution_invalidates",
"test_unavailable_model_and_config_bound",
"test_wip_bound",
"test_zero_exit_error_and_incomplete_events_fail"
],
"passed": [
"test_acceptance_requires_independent_final_integrated_package",
"test_actual_worktree_identity_and_baseline_without_source_commits",
"test_baseline_rechecked_under_reservation",
"test_candidate_worktree_binding_cannot_claim_integration",
"test_checkpoint_basis_session_model_and_bounds",
"test_config_mutation_during_zero_exit_success_fails",
"test_dry_run_writes_no_run_and_no_fallback",
"test_duplicate_json_keys_and_nonfinite_numbers",
"test_error_followed_by_success_still_fails",
"test_evidence_source_tampering_and_revision",
"test_final_integrated_verifier_launch_preserves_guards",
"test_identity_and_dependency_fail_closed",
"test_immutable_inputs_and_criterion_coverage",
"test_integrated_re_source_mutation_rejects_acceptance",
"test_lease_concurrent_acquisition_exactly_one_winner",
"test_lease_token_owner_and_explicit_stale_release",
"test_lifecycle_no_bypass_or_missing_inputs",
"test_missing_and_stale_checkpoint_and_artifact",
"test_model_mismatch_and_nonzero_exit_fail",
"test_model_registry_no_fallback",
"test_multiple_surprises_remain_blocked_until_all_resolved",
"test_old_recovery_checks_integrity_but_not_age",
"test_permissions_expanded_prompt_and_provenance",
"test_resolution_permission_scope_and_architecture_authority",
"test_run_missing_end_checkpoint_is_incomplete",
"test_run_success_captures_actual_events_and_checkpoint",
"test_runner_role_status_surprise_and_missing_checkpoint",
"test_running_reservation_is_not_stolen",
"test_same_head_source_mutation_rejects_verdict_and_promotion",
"test_schema_rejects_unknown_missing_types_and_ids",
"test_scientific_artifacts_and_secret_path_escapes",
"test_source_binding_add_delete_mode_and_escape",
"test_state_root_and_path_escape",
"test_surprise_blocks_and_resolution_invalidates",
"test_unavailable_model_and_config_bound",
"test_wip_bound",
"test_zero_exit_error_and_incomplete_events_fail"
],
"returncode": 0,
"schema": "sots-controls-test/1",
"source_binding": {
"engine": {
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"path": "/home/alex/sots-engine",
"sha256": "ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd"
},
"re": {
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"path": "/home/alex/sots-re",
"sha256": "6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8"
}
},
"status": "passed",
"stderr": "test_schema_rejects_unknown_missing_types_and_ids (test_controls.Controls) ... ok\ntest_duplicate_json_keys_and_nonfinite_numbers (test_controls.Controls) ... ok\ntest_state_root_and_path_escape (test_controls.Controls) ... ok\ntest_lifecycle_no_bypass_or_missing_inputs (test_controls.Controls) ... ok\ntest_identity_and_dependency_fail_closed (test_controls.Controls) ... ok\ntest_missing_and_stale_checkpoint_and_artifact (test_controls.Controls) ... ok\ntest_checkpoint_basis_session_model_and_bounds (test_controls.Controls) ... ok\ntest_wip_bound (test_controls.Controls) ... ok\ntest_surprise_blocks_and_resolution_invalidates (test_controls.Controls) ... ok\ntest_multiple_surprises_remain_blocked_until_all_resolved (test_controls.Controls) ... ok\ntest_acceptance_requires_independent_final_integrated_package (test_controls.Controls) ... ok\ntest_evidence_source_tampering_and_revision (test_controls.Controls) ... ok\ntest_lease_concurrent_acquisition_exactly_one_winner (test_controls.Controls) ... ok\ntest_lease_token_owner_and_explicit_stale_release (test_controls.Controls) ... ok\ntest_model_registry_no_fallback (test_controls.Controls) ... ok\ntest_runner_role_status_surprise_and_missing_checkpoint (test_controls.Controls) ... ok\ntest_final_integrated_verifier_launch_preserves_guards (test_controls.Controls) ... ok\ntest_old_recovery_checks_integrity_but_not_age (test_controls.Controls) ... ok\ntest_same_head_source_mutation_rejects_verdict_and_promotion (test_controls.Controls) ... ok\ntest_integrated_re_source_mutation_rejects_acceptance (test_controls.Controls) ... ok\ntest_immutable_inputs_and_criterion_coverage (test_controls.Controls) ... ok\ntest_candidate_worktree_binding_cannot_claim_integration (test_controls.Controls) ... ok\ntest_source_binding_add_delete_mode_and_escape (test_controls.Controls) ... ok\ntest_scientific_artifacts_and_secret_path_escapes (test_controls.Controls) ... ok\ntest_run_success_captures_actual_events_and_checkpoint (test_controls.Runner) ... ok\ntest_run_missing_end_checkpoint_is_incomplete (test_controls.Runner) ... ok\ntest_unavailable_model_and_config_bound (test_controls.Runner) ... ok\ntest_dry_run_writes_no_run_and_no_fallback (test_controls.Runner) ... ok\ntest_model_mismatch_and_nonzero_exit_fail (test_controls.Runner) ... ok\ntest_running_reservation_is_not_stolen (test_controls.Runner) ... ok\ntest_zero_exit_error_and_incomplete_events_fail (test_controls.Runner) ... ok\ntest_config_mutation_during_zero_exit_success_fails (test_controls.Runner) ... ok\ntest_error_followed_by_success_still_fails (test_controls.Runner) ... ok\ntest_resolution_permission_scope_and_architecture_authority (test_controls.Runner) ... ok\ntest_baseline_rechecked_under_reservation (test_controls.Runner) ... ok\ntest_permissions_expanded_prompt_and_provenance (test_controls.Runner) ... ok\ntest_actual_worktree_identity_and_baseline_without_source_commits (test_controls.Worktrees) ... ok\n\n----------------------------------------------------------------------\nRan 37 tests in 6.919s\n\nOK\n",
"stdout": ""
}

View file

@ -0,0 +1,51 @@
{
"id": "research-completion-abi-static-run-79357a65226f61d6a86c042d",
"axis": "static-recovery",
"path": "verify/results/research-completion-abi-independent/integration-lead-20260910/manifest.json",
"sha256": "4fdf2cbf02f0f3dd53c4ccfd1787a2fb8012d0de76dad63e97c2b5cfbdc6c46c",
"source": {
"engine": {
"path": "/home/alex/sots-engine",
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23"
},
"re": {
"path": "/home/alex/sots-re",
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7"
}
},
"integrated": true,
"source_binding": {
"engine": {
"path": "/home/alex/sots-engine",
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"sha256": "ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd"
},
"re": {
"path": "/home/alex/sots-re",
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"sha256": "e74ef6cff202ee35a6fdc38d63842b4826a074e34502dfc2981a33ffea912bd4"
}
},
"binaries": [
{
"path": "dumps/sots.exe",
"sha256": "970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841"
}
],
"inputs": [
{
"path": "verify/results/research-completion-abi/run-79357a65226f61d6a86c042d/report.md",
"sha256": "d5a28f01002f1711cf8575ffd817a8f0998b413c6280d656e6cdad5a90a04477"
}
],
"outcomes": [
{
"criterion": "ownership-recovered",
"status": "pass",
"artifact": {
"path": "verify/results/research-completion-abi-independent/integration-lead-20260910/manifest.json",
"sha256": "4fdf2cbf02f0f3dd53c4ccfd1787a2fb8012d0de76dad63e97c2b5cfbdc6c46c"
}
}
]
}

View file

@ -0,0 +1,55 @@
{
"id": "research-completion-abi-validation-run-735fcb8f4876c10285b03fad",
"axis": "validation",
"path": "verify/results/research-completion-abi-independent/integration-lead-20260910/independent-state.json",
"sha256": "6463816f322803b2b7b479e1fc116c4ffa33fb2772a3005d492422a00acea433",
"source": {
"engine": {
"path": "/home/alex/sots-engine",
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23"
},
"re": {
"path": "/home/alex/sots-re",
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7"
}
},
"integrated": true,
"source_binding": {
"engine": {
"path": "/home/alex/sots-engine",
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"sha256": "ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd"
},
"re": {
"path": "/home/alex/sots-re",
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"sha256": "e74ef6cff202ee35a6fdc38d63842b4826a074e34502dfc2981a33ffea912bd4"
}
},
"binaries": [
{
"path": "dumps/sots.exe",
"sha256": "970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841"
}
],
"inputs": [
{
"path": "verify/results/saves/turn3-state.sav",
"sha256": "978041acd168b56ed8eb3f5e42e78d5e70eae6e6517d75e659a5eb7ca3d60921"
},
{
"path": "verify/results/research-completion-abi-independent/integration-lead-20260910/manifest.json",
"sha256": "4fdf2cbf02f0f3dd53c4ccfd1787a2fb8012d0de76dad63e97c2b5cfbdc6c46c"
}
],
"outcomes": [
{
"criterion": "independent-cross-check",
"status": "pass",
"artifact": {
"path": "verify/results/research-completion-abi-independent/integration-lead-20260910/independent-state.json",
"sha256": "6463816f322803b2b7b479e1fc116c4ffa33fb2772a3005d492422a00acea433"
}
}
]
}

23
campaign/models.json Normal file
View file

@ -0,0 +1,23 @@
{
"schema": "sots-models/1",
"roles": {
"lead": "openai/gpt-5.6-sol",
"resolver": "openai/gpt-6-astra",
"architecture-review": "openai/gpt-5.6-sol",
"analyst": "openai/gpt-5.6-sol",
"implementer": "openai/gpt-5.6-sol",
"verifier": "openai/gpt-5.6-sol",
"lab": "openai/gpt-5.6-sol"
},
"agents": {
"lead": "sots-lead",
"resolver": "sots-resolver",
"architecture-review": "sots-lead",
"analyst": "sots-analyst",
"implementer": "sots-implementer",
"verifier": "sots-verifier",
"lab": "sots-lab"
},
"max_steps": 40,
"implementation_wip": 2
}

View file

@ -1,46 +1,10 @@
# Open questions
# Questions and surprises
Each links to the finding that raised it. Promoted to backlog or closed by **re-quartermaster**.
Active blockers belong to the affected `contracts/*.json` and its checkpoint. Falsified assumptions,
conflicting evidence, instrument effects and changed scope belong in `runtime/surprises/`, with a
discriminating probe and an Astra resolution in `runtime/decisions/` before affected work resumes.
- **Compiler archive mismatch** — imports say MSVCR100/MSVCP100 (VS2010), but Ghidra applied
`windows_vs12_32` datatypes (closest available). Confirm the exact toolchain from the PE Rich
header; decide which datatype archive best fits. (from [[01-fingerprint]])
- **Battle-load root cause** — inferred as single-threaded engine + core-count-sensitive code;
must be confirmed by a `ForceSingleCore=0` vs `=1` diff once the main loop is mapped.
(from [[00-strategy]])
- **Save-editor struct coverage** — community editors cover players/tech/systems; fleet/combat
state coverage may be partial. Treat as strong hints, verify each field against real saves.
- **Lockstep determinism** — `@SYNC ERROR DETECTED: Frame %d` indicates a deterministic lockstep sim. Big for reimplementation + old-vs-new differential (determinism makes equivalence checkable frame-by-frame). Confirm scope. (from [[strings-and-config]])
- **Mods override mechanism** — `.gob` = `gobio::ZipFileSystem` with a `NativeFileSystem` loose-file override; this is how `./Mods` wins over archived files. Verify load order. (from [[strings-and-config]])
- **Battle-load root cause** — the shipped fix is a blunt process-affinity pin (`FUN_0089ee70`) with NO CPU-topology detection, so there is no adaptive branch. The real cause is emergent multi-core contention: which thread(s)? Investigate the 3 `CreateThread` sites (`FUN_00902350`, `FUN_00736e30`, startup `FUN_008a0e50`), the streaming-sound thread, and lockstep sync waits. (from [[ghidra-recon]])
- **Save-struct contradictions (R1 vs R2)** — field widths (`Abdn`/`Dstyd`/`ltis` Int16 vs Int32; `Bats2`), R2's `OID = PID*16` owner-handle claim, species id 4 (`_NPC` vs 'AI Rebellion'). Resolve against the binary's Streamable read code. (from [[save-editor-structs]])
- **Unlabeled save blocks** — `CdPlayer` (unknown1..35), empty `SimSystemDetailSpy`, opaque ~2500 B RNG blob. Analyst targets once the Streamable readers are located. (from [[save-editor-structs]])
- **Missing HUD scripts** — exe references `GUI/Combat/CombatHUD.script`, `SensorHUD.script`, `NoHUD.script` but none ship in the gobs or loose; likely dev-only overrides via the gobio native-FS fallback. Confirm via `CombatScreen` load path. Also: `.script` files are display configs, not widget layouts (corrects round-one note). (from [[ui-screen-map]])
- **Tech `allows` default per-race %** — `tech_tree.json` edges only carry races written in the `allows` string; the default for an unlisted race (believed 100%) is engine code. Ghidra target in the tech loader. (from [[data-parsers]])
- **Engine parser leniency** — 12 shipped shipsections are syntactically broken (unclosed `{`, extra `}`) yet load; keys and identifiers are case-insensitive. Reimplementation must match this leniency. `.effect` is its own `TXT`/`BEGIN-END` format, not brace-block (corrects round one). (from [[data-parsers]])
- **Struct recovery leftovers** — `PlayerColorID` exact on-disk width (writer `FUN_008b9cb0` undecompiled); `ServerSystem+0x10` owner type; `TechTree` per-tech body; `CdPlayer` block. R2's `OID = PID*16` is an id-allocation pattern, not in this code. (from [[struct-recovery]])
- **Resolved (R1/R2 contradictions)** — `Bats2`/`rcex` are int64 (R2 wrong); `Abdn`/`Dstyd` bools, `ltis` int; `TRM`/`CstR/E/T`/`shrm`/`RefCap`/`RepCap`/PlayerView `Infra` are floats; `pswd` string; `TShn`/`ETS`/diplomacy counters int16 in memory, int32 on disk; `Nexp` carries `xid/xmin/xmax/xper`; `FtOrig` is Vector3. (from [[struct-recovery]])
- **Battle-load, narrowed** — sim/combat load run on the main thread; the only other threads are net watchdog, TIME_CRITICAL audio streaming (`g_musicCS`), and a star-map mesh builder. Hypothesis: audio-thread critical-section contention or D3D9 runtime/driver threads on many cores. Needs a dynamic profile (x32dbg / ETW) under the software-GPU stack. (from [[turn-spine]])
- **Spine leftovers** — `StrategyServer` struct partial (41 fields); static-initialiser region 0x009be000–0x009c1400 undisassembled; `Mars::Stream` vftable not located; several small ProcessTurn phase fns unnamed. (from [[turn-spine]])
- **Save framing ambiguities (settle on first real save)** — padding joint `[len][name][value][pad]` vs split; bool vs int for names with len%4==0 (no type byte); on-disk tags for Summary/CreateParameters and count/element tags inside framed arrays unknown (positional for now). A real 3-char bool tag (`NPC`,`Dep`,`hsp`) settles padding. (from [[SAVE_FORMAT]])
- **Strict-parse gaps vs real save (verifier output, round 3)** — (1) `ServerSystem`: 7/28 systems carry `VFlags` where `Name`/`vnh` were expected — a conditional layout (uncolonized/special systems?); (2) `halt[].haltv` is a 31/35-byte struct, not a bool; (3) optional `indi` (IndependenceInfo?) precedes `NVE`/`PID` in some systems; (4) `PrisonerHold.prisoners[]` entries lack `PrNSp`; (5) `/createParams/key` is int; (6) `turnstats.hist.stats.tch` is int; (7) optional trailing `zdsi`/`zdst`. Padding = **joint** (settled). 7 resyncs / 2728 raw bytes ≈ RNG blob. (from [[turn2-strict-issues]])
- **RESOLVED: strict-parse gaps** — 5/8 were reader bugs (ASCII plausibility test applied to string values; empty string == int 0), 3 real: `PrNSp` only when `PrMax>0`; `indi` unconditional in `NVO` nodes (system-level gated by `hindi`); `zdsi/zdst` pairs under `zdsc`. `Key` is an empty string; `tch` int. Summary/CreateParams tag lists confirmed. Reader patch in flight. (from [[schema-gaps-resolved]])
- **RESOLVED: save framing** — padding is joint; `"."` = NULL tag (VectorHelper count+elements, Vector3 bodies); empty strings are 4 zero bytes; `CDT` is a tagged frame + opaque `CD` frames. All three real saves parse `--strict` clean. Note: `SvSctOb` IS present in all saves (patch doc §7 was wrong). (from [[SAVE_FORMAT]])
- **(parked) Combat loader job API** — does tactical-battle loading go through the job helpers `0x8fc160`/`0x8fa5b0` with the `TryEnterCriticalSection→Sleep(1000)` completion poll (`0x0071ea60`)? If yes, that is a plausible many-core stall (lost try-lock = +1 s per poll). End Turn also has a deliberate `Sleep(computed)` ≈0.85 s at `0x00838da9`. (from [[battle-load-profile]])
- **Ship-design code rules (Ghidra, from SHIP_DESIGN_RULES.md §8)** — hidden default rider designs are built WITHOUT tech gating (where?); is section class-equality enforced or merely unoffered; confirm the turret class-accept table (`standard ← {standard,missile,grapple}`, `strafe ← {standard}`; grapple weakest); hull-class tech injection (`IND_CruisCon`/`IND_DreadCon`) + station exemption; option defaults/auto-upgrade and what `option_cost` multiplies; weapon cost per bank vs per mount; mass/speed formulas; `faiDes`/`dWep` meaning. (from [[SHIP_DESIGN_RULES]])
- **Corrections from turn internals** — `ServerPlayer+0xf9` is the AI flag (not bTurnDone); `FUN_007d7f70` is encounter detection; ProcessTurn phase 2 is trade, not diplomacy; the spine's `FUN_00840fe0` 'income' is special projects — income is `FUN_00863030` ComputeBudget. `TECHBEN_*` data blocks are inert (effects hard-coded via the 116-entry tech-name table @0x00a19718). Open: TRA/TRP producers, `FPsp2` derivation, `PERGATETRAFFIC_*` readers, exact BnkEl/BnkPr expression. (from [[strategic-turn-internals]])
- **`Mars::Application::Initialize` signature (P2-M0 finding)** — a C++ `__thiscall` detour that called the original crashed inside Initialize; the trace hook now uses a convention-agnostic asm stub. Verify the real signature (stack args? EDX use? return value?) before any `compare`/`replace` hook on it. Same caution for every `[unverified]` entry in `ghidra/addresses.json`. (from [[m0]])
- **Formula gaps surfaced by the game/sim port (feed back to Ghidra)** — which bankruptcy limit carries the 3.3 factor and when the bankruptcy start turn is stamped; the suitability→carrying-capacity hazard curve shape; the trade-points→money system-income tail; the `POPBONUS_INC` population increment; the expense-slider request term; which running total the tech-income bonus / savings aid read; node-line speed clamp at the influence radius; whether `DecayAllResearch` also hits the current target. (from [[game-sim]])
- **RESOLVED: Initialize signature** — `bool __thiscall Application::Initialize(this, AppStartup*)`, RET 4; Run = `void(this)`; OnTick = `bool(this)`. Plain thiscall wrappers are safe for Run/OnTick; Initialize needs the extra arg. (from [[loader-prototypes]])
- **PARITY BUG (fix in mars/text + Python flat_kv): duplicate config keys are FIRST-occurrence-wins in the engine** (entry erased on use; duplicates log 'multiply defined'); our readers implement last-wins. Also the brace parser DROPS a final key/value pair that lacks a trailing newline, and uses whitespace-only delimiting (braces not delimiters) with `" ' \`` quotes and no escapes — mars/parse must match these for compare mode; verify on the 12 broken sections + a no-trailing-newline fixture. (from [[loader-prototypes]])
- **Not traced end-to-end** — `Species/_NPC/weapons/*.weapon` loading and the `.effect` dictionary entry `EffectDictionary_Load` (0x008b42b0, unverified). (from [[loader-prototypes]])
- **RESOLVED: End-Turn oracle** — deterministic and cross-process: compare autosaves by sha256, no masking. Only when diffing a re-save of a *loaded post-turn* autosave: mask `Player.Status` (→0) and recompute/ignore `Summary.Checksum` (additive). (from [[determinism-oracle]])
- **SAVE_FORMAT tag corrections (fix Python reader + spec)** — real on-disk tags: `otnF` (not `ontF`) in Odes/Owep/Otch, `nextid` (not `nextId`) in NdGr2, Design = `FAIDes/DHide/DWep/DName`; `ords`/`wpts` are real tags. Python's positional R() matching hid these. RNG: float mapping `(float)(y*2^-32)`, `next_int` mask, and lazy-vs-eager twist at `left==0` still need binary confirmation. (from [[mars-stream]])
- **RESOLVED: tech `allows` default** — unlisted species = 1.0 (confirmed in `FUN_005822d0` tree-creation roll, strategic-turn-internals §2); `game/data` uses 100. Still open from game/data: what the engine's converter does with the 34 malformed tokens (`force_right o`, `crew false`, `1.0f`, `0-5`, ``90\``); repeated scalars in a block are last-wins per the sequential if/else consumers (loader-prototypes §M3) — confirm on a fixture in compare mode. (from [[game-data]])
- **RESOLVED: SAVE_FORMAT tag names** — all corrections confirmed by bytes and applied to the Python reader + spec (§10). Residual doc debt: `findings/objects/save-editor-structs.md` and `verify/design-rules/SHIP_DESIGN_RULES.md` still quote R1's `ontF/faiDes/nextId` spellings (R1-provenance; annotate rather than rewrite). (from [[SAVE_FORMAT]])
- **RESOLVED (2026-09-08, lane S): `std::string` layout and size, once and for all** — `_Bx@0, _Mysize@0x10, _Myres@0x14, _Alval@0x18`, **sizeof 0x1c**, and there is exactly **one** instantiation in this binary. `struct-recovery.md` §0 was right (its §0 prose had `size`/`res` transposed — fixed); `turn-spine.md` §1.1 was wrong (already annotated); `loader-prototypes.md` and one `addresses.json` prototype said 0x18 — fixed. Lane X's `ObservedTech` 0x18 reading was a mis-attribution: `+0x24` is the string's trailing `_Alval`, not a data field, proved by three complete enumerations of the element (`ObservedTech::Write` 0x00817cf0, ctor 0x008562a0, copy ctor 0x0079a184) and generalised over the whole exe by `tools/strfootprint.py` (65 string members, 0 collisions inside the 0x1c span, 51/52 gaps exactly 0x1c). **Zero recovered struct tables were wrong** — `pswd` included. Standing rule that follows: *never size a struct member from the offsets the code touches* — this build's STL puts the empty allocator **last** in both `string` (0x1c) and `vector` (0x10), and an empty allocator is never loaded or stored, so a touch-scan undercounts by 4 every time. See `observedtech-append.md` §9. (from [[re-windows-2000s-howto]], [[observedtech-append]])
- **RESOLVED: formula gaps (all 8)** — see [[formula-gaps]]; game/sim's low-confidence functions can now be pinned. **RESOLVED: std::string** = `_Bx@0,_Mysize@0x10,_Myres@0x14,_Alval@0x18`, sizeof 0x1c (struct-recovery §0 right; turn-spine §1.1 WRONG — annotated). **CORRECTION:** the 116-entry table @0x00a19718 is a name-membership list, not the effects table; use `g_TechIdNames` (196) + `OnTechResearched`. Open: values of the 6-entry AI-tech bonus table (0x00a17888); producer of ServerPlayer +0x224/+0x228/+0x22c beyond the setup-record copy (0x0077b620). (from [[tech-effects]])
- **RESOLVED: RNG semantics** — `Seed` is `thiscall(this, uint32)` RET 4 (MT19937 init + immediate twist); `Twist` takes `this` in ECX only; **twist is LAZY** (`if (left==0) Twist()` inside the draw), `left` lives at `+0x9c4`, confirming the save blob layout. **float mapping, needs a targeted check (not a red flag):** `NextFloat` decompiles as returning `float10`, but that is simply how x86 float returns look (value in `ST(0)`), so it is weak evidence of extended-precision *computation*; a single `y * 2^-32` multiply rounds once either way. B3 should still compare the mapping explicitly (exact constant and whether the draw is `y*2^-32`, `(y>>8)*2^-24`, or divided by 2^32-1), and the x87-vs-SSE float-parity policy from the RE how-to is still needed before the x64 standalone. `RNG_NextInt` signature still unverified. (own Ghidra pass)
- **Struct-modelling hazard (found by M2)** — an MSVC-2010 `std::vector` member is **three words**, so a naive C translation put the next pointer at `+0x18` when it is really at `+0x14`; the hook silently reported the unmodelled word (string bytes `"TION"`) as a real field. Any hand-modelled game struct must pin its size with `static_assert` and account for 3-word vectors. (from [[M2]])
- **x87 precision-control mode at runtime** — 53-bit MSVC default vs 24-bit if D3D9 grabbed the FPU; moves only the last bit (~0.094% of words). `float_from_pc24()` models it and the B3 hook logs `fpu_cw` per call, so the first B3 trace settles it. (from [[B3]])
- **Some truths are unreachable by compare** — B3's draw-divisor bug differed on 0.78% of draws yet flipped 0 decisions in 1e6, so a behavioural compare would have passed while the code was wrong. Static reading of the instruction stream remains necessary; compare validates, it does not discover. (from [[B3]])
Use [campaign controls](README.md) to record and resolve them. The generated [board](board.md)
shows open surprise records, dependencies and stop conditions. [The plan](backlog.md) defines
priority; domain uncertainties and their historical resolutions remain alongside their scientific
evidence in `../findings/`. This page is an entry point, not a second question ledger.

View file

@ -0,0 +1,280 @@
# Proposed pilot: completion-bearing research replacement
Status: **proposed**. This is a contract design, not replacement acceptance. Current architecture
owner is `Astra pilot architect` in the `architecture-review` role on `openai/gpt-5.6-sol`;
subsequent implementation and independent verification use distinct campaign executions.
The target is a bounded replacement of `Game::TechTree::ProcessResearch`, its `SetResearched`
cascade and required completion callback writes on explicitly certified workloads. Broad research
displacement remains unproved. No new live address, remote deployment or dependency policy is
authorized by this document.
## 1. Evidence inspected independently (2026-09-09)
Sources: `findings/subsystems/research-replace.md`; archived CR compare JSON, raw compressed
traces, shim logs and saves; current engine research, tech-effect and event interfaces. Archived
engine build is `cr-618ccb1-20260909T131556Z`, not the rollout's current source snapshot.
Recomputed SHA-256:
| RE-relative file | bytes | SHA-256 |
|---|---:|---|
| `verify/results/saves/turn3-state.sav` | 67219 | `978041acd168b56ed8eb3f5e42e78d5e70eae6e6517d75e659a5eb7ca3d60921` |
| `verify/results/saves/cr/cr-oracle-endturn.sav` | 67212 | `e00eed0c03a31d27a81b7470a9dcc9ba08a2ac48c20baeee4f34749164743e3f` |
| `verify/results/saves/cr/cr-oracle-autosave.sav` | 67811 | `79df50475a7b83afa927d992b9f030dcf45710f4bda0133b8b1fa4800a72e420` |
| `verify/results/saves/cr/cr-replace0-autosave.sav` | 67511 | `6b51db992b158caa5424d71b2dccf72924af7198b4165bfcfc870e0d438fb6d5` |
| `verify/results/saves/cr/cr-replace1-autosave.sav` | 67537 | `8a4309ee4fe0b3177a2820600b5016c7c256d0f51b065df469ecd0b4f2342235` |
Local reproduction (diagnostic tool exit alone is not an equality verdict):
```sh
python3 verify/state-checksum/state_checksum.py verify/results/saves/cr/cr-oracle-autosave.sav verify/results/saves/cr/cr-replace1-autosave.sav --limit 40
```
This reports **16** exact-bit, unmasked leaf differences. Oracle -> R1: OutMod 1.25 -> 1.1;
ConMod[0..2] 0.9 -> 1; ResTNm empty -> IND_Waldo; EvNxID 7 -> 5; events 5/6 absent and
turn-bucket count 3 -> 1; observed-tech element 11 absent and count 11 -> 10; BnkPr/BnkEl,
RepCur/RepMax and Summary.Checksum differ. These are five primary scalar fields, collection
writes/counts and five derived leaves. They are not permission to patch five downstream values.
`verify/results/compare/cr-compare.json:289-357` reports partial coverage: three comparisons,
six undeclared spans in one call and eight unmodelled notes. In
`verify/traces/cr-R1.jsonl.gz`, call 1 is replace, allocation tech 144 / 2898, input turn 4,
order counter 22, observed count 10, roll_pending false, RNG left 413 and CW 4735 (`0x127f`).
Its RNG digest/index/left are unchanged. Logs `verify/results/shim/cr/cr-R1.log:116-118`
count one completion and three unlocks, then two zero-point calls. `otch_appends=1` counts a
decision; it does **not** mean an element was constructed live.
### Corrections to inherited narrative
1. R1 log lines 75-94 show seven drawsite detours and twelve probes in addition to the six
sites enumerated in CR findings. Instrumentation is broader than the template-hook config.
Every fresh run needs a complete installed-site manifest, not an “exhaustive config” assertion.
2. R1 runtime CW is `0x127f`, including the research trace argument; initialization prints
`0x027f`. Preserve the full measured word and precision/rounding separately.
3. Runtime string lookup is already an engine interface (`research_events.h:95-105`,
`app/event_phase.cpp:10-14`). The absence of bundled game prose does not establish that
original `PostEvent` is mandatory. Runtime asset loading is a concrete route to investigate.
4. `shim/hooks/tech_effects.cpp:354-365` already writes player state/design masks and delegates
node-bore updates in replace mode. The research hook does not integrate that complete callback;
calling the helper “host-tested” is not evidence its full live boundary is implemented.
## 2. Workloads and access paths
### W1 — primary positive workload, exact LOAD route
On a future explicitly leased lab with operator-supplied executable/data paths: restore the
hashed turn3 input as the only selected input save; start a fresh process; use Load Game, select
the input, enter its lobby/map at Turn 3, then one End Turn to Turn 4. Verify UI/state transitions
rather than sleep-and-assume. Preserve both output saves before any reset. Bind save selection,
route, process identity, executable hash, assets, shim hash, config and instrumentation to evidence.
Historical predictions to re-certify before measuring candidate results:
- Exactly three research calls, owners 32/496/512 in order, allocations 144:2898, 90:0, 9:0.
- One IND_Waldo completion: progress 5768 -> 7500, state 3 -> 4, turn_researched -1 -> 4,
order -1 -> 22, counter 22 -> 23, refund 1166. Flag unchanged.
- Nodes 132/136/142 unlock, costs 10000/16000/8000, available turn 4. Save tree slots are
94/98/104; tech 144 is slot 106. Never equate tech id with serialized slot.
- One full ObservedTech record, two full events (completion followed by unlocked-techs),
event next id 5 -> 7; primary effect fields reach oracle values; target clears.
- Zero RNG words in this workload. This is a negative RNG control, not evidence for draws.
### W0 — regression control, insufficient for completion acceptance
`verify/results/saves/turn2-state.sav`, one End Turn via LOAD, reaches the turn3 input above.
This exercises the research pass/overbudget event and a RNG word, but zero completions. Re-certify
its two-process oracle independently and pin its input hash before use. Do not substitute W0
for W1, or use zero-allocation calls as the positive execution threshold.
### W2 — path to broader completion evidence (not yet certified)
Select a different, archived completion-bearing input from the unlock continuations, or generate
one under an approved lab contract; record the input hash and exact LOAD/continuation route before
prediction. Require a different tech/effect family, a positive RNG draw and a second completion
that observes the advanced order counter. The existing U/V evidence motivates selection but is
not a ready executable workload contract. Separate controls are required for that exact route.
Until W2 exists, any accepted pilot claim is restricted to W1 plus its declared regression checks.
## 3. Full write boundary and responsibilities
| Boundary | Required state / behavior | Existing interface and current gap |
|---|---|---|
| Research pass | all node progress/state/flag writes; signed capped spend and refund accumulator; decay of other Available nodes; RNG state, left and next index | `sim::ProcessResearchTurn`, `ResearchCompletionHook`; current CR pass writes live |
| Unlock cascade | node costRP, availability/researched turn, order; tree order counter; child/prerequisite availability; recursive zero-cost completions and ordering | `sim::TechGraph` / `SetResearched`; replace cascade opt-in exists, transcription failures can currently skip it |
| Completion callback | target pointer/ResTNm; pending-roll flags; every applicable player economy float, masks, boolean/species flags, design-option masks; node-bore storage/lifetime | `ApplyTechCompletion`, `RunCompletionTail`, `tfx::ReadPlayerState`/`WritePlayerState`; integrate with research on pre-call inputs, avoid already-researched guard |
| Observed technology | dedup/update semantics, entire 0x2c record (name, first/last turns, detected, with), vector content/count/capacity and allocator ownership | research hook currently alters scratch span only; full live construction and update semantics need evidence |
| Events | complete turn buckets and ordered records: id, summary, message, location, position, image, action, chainId; next id; dedup and pruning; all owned allocations | `events::EventStorage`, `PostResearchPassEvents`; research hook is count-only/compare-only; runtime text and live ABI adapter missing |
| Callback outcomes beyond player | owned-system AI flags/caps/addiction/plague; ships' plague state; recursive Zuul tech grants; pending research-event RNG and plague/rebellion consequences including allocations/cancel research | `TechApplyOutcome` reports work, does not execute it; broader closure remains incomplete |
| Downstream observation | budget/bankruptcy/repair/checksum consequences of primary effects | let ordinary turn processing derive them; full oracle must expose them, never harvest original post-state or hardcode expected leaves |
The W1 observed write set is a subset of this boundary. The complete callback has conditional
system/ship/object writes absent on W1. A narrow pilot must preflight its supported class and
fail closed before mutating on unsupported branches. Suppressed writes, unavailable graph/text,
unknown pointers, unreadable names, failed allocation, or unmodelled fired rolls are blockers,
not successful no-ops. General displacement requires separate evidence for all reachable effects.
Events require exact formatting/dedup order, `FLT_MAX` no-position values, action conversion,
the original prune-window behavior and preexisting event contents. `KeylessEventText` substitutes
tokens for prose and must never be serialized as a passing oracle. Completion message length
above 255 has an explicitly documented divergence/undefined-original boundary; exclude or resolve
it explicitly. Seed comparisons from pre-call state, not the original callback's output.
## 4. Inputs and original dependencies
Required immutable input manifest before ready:
- Exact engine and RE baseline commits plus actual source-content hashes; paired worktrees;
compiler/toolchain/build flags, host and shim binaries, generated-address provenance.
- The hashed W1 input and oracle archive above, plus selected W0/W2 inputs as applicable.
- Operator-owned game executable and proxy originals with hashes. The archived trace reports exe
SHA-256 `970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841`; remeasure it.
- Explicit runtime data root, manifest of tech definitions/graph, tuning/constants/species inputs,
localized string-table files and locale/encoding/load order. Existing parser data must come
from user assets, not copies of game prose embedded in source. Missing table/key is not empty text
for acceptance. Asset paths and hashes are not yet supplied for this pilot.
- Full configs and actually installed interceptors (template hooks, init, FPU sampling, probes,
drawsites), FPU CW per call, input route/process-reset record, output/log/trace file hashes.
Original dependency ledger (each needs a lead decision and explicit qualification):
1. **Existing:** research calls original `TechTree::Cost` for effective cost and cascade cost
lookup (`shim/hooks/research.cpp:568-573,916-919`). Formula and applicable bonus-tech discovery
are not displaced by this pilot merely because a host formula exists.
2. **Existing separate B2 hook:** original has-researched lookup and node-bore updater
(`tech_effects.cpp:325-328,358-365`). Node-bore updater allocates/frees state; it is not
read-only despite the source comment's analogy. Reuse requires disclosure and effect accounting.
3. **Proposed, undecided:** original string lookup / allocator / event posting helpers versus a
runtime-asset text adapter and compatible live allocation. No selected policy or guessed address.
4. **Outside replaced root:** original turn driver, budget allocator and remaining simulation,
asset loading and save serializer still run in the shim experiment. Whole standalone turn
equality is a different acceptance axis and cannot be inferred from this partial replacement.
## 5. Executable acceptance to provide before ready
The contract must eventually name real, versioned commands and dependencies for this sequence;
the following are precise requirements, not a presently implemented runner:
1. Fresh full gate on hashed source/inputs, expected test identities, positive corpus execution,
asset-dependent tests and shim build. A host-only pass is insufficient. Bind full gate manifest
and resulting binary to every experiment and reject source/input changes.
2. Two fresh-process C1/C2 controls with hooks off, same proxy, input, assets and exact W1 route;
both output pairs equal byte-for-byte. Archive independent process logs; one saved oracle
copy is not independent proof that two processes agreed.
3. Compare-neutral N with the candidate binary and complete instrumentation manifest; both
output saves byte-equal controls; positive W1 counters and decoded state. Zero compared calls,
partial required-region coverage or undeclared required writes cannot pass.
4. Replace R, same baseline and binary, bypass original ProcessResearch and required displaced
callback implementation (count explicit original helper calls separately). Require exactly
one W1 completion/three unlocks, real element/event writes, zero failures/unreadable inputs,
and full declared state validation including nonserialized order counter and RNG state.
5. Require **post-turn** autosave byte equality, inflated equality and exact-bit unmasked state
equality independently, with reader reconstruction coverage. Pre-turn EndTurn equality alone
cannot satisfy acceptance. No masks for event text, callback fields or derived discrepancies.
6. Negative controls must fail: archived R0 (27 differences) and R1 (16); zero-completion W0
cannot satisfy W1 threshold; omit callback/event/ObservedTech write or use wrong input hash;
remove a trace/log/output; mark unknown RNG as zero. Checker rejects all.
7. Independently assigned verifier re-runs the checks and ties verdict to contract, source,
binary, asset and evidence digests. Implementation worker cannot self-certify acceptance.
Integration requires revalidation of integrated source; changed inputs invalidate evidence.
W2 and branch-specific tests must be added before expanding the claim to RNG-consuming,
Zuul/early-completion, nonzero-decay, zero-cost recursion, prerequisite/no-auto-available,
re-observed/deduplicated, temperance, plague or rebellion cases. Their absence is visible coverage
debt, not satisfied execution. Local simulation tests alone do not establish live allocator safety.
### 5.1 Acceptance interface fixed before implementation (2026-09-10)
The accepted `research-completion-abi` contract closes the static record/container dependency only.
It does not close live allocation safety or any replacement criterion. The pilot checker and run
driver do not yet exist, so the commands below are required interfaces and remain blockers, not
executable claims:
```sh
python3 tools/research_replacement.py preflight --package MANIFEST.json --workload W1
python3 tools/gate.py --engine ENGINE --corpus CORPUS --out NEW_GATE_DIR \
--profile full --data DATA --shim --sots-input SOTS_EXE=EXE --sots-input SOTS_PROXY=PROXY
python3 tools/research_replacement.py certify-controls --package MANIFEST.json --workload W1 \
--c1 C1_DIR --c2 C2_DIR --compare N_DIR
python3 tools/research_replacement.py check-replace --package MANIFEST.json --workload W1 \
--replace R_DIR --oracle C1_DIR
python3 tools/research_replacement.py negative-controls --package MANIFEST.json \
--replace0 verify/results/saves/cr/cr-replace0-autosave.sav \
--replace1 verify/results/saves/cr/cr-replace1-autosave.sav --w0 W0_DIR
```
`MANIFEST.json` must bind paired source manifests, the full-gate manifest and shim binary, owner
executable/proxy, generated addresses, data root and every consumed tech/tuning/species/string file,
locale/encoding/load order, exact configs and installed-site manifest, W1/W0 saves, process route,
and output/log/trace hashes. Each command must fail on an absent or extra required artifact, hash or
source drift, stale output directory, zero required execution, unexpected skip, unreadable input,
unsupported branch, or unknown RNG. `check-replace` must separately report file bytes, inflated
bytes, exact-bit typed state, reader coverage, nonserialized order counter, complete RNG state and
actual words, callback/helper counters, allocations and complete event/ObservedTech elements.
Before any implementation contract can become ready, an independent verifier must turn these
interfaces into an executable falsifier plan covering archived R0 and R1, a wrong W1 hash, each
missing callback/event/ObservedTech write, an omitted output/log/trace/site manifest, W0 presented
as the positive, unknown RNG presented as zero, original displaced-root fallback, and same-HEAD
source-byte drift. Verifier and implementer executions must be different sessions.
### 5.2 Bounded W1 architecture and dependency decisions
The replacement is one ordered coordinator with a dry-run preflight, not three independently
acceptable leaf patches. Preflight reads all three owner calls and computes the complete W1 plan on
scratch state before the first live write. It must positively identify the exact owner/allocation
sequence, one tech-144 `IND_Waldo` completion, the three unlocks, no pending research roll, no
unmodelled conditional system/ship/Zuul/plague/temperance/rebellion effect, and an explicit outcome
for every recursive-completion and decay branch. The eventual immutable W1 manifest must state the
certified expected outcomes; any mismatch is unsupported and blocks before mutation. This is a W1
classifier, not a general research implementation.
The coordinator then preserves original order: research arithmetic; `SetResearched` node/order
writes; full ObservedTech record operation; matched-target handling; full completion event; W1 player
effects and common tail; unlocked-tech event; remaining pass writes. It must use pre-call state for
all decisions. Allocation failure after mutation is an observed failed run and cannot pass; this
plan does not claim transactional rollback that the original does not provide.
Original-helper policy for this bounded pilot is explicit:
1. **Retain and count `TechTree::Cost`** for effective and cascade costs. Independent cost
replacement is excluded from the claim.
2. **Retain and count `TechTree::HasResearched`** for the common callback tail and design masks.
The replacement owns the resulting mask and field writes; the helper is lookup only.
3. **Retain and count `ServerPlayer::UpdateNodeBoreParams`** at its original common-tail position.
It may allocate/free through the game's CRT even when W1 does not select a bore tech.
Independent node-bore maintenance is excluded.
4. **Use the original MSVCR100 scalar new/delete family and accepted record/container ABI as a
live memory bridge**, with every allocation/copy/destruction operation counted. This is
original-runtime allocation assistance, not standalone allocator replacement.
5. **Do not call original `ProcessResearch`, `SetResearched`, `OnTechResearched`,
`RecordObservedTech`, `EventStorage::PostEvent`, or original string lookup** in replace mode.
Runtime owner assets must supply localized text to an engine-side lookup; replacement code owns
record contents, event IDs/order/dedup/pruning and callback effects. Keyless text is forbidden.
6. The original turn driver, budget allocation, asset loading and save serializer remain outside
the replaced root and must be disclosed separately from retained helpers.
Static ABI acceptance unlocks exactly one preparatory dependency: a live record-bridge contract
must exercise ObservedTech, TurnEvents and PlayerEvent operations with empty/spare/full capacity,
short/long strings, repeated observed names, exact duplicate and description-only-different events,
normal destruction and a recorded failure path, under a lease. It owns only the bridge and fixtures
and may not wire research replacement. Only after independent acceptance of that bridge may one
complete W1 coordinator implementation own `src/shim/hooks/research.{cpp,h}` plus narrowly named
bridge/effect/event files and tests. No two workers may concurrently own those files or the same
VM/build directory.
## 6. Current blockers / stop conditions
- No executable pilot-specific acceptance runner or full input/asset manifest. W2 is not required
for the W1-only pilot but remains required before any broader claim.
- Live research callback integration, complete ObservedTech/event construction, broader callback
outcomes and unsupported-path preflight remain unimplemented/unverified.
- Static record/container ABI is accepted, but the live record bridge and its independent runtime
safety evidence are missing. Retained Cost/HasResearched/node-bore/CRT helpers and forbidden
displaced roots are fixed above; runtime asset paths and adapter execution remain unresolved.
- Archived C1/C2 equality is documented but independent raw control-run bundles are not established
by the single oracle pair inspected here. Fresh controls are mandatory.
- Instrumentation and runtime FPU narrative need correction in acceptance inputs; archives are
historical observations, not the current candidate's attestation.
- Stop on control disagreement, silent fallback, missing data, branch outside approved class,
unexpected writes/draws, stale evidence, source drift, or scope/architecture surprises; persist
checkpoint and escalate to Astra before changing the contract.
This proposal authorizes planning only. Keep lifecycle **proposed** until required dependencies,
input manifests, bounded implementation scope and executable acceptance exist.

36
campaign/research/NEXT.md Normal file
View file

@ -0,0 +1,36 @@
# Next RE / implementation boundary
Framework is complete. First research-completion static pass is now captured and cross-checked.
Do not reopen general workflow development as a prerequisite for this slice.
## Recovered
- Original MSVCR100 scalar new/delete allocation family and import thunks.
- ObservedTech 0x2c record constructor, copy construction, vector append/growth and old-element
destruction path. Its copy helper has three cdecl-style stack arguments.
- PlayerEvent 0x74 copy/append/destruction, with three independently owned strings. Its copy
constructor uses ECX destination and one stack source argument instead.
- Callback order: observation -> matched-target roll/clear -> completion event -> tech effects/tail.
- Observed record uses internal tech key; completion event uses the display-name member.
- Name-not-found versus capacity-full are distinct branches. NPC/non-rebellion and `_Root` tech
predicates are part of observation eligibility. `_Root` comparison is case-insensitive.
- Ghidra's non-returning-delete annotation omits real cleanup. Raw instruction captures recover
the post-free pointer clear and return; no shared database mutation was needed.
## Smallest next work
Recover/cross-check the nested TurnEvents bucket constructor/growth and event duplicate/prune
helpers (0x00885380, 0x00825d40, 0x00879eb0), including exceptional cleanup/ownership. Then build
a narrowly scoped live-record adapter using the verified ABI contracts. First exercise short/long
strings, spare/full capacity, and repeated-name/duplicate-event cases under a leased controlled
workload before wiring it into complete research replacement.
An ABI bridge may use original-runtime allocation services as an explicitly declared dependency;
that does not mean the original's RecordObservedTech or PostEvent game decisions may be counted
as our replacement. Our code must own record contents, event IDs/order/dedup and callback effects.
The original remaining turn driver is outside this scoped replacement. Full W1 original-vs-new
acceptance still requires fresh controls and complete state comparison.
Evidence entry points: research-completion-abi.md, record-observation-crosscheck.md,
research-callback-order.md and verify/results/{research-completion-abi,research-callback}/.
Static recovery is not a claim of live allocator safety or a successful replacement.

View file

@ -0,0 +1,21 @@
# Active phase: reverse engineering
User confirmed restart and asked for an explicit framework-to-RE transition. Framework is done;
active work is `research-completion-abi`, recovering actual original record construction and
ownership required by the research write-back pilot. No general orchestration expansion.
Normal loop lead and analyst: GPT-5.6 Sol through the existing bounded launcher. GPT-6 Astra is
reserved for problem/surprise resolution. Canonical
repositories remain at RE 3bfde5a / engine 7741d42 plus reviewed uncommitted rollout source.
Config loader/model check and campaign validation passed after restart. No open surprises.
Scope split: analyst recovers ObservedTech/event allocation/string/container ABI from fresh
read-only original-binary evidence. Lead checks completion effects and helper boundaries.
Raw captures go to verify/results/research-completion-abi; decisions/handoff to campaign/research.
No Windows/Ghidra mutation or replacement deployment under this analysis contract.
Lead checkpoint: fresh OnTechResearched and UpdateNodeBoreParams decompilations/disassembly
captured under verify/results/research-callback. Original executable SHA matches fingerprint.
Callback order and W1 numeric path confirmed from instructions. Ghidra's non-returning delete
annotation demonstrably truncates pointer clearing/returns; affected lifetime claims require
instruction-stream evidence. Details: research-callback-order.md. Analyst owns separate record ABI.

View file

@ -0,0 +1,53 @@
# Independent cross-check: RecordObservedTech
GPT-6 Astra, local instruction stream from fingerprinted `dumps/sots.exe`, 2026-09-09.
MD5 `9969481c39f4b33a8a21c48b62abee4c` exactly matches the analyst's ReVa program metadata;
the same local file's SHA-256 is `970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841`.
This closes the previously reported missing ReVa/local fingerprint linkage.
Fresh disassembly: `verify/results/research-callback/record-observed-tech-objdump.txt`.
## Corrections to the first analyst pass
- The constructor/push path is **name not found**, NOT vector full capacity. The function scans
first at observer+0x274 through last at +0x278; +0x27c capacity is not read in this wrapper.
Empty list or exhausted search reaches 0x007ba274. Capacity handling belongs to 0x007b7320.
- The observer is stack argument 1 (`[ebp+8]`), not argument 2. Stack argument 2 (`[ebp+0xc]`)
supplies observation eligibility bytes and the field used to select the with-mask bit.
- Stack argument 3 is a TechDef-like object whose string starts at **object+4**. It is not a
bare string pointer: source length is object+0x14 and capacity object+0x18. The comparison uses
destination string at record+0x0c. Confirm semantic TechDef identity using the caller/schema.
## Pinned instructions / static callable boundary
Wrapper 0x007ba1a0 uses this in ECX, three stack arguments, returns with **ret 0x0c** at 0x007ba32b.
Its ECX-derived object supplies the 16-bit turn at +0x0c. The owner callback caller prepares ECX
from player+8 minus four and pushes (technology, player, player) in reverse argument order.
Before searching it requires three non-null arguments and rejects a subject with
`NPC && !RebAI` (offsets +0xfb/+0xfc, names cross-checked with the existing serializer/address
contract). It then calls 0x0057e6d0 on argument 3; a nonzero result suppresses recording.
Fresh disassembly now resolves that helper: read the technology's name string at def+4,
find its **first underscore**, and compare the suffix with **`_Root` using `_stricmp`**.
The literal is at 0x00a00040; imported comparator IAT is 0x009dd328 (MSVCR100.dll entry 115).
Thus root technologies are excluded, case-insensitively. It is not a costly master-tree query;
ECX is unused in this helper. Capture: observed-tech-exclusion-objdump.txt and
observed-tech-exclusion-literal.txt. The underscore scan has no terminator check in the binary;
valid tech-name syntax is a precondition, not evidence of safe arbitrary-string handling.
Search increments by **0x2c**, compares full names via 0x004236a0, and preserves an existing
element if found. On absence it constructs a stack temporary (0x008562a0), appends via 0x007b7320,
then operates on the newly appended element at last-0x2c:
- first/last turns are 16-bit offsets **+4/+6**;
- name assignment targets the string at **+0x0c** via 0x00425430;
- both new and existing paths update last turn **+6** and OR a bit into **+0x28**, using
subject+0x28 as the x86 shift count;
- existing-path first-turn/name stay unchanged in this wrapper.
Append is followed by conditional destruction of the TEMPORARY string when capacity >=16.
The temporary lifetime does not permit stealing its buffer into the appended element. Copy/
reallocation/destruction inside 0x007b7320 must be recovered before implementation.
These facts are static ABI/ordering evidence. They do not prove live allocation safety.

View file

@ -0,0 +1,76 @@
# Research callback: fresh instruction-stream findings
Lead: openai/gpt-6-astra, 2026-09-09. Static RE, not live replacement verification.
Original binary: dumps/sots.exe, SHA-256
`970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841` (matches recorded fingerprint).
Fresh ReVa reads were cross-checked against local GNU objdump on that executable. No Ghidra edits.
Raw/materialized captures: verify/results/research-callback/.
## Callback order is observable, not interchangeable
OnTechResearched starts at 0x00891790. The binary establishes this order:
1. Call RecordObservedTech at **0x008917dc**, passing the technology and the player twice;
`ecx` is formed from the server reference at player+8 minus four (when non-null).
2. Compare completing technology to player+0x294. If matched, optionally call the pending-roll
handler at 0x0088df20, then clear player+0x3b4 and player+0x294.
3. Unless silent, format and post the completion event at **0x008919b5**. Its text branches
use the research progress-ratio result before applying economic effects.
4. Execute the technology-specific scalar effects and common completion tail.
Thus the observed-record operation precedes target clearing, and the completion event precedes
economic effect writes. A replacement should preserve this order; the earlier conceptual pipeline
diagram was not an instruction-order specification.
The two records also use DIFFERENT strings. RecordObservedTech compares/copies the internal
technology key from **TechDef+4**. The completion message fetches **TechDef+0x40**, with its
capacity checked at +0x54 (0x0089180d..0x00891832), before formatting. This is the display-name
surface seen in original event prose, not the internal key. Reusing `IND_Waldo` as event text
would be wrong even if the observed-tech name were correct.
## W1 IND_Waldo scalar path
`MasterTechTree::IsTech` is tested with immediate **10001 / 0x2711** at 0x00891a05.
The true branch reaches 0x00891a7f: subtract the qword constant at 0x009e2318 from construction
modifiers +0x10c/+0x110/+0x114, store each as float32; add the qword constant at 0x009ed188 to
output modifier +0x124 and store float32. Raw literals:
- 0x009e2318: `00 00 00 a0 99 99 b9 3f` = double-widened float32 0.1.
- 0x009ed188: `00 00 00 40 33 33 c3 3f` = double-widened float32 0.15.
The common tail invokes bitmask rebuilding, the node-bore updater and species flags. W1's four
numeric writes do not justify skipping the common tail or patching later bankruptcy/repair values.
## Decompiler hazard: missing post-delete control flow
Fresh ReVa decompilation marks operator_delete at 0x00924faa as non-returning. This truncates
real logic: UpdateNodeBoreParams is reported as ending at 0x00818365, immediately after its delete
call. Local executable disassembly shows:
- 0x00818361: call 0x00924faa;
- 0x00818366: caller stack cleanup;
- **0x00818369: write zero to player+0x308**;
- **0x00818382: return**.
Its positive branch allocates **12 bytes** through 0x00924fb6 if the pointer is absent, constructs
the object through 0x006e18c0, stores the pointer, and copies three words from selected parameters.
It is not a read-only helper. Both allocation/free helpers are import thunks. Fresh PE import
inspection pins them to **MSVCR100.dll**: 0x00924faa jumps through IAT 0x009dd1c8 to
`??3@YAXPAX@Z` (scalar operator delete); 0x00924fb6 jumps through IAT 0x009dd1d0 to
`??2@YAPAXI@Z` (scalar operator new). The import descriptor's first thunk is RVA 0x005dd15c;
entries 27 and 29 resolve those slots. See pe-headers-and-imports.txt and allocation-import-thunks.txt.
This provides a concrete original-runtime allocation boundary; it does not justify substituting
the MinGW runtime allocator for memory the original's destructors will free.
The same false non-return annotation appears after long-string temporary cleanup in the main
callback. At 0x008919d1 the binary calls delete, then falls through to effect processing at
0x008919d9; the decompiler labels that branch non-returning. Therefore decompiled absence of a
write/return after deletion cannot be evidence that the original lacks it.
## Astra decision / next RE action
Continue this read-only RE slice with raw instructions as authority on affected lifetime paths.
Do not change the shared database during concurrent analysis. Retain the flawed decompilation
as evidence of the limitation. No replacement or allocator-safety claim follows from these facts.
Next: verify the analyst's ObservedTech/event ownership recovery against the binary, then issue
the smallest concrete implementation handoff. The allocator import family is now pinned statically.

View file

@ -0,0 +1,87 @@
# Completion record ABI recovery
Static handoff only. The provenance index is
`verify/results/research-completion-abi/reva-2026-09-09-index.md`; the regenerated instruction
capture and interpretation are respectively
`verify/results/research-completion-abi/objdump-2026-09-09-ownership.txt` and
`verify/results/research-completion-abi/recovered-static.md`. The complete dedup/helper repair is
`verify/results/research-completion-abi/objdump-2026-09-09-dedup-helper.txt`; its first-window raw
provenance is superseded by the paired captures and identity record in
`verify/results/research-completion-abi/objdump-2026-09-10-boundary-repair.md` under Astra decision
`d-d2a9b8be6399a6abaa0e05a5`. Input identity is `dumps/sots.exe`,
SHA-256 `970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841` / MD5
`9969481c39f4b33a8a21c48b62abee4c`.
The ownership archive's terminal-byte provenance is likewise superseded by the complete package
`verify/results/research-completion-abi/run-79357a65226f61d6a86c042d/` under Astra decision
`d-d4c494ba02ada278030ef473`. Its six narrow/wide pairs, raw section-byte checks and full ten-window
audit establish the encoded return immediates while preserving the static-only limitation. The
package found three additional truncated historical stops (ObservedTech append/reallocator and
string allocation/replacement); their widened streams are now the byte authority. No archive
production-history inference or live-safety claim is made.
## Implementable machine boundaries recovered
* `0x008562a0`: ObservedTech default constructor, ECX receiver, EAX return, plain `ret`.
* `0x007b7320`: ObservedTech vector append, ECX receiver plus one stack word, `ret 4`; stride `0x2c`.
Its copy helper is `0x0079a150` (cdecl-style allocator/destination/source stack arguments), which copy-constructs the embedded string rather than copying a
vector element header. Capacity growth is `0x007b5820` -> `0x007b34e0` -> `0x0057e590`.
* `0x0057e590` calls `0x00924fb6` with `count * 0x2c`; reallocation destroys every old element via
virtual slot 0 with zero and frees the array through `0x00924faa`. These are MSVCR100 scalar-new
and scalar-delete import thunks, not clean-room allocator operations.
* `0x0086c580`: PlayerEvent vector append, ECX receiver plus one stack word, `ret 4`; stride `0x74`.
It grows via `0x00869500` and copy-constructs through `0x007693f0` (ECX destination, stack source,
EAX destination return, ret 4), independently assigning all
three strings. `0x0061ae90` releases each long string via `0x00924faa` when capacity is `>= 0x10`.
* `0x004249a0` (reached by `0x00425430` assignment) allocates through `0x00924fb6` and releases a
prior long destination buffer through `0x00924faa`. A temporary long string is therefore not
transferable by raw header copy.
* `0x00885380`: get-or-create TurnEvents bucket, ECX EventStorage receiver plus stack turn, EAX
bucket return, `ret 4`. It returns the last existing matching turn. On absence it appends a deep
copy of a zero/empty stack bucket through `0x00884cb0`, then writes the stored turn.
* `0x00884cb0`: outer TurnEvents vector append, ECX vector receiver plus stack source, `ret 4`,
stride `0x18`. Full-capacity growth is `0x008841a0` -> `0x00883a60`; allocation is
`0x006e8f50` -> `0x00924fb6` with `count * 0x18`. Existing buckets are copy-constructed by
`0x0077fed0`, including an independently allocated/copied nested PlayerEvent vector via
`0x00779850` -> `0x0078af40` (`count * 0x74`) -> `0x007725a0` -> `0x007693f0`.
* TurnEvents virtual slot zero resolves from vtable `0x00a0f07c` to `0x0062e120`. It destroys the
nested vector through `0x00629580`; that destroys every `0x74` PlayerEvent, frees the nested block,
and zeros its three pointers. Static unwind edges clean partial PlayerEvent and TurnEvents ranges
and free the new outer block, but no allocation failure was executed live.
## Ordering / visible effects
RecordObservedTech's append predicate is name absence, not capacity. A matching existing record
keeps first-turn/name and updates last-turn/with mask. `0x00825d40` scans a bucket's events in
`0x74` steps, checking action, location, three floats, message and image before passing both
description strings to `0x0046f8c0`. Fresh paired-boundary instructions establish that helper as
caller-cleaned `bool string_not_equal(stored, candidate)`: it returns one for any byte/length
difference and zero for equality, handling each operand's inline/heap representation at capacity
`0x10`. FindDuplicate reaches the match return only on zero, so `EvDsc` equality is required and a
description-only difference does not deduplicate. This statically contradicts the inherited
description-omission claim; decision `d-2ff30c9f5355116bea822924` required the now-archived complete
branch/helper repair. The later provenance correction does not itself prove these semantics: an
independent verifier must reproduce the repaired package and predeclared falsifiers. The wrapper
returns the first element equal in all fields and writes nothing.
`0x00879eb0` prunes only a leading
stale run (`EvTurn < turn-50`), deep-shifts from the run's last stale element, and therefore removes
`n-1`: one stale bucket survives, a single stale bucket causes no write, and stale buckets after a
fresh bucket are not inspected. The no-duplicate EventStorage path remains distinct from event-vector
capacity: it is the path that appends a `0x74` PlayerEvent and changes IDs/vector contents. Caller
text/position/action/defaulting and the exact PostEvent write order remain required inputs/effects.
No RNG draw occurs in the recovered bucket, duplicate, prune, copy, allocation, or destruction
boundaries.
## Original/runtime dependencies and limits
Any original-assisted allocation, string assignment or deletion must retain allocator-family
compatibility: the recovered calls target the original MSVCR100 import thunks. A standalone
replacement needs its own coherent allocation/destruction boundary; calling these original helpers
is an original dependency, not independent replacement. Calling `0x0046f8c0` likewise retains an
original string-layout/comparison dependency, though its equality behavior is implementable without
allocation in a standalone boundary. Required unavailable proof inputs are a safe
long-string/full-capacity pre/post fixture (or equivalent archived trace), same-bucket
equal/description-only-different event fixtures covering short and long strings, exact exceptional
cleanup outcomes under a live throw, and independent reproduction of the named static windows and
falsifiers. This handoff makes no live
allocator-safety, runtime event-construction, or replacement-acceptance claim.

View file

@ -0,0 +1,433 @@
{
"schema": "sots-live-record-addresses/1",
"status": "incomplete-planning-input",
"binary": {
"path": "dumps/sots.exe",
"sha256": "970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841",
"image_base": "0x00400000"
},
"tool": {
"path": "/usr/bin/objdump",
"version": "GNU Binutils 2.38",
"sha256": "1eaaef2e7f57c4c7f69115c495e2466f5a8c8e5f3bc42221d092382f30f9d4cd"
},
"source_identity": {
"engine": {
"path": "/tmp/opencode/sots-final-research-engine",
"commit": "7741d42fc5e4e761e6449bdaf0e4a61d00036a23",
"git_common_dir": "/home/alex/sots-engine/.git"
},
"re": {
"path": "/tmp/opencode/sots-final-research-re",
"commit": "3bfde5a70d874a723e797a695bbd847fd82c0aa7",
"git_common_dir": "/home/alex/sots-re/.git"
}
},
"fresh_capture": {
"session": "run-eca0889c30beb7f00f4ac264",
"cwd": "/home/alex/sots-re",
"commands": [
{
"argv": [
"/usr/bin/objdump",
"-D",
"-Mintel",
"--start-address=0x0079a142",
"--stop-address=0x0079a1e0",
"dumps/sots.exe"
],
"returncode": 0,
"stdout_bytes": 3452,
"stdout_sha256": "f8f31b09ddb0a6d5b4016f84bfe86b994ed944be7372e264b90344fd560d4d05",
"stderr_bytes": 0,
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"argv": [
"/usr/bin/objdump",
"-D",
"-Mintel",
"dumps/sots.exe"
],
"returncode": 0,
"stdout_bytes": 148427275,
"stdout_sha256": "b748aef66fb4bb11be5223517a4c563eccd8c5117d86481c1459c20eded932c3",
"stderr_bytes": 0,
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"argv": [
"/usr/bin/objdump",
"-D",
"-Mintel",
"--start-address=0x007b7320",
"--stop-address=0x007b73a1",
"dumps/sots.exe"
],
"returncode": 0,
"stdout_bytes": 2794,
"stdout_sha256": "510efc3587feec6b34d52effccfd9afac6cec4ab3358de54ba7ad9aecfa73c67",
"stderr_bytes": 0,
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"argv": [
"/usr/bin/objdump",
"-D",
"-Mintel",
"--start-address=0x00425430",
"--stop-address=0x00425519",
"dumps/sots.exe"
],
"returncode": 0,
"stdout_bytes": 5205,
"stdout_sha256": "9f3ceb743ad7878d1d5900233d24acd2bd0bc86bc9f44acfcfccf0a6735e5c16",
"stderr_bytes": 0,
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
]
},
"constructor_destructor_capture": {
"session": "run-a247a9d6650d9e0954596cc0",
"manifest": "verify/results/research-live-record-bridge/run-a247a9d6650d9e0954596cc0/manifest.json",
"scope": "Read-only constructor, scalar-deleting destructor, and vtable-slot capture; planning evidence only."
},
"reserve_recapture": {
"session": "run-a52f7d5ebec657d8923d8402",
"manifest": "verify/results/research-live-record-bridge/run-a52f7d5ebec657d8923d8402/manifest.json",
"stdout": "verify/results/research-live-record-bridge/run-a52f7d5ebec657d8923d8402/observed-reserve.stdout.txt",
"stdout_sha256": "2d011ed96329c4c4ff462cbfd65decac9dccf40558765244c769be1dedc92275",
"comparison": "verify/results/research-live-record-bridge/run-a52f7d5ebec657d8923d8402/comparison.json",
"scope": "Read-only byte-exact recapture of 0x007b5820..0x007b5898. Full comparison found the invalidated transcription omitted exactly eight presentation spaces; all 49 address/opcode/mnemonic/operand rows match. Planning evidence only."
},
"player_event_constructor_capture": {
"session": "run-c1238a40bfc3bfa7c2ff9ba6",
"manifest": "verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/manifest.json",
"constructor_stdout": "verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/player-event-ctor-exact.stdout.txt",
"eh_analysis": "verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/player-event-ctor-eh-analysis.json",
"scope": "Read-only callable constructor and MSVC unwind capture; static planning evidence only, not live allocator or exception execution."
},
"player_event_copy_capture": {
"session": "run-36c401e90eb0ec1db4d35865",
"manifest": "verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/manifest.json",
"copy_stdout": "verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/player-event-copy-exact.stdout.txt",
"eh_analysis": "verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/player-event-copy-eh-analysis.json",
"scope": "Read-only callable copy-constructor and MSVC unwind capture; static planning evidence only, not live allocator or exception execution."
},
"operations": {
"observed_tech_default_construct": {
"va": "0x008562a0",
"rva": "0x004562a0",
"callable_entry": true,
"prototype": "ObservedTech *__thiscall observed_tech_default_construct(ObservedTech *destination)",
"receiver": "ECX = writable uninitialized storage for one complete 0x2c-byte ObservedTech",
"arguments": [],
"stack_cleanup": "no stack arguments; helper ends in plain ret",
"return": "EAX = destination ObservedTech pointer on normal return",
"writes": [
"vptr 0x00a2439c at destination +0x00",
"zero dword at +0x04, covering both 16-bit turn fields",
"zero byte at +0x08",
"valid empty/SSO std::string rooted at +0x0c with size zero and capacity 0x0f",
"zero dword at +0x28"
],
"ownership": "Field-wise construction creates one valid embedded string; it does not adopt or copy an owning header. The constructor establishes an SEH frame around empty-string setup through VA 0x00425550. On normal return the destination owns exactly its initialized name string and must later be destroyed exactly once.",
"vtable_provenance": {
"vtable_va": "0x00a2439c",
"complete_object_locator_va": "0x00a81c78",
"slots": [
{"index": 0, "va": "0x00793610", "meaning": "scalar-deleting destructor"},
{"index": 1, "va": "0x00817c40", "meaning": "Read"},
{"index": 2, "va": "0x00817cf0", "meaning": "Write"}
]
},
"captures": [
"verify/results/research-live-record-bridge/run-a247a9d6650d9e0954596cc0/observed-ctor.stdout.txt",
"verify/results/research-live-record-bridge/run-a247a9d6650d9e0954596cc0/observed-vtable.stdout.txt",
"verify/results/research-live-record-bridge/run-a247a9d6650d9e0954596cc0/manifest.json"
]
},
"observed_tech_scalar_delete_destruct": {
"va": "0x00793610",
"rva": "0x00393610",
"callable_entry": true,
"prototype": "ObservedTech *__thiscall observed_tech_scalar_delete_destruct(ObservedTech *value, uint32_t flags)",
"receiver": "ECX = one fully constructed live-layout ObservedTech",
"arguments": [
{
"index": 0,
"location": "[entry ESP+0x04] / [EBP+0x08]",
"meaning": "scalar-deleting flags; bit 0 requests freeing the object storage"
}
],
"stack_cleanup": "callee removes the one 4-byte flags argument with ret 4",
"return": "EAX = input ObservedTech pointer on normal return, including the flags-bit-0 path",
"writes": [
"when name capacity at +0x20 is at least 0x10, frees the owned buffer pointer at +0x0c through VA 0x00924faa",
"sets name capacity +0x20 to 0x0f, size +0x1c to zero, and first inline byte +0x0c to zero",
"writes base vptr 0x009e22bc at +0x00",
"when flags bit 0 is set, frees the ObservedTech storage through VA 0x00924faa"
],
"ownership": "Consumes the one name ownership exactly once. For stack temporaries, vector elements, and all other embedded values the bridge must pass flags=0 so only member lifetime ends and object storage is not freed. Reuse after return requires a fresh constructor; a second destructor call is forbidden.",
"embedded_invocation": {
"flags": 0,
"required_reason": "Original vector reallocation pushes zero before virtual slot-0 dispatch over each old 0x2c-byte element; flags=1 would incorrectly scalar-delete embedded storage."
},
"captures": [
"verify/results/research-live-record-bridge/run-a247a9d6650d9e0954596cc0/observed-dtor.stdout.txt",
"verify/results/research-live-record-bridge/run-a247a9d6650d9e0954596cc0/observed-vtable.stdout.txt",
"verify/results/research-completion-abi-independent/integration-lead-20260910/observed-realloc-wide.stdout.txt",
"verify/results/research-live-record-bridge/run-a247a9d6650d9e0954596cc0/manifest.json"
]
},
"observed_tech_copy_construct": {
"va": "0x0079a150",
"rva": "0x0039a150",
"callable_entry": true,
"prototype": "void __cdecl observed_tech_copy_construct(void *unused_allocator, ObservedTech *destination, const ObservedTech *source)",
"arguments": [
{
"index": 0,
"location": "[entry ESP+0x04] / [EBP+0x08]",
"meaning": "allocator-shaped argument passed as vector+0x0c by both callers; not read by this helper"
},
{
"index": 1,
"location": "[entry ESP+0x08] / [EBP+0x0c]",
"meaning": "destination ObservedTech pointer"
},
{
"index": 2,
"location": "[entry ESP+0x0c] / [EBP+0x10]",
"meaning": "source ObservedTech pointer"
}
],
"stack_cleanup": "caller removes 12 bytes; helper ends in plain ret",
"receiver": "none; incoming ECX is not consumed as a receiver",
"return": "no supported return-value contract; EAX is incidental/clobbered",
"writes": [
"destination vptr at +0x00",
"16-bit fields at +0x04 and +0x06",
"byte field at +0x08",
"deep-constructed string rooted at +0x0c through VA 0x00425430",
"32-bit field at +0x28"
],
"ownership": "Constructs destination field-wise. The destination string starts empty/SSO and is assigned from the source; no owning string header is copied. Entry SEH state covers the potentially allocating string operation.",
"callers": [
{
"call_va": "0x007b7366",
"containing_entry_va": "0x007b7320",
"path": "source originally inside vector; source pointer recomputed after possible growth"
},
{
"call_va": "0x007b738f",
"containing_entry_va": "0x007b7320",
"path": "source outside vector"
}
],
"all_direct_callers_probe": "Full-image linear objdump contained exactly the two direct call rows above for target 0x79a150.",
"interior_negative_control": {
"va": "0x0079a184",
"rva": "0x0039a184",
"callable_entry": false,
"reason": "Interior instruction depends on the 0x0079a150 prologue having established EBP, SEH state, ESI=destination and local construction state. No direct caller targets it."
},
"accepted_dependency_captures": [
"verify/results/research-completion-abi-independent/integration-lead-20260910/observed-copy-control.stdout.txt",
"verify/results/research-completion-abi-independent/integration-lead-20260910/observed-push-wide.stdout.txt",
"verify/results/research-completion-abi-independent/integration-lead-20260910/manifest.json"
]
},
"observed_tech_vector_append": {
"va": "0x007b7320",
"rva": "0x003b7320",
"callable_entry": true,
"prototype": "void __thiscall observed_tech_vector_append(ObservedTechVector *vector, const ObservedTech *source)",
"receiver": "ECX = live three-pointer vector header: first at +0x00, last at +0x04, end at +0x08; allocator-shaped storage begins at +0x0c",
"arguments": [
{
"index": 0,
"location": "[entry ESP+0x04] / [EBP+0x08]",
"meaning": "source live-layout ObservedTech to deep-copy"
}
],
"stack_cleanup": "callee removes the one 4-byte source argument with ret 4",
"return": "no supported return-value contract; EAX is incidental after the copy helper",
"source_location_branches": [
"When source is in [first,last), computes its 0x2c-element index before any growth and recomputes source from the possibly replaced first pointer afterward.",
"When source is outside [first,last), retains the caller pointer across possible growth. A pointer into unused capacity or exactly at last is not treated as a live in-vector source and is forbidden by the bridge precondition."
],
"no_growth": "Calls 0x0079a150 with vector+0x0c, destination=old last, and selected source; advances last by exactly 0x2c only after normal copy return. Existing elements and end are unchanged.",
"growth": {
"reserve_va": "0x007b5820",
"reserve_prototype": "void __thiscall observed_tech_vector_reserve_additional(ObservedTechVector *vector, uint32_t additional_count)",
"reserve_abi": "ECX=vector, one stack count, ret 4, no supported return; append passes additional_count=1 only when last==end.",
"capacity_rule": "Rejects size+additional above 0x05d1745d elements; if required exceeds capacity, chooses at least required and otherwise approximately capacity+floor(capacity/2), capped through the same maximum check, then calls 0x007b34e0 with the chosen element capacity.",
"reallocate_effects": "0x007b34e0 obtains count*0x2c storage through 0x0057e590 -> MSVCR100 scalar new thunk 0x00924fb6, deep-copy-constructs [old first,old last) into the new block through 0x0085e650, destroys each old element through virtual slot zero with flags=0, frees the old block through 0x00924faa, then writes end, last and first in that order. Append subsequently deep-copies the requested source at the new last and advances last by 0x2c.",
"normal_postcondition": "All prior element values survive as independently owned deep copies; every old element is destroyed exactly once and old array storage is freed once through the matching runtime family."
},
"exceptional_ownership": "The append helper has no local handler and advances last only after copy construction returns. Reserve/reallocate install MSVC SEH state around allocation/range copy; 0x0085e650 tracks the current destination and has a partial-range destruction funclet. Static control flow therefore supports cleanup before propagation and leaves the published vector header update until after successful relocation, but no live throw has been exercised. The bridge must contain any propagated C++ exception at its MSVC DLL boundary, must treat the operation as failed with no accepted new element, and must validate zero outstanding allocation/partial element before this row can support live-safety acceptance.",
"captures": [
"verify/results/research-completion-abi-independent/integration-lead-20260910/observed-push-wide.stdout.txt",
"verify/results/research-live-record-bridge/run-a52f7d5ebec657d8923d8402/observed-reserve.stdout.txt",
"verify/results/research-live-record-bridge/run-a52f7d5ebec657d8923d8402/manifest.json",
"verify/results/research-live-record-bridge/run-a52f7d5ebec657d8923d8402/comparison.json",
"verify/results/research-completion-abi-independent/integration-lead-20260910/observed-realloc-wide.stdout.txt",
"verify/results/research-completion-abi-independent/integration-lead-20260910/observed-alloc-wide.stdout.txt"
]
},
"player_event_default_construct": {
"va": "0x0084ee30",
"rva": "0x0044ee30",
"callable_entry": true,
"prototype": "PlayerEvent *__thiscall player_event_default_construct(PlayerEvent *destination)",
"receiver": "ECX = writable uninitialized storage for one complete 0x74-byte PlayerEvent",
"arguments": [],
"stack_cleanup": "no stack arguments; helper ends in plain ret",
"return": "EAX = destination PlayerEvent pointer on normal return",
"writes": [
"vptr 0x00a21958 at destination +0x00",
"EvEID zero at +0x04",
"valid empty/SSO EvDsc std::string rooted at +0x08 with size zero, capacity 0x0f and first inline byte zero",
"valid empty/SSO EvMsg std::string rooted at +0x24 with size zero, capacity 0x0f and first inline byte zero",
"EvLoc zero at +0x40",
"EvPos dwords at +0x44, +0x48 and +0x4c copied from 0x00af0dc8, 0x00af0dcc and 0x00af0dd0; each source word is 0x7f7fffff (FLT_MAX)",
"valid empty/SSO EvImg std::string rooted at +0x50 with size zero, capacity 0x0f and first inline byte zero",
"EvAct zero at +0x6c",
"EvCID zero at +0x70"
],
"complete_layout": "The listed writes establish every logical field of the 0x74-byte object: 4-byte vptr, 4-byte EvEID, three independent 0x1c-byte strings, EvLoc, three position dwords, EvAct and EvCID. They do not overwrite inactive SSO union bytes or the allocator-shaped trailing dword in each 0x1c-byte string object; those bytes are not observable string value or ownership state. No owning header is imported from caller storage.",
"string_initialization": "Each string is manually established as empty/SSO and then passed as ECX to 0x00425550 with stack arguments empty literal 0x009e100c and count zero. The bound zero-count path writes size zero and the inline terminator, performs no allocation or free, and returns the destination with ret 8. On normal return all three are distinct valid owned subobjects even though inactive storage bytes may retain their prior contents.",
"exceptional_partial_construction": {
"handler_thunk_va": "0x0099613e",
"func_info_va": "0x00ac98a4",
"func_info": "MSVC magic 0x19930522, maxState 3, unwind map 0x00ac988c, no try-block or IP maps, flags 1",
"unwind_states": [
"state 0 -> -1 through 0x00996120: restore base vptr 0x009e22bc through 0x00763a00",
"state 1 -> 0 through 0x00996128: destroy completed EvDsc at destination+0x08 through 0x008e0610, then continue state 0 cleanup",
"state 2 -> 1 through 0x00996133: destroy completed EvMsg at destination+0x24 through 0x008e0610, then continue states 1 and 0 cleanup"
],
"qualification": "The state is advanced immediately before the next empty-string helper call, so a hypothetical exception during construction of a string cleans only predecessor string subobjects plus the base; a failing current subobject is not treated as completed. For the constructor's fixed valid empty-literal/count-zero inputs, the bound 0x00425550 path does not allocate, free or call a failure helper. The third successful call is followed only by scalar stores on the observed path. This is static unwind topology; no throw or allocator behavior was executed."
},
"ownership": "On normal return the destination owns three independently destructible valid strings and must be destroyed exactly once. A failed construction must not be passed to the complete PlayerEvent destructor; only the compiler unwind actions for completed states may run.",
"captures": [
"verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/player-event-ctor-exact.stdout.txt",
"verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/player-event-ctor.stdout.txt",
"verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/player-event-ctor-ehdata.stdout.txt",
"verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/player-event-ctor-funcinfo.stdout.txt",
"verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/player-event-ctor-cleanup-base.stdout.txt",
"verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/player-event-ctor-cleanup-string.stdout.txt",
"verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/string-empty-init.stdout.txt",
"verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/player-event-ctor-eh-record.bin",
"verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/player-event-ctor-eh-analysis.json",
"verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/manifest.json"
]
},
"player_event_copy_construct": {
"va": "0x007693f0",
"rva": "0x003693f0",
"callable_entry": true,
"prototype": "PlayerEvent *__thiscall player_event_copy_construct(PlayerEvent *destination, const PlayerEvent *source)",
"receiver": "ECX = writable uninitialized storage for one complete 0x74-byte PlayerEvent",
"arguments": [
{
"index": 0,
"location": "[entry ESP+0x04] / [EBP+0x08]",
"meaning": "source fully constructed live-layout PlayerEvent"
}
],
"stack_cleanup": "callee removes the one 4-byte source argument with ret 4",
"return": "EAX = destination PlayerEvent pointer on normal return",
"ordered_writes": [
"writes vptr 0x00a21958 at destination +0x00, then copies source EvEID +0x04",
"establishes destination EvDsc +0x08 as empty/SSO, then deep-assigns source EvDsc through 0x00425430 with offset zero and count 0xffffffff",
"establishes destination EvMsg +0x24 as empty/SSO, then deep-assigns source EvMsg through 0x00425430 with offset zero and count 0xffffffff",
"copies source EvLoc +0x40 and all three EvPos dwords +0x44, +0x48 and +0x4c",
"establishes destination EvImg +0x50 as empty/SSO, then deep-assigns source EvImg through 0x00425430 with offset zero and count 0xffffffff",
"copies source EvAct +0x6c and EvCID +0x70"
],
"complete_layout": "The ordered writes establish every logical field of the 0x74-byte destination. Each destination string receives its own valid SSO or heap ownership; no source string header, pointer, size/capacity tuple, or other owning header is transferred.",
"exceptional_partial_construction": {
"handler_thunk_va": "0x009862de",
"func_info_va": "0x00ab9f0c",
"func_info": "MSVC magic 0x19930522, maxState 3, unwind map 0x00ab9ef4, no try-block or IP maps, flags 1",
"unwind_states": [
"state 0 -> -1 through 0x009862c0: restore base vptr 0x009e22bc through 0x00763a00",
"state 1 -> 0 through 0x009862c8: destroy completed destination EvDsc at +0x08 through 0x008e0610, then continue state 0 cleanup",
"state 2 -> 1 through 0x009862d3: destroy completed destination EvMsg at +0x24 through 0x008e0610, then continue states 1 and 0 cleanup"
],
"qualification": "Construction state is set to 0 before the EvDsc assignment, 1 before the EvMsg assignment, and 2 before the EvImg assignment. Therefore a throwing current deep assignment is not treated as completed; only predecessor destination strings plus the base are unwound. After successful EvImg assignment, only scalar copies remain. This is static unwind topology; no allocation failure or throw was executed."
},
"ownership": "On normal return destination owns three independent deep copies and must later be destroyed exactly once. Source remains unchanged and retains all three original ownerships. A failed copy must not be passed to the complete PlayerEvent destructor; compiler unwind handles only completed destination subobjects.",
"captures": [
"verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/player-event-copy-exact.stdout.txt",
"verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/player-event-copy-ehdata.stdout.txt",
"verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/player-event-copy-funcinfo.stdout.txt",
"verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/player-event-copy-cleanup-base.stdout.txt",
"verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/player-event-copy-cleanup-string.stdout.txt",
"verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/player-event-copy-eh-record.bin",
"verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/player-event-copy-eh-analysis.json",
"verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/manifest.json"
]
},
"string_assign_substr": {
"va": "0x00425430",
"rva": "0x00025430",
"callable_entry": true,
"prototype": "std::string *__thiscall string_assign_substr(std::string *destination, const std::string *source, uint32_t source_offset, uint32_t count)",
"receiver": "ECX = destination std::string",
"arguments": [
{
"index": 0,
"location": "[entry ESP+0x04] / [EBP+0x08]",
"meaning": "source std::string pointer"
},
{
"index": 1,
"location": "[entry ESP+0x08] / [EBP+0x0c]",
"meaning": "zero-based source byte offset"
},
{
"index": 2,
"location": "[entry ESP+0x0c] / [EBP+0x10]",
"meaning": "maximum byte count; 0xffffffff means through source end"
}
],
"stack_cleanup": "callee removes all 12 stack-argument bytes with ret 0x0c",
"return": "EAX = destination std::string pointer on every normal return path",
"bridge_invocation": {
"source": "valid live-layout source string",
"source_offset": 0,
"count": "0xffffffff",
"destination_precondition": "already initialized empty or otherwise valid live-layout string"
},
"writes": [
"destination bytes or destination-owned heap buffer",
"destination size at +0x10",
"destination capacity at +0x14 when growth is required",
"terminating zero byte"
],
"ownership": "Self-assignment uses two in-place erase operations. Non-self assignment selects source inline bytes when capacity is below 0x10 or its heap pointer otherwise. If destination capacity is insufficient it calls VA 0x004249a0 before copying; that worker uses the bound MSVCR100 new/delete thunks. The bridge must initialize destination first and must never transfer the source header.",
"exception_boundary": "This helper has no local SEH frame. Invalid offset and excessive length call imported failure helpers; allocation can propagate from VA 0x004249a0. Bridge usage fixes offset=0/count=0xffffffff on a valid source, leaving allocation as the expected exceptional edge to be contained by the fixture DLL boundary.",
"bridge_call_sites": [
"0x0079a1bd copies ObservedTech name at +0x0c",
"0x00769445 copies PlayerEvent EvDsc at +0x08",
"0x00769464 copies PlayerEvent EvMsg at +0x24",
"0x0076949b copies PlayerEvent EvImg at +0x50"
],
"accepted_dependency_captures": [
"verify/results/research-completion-abi-independent/integration-lead-20260910/observed-copy-control.stdout.txt",
"verify/results/research-completion-abi-independent/integration-lead-20260910/player-copy-wide.stdout.txt",
"verify/results/research-completion-abi-independent/integration-lead-20260910/string-alloc-wide.stdout.txt",
"verify/results/research-completion-abi-independent/integration-lead-20260910/manifest.json"
]
}
},
"forbidden_entries": [
"0x0079a184"
],
"readiness": {
"complete": false,
"reason": "The ObservedTech default-construction, copy-construction, vector-append/growth and scalar-deleting destruction, PlayerEvent default-construction and copy-construction, and shared string-assignment rows are reconciled here. PlayerEvent append/destruction, every TurnEvents operation, and remaining exposed allocation operations still require exact generated rows and bound captures before implementation."
}
}

View file

@ -0,0 +1,200 @@
# Live-record bridge readiness architecture
Status: **planning draft; contract remains proposed**. This is acceptance-before-implementation
for `research-live-record-bridge`, not live-safety evidence. No game, VM, allocator, constructor,
or bridge code was executed while producing it.
## 1. Bound facts and reconciliation result
The accepted dependency is the integrated static package
`verify/results/research-completion-abi-independent/integration-lead-20260910/manifest.json`
(binary `dumps/sots.exe`, SHA-256
`970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841`). Its scope is static
reproduction plus archived-save inspection, not live allocator safety.
Two current generated-header statements are unsafe to consume and must be replaced by a dedicated
bridge fact channel before implementation:
* `include/generated/sots_addresses.h` says `EvDsc` is omitted from duplicate equality. The accepted
repaired windows establish the opposite: after action, location, three floats, message and image,
`0x00825d40` compares both descriptions through `0x0046f8c0`; a description-only difference is
therefore **not** a duplicate.
* The same header names `ObservedTech_copy_ctor = RVA 0x0039a184`, an interior inlined-copy site.
Fresh pinned-binary reconciliation in
`campaign/research/research-live-record-addresses.json` confirms callable helper entry VA
`0x0079a150` (RVA `0x0039a150`). It is a three-stack-argument cdecl-style helper: unused
allocator-shaped argument, destination, source; the caller removes 12 bytes after its plain
`ret`. It has no supported return-value contract. Full-image linear disassembly found exactly two
direct calls, both to `0x0079a150`; neither targets `0x0079a184`. The interior site depends on the
entry prologue's EBP, SEH, ESI and construction-state setup and is therefore an executable negative
control, never a fallback.
The dedicated package now records the ObservedTech default constructor `0x008562a0`
(`ECX=this`, no stack words, `EAX=this`, plain `ret`) and scalar-deleting destructor `0x00793610`
(`ECX=this`, one flags word, `EAX=this`, `ret 4`). Fresh raw captures and a capture manifest are at
`verify/results/research-live-record-bridge/run-a247a9d6650d9e0954596cc0/`. The constructor creates
the valid empty name string and all scalar defaults. The destructor frees a long name, resets that
string, restores base vptr `0x009e22bc`, and frees object storage only when flags bit 0 is set. Vtable
bytes at `0x00a2439c` put this destructor in slot zero; the accepted reallocation capture positively
shows old embedded elements dispatched through slot zero with a pushed zero, so bridge calls must use
flags=0 and must never repeat destruction.
The dedicated package now also records the complete PlayerEvent default constructor `0x0084ee30`
(`ECX=this`, no stack words, `EAX=this`, plain `ret`) in
`verify/results/research-live-record-bridge/run-c1238a40bfc3bfa7c2ff9ba6/`. It establishes every
logical field of the 0x74-byte object: vptr, zero ID/location/action/CID, three independent valid
empty strings, and three `FLT_MAX` position words copied from `0x00af0dc8`; inactive SSO/allocator
storage bytes are not overwritten. The fixed empty-literal/count-zero helper path allocates and
frees nothing. Direct PE decoding of the constructor's
MSVC FuncInfo records three unwind states: restore the base vptr, then destroy completed EvDsc,
then destroy completed EvMsg. The current string is not treated as completed if its constructor
helper throws. This establishes static partial-construction ownership only; no throw, allocation or
live destructor was executed.
The dedicated package now also records the complete PlayerEvent copy constructor `0x007693f0`
(`ECX=destination`, stack source, `EAX=destination`, `ret 4`) in
`verify/results/research-live-record-bridge/run-36c401e90eb0ec1db4d35865/`. It writes the vptr and
EvEID, independently empty-initializes and deep-copies EvDsc then EvMsg, copies EvLoc and all three
EvPos words, independently initializes and deep-copies EvImg, then copies EvAct and EvCID. Every
string copy uses `0x00425430` with offset zero/count `0xffffffff`; no source owning header is
transferred. Direct PE decoding binds three MSVC unwind states: base-vptr restore, completed EvDsc
destruction, then completed EvMsg destruction. Construction state advances before each potentially
allocating string assignment, so the currently failing string is not treated as complete. This is
static partial-copy ownership only; no allocation failure, throw or live destructor was executed.
The dedicated package now also records ObservedTech vector append `0x007b7320`
(`ECX=vector`, stack source, `ret 4`, no supported return). It distinguishes source inside the live
range from source outside it, reserves one slot through `0x007b5820` only when full, deep-copies at
the old/new last, and advances last only after normal return. Growth chooses at least
`size+1` and normally 1.5x capacity, then follows `0x007b34e0` -> `0x0057e590` -> MSVCR100 new,
deep-copies all old values, destroys the old range with flags zero, frees the old block through the
matching thunk, and publishes the new three-pointer header. Static SEH state exposes partial-copy
cleanup, but an actual throw remains unexecuted and cannot support live-safety acceptance.
The reserve window is now bound to the direct raw capture and manifest at
`verify/results/research-live-record-bridge/run-a52f7d5ebec657d8923d8402/`. Its full comparison records
that the invalidated manual transcription omitted exactly eight presentation spaces while all 49
address/opcode/mnemonic/operand rows match. Only the new 2472-byte stream is the current byte-exact
capture; the old 2464-byte stream remains invalidated and must not be cited as raw evidence.
The following accepted boundaries may seed the dedicated package, but each callable row still needs
its raw-window artifact and exact prototype in that package: PlayerEvent append `0x0086c580`
(`ECX=vector`, stack source, `ret 4`); destructor `0x0061ae90`
(`ECX=this`, plain `ret`); get/create TurnEvents `0x00885380` (`ECX=EventStorage`, stack turn,
`EAX=bucket`, `ret 4`); TurnEvents append `0x00884cb0` (`ECX=outer vector`, stack source,
`ret 4`); TurnEvents slot-zero destructor `0x0062e120`; string assignment entry `0x00425430`
with allocating worker `0x004249a0` (`ret 8`); MSVCR100 scalar delete/new import thunks
`0x00924faa`/`0x00924fb6`. Original `RecordObservedTech`, `EventStorage::PostEvent`, and every
research completion root are forbidden.
## 2. Exclusive write set
One implementation lane owns exactly these new or modified paths in the assigned engine worktree:
* `include/generated/sots_live_record_addresses.h` (generated; never hand-maintained)
* `src/shim/live_record/{abi.h,bridge.h,bridge.cpp,fixture_entry.cpp,CMakeLists.txt}`
* top-level `CMakeLists.txt` only to add the isolated live-record targets
* `tests/shim_live_record/{CMakeLists.txt,unit_tests.cpp}`
* `tools/build-live-record-fixture.ps1`
It must not edit or link `src/shim/main.cpp`, `src/shim/hooks/research.cpp`, any research hook,
or the standalone game model. The architecture/acceptance lane owns exactly:
* `campaign/research/research-live-record-bridge.md`
* `campaign/research/research-live-record-addresses.json`
* `tools/generate_live_record_addresses.py`
* `verify/live-record-bridge/{check_package.py,expected-records.json,forbidden-symbols.txt}`
* immutable run directories below `verify/results/research-live-record-bridge/`
Contract/checkpoint mutations remain canonical campaign transactions. Any expansion of either set
requires contract revision before code changes.
## 3. Bridge-only invocation and ownership
Build a **32-bit MSVC-2010-compatible** `sots_live_record_fixture.dll`, separate from `binkw32.dll`.
A PowerShell controller starts a disposable game process without advancing a turn, loads only this
fixture DLL, invokes exported `DWORD WINAPI RunLiveRecordBridgeFixture(void*)`, and exchanges a
versioned request/result through a named file mapping. The export validates PE fingerprint/module
base and resolves only generated RVAs. The controller records loaded modules and rejects any run
where `binkw32.dll` is the campaign proxy or any forbidden decision-root address appears in the
fixture import/call audit. This route neither links nor initializes the normal shim entry point.
All owning objects stay inside the original process and one compiler/runtime family. The bridge
never transfers a `std::string` or vector header across the mapping. Requests contain scalar fields
and counted UTF-8 bytes; results contain scalar fields, copied string bytes, vector sizes/capacities,
and operation counters. Construction is field-wise through accepted constructors/assignment/copy
helpers. Append delegates to the accepted vector helper. Destruction is reverse-order, exactly once,
with scalar-delete flags zero for embedded values; only array blocks created by the compatible
original runtime are released through its matching service.
Each operation owns a journal state (`empty`, `object-constructed`, each string assigned,
`element-appended`, `result-copied`, `destroyed`). A deterministic failpoint fires **before** each
original call and unwinds only completed states. Actual MSVC allocation exceptions are caught inside
the MSVC-built DLL and converted to a result code; no C++ exception crosses the exported WINAPI
boundary. The contained-failure case is accepted only when counters show no accepted partial record,
no outstanding allocation, no mismatched family, and one destruction per completed owned value.
## 4. Required cases and accounting
The fixture package must predeclare cases for empty, spare-capacity and full-capacity vectors; SSO
and heap strings for every string field; repeated ObservedTech name update; exact event duplicate;
description-only-different event; normal destruction; and one failpoint on a long-string/growth path.
Every case records complete resulting ObservedTech, TurnEvents and PlayerEvent fields, first/last/end
offsets, event ID/order, helper call counts, allocations by family and size, destructions/frees by
object identity, failpoint, return status, forbidden-call count, and execution count. Zero cases,
missing records, or unbalanced identities fail rather than skip.
## 5. Resources, manifests, and executable gates
No resource is currently leased. Host generation/tests use the assigned paired worktrees and a
unique output directory. The 32-bit package requires an immutable compiler/linker/SDK manifest
(exact VS2010 tool binaries and hashes), generated-address JSON/header hashes, source bindings,
fixture DLL/PDB/controller hashes, original EXE/MSVCR100 hashes, expected-record fixture hash, and
command/environment manifest. Runtime uses **VM144 only** after verifying MAC/IP, console/admin
access, game/session/process state and housekeeping, then acquiring canonical lease `vm144`.
VM140 is excluded. Building on CT111 or another shared host also requires its named campaign lease.
The eventual package must make these commands literal and zero-exit (output directory replaced by a
new unique path each run):
```text
python3 tools/generate_live_record_addresses.py --input campaign/research/research-live-record-addresses.json --output <engine>/include/generated/sots_live_record_addresses.h --check
cmake -S <engine> -B <host-build> -DSOTS_LIVE_RECORD_TESTS=ON
cmake --build <host-build> --target shim_live_record_unit_tests
ctest --test-dir <host-build> -R '^shim_live_record_' --output-on-failure
powershell -NoProfile -File <engine>/tools/build-live-record-fixture.ps1 -Source <engine> -Out <win-build> -Manifest <toolchain-manifest>
powershell -NoProfile -File <run-controller> -Guest VM144 -Fixture <fixture.dll> -Cases <expected-records.json> -Out <vm-run>
python3 verify/live-record-bridge/check_package.py --engine <engine> --re <re> --package <vm-run> --require-source-match --require-binary-match --require-fixture-match --require-all-cases --require-balanced-lifetimes --require-negative-controls
```
`check_package.py` must include executable mutations for raw owning-header transfer, interior/wrong
entry, wrong convention, allocator-family mismatch, omitted cleanup, double free, incomplete fields,
forbidden roots, zero execution, missing artifacts and source/binary/fixture drift. Host success is
not live acceptance. A different verifier session must reproduce the integrated package and at least
one mutation after all evidence is bound to one integrated source manifest.
## 6. Readiness blockers and exact next probe
The contract remains proposed. Missing items are the generated address header and exact prototypes
for PlayerEvent append/destruction, remaining allocation, and TurnEvents calls;
verified VS2010 toolchain identity; controller and failure-containment implementation; literal VM144
identity/preflight; expected records; checker; and immutable manifests.
The `0x0079a150` versus `0x0079a184` check is complete and recorded in
`research-live-record-addresses.json`; it qualifies only the ObservedTech copy-construction row.
The shared string-assignment check is also complete in the JSON: `0x00425430` takes ECX destination
plus source/offset/count stack arguments, returns the destination in EAX, and removes 12 bytes with
`ret 0x0c`. Bridge copy sites use offset zero and count `0xffffffff`; allocation exceptions may
propagate, so the fixture boundary must contain them. The ObservedTech constructor/destructor pair is
now complete in the JSON, including virtual-slot provenance and the flags-zero embedded-object rule.
The ObservedTech vector append/growth boundary is now encoded, including both source-location
branches, growth allocation/copy/destruction, unsupported return value, and the static-only
exceptional ownership qualification. PlayerEvent default construction at `0x0084ee30` is now
complete, including exact writes across the 0x74-byte layout, three string initialization states,
ABI/return and static exceptional partial-construction cleanup. PlayerEvent copy construction at
`0x007693f0` is now complete, including the full ordered write set,
three independent deep-copy states, ABI/return and static partial-copy unwind. The next discriminating
static check is PlayerEvent destruction at `0x0061ae90`: bind the complete callable window and encode
the exact reverse string-destruction order, vptr transition, ABI/return behavior and any exceptional
qualification before relying on it for fixture cleanup.
Do not begin bridge implementation until every exposed ABI row is encoded in the dedicated
generated-address package.

View file

@ -0,0 +1,74 @@
# Rollout result — 2026-09-09
Architecture/planning/resolutions: GPT-6 Astra. Three additional Astra architecture/review
executions supported the lead. Bounded implementation/verifier workers used GPT-5.6 Terra;
final Windows operations used GPT-5.5. No source-repository commit, push or deployment of a
new game shim was performed. The Windows housekeeping changes were explicitly authorized.
## Delivered
- Versioned role prompts/model routing, AGENTS entry points, 40-step worker quanta, auto-compaction,
regular durable checkpoints, no silent fallback and no nested worker delegation.
- Canonical RE contracts, guarded lifecycle, independent source-bound evidence/verdicts,
surprise/Astra decision records, atomic leases and source-isolated launch controls.
- Replaced old board/coverage/Forgejo/displacement workflow and removed global Claude re-* agents.
Current projections come from contracts and explicit content-addressed evidence selection.
- Fresh snapshot gate with actual source/input/binary hashes, expected test inventory, positive
corpus execution, explicit skips and full output capture; no reused remote overlay/build.
- Separate file/inflated/state comparisons, retained output saves, measured-only reporter and
optional equality requirement. Campaign acceptance is not inferred from equal hashes alone.
- Fixed RNG draw accounting across twists/rejections, duplicate nested-player accounting,
lost replay writes, empty/malformed corpus false-skips, and snapshot clean-room scanning.
- Concrete proposed research write-set replacement pilot with archived workload, prerequisites,
complete effect boundary, controls and remaining implementation dependencies.
## Validation
- Python: **71 unique tests passed** (37 campaign controls, 19 tooling, 8 publishing, 7 config/scanner).
- Actual OpenCode loader/model availability checks passed. Real normal launcher runs completed
for Astra architecture-review and Terra verifier roles, with actual session IDs, successful
stop events, fresh canonical checkpoints and source identity records. Model request is explicit;
emitted provider model metadata is unavailable and is not fabricated.
- Fresh engine host build and MinGW shim cross-build passed. **59 CTest identities: 52 passed,
7 explicit permitted asset/trace skips, 0 failed.** Four corpus suites each exercised **43 saves**.
- Independent Astra review rehashed 524 engine + 10 RE execution-tool files, both binaries,
all corpus inputs and the saved replay; all matched retained manifests.
- Canonical turn remains **62 state differences** from the oracle. It is measured, not accepted.
- `controls-bootstrap` reached **accepted** through independent verification and integrated
source-bound verdict after R4/R6/R8 and handoff issues were resolved by Astra. Acceptance scope
is the declared control-plane criterion, not engine/game fidelity.
Current selected gate: `campaign/evidence/8e14e00ee3ce7478ddfdef8de12183451e858c52d78dc28cffbdee47f5d087d8-gate.json`.
Current selected replay: `campaign/evidence/87f92c2b54625ecbca1f3c0a37e57c43d03a4aff488edf4ea8a09a842cd6279d-replay.json`.
Build/source/tool snapshots retained at `/home/alex/.local/share/sots-runs/rollout-host-20260909-c`.
Actual replay output retained at `/home/alex/.local/share/sots-runs/rollout-replay-20260909`.
Final independent controls verdict: `campaign/runtime/verdicts/controls-bootstrap.json`.
Final integrated verifier run: `campaign/runtime/runs/run-97066391080a3d06dce27a80.json`.
## Five Windows guests
| VM | Verified IP | Cleanup/profile | Login evidence |
|---|---|---|---|
| 140 | 192.168.10.139 | compliant | existing console preserved; autologon config + key SSH verified |
| 141 | 192.168.10.143 | compliant | reboot → automatic re console; key SSH recovered |
| 144 | 192.168.10.144 | compliant | reboot → automatic re console; key SSH recovered |
| 145 | 192.168.10.145 | compliant | reboot → automatic re console; key SSH recovered |
| 146 | 192.168.10.146 | compliant | reboot → automatic re console; key SSH recovered |
Lead independently queried all five after completion: `re` console active; sshd Running/Automatic.
Policy/task/consumer cleanup and per-VM result JSON are under `verify/results/housekeeping/`.
The existing provisioned credential was located in the documented installation ISO and streamed
privately into protected LSA autologon storage. No password reset or plaintext-registry password.
Temporary ISO mount absent after cleanup; all VM/credential leases released.
Windows re-enabled a scheduled scan/OneDrive after login during verification. The repeatable
`Apply`/`Verify` profile is therefore a required preflight after reboot and before each new oracle
capture; old compliant JSON is not proof of current guest state. See the housekeeping guide.
## Next action
Review uncommitted rollout changes; prepare the research replacement pilot from the reviewed
integration snapshot. Use source-identical verifier handoffs (baseline HEAD alone omits these
uncommitted changes). Full asset/trace gate and live completion-bearing research replacement
remain separate, unclaimed milestones. Restart OpenCode to load project configuration/agents;
existing sessions retain their previously loaded configuration.

View file

@ -0,0 +1,38 @@
# Architecture rollout — 2026-09-09
Authority: user approved implementation; architecture and plan-changing surprises are owned by
`openai/gpt-6-astra` (the active lead). The user's correction supersedes SOL/MYTHOS routing.
## Decisions
- `sots-re` is the only campaign state authority. Contracts, checkpoints, decisions, evidence,
leases and accepted results live here. Chat memory and engine docs are not campaign state.
- Primary lead and resolver: GPT-6 Astra. Analysts, implementers and independent verifiers:
GPT-5.6 Terra. Lab operator: GPT-5.5. Compaction: GPT-5.5. No silent model fallback.
- One pilot, then at most two independent implementation slices. No worker subdelegation.
- Workers checkpoint every 20 tool calls or 15 minutes, whichever comes first, and before
compaction, handoff, experiments or stopping. Bounded sessions resume from repository state.
- New slices use paired worktrees. This bootstrap alone uses exclusive FILE ownership in the
clean canonical trees: the lead owns architecture/state/config/dashboard; gate-worker owns
gate/evidence/reporter tooling; engine-worker owns accounting and engine tests. No shared-file
writes, staging, commits, pushes, remote deployment or Ghidra mutations are authorized.
- Replace obsolete live workflow documents and agents; history is in Git. Retain scientific
evidence and domain findings. Historical observations do not become current acceptance.
- Local gate builds a fresh source snapshot, hashes actual source and inputs, runs CTest once,
enforces expected identities and required execution, and records limitations. Full acceptance
additionally requires assets, shim build and slice-specific oracle criteria. No remote shared
staging overlay; operators run the same gate on a leased lab host with explicit paths.
- Reporter requires explicit binary and provenance, errors on missing/failed pairs or coverage,
separates byte/inflated/state equality, and supports measurement versus acceptance explicitly.
## Bootstrap task ownership
| Worker | Model | Files | State |
|---|---|---|---|
| lead | openai/gpt-6-astra | architecture, AGENTS, configuration, campaign tool/state, dashboard | implementing |
| gate-worker | openai/gpt-5.6-terra | tools/{gate.sh,gate.py,evidence.py,standalone_report.py}, verify/tooling/ | assigned |
| engine-worker | openai/gpt-5.6-terra | src/app accounting, RNG support as necessary, tests/, CMake test properties | assigned |
Surprises must be recorded in the worker checkpoint with evidence and the proposed discriminating
check, then escalated to the lead before changing architecture or scope. Ordinary implementation
errors within a contract may be fixed without escalation.

View file

@ -0,0 +1,54 @@
# Astra integration review — control-plane repairs
After your first bounded controls session completes, inspect this followup and latest independent
review. Same owned files, model GPT-6 Astra, no delegates/commits/lab changes.
Lead inspected run_agent.py:
1. check_launch currently forbids unresolved surprises for ALL roles. This prevents the explicitly
assigned resolver from launching to resolve the surprise. Permit Astra lead/resolver recovery on
blocked contracts without a fresh worker checkpoint; keep ordinary workers blocked. Bind these
recovery launches read/decision scope, not implementation permission. Add regression test.
2. Prompt says 'Workers cannot change architecture' unconditionally even for lead/architecture-review.
Render authority by role; user explicitly requires Astra architecture actors to do that work.
3. Model availability plus a JSON event is not proof of successful run: detect `type:error` even
when process exits zero, and require a successful completed step event, actual session ID and
end checkpoint. Provider refusal/runtime error must not be recorded complete after old checkpoint.
Missing observed_model can remain explicitly unavailable; never invent observed model.
4. Check exact git worktree baseline again under run reservation lock (validation-to-use race),
and validate no underlying canonical RE model/prompt/config mutation while launch executes.
5. Verify normal noninteractive permissions actually permit the bounded worker to read assigned
paired worktrees and checkpoint canonical RE. If necessary add --auto for this user-authorized
launcher with explicit deny overrides or scoped external_directory grants. Test command/env; do
not leave a launcher that always yields incomplete due to noninteractive permission prompts.
6. Artifact restrictions currently permit only campaign/. Existing scientific evidence under
verify/ must be referenceable without copying huge corpora into campaign. Permit immutable hashed
artifact references anywhere within canonical RE EXCEPT secrets/outside symlinks; continue
keeping control records under campaign/runtime. Document this separation and test path escapes.
Independent reviewer may find additional real defects. Address confirmed issues in owned files,
add adversarial tests, checkpoint precise interface change for publishing/pilot/lead. Do not
modify another worker's files. Main will run complete tests and normal launch smoke after.
## Independent Astra review R4/R6 — mandatory integration fixes
Read campaign/rollout/independent-review.md. R4 (HIGH) is real: baseline path+HEAD cannot bind
uncommitted candidate/integrated sources. Add an explicit actual source-content binding to
evidence/verdicts, checked at promotion against the referenced candidate/integrated worktrees.
Use engine + relevant RE source file manifests/digests (with documented exclusions for mutable
campaign state/evidence outputs to avoid self-reference), and immutable artifact/input hashes.
Candidate source paths may be paired worktrees, integrated paths canonical; baseline still pins
starting commits. Refuse old evidence/verdict after same-HEAD source byte changes. One source
binding for all final integrated evidence must agree. Do not let a lead boolean substitute for
this identity check. Exact arbitrary criterion meaning remains independent-review responsibility;
document that boundary. Add test changing engine bytes without HEAD change and rejecting promotion.
Update schema/sample/README; pilot agent's proposed contract has no evidence so should stay valid.
R6 durable recovery: OLD valid checkpoint is okay for STARTING a new quantum; require freshness
only for handoff/promotion/end of this quantum. Do not demand fabricated fresh timestamps to
resume next day. Verify basis/artifact/source identities independently of age on recovery. Test.
Runner config provenance must hash expanded role prompt + relevant effective config, not just
JSON file containing a file-reference. Lead's tools/check_agent_config.py --resolved already
verified live OpenCode loader resolves prompts/models correctly. Temporary fixture git commits
are allowed ONLY inside disposable test repos for unit testing, never in the actual projects.

View file

@ -0,0 +1,195 @@
# Controls worker checkpoint
Status: **approved R4/R6 and runner repairs implemented; independent integrated review pending**.
Model openai/gpt-6-astra; current logical checkpoint session `rollout-controls-repairs` (actual
harness session ID unavailable). Read the final repair handoff below; earlier sections are history.
No delegation, staging, project commits or lab I/O. Temporary fixture Git commits are authorized.
## Interface announcement (2026-09-09)
Canonical state root is the absolute RE repository path passed as `--state-root`.
Contracts live in `campaign/contracts/<id>.json`; every contract has required fields
`id,title,status,owner,baseline,scope,inputs,effects,original_dependencies,dependencies,acceptance,predictions,stop_conditions,checkpoint`.
`owner` is `{name,role}`. `baseline` is `{engine:{path,commit},re:{path,commit}}`
with canonical absolute repository paths and full git commit IDs. `scope`, `inputs`, `effects`,
`original_dependencies`, `dependencies`, `predictions`, `stop_conditions` are string arrays;
dependencies are contract IDs. Acceptance is an array of `{id,axis,criterion}` objects.
Checkpoint is null or a campaign-relative JSON path. Status is proposed/ready/implementing/
verification/integration/accepted/blocked/needs-revision. Optional `evidence` is an array of
source-bound records; exact schema and README follow. No scalar verified status.
Runtime directories: `campaign/runtime/checkpoints`, `surprises`, `decisions`, `verdicts`,
`leases`, `runs`. Open surprise JSON has `contract`, `status:"open"`, `id`, summary/probe.
Checkpoint JSON has `contract`, `summary`, `artifacts`, `next_action`, `model`, `session`,
`actor`, `timestamp`. Paths to durable artifacts must be under canonical campaign/.
## Implementation checkpoint (2026-09-09, quantum in progress)
Schema, models registry, proposed controls-bootstrap contract, campaign CLI and runner now exist.
No tests executed yet. `tools/campaign.py` exports `Campaign(root)` with `load`, `contracts`,
`validate`, `open_surprises`; CLI list/status/validate/checkpoint/transition/surprise/resolve/
evidence/verdict/lease. Model identity is explicitly a claim, not authentication.
Evidence record is `{id,axis,path,sha256,source,integrated}`; source uses the exact baseline object.
Evidence artifact contents are responsible for actual dirty-tree manifests (runner captures them).
Independent passing verdict is bound to complete evidence digest + contract basis. Integrated
evidence changes invalidate that digest, so acceptance requires another independent verdict.
Checkpoint freshness is 15 minutes; runner end checkpoint must also be after start and match
run-provided checkpoint session/model/actor/role. Run records retain requested versus observed model.
Coordination: read publishing checkpoint (its current.json gate manifest differs correctly from
contract base source), review checkpoint (pilot now adopting schema), lead opencode.json (steps 40,
matching role agents and GPT-5.5 compaction). No cross-cutting plan changes made.
## Pre-test checkpoint
Added campaign/README.md with strict fields, runtime formats, CLI examples, guarded lifecycle,
checkpoint/model provenance limitations, and runner command. Added verify/campaign/test_controls.py:
negative lifecycle/schema/source/model/checkpoint tests, actual concurrent lease contenders, fake
OpenCode subprocesses for quantum completion, and disposable shared clones/linked worktrees for
real Git identity tests. Tests never commit/stage or launch agents; all fixture writes are temporary.
Source repository baseline object existence is now checked before ready/implementing. Ordinary
needs-revision transitions also clear checkpoint/evidence. No test results yet.
Next action: run `python3 -m unittest discover -s verify/campaign -p 'test_*.py' -v` and fix failures.
No other worker checkpoints existed at initial inspection. Source bootstrap baseline:
engine 7741d42fc5e4e761e6449bdaf0e4a61d00036a23,
RE 3bfde5a70d874a723e797a695bbd847fd82c0aa7 (current concurrent work is uncommitted).
## Final handoff checkpoint — 2026-09-09T21:35Z
### Delivered and tested
- Owned source files: tools/campaign.py, tools/run_agent.py, campaign/contract.schema.json,
campaign/models.json, campaign/contracts/controls-bootstrap.json, campaign/README.md,
verify/campaign/test_controls.py, campaign/runtime/ records and this checkpoint.
- `python3 -m unittest discover -s verify/campaign -p 'test_*.py' -v`: **23/23 passed**
in 2.180s. Initial 22/23 caught Git 2.34 lacking worktree-list `-z`; fixed to porcelain lines
with explicit unusual-path rejection. Closed subprocess stdout to remove ResourceWarning.
- `python3 tools/campaign.py --state-root /home/alex/sots-re validate`: passed both
controls-bootstrap and research-replacement. No acceptance transition performed.
- Tests cover actual cross-process exclusive lease acquisition, token/owner/stale-release
controls, fake process success/failure and missing checkpoint, model/config routing, real linked
worktree/common-dir/baseline verification, schema/path/lifecycle/identity/WIP/surprise/evidence
negatives and final integrated-package verdict refresh. Disposable shared clones reuse existing
local history: **tests execute no git commit or staging**, addressing reviewer test restriction.
- RE source identity remains baseline plus concurrent uncommitted changes. Owned file SHA-256:
- tools/campaign.py: fa6fc0914ca792daa5decaac8c48b285499a331287d4ccef35d953cca4b0965b
- tools/run_agent.py: fc2233fcbc09dd8878e66cae6b0a9b9985146ef02ae22bff3a10643e0c14784e
- contract.schema.json: ae4796b1f8e8336ddb63e60d774a81ff965461e4b884b5a2488e3865c6a6c5e0
- models.json: 95f507237a8e4fcf14189da4aa102dfae1dbaa536d4d8db6bcbfc30162ac5443
- verify/campaign/test_controls.py: 894cf3ef92e540daf5017c46acc526b56d9ac7441def917c1a2910a086954e18
### Surprises / lead decisions required
Read campaign/rollout/independent-review.md after successful tests. Recorded both findings with
`campaign surprise`; controls-bootstrap is machine-readably **blocked**. No affected interface
changes made after these cross-cutting findings, per assignment escalation rule.
1. **R4 / s-410e48d5ae6cc4da0a6ae649**: current evidence binds baseline path/commit, artifact hash,
axis and declared integrated boolean; it does not machine-bind actual candidate/integrated bytes.
Reviewer correctly demonstrates that same-HEAD source changes evade this check. README already
assigned actual manifests/criteria to independent human review, but that is insufficient for
stronger automatic acceptance. Proposed decision: typed acceptance package binding candidate
and integrated source manifests, binary, immutable input hashes and per-criterion outcomes;
coordinate shape with gate/publishing. Probe changes bytes at unchanged HEAD and rejects old
verifier/integration result. Evidence: independent-review.md R4, current check_evidence/verdict.
2. **R6 / s-f1c41532e618c77d41538902**: launch uses 15-minute freshness, preventing next-day
recovery; unconditional surprise rejection prevents resolver launch. Assignment explicitly said
no open surprises at launch, so exception needs clarification. Proposed decision: recovery checks
identity/basis/artifact integrity without age limit, fresh end checkpoint remains strict; permit
explicit resolution-only Astra quantum while affected workers stay blocked. Probe old-valid vs
missing/mismatched checkpoint and resolver vs implementer with open surprise.
Other known review limitation: runner hashes canonical config/overlay, not expanded prompt files
or every effective configuration source. Claimed role/model and agent permissions are not security
boundaries. No real OpenCode agent launched; actual effective-config/model execution remains an
independent integration check. Interrupted running reservations deliberately do not auto-expire;
manual lead inspection is currently required before clearing an interrupted record.
### ONE exact next action
Lead: record Astra resolutions for `s-410e48d5ae6cc4da0a6ae649` and
`s-f1c41532e618c77d41538902`, specifying the source-package interface and recovery/resolver policy,
then resume this controls worker from this checkpoint to implement and test those decisions.
## Repair handoff — 2026-09-09T21:54Z
### Authority, source and scope
- Recovered from the prior checkpoint and formally resolved surprises. Decisions
`d-42c6d0b4ee5114e6f2e07c99` (R4) and `d-ab717735fc6c1661919f6894` (R6), plus
controls-followup.md, authorize this implementation. Both surprise records are resolved.
- Baselines rechecked: RE `3bfde5a70d874a723e797a695bbd847fd82c0aa7`, engine
`7741d42fc5e4e761e6449bdaf0e4a61d00036a23`. Bootstrap exclusive canonical file ownership
exception applies. Concurrent source remains uncommitted; final machine checkpoint artifacts
hash the exact owned source/schema/test/README bytes. No engine edits or resource leases.
- Changed: tools/campaign.py, tools/run_agent.py, campaign/contract.schema.json,
campaign/contracts/controls-bootstrap.json (acceptance text), campaign/README.md,
verify/campaign/test_controls.py, this handoff and canonical runtime checkpoints.
Registry/config/agent files, pilot, gate/report and publishing ownership preserved.
### Precise interface changes for lead, publishing and pilot
1. Evidence now requires `source_binding`, `binaries`, `inputs`, `outcomes` in addition to existing
fields. Source binding is `{engine:{path,commit,sha256},re:{path,commit,sha256}}`, generated by
`campaign source-binding CONTRACT [--engine-worktree ABS --re-worktree ABS]`. No worktree args
means canonical integrated trees. Actual Git manifests include dirty/untracked nonignored
file bytes, modes and tracked deletions; fixed RE campaign-state/results and cache exclusions
are documented in README. Source symlinks/submodules fail closed. Candidate paths must belong
to paired repositories; integrated paths must be canonical. All final integrated evidence
must share one binding. Every evidence/verdict/promotion check rehashes source content.
2. `binaries` and `inputs` are nonempty immutable `{path,sha256}` arrays. `outcomes` exactly covers
criterion IDs for each axis with `{criterion,status,artifact:{path,sha256}}`. Passing declared
outcomes do not prove arbitrary criterion meaning: independent reproduction/review remains
responsible for actual execution, scope/branch exposure and input/effect completeness.
Verdicts bind evidence digest plus explicit `source_bindings_digest`. Old evidence/verdicts
need regeneration/reproduction; proposed pilot with no evidence still validates.
3. Scientific artifact references are canonical RE-relative, including existing `verify/`.
Controls stay under campaign/runtime; absolute/traversing/outside-link/private-key/secret/Git
artifact references fail. Both lexical path and resolved alias are checked. Hashing its own
mutable contract in a checkpoint is explicitly rejected; contract metadata uses `basis`.
4. Recovery accepts old intact checkpoints, checks basis/artifacts and source-bound evidence,
and independently verifies paired Git baseline/worktree identities. Promotion/end retain
15-minute freshness. Astra lead/resolver may enter blocked surprises without worker checkpoint
under resolution-only prompt/permissions and unchanged paired source at completion. Normal
architecture actors receive authority appropriate to role; affected ordinary workers block.
5. Runner requires zero exit, no error event, successful `step_finish` reason `stop`, one actual
nonempty session ID, consistent emitted model identity, and fresh matching end checkpoint.
Missing observed model is explicitly unavailable. Canonical model/prompt/config fingerprints,
expanded role prompt and effective live loader config hashes are recorded; config/contract
changes around reservation/execution fail. Git HEAD/worktree validation repeats under lock.
6. Noninteractive overlay grants read/search, normal worker shell and exact root/subtree external
access to paired worktrees/canonical RE, preserving role edit denies. Task/question denied;
resolution shell/edit permissions narrowed to read/decision state. Effective loader model,
steps, expanded prompt and requested permission entries are checked. No `--auto` required.
These remain operational guards, not authentication, shell sandboxing or continuous auditing.
7. Gate remains `sots-gate/1` with `source.engine/re`; reporter is measured-only with
`--require-match`. The new contract envelope references immutable gate/report packages rather
than changing their schemas. No publishing acceptance/current pointers were changed.
### Measured verification
- `python3 -m unittest discover -s verify/campaign -p 'test_*.py' -v`: **36/36 passed**, 6.530s.
Includes real disposable Git/worktree same-HEAD candidate and integrated drift, add/delete/mode,
source/path/secret escapes, criterion/input omissions, concurrent leases, old recovery/resolver
policy, zero-exit errors (also error followed by success), missing successful step/session,
baseline race recheck, config drift, role authority and permission/environment provenance.
- Subsequently added checkpoint self-reference guard and exact-directory external grants:
checkpoint bounds/self-reference regression **1/1 passed**, 0.098s; permission provenance and
subprocess-success regressions **2/2 passed**, 0.391s. No unrelated changes after these checks.
- `python3 tools/campaign.py --state-root /home/alex/sots-re validate`: **passed** both contracts.
- Live `opencode debug config` with generated implementer env validated actual loader expansion,
model, 40 steps and permissions. Prior overlay effective hash
`25b06304c87586543d0607f0abc3f3d46c366cc664948f33c0900b38ab8b3248`, agent hash
`5252aaec5ac9b7a8b3cc6265937651f09b00f87731e61e1582d9fbe2caa17b7a` (before additive exact-root
grant). No real agent launch performed; normal-launch smoke belongs to the lead integration run.
- Checkpoint `2f0fe9ac4ec15b15a983bd75` attached its own contract before pointer mutation and thus
has an invalid artifact hash. It is superseded by subsequent checkpoints; the new guard prevents
recurrence. Final checkpoint intentionally references stable source/docs and this handoff only.
### Acceptance and ONE exact next action
Implementation and local measurements delivered; contract remains needs-revision, not accepted.
Independent verifier reproduction and integrated-tree/normal-launch smoke remain pending.
Lead: run the complete integrated test suite and a normal noninteractive launcher smoke, then
assign independent reproduction of this source-bound controls package before any promotion.

View file

@ -0,0 +1,59 @@
# Astra campaign controls architect
User explicitly requested three additional GPT-6 Astra agents for this architecture rollout.
You are one, running openai/gpt-6-astra. Implement the following approved architecture, refining
local details as necessary; report cross-cutting surprises to the lead through your checkpoint.
Read campaign/rollout/architecture-decision.md. No delegation, commits, staging, push or lab I/O.
Use apply_patch. Checkpoint every 20 tool calls/15min and before compaction/stopping in
campaign/rollout/controls-worker-state.md. User wants ruthless replacement of old workflow.
OWNED FILES ONLY: tools/campaign.py, tools/run_agent.py, campaign/contract.schema.json,
campaign/models.json, campaign/contracts/*.json EXCEPT research-replacement.json (pilot agent),
verify/campaign/ tests, campaign/runtime/ runtime state, campaign/README.md.
Lead owns AGENTS.md and guides/multi-agent-workflow.md, all OpenCode agent files and configs.
Another architect owns board/backlog/dashboard and their generators. Gate worker owns
tools/{gate.sh,gate.py,evidence.py,standalone_report.py}, verify/tooling/.
## Implement
Compact stdlib CLI tools with robust tests, no external server dependency. Models.json owns
roles lead/resolver=openai/gpt-6-astra; analyst/implementer/verifier=openai/gpt-5.6-terra;
lab=openai/gpt-5.5. No silent fallback. Explicit Astra architecture-review role allowed.
Contract schema strict JSON, required: id,title,status,owner,baseline,scope,inputs,effects,
original_dependencies,dependencies,acceptance,predictions,stop_conditions,checkpoint.
Agree exact field structure in campaign/README.md and provide a valid bootstrap example.
Lifecycle proposed -> ready -> implementing -> verification -> integration -> accepted,
blocked/needs-revision possible. Separate evidence axes, not a verified scalar.
Every transition guarded: ready has inputs/acceptance and baseline; implementing bounded WIP;
verification has checkpoint/artifacts; integration requires independent verifier verdict tied to
source/evidence; accepted requires integrated evidence and no open surprises. Avoid claiming
machine-enforced model authority merely from an editable claimed model field.
CLI list/status, validate [contracts], checkpoint (persist bounded JSON summary, artifacts,
exact next action, model/session, timestamp), surprise (create unresolved record + block contract),
resolve (Astra decision record, invalidate affected claims/results; require explanation and probe),
transition with clear fail-closed guards, lease acquire/release/show (atomic, owner tokens, no
automatic stealing; stale lease requires explicit lead release). Store ALL durable state under
RE campaign/. Runtime lock/checkpoint state belongs canonical RE even when workers have paired
worktrees, via explicit --state-root absolute path (no sibling guesses in temporary worktrees).
Machine-readable state is authority; board/dashboard are generated projections.
run_agent.py: explicitly choose role from models.json, pass --model to opencode CLI, no model
fallback; validate contract role/status and no open surprises. For normal worker launches require
two actual distinct git worktrees matching baseline engine/RE revisions, with cwd engine or RE
explicit. Source repositories canonical baseline fields paths+commit. No auto commits. Support
--dry-run, and fail if model not in `opencode models`. Run using repo-local role configuration
(lead will provide `sots-lead`, `sots-analyst`, `sots-implementer`, `sots-verifier`, `sots-lab`,
`sots-resolver` agents in RE opencode.json; launch with OPENCODE_CONFIG explicit path so engine
worktrees use same definitions). Limit sessions to 40 steps via config; capture log/session/model
in canonical campaign/runtime. At quantum end require fresh durable checkpoint or mark run
incomplete. Next quantum starts fresh from contract+checkpoint; do not rely on chat resume.
Compaction auto configured by lead, regular repository checkpoints + bounded fresh sessions are
the reliable memory discipline. Record actual requested model and runner events when available.
No fake token-threshold claim. Worker role edits architecture prohibited by instructions and
where feasible permissions; ordinary tooling is not a security boundary against arbitrary shell.
Add unit tests for schema invalidity, lifecycle bypass, bad identity, pending surprise, concurrent
lease acquisition, incorrect release token, WIP bound, bad role/model routing, missing/stale
checkpoint. Keep it practical and document exact commands. On completion let lead know schemas
and APIs in checkpoint so other architects can wire projections/pilot correctly.

View file

@ -0,0 +1,66 @@
#!/usr/bin/env python3
"""Capture this rollout's controls-suite evidence; never issue a verifier verdict."""
import argparse
import ast
import json
from pathlib import Path
import re
import subprocess
import sys
import time
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT / "tools"))
from campaign import Campaign, ControlError, atomic_json
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--integrated", action="store_true")
parser.add_argument("--reuse", help="Existing canonical-RE-relative suite artifact, revalidated against source")
args = parser.parse_args()
campaign = Campaign(str(ROOT))
contract = campaign.load("controls-bootstrap")
source = campaign.source_binding(contract)
if args.reuse:
relative = args.reuse
result = json.loads(campaign.artifact_path(relative).read_text())
if result["source_binding"] != source or result["status"] != "passed":
raise ControlError("existing test evidence is not this passed source snapshot")
else:
test_source = ROOT / "verify/campaign/test_controls.py"
expected = sorted(node.name for node in ast.walk(ast.parse(test_source.read_text()))
if isinstance(node, ast.FunctionDef) and node.name.startswith("test_"))
command = [sys.executable, "-m", "unittest", "discover", "-s", "verify/campaign", "-v"]
process = subprocess.run(command, cwd=ROOT, text=True, capture_output=True)
actual = sorted(re.findall(r"^(test_\w+) .* \.\.\. ok$", process.stderr, re.M))
ok = bool(expected) and expected == actual and process.returncode == 0
result = {"schema": "sots-controls-test/1", "status": "passed" if ok else "failed",
"source_binding": source, "command": command, "expected": expected, "passed": actual,
"returncode": process.returncode, "stdout": process.stdout, "stderr": process.stderr}
if campaign.source_binding(contract) != source:
result["status"] = "failed"
result["error"] = "source changed during control tests"
relative = f"campaign/evidence/controls-suite-{time.time_ns()}.json"
atomic_json(ROOT / relative, result)
if result["status"] != "passed":
raise ControlError(f"controls suite failed; see {relative}")
artifact = campaign.artifact(relative)
record = {"id": "controls-suite", "axis": "control-tests", **artifact,
"source": contract["baseline"], "source_binding": source, "integrated": args.integrated,
"binaries": [campaign.artifact("tools/campaign.py"), campaign.artifact("tools/run_agent.py")],
"inputs": [campaign.artifact("verify/campaign/test_controls.py"),
campaign.artifact("campaign/contract.schema.json"),
campaign.artifact("campaign/rollout/controls_evidence.py")],
"outcomes": [{"criterion": "controls-negative-paths", "status": "pass", "artifact": artifact}]}
campaign.evidence(contract["id"], record, "rollout-lead", "lead", "openai/gpt-6-astra")
print(json.dumps({"artifact": relative, "executed": len(result["passed"]),
"integrated": args.integrated, "source_binding": source}, indent=2))
if __name__ == "__main__":
try:
main()
except (ControlError, OSError, ValueError) as exc:
print(str(exc), file=sys.stderr)
sys.exit(1)

View file

@ -0,0 +1,18 @@
# Astra integration followup — engine accounting and invalid corpus handling
Your first worker session completed. Use a fresh bounded session and existing RE checkpoint.
Same file ownership, model openai/gpt-5.6-terra, no delegation/commit/architecture changes.
Lead inspected diff: RNG and S13 fixes are present, but TWO assigned items are incomplete.
1. `RunStrategicTurn` replay leaf writes are still added before final r.leafWrites reset; preserve
them exactly once. Add independent regression coverage proving replay contribution isn't lost
(existing command replay executable preferred; no new CTest identity required).
2. Configured empty corpus in tests/app/test_turn.cpp still returns skip 77. A specified directory
with zero .sav is invalid input, must fail (also other configured corpus consumers). CTest skip
regex can mask a failure if invalid-path messages say skipped. Ensure specified bad directories,
empty corpus, unreadable saves produce nonzero and FAIL, not Skip. Only UNSET dependencies skip.
Audit exactly the corpus tests you modified; add meaningful negative checks and report commands.
Do not run broad gate; lead coordinates after source stable. Focused test reruns appropriate.
Update engine-worker-state.md with exact changes/results and completion. Stop after.

View file

@ -0,0 +1,64 @@
# Engine worker checkpoint
Updated: 2026-09-09
## Followup checkpoint (openai/gpt-5.6-terra)
- Source worktree: `/home/alex/sots-engine` at `7741d42fc5e4e761e6449bdaf0e4a61d00036a23`;
RE state root: `/home/alex/sots-re` at `3bfde5a70d874a723e797a695bbd847fd82c0aa7`.
- Preserved command-replay leaf writes during `RunStrategicTurn`'s final record fold, then added
an `app_command_replay` regression that verifies an applied replay write changes the board and
is included exactly once beyond all phase records.
- Changed configured empty save directories from skips to failures in the modified app turn,
app turn-record, design census, Mars save, and Mars domain corpus consumers. Unset dependencies
retain their existing skip behavior; unreadable and parse-error saves remain failures without
skip wording.
- Observation: `git diff --check` passed before focused build/test execution. Existing unrelated
rollout changes are present in the engine worktree and were left untouched.
- `mars_stream_test_save` now stops after reporting parser errors, before accessing typed-shape
assumptions. `mars_stream_domains` reports parse/read errors and omits those saves from its
domain archive. This turned the malformed-save signal termination into ordinary nonzero test
failures; it is a test-boundary fix within the assigned contract, not an architecture change.
- Results: fresh `/tmp/opencode/sots-engine-followup` host build succeeded. With
`SOTS_SAVES_DIR=/home/alex/sots-re/verify/results/saves`, `ctest --test-dir
/tmp/opencode/sots-engine-followup --output-on-failure -R
'^(app_command_replay|app_turn|app_turn_record|mars_stream_save|mars_stream_domains)$'`
passed 5/5 twice, after the final test-boundary change.
- Negative evidence: each modified corpus executable returned nonzero for the configured empty
directory `/tmp/opencode/sots-empty-corpus`: app turn, app turn-record, Mars save, Mars
domains, and design census (the census was given `SOTS_DATA_DIR=/tmp/opencode`). Each of the
four applicable consumers returned a normal nonzero failure for configured malformed
`/tmp/opencode/sots-invalid-corpus/malformed.sav`; no skip wording or signal termination.
- Skip evidence: `env -u SOTS_SAVES_DIR -u SOTS_DATA_DIR ctest --test-dir
/tmp/opencode/sots-engine-followup --output-on-failure -R
'^(app_turn|app_turn_record|mars_stream_save|mars_stream_domains|game_design_census)$'`
reported all five as CTest skipped. Only unset dependencies take that path.
- `git diff --check` passed after the final edits. No broad gate was run. Existing unrelated
rollout changes in both worktrees remain untouched.
- Completion: followup contract implemented and focused evidence recorded. Next action: stop;
lead may consume this checkpoint for the coordinated source-stable gate.
- Implemented nonserialized `MT19937::words_drawn()` accounting. It resets on `seed()` and
successful `load_state()` and is not included in save serialization.
- `CountingRandom` now measures bounded-integer rejection consumption from that monotone count,
so a rejection loop may cross any number of twists.
- Removed S13 wrapper aggregation of P01..P12 counters; appended player records are the only
contributors to final turn totals.
- Added MT boundary/rejection and reset/load tests, plus an app corpus test that validates
reported RNG words against the independently persisted generator post-state.
- Corpus absence now returns 77 for app/census tests; unreadable or parse-error saves fail and
nonzero executed saves remain required. CTest skip properties were added to dependency tests.
- Verification: fresh build at `/tmp/opencode/sots-engine-accounting` configured and built
successfully. `SOTS_SAVES_DIR=/home/alex/sots-re/verify/results/saves ctest --output-on-failure`
passed 52 of 59 tests; the remaining 7 were reported by CTest as skipped.
- Skip inventory verified with verbose CTest: `game_config_replay` lacks `SOTS_M1_TRACE` and
`SOTS_DATA_DIR`; `game_data_realdata`, `game_design_realdata`, and `mars_text_realdata` lack
data inputs; `game_design_census` lacks `SOTS_DATA_DIR`; `game_sim_smoke_real_save` lacks
`SOTS_SAVES_JSON`; `mars_vfs_realdata` lacks `SOTS_GOB_DIR`. No configured corpus failure was
skipped: `app_turn`, `app_turn_record`, `mars_stream_save`, and `mars_stream_domains` executed
against the required saves directory and passed.
- Focused rerun passed `mars_rng_unit`, `app_turn`, and `app_turn_record`; `game_design_census`
was CTest-skipped for its missing data-root dependency. `git diff --check` is clean.
- Limitation: full asset-dependent acceptance remains unavailable locally because the listed asset
and trace paths are unset. The configure cache does not consume `-DSOTS_SAVES_DIR`; the required
path was supplied to CTest through its runtime environment.

View file

@ -0,0 +1,33 @@
# Engine worker assignment
You are an implementation worker, model openai/gpt-5.6-terra. Read architecture-decision.md.
Implement only accounting defects and honest test execution in /home/alex/sots-engine.
Keep /home/alex/sots-re/campaign/rollout/engine-worker-state.md updated every 20 calls/15min,
before compaction and stopping. You alone own src/app accounting changes, RNG support needed
for accurate draw counts, tests/ and CMake test properties. Lead owns engine docs/config.
No commits, staging, push, deployment, agents or architecture changes. Use apply_patch.
## Contract from Astra
1. Fix CountingRandom in src/app/turn.cpp counting inclusive integer RNG draws across twist(s)
including rejection draws. Count actual words consumed; do not repair using modulo that assumes
at most one twist. Preserve generator output and save layout. Minimal exact mechanism, focused
tests with twist boundary and rejection coverage. Adding nonserialized monotone draw accounting
to MT19937 is acceptable if needed; reset/load semantics must be explicit and tested.
2. Fix final turn aggregation: S13 wrapper aggregates player phases then appended children are
counted again; replay totals before reset disappear. Reports must count each operation exactly
once, preserve replay writes, and reflect actual generator advance. Inspect existing architecture
before edit. No game behavior or broader phase integration changes.
3. Make missing dependency tests report CTest Skipped using CTest SKIP_REGULAR_EXPRESSION
or return 77 + SKIP_RETURN_CODE consistently, including current seven asset/trace skip cases.
Configured-but-invalid corpora must fail. app_turn currently can drive zero saves and still pass:
fix unreadable/erroring saves to fail and require nonzero executed saves when configured.
Test real state changes/accounting independently rather than trusting own logged counters.
4. Avoid changing test count if new cases fit existing test executables. If new CTest identity is
necessary record exact inventory change for lead/gate worker. Run fresh CMake host build in a
NEW /tmp/opencode directory with SOTS_SAVES_DIR=/home/alex/sots-re/verify/results/saves; inspect
actual skipped outputs, run regression suites appropriate to changes. Assets unavailable on
local host is expected, not a surprise or permission to waive full acceptance.
Return checkpoint: code changed, test commands/results, remaining limitations; write any
scope-changing surprise with concrete evidence for Astra, pause affected work until reviewed.

View file

@ -0,0 +1,122 @@
# Controls formal verifier checkpoint
## Fresh verifier quantum plan — run-cb15199f9272fe496bd10a8a
Actor `controls-independent-verifier`; role `verifier`; requested model
`openai/gpt-5.6-terra`; session `run-cb15199f9272fe496bd10a8a`. This is an
independent re-execution, scoped only to `controls-bootstrap` /
`controls-negative-paths`; it is neither original-assisted validation nor a
partial/full engine comparison, independent replacement, or integrated replay.
Falsifiers defined before execution: (1) the current canonical source binding,
declared executable/input/result hashes, contract basis, or no-open-surprise
state differs from the handoff; (2) the complete suite has any failure, error,
skip, or fewer than the declared 37 distinct tests; (3) old intact recovery,
stale end checkpoint, and artifact-tampered recovery do not separate as
required; (4) same-HEAD candidate or canonical-integrated byte mutation is not
rejected before verdict/promotion; (5) the added verifier integration route
allows owner overlap, source drift, or an open surprise; (6) the actual launch
record lacks a real session, successful `stop`, matching fresh checkpoint,
zero return, or source-before/source-after equality. Required branch/state
exposures are valid-old/tampered/stale recovery; candidate/canonical-integrated
same-HEAD mutation; verifier verification/integration entry versus owner,
source-drift, and surprise negative controls; and real launch record versus
fake-process unit simulation. No RNG/stateful game workload is in contract, so
RNG accounting is inapplicable rather than assumed satisfied.
Pre-execution observations: all three recorded surprises are resolved;
canonical and paired-worktree HEADs equal the pinned commits, while canonical
trees are intentionally dirty and paired launch trees are clean. Candidate
source binding is distinct from the canonical evidence binding and will not be
substituted. The R8 correction invalidated the prior formal verdict; its new
evidence claims 37 tests. Next: checkpoint this plan, then independently
rehash/revalidate and run the full suite plus held-out negative controls.
## Fresh reproduction results — run-cb15199f9272fe496bd10a8a
Canonical `source-binding controls-bootstrap` produced the attached evidence's
engine digest `ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd`
and RE digest `6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8`.
`campaign.py validate controls-bootstrap` passed. Independent byte hashes of
the two declared binaries, three declared inputs, and outcome package all
exactly match the contract. The package has 37 unique expected and 37 unique
passed method names, with no missing or extra names, return code zero and
`status: passed`.
`PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s verify/campaign
-p 'test_*.py' -v` reproduced **37/37**, zero skips/errors/failures, in 7.049
seconds. The independent held-out negative-control rerun of old recovery,
same-HEAD verdict/promotion drift, canonical integrated RE mutation, and final
integrated-verifier guards reproduced **4/4** in 1.093 seconds. Thus every
defined control branch exposed by these tests behaved as predicted; no failed
prediction was observed.
Independent parsing of the actual non-fake run record found 24/24 JSONL events,
zero error events, one completed/observed actual session, return code zero, a
`step_finish` reason `stop`, source-before equal source-after, and the matching
checkpoint session. Its observed model remains `unavailable`; it is an actual
Astra architecture-review launch, **not** a direct Terra normal-worker
execution. This is a residual/provenance limitation, not evidence of a Terra
execution, but does not falsify the narrowly worded unit-test criterion.
Decision: record a fresh scoped passing verifier verdict for the exact current
nonintegrated evidence only. Do not claim integrated acceptance, whole-engine
behavior, original comparison, replacement, replay, or game RNG/state
coverage. Exact next action: lead may attach a source-bound integrated package,
after which a fresh independent verdict must bind its changed evidence digest.
Actor `controls-independent-verifier`; role `verifier`; model
`openai/gpt-5.6-terra`; session `controls-independent-20260909-formal-1`.
## Scope and pre-execution falsifiers
This is a source-bound verdict only for `controls-bootstrap` criterion
`controls-negative-paths`, not engine, assets, research replacement, or an integrated package.
The verdict would fail if the attached artifact/binary/input hashes or either canonical source
manifest differed; if the suite had a failure, skip, or fewer than 36 tests; if old recovery
accepted corrupted artifacts or rejected solely for age; if a same-HEAD byte change did not
invalidate verdict/promotion; or if the purported normal launch lacked a real session, stop,
fresh matching checkpoint, zero return, or unchanged paired-worktree state. Required distinct
states were intact-old versus stale-end versus tampered recovery, candidate-engine versus
integrated-RE same-HEAD mutation, and real normal launch versus fake-process unit simulation.
## Independent observations and reproduction
Read `AGENTS.md`, `campaign/README.md`, contract
`campaign/contracts/controls-bootstrap.json`, current checkpoint
`campaign/runtime/checkpoints/controls-bootstrap-243f539b3219e74f12ef0db7.json`, raw evidence,
raw run JSON/JSONL/stderr, and Astra review `campaign/rollout/independent-review.md`.
`python3 tools/campaign.py --state-root /home/alex/sots-re source-binding controls-bootstrap`
recomputed engine `7741d42fc5e4e761e6449bdaf0e4a61d00036a23` digest
`ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd` and RE
`3bfde5a70d874a723e797a695bbd847fd82c0aa7` digest
`82fc34631b2baa2ee74557020f74d68cc4db3c031561210f9933a3f22d7ff7b6`, exactly matching
the attached evidence. Independently rehashed all declared binaries, inputs, and result artifact;
each matched its declared SHA-256. `campaign.py validate controls-bootstrap` passed.
`PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s verify/campaign -p 'test_*.py' -v`
ran **36 tests**, all passed, zero skips, in 6.720 s. Held-out focused rerun:
`python3 -m unittest -v verify.campaign.test_controls.Controls.test_old_recovery_checks_integrity_but_not_age verify.campaign.test_controls.Controls.test_same_head_source_mutation_rejects_verdict_and_promotion verify.campaign.test_controls.Controls.test_integrated_re_source_mutation_rejects_acceptance`
ran 3/3 pass (0.722 s). The inspected tests require an old intact checkpoint to launch but reject
its stale end-checkpoint use and a post-checkpoint artifact modification; they alter candidate
engine and canonical RE bytes without changing HEAD and require source-content rejection before
verdict/integration/acceptance.
The actual, non-fake normal-launch record
`campaign/runtime/runs/run-df1472c13f31db3a4d5361f0.json` hashes to
`65dd1c1286742cd4d2401af5a229d7d014f60dd329dadee0dee78c499f61d663`.
Its JSONL has 24 parseable events, exactly one actual session
`ses_f77cf5062ffeTknrMfnbJMmdNh`, a `step_finish` with reason `stop`, return code 0, zero error
events, matching launcher checkpoint/session, and `source_before == source_after` for both paired
worktrees. Raw stderr is empty. Observed model is correctly `unavailable`, not fabricated; this
is an actual Astra architecture-review smoke, not evidence of a Terra worker launch.
## Decision and residual
Pass is justified only for the one declared controls test criterion and the exact nonintegrated
binding above. Astra R8 remains a separately recorded residual: the current launcher permits a
verifier in `verification` but not `integration`; it prevents the later fresh integrated-verifier
launch and requires Astra resolution. It neither converts this reproduced nonintegrated suite into
whole-engine acceptance nor is hidden as success. Exact next action: lead resolves R8, attaches
an integrated controls package, then obtains a new independent verdict over its changed digest.

View file

@ -0,0 +1,32 @@
# Independent controls verifier — bounded formal acceptance task
Model openai/gpt-5.6-terra; role verifier; actor controls-independent-verifier.
No implementation/source/document edits, no delegates/commits/lab actions. Own only your
canonical runtime checkpoint/verdict for controls-bootstrap, plus
campaign/rollout/formal-verifier-state.md. Read canonical AGENTS, contract and current evidence.
Do not rely on lead summary. Inspect recorded tests/raw stderr/source bindings and reproduce
the complete control suite (now 37 tests after R8). Challenge old-checkpoint recovery,
same-HEAD source drift and final integrated-verifier launch guards specifically.
Read independent Astra review, noting it is distinct from this formal source-bound verdict.
Source-bound test package is already attached to controls-bootstrap, state verification.
R8 is now formally resolved by Astra (d-6239404c8f40351310c8abf0); the one-line role/status
fix and added guarded integration regression require refreshed source-bound verification.
Validate ALL evidence/inputs/binaries/source_binding through campaign API/CLI, independently run
the appropriate local unit suite, inspect the actual normal-launch record
campaign/runtime/runs/run-df1472c13f31db3a4d5361f0.json and its JSON events/checkpoint to confirm
real session/stop/no source mutation. Do not mistake fake-process tests for that real launch.
If running in integration: source/package revalidate the final integrated evidence; no repeat
suite is needed if hashes match your just-reproduced verification package. New verdict must
bind the changed integrated evidence digest. If contract criterion holds and no new blocker, record a passing
verdict with campaign CLI: --actor controls-independent-verifier --role verifier
--model openai/gpt-5.6-terra --session controls-independent-<unique> --verdict pass
--explanation scoped to actual controls tests. If not, record fail with precise evidence.
Never widen this to whole-engine/full-assets/research acceptance.
Write a checkpoint with your actual actor/model/role/session, immutable evidence artifact(s),
test outcomes and exact next action. Lead will then promote same package to integration and ask
for final source/package revalidation; no redundant tests needed if all source/input hashes are
identical, but changed integrated evidence digest needs a new independent verdict.
At completion stop. Checkpoint before 40-step quantum limit. No alias model substitution.

View file

@ -0,0 +1,56 @@
# Astra integration followup — repair gate/report acceptance gaps
First session delivered useful initial tooling but incomplete enforcement. Same file ownership,
fresh bounded session openai/gpt-5.6-terra. Read independent-review.md if present and your checkpoint.
No delegation, commits, live lab operations or architecture changes. This is a precise Astra
approved repair contract, not permission to waive any of the initial requirements.
Fix these inspected defects and write adversarial tests proving them:
1. `corpusNonzero` cannot be absence of "0 save" in ctest --output-on-failure. Parse per-test
JUnit system-out positive summary counts for all four corpus tests; require count equals manifest
top-level saves count (tests scan top-level, do not hash nested unexecuted .sav as exercised).
Missing summaries, zero/mismatched count and duplicates fail. JUnit executed identity multiset
must exactly match discovered/expected inventory (including tests absent from XML -> fail).
2. Source copy integrity: compare every copied byte hash/mode to pre-copy snapshot BEFORE build.
`startswith('build')` excludes actual source filenames like build_turn.cpp. Exclude only top-level
known build output directories or explicitly named runtime artifact directories. Track deleted
files and symlink semantics or reject source symlinks explicitly. Snapshot includes untracked files.
3. Require tools versions and complete hashes for actual supplied SOTS_* file/dir dependencies,
assets and trace inputs. Explicitly sanitize inherited SOTS_* environment or validate/hash each
consumed input. Record roots, actual env settings, compiler/build settings and skip limitations.
4. --shim should be a boolean flag; use source cmake/toolchain-mingw-i686.cmake. Full requires
--data and shim build; --shim on host also builds. Check resulting DLL hash. Initial --shim PATH
requires directory but passes directory to CMAKE_TOOLCHAIN_FILE, unusable. Correct docs/help/tests.
5. RE identity mutation: don't hash transient campaign runtime/publication state as executable
source. Bind actual RE tooling inputs via immutable copies or hash list before+after; list excludes
only runtime/evidence output areas explicitly. Engine source must be stable before+after. Gate
should run while other independent campaign checkpoints change without falsely claiming tools
are mutable. Detect actual gate/checksum/inventory source mutation.
6. run/errors: subprocess exceptions need failed manifest, expected actual statuses must hold,
input roots/output roots must not overlap, jobs positive, binary must exist for passing gate.
All required checks explicitly present, not all(empty) success. `all` over strings is unsafe.
7. Standalone reporter: verify passed gate schema and binary hash/source identity thoroughly.
Preserve full stderr/stdout and complete paths/diffs. --roundtrip only if CLI semantics means
verify then SIMULATE (inspect src/app/main.cpp; don't accidentally test identity instead of turn).
Distinguish accepted ON SELECTED WORKLOADS from campaign replacement acceptance; reporter is
measurement by default and --accept file equality criterion explicitly documented. Hash all
engine-arg file inputs (commands/data) actually used, prevent extra args overriding --out/metric
or injecting --roundtrip-only/etc. Detect binary/input mutation after run too. Keep required
coverage and equality separation. Add negative-path tests missing pairs, binary mismatch,
malformed/failed manifest, missing coverage, pair failure, wrong reference and unexpected args.
Do not rerun integrated gate until lead says source stable. Unit tests and fixture negative paths
now; checkpoint exact manifest/CLI shape and results. Main will run fresh final gate later.
## Astra resolution of independent review R2
The equality reporter must NOT claim campaign acceptance. Replace --accept with --require-match
(no legacy alias). This flag only requires all selected pairs to match and affects exit status;
report status remains `measured` on a valid measurement, including when equality holds. Add
`matchRequired` and `allPairsMatch` booleans and an explicit scope statement. A failed required
match has status failed and retained residual evidence. ONLY campaign controls + independent
verdict/integrated criteria can produce accepted status. This removes no-op-as-accepted semantics
without pretending a general equality tool can infer whether a workload exercised research.
Test identical input/oracle can be measured but never gets `accepted`; full gate source validation
still required. Pilot provides required positive phase/branch controls separately.

View file

@ -0,0 +1,76 @@
# Gate worker checkpoint
Timestamp: 2026-09-09T22:05:00Z
Model/session: openai/gpt-5.6-terra, bounded Astra-followup implementation session.
## Contract and source identities
- Active repair contract: `campaign/rollout/gate-followup.md`; read the prior worker checkpoint,
`gate-worker.md`, `architecture-decision.md`, workflow, and reviewer checkpoint. No
`independent-review.md` exists in this checkout.
- RE source is `/home/alex/sots-re`; the worktree is already dirty with other lanes' changes.
Owned files remain `tools/{gate.sh,gate.py,evidence.py,standalone_report.py}`, `verify/tooling/`,
and this checkpoint. No staging, commits, or lab activity.
- Engine inspected at `/home/alex/sots-engine`, HEAD
`7741d42fc5e4e761e6449bdaf0e4a61d00036a23`, dirty from concurrent engine work. Its
`src/app/main.cpp` confirms `--roundtrip` verifies untouched serialization and then calls
`RunStrategicTurn`; it must remain part of the reporter invocation, not replace turn simulation.
- The required shim toolchain is the source-relative
`cmake/toolchain-mingw-i686.cmake`; its output target is `binkw32.dll`.
## Observations and decision
- Existing gate defects match the repair contract: source exclusion used `startswith("build")`,
copy integrity was not verified, source symlinks/modes/deletions were not represented,
inherited `SOTS_*` inputs were retained, JUnit completeness/corpus summaries were fail-open,
`--shim` took an unusable directory/toolchain path, and manifest success used unsafe generic
`all(checks.values())`.
- Existing reporter only checked gate schema/status and binary hash; it permitted unsafe engine
arguments and did not detect provenance/binary/input mutations after execution.
- This is ordinary implementation repair within the approved contract. Do not run an integrated
gate while the engine source is mutable.
## Implemented repair
- `tools/gate.py` now snapshots tracked and nonignored untracked engine files with complete
SHA-256 and mode records, rejects source/input symlinks, excludes only exact top-level known
build outputs, checks every copied file before the build, and detects additions/deletions/mode
and content changes after the run. RE tooling identity is an explicit immutable list rather
than mutable campaign runtime/publication state.
- The gate sanitizes inherited `SOTS_*`, accepts declared extra dependencies as repeatable
`--sots-input SOTS_NAME=PATH`, records roots, hashes full consumed file/directory inputs,
compiler/tool versions, commands, and actual environment. Input/output root overlap and
nonpositive jobs are rejected.
- `--shim` is now boolean. Host is always built; `--shim` also builds the source-relative
`cmake/toolchain-mingw-i686.cmake` configuration and hashes exactly one `binkw32.dll`. Full
requires `--data --shim`.
- JUnit records every testcase/system-out. Its executed identity multiset must be the expected
inventory with no missing/duplicate identity; statuses must cover every expected test without
failures or unexpected skips. Each of the four corpus tests must report exactly one positive
`N save(s)` count equal to the top-level corpus save manifest count.
- `tools/evidence.py` validates all passed-gate source, binary, test coverage and required-check
fields. `tools/standalone_report.py` binds binary/provenance/pair/engine file inputs before and
after execution, retains complete child stdout/stderr and differences, blocks output/metric/
roundtrip argument overrides, and records that `--roundtrip` verifies serialization before
`RunStrategicTurn`. Measurement remains scoped to selected workloads; `--accept` fails unless
all selected pairs match on file, inflated and state digests.
## Validation
- `python3 -m py_compile tools/gate.py tools/evidence.py tools/standalone_report.py verify/tooling/test_tooling.py`: pass.
- `python3 -m unittest verify/tooling/test_tooling.py -v`: pass, 15 tests. The expected argparse
diagnostics occur in rejection tests. Tests exercise build-named sources, pre-copy mutation,
symlink rejection, JUnit duplicate/positive counts, subprocess exception, incomplete/failed
provenance, binary mismatch, unsafe arguments, missing pair, wrong reference and pair failure.
- `git diff --check`: pass. `python3 tools/gate.py --help` and
`python3 tools/standalone_report.py --help`: pass.
- Per contract, no integrated gate, commits, staging, live lab operation, or architecture change
was performed.
## Blocker and exact next action
- The engine checkout remains dirty/concurrently owned, so any integrated measurement is still
invalid. This repair provides no acceptance result.
- Exact next action: lead coordinates a stable baseline-pinned engine identity, then a fresh
worker runs the documented gate CLI once in a new external output directory and independently
verifies the resulting evidence package.

View file

@ -0,0 +1,50 @@
# Gate worker assignment
You are an implementation worker, model openai/gpt-5.6-terra. Read architecture-decision.md.
Implement, do not merely advise. Work only in your owned files in /home/alex/sots-re:
tools/gate.sh, tools/gate.py, tools/evidence.py, tools/standalone_report.py, verify/tooling/.
Keep campaign/rollout/gate-worker-state.md updated every 20 tool calls/15min and before stopping.
No commits, stage, push, deployment, other agents, architecture changes, or shared dashboard edits.
Use apply_patch for edits. Scope changes/surprises go into checkpoint and back to the Astra lead.
## Contract from Astra
Replace the old remote overlay gate with a local, reproducible stdlib Python gate and tiny shell
entrypoint. CLI: --engine PATH --corpus PATH --out NEW_DIR --profile host|full (default host),
--data PATH optional, --jobs N, --shim optional (full requires shim and assets). Run locally only;
documentation will tell operators to run same command on a leased lab host. Every build is fresh
from a source snapshot (git tracked + nonignored untracked files; exclude .git/build outputs,
never accidentally hash/copy build dirs). Manifest source relative paths + SHA256, git HEAD/dirty,
tools versions, corpus hashes, input asset hashes when used, binary hash, all commands and complete
logs. Detect source/input mutation across run. Out must be new, never delete/reuse existing output.
Capture an explicit expected test list checked into verify/tooling/host-tests.json (59 currently;
engine worker may add tests so coordinate mismatch to lead). Compare discovered CTest json list
exactly to this inventory. Execute CTest once with output junit and parse all test statuses; skips
must be visible (engine worker is adding properties). host profile allows explicit skip list for
asset/trace dependent tests (currently seven); corpus tests must run. full profile requires all
tests not skipped; users supply needed SOTS_* dependencies, record/hash their paths too. Require
nonzero save corpus and nonzero execution for corpus tests (parse their positive summaries).
Run engine clean_room_check.sh + check_shim_configs.py, host build, optional shim build; preserve
return codes. Emit out/manifest.json with schema sots-gate/1, status passed|failed, profile,
source (engine identity and RE identity), inputs, binary {path,sha256}, tests {expected,passed,
skipped,failed}, checks and limitations. Failed checks produce failed manifest and exit nonzero.
Avoid self-referential source hashes if out lies inside RE: exclude output runtime area explicitly
or require out outside source trees. No network required. Include focused unittest tests for
missing input, stale output, source hash mutation, zero tests, skip classification, wrong inventory.
Rewrite standalone_report.py if simpler, no backward compatibility necessary. Require --binary,
--provenance (gate manifest), --out NEW_DIR, --pair INPUT ORACLE (repeatable), --engine-arg repeated,
--accept flag. Measurement permits divergences but returns nonzero on any invalid inputs,
coverage failure, execution failure. --accept requires every selected pair to match exactly.
Verify binary hash + passed gate manifest before running, explicit source binding via gate.
Never choose another reference on failure. Record input/output hashes, full stdout/stderr,
all named differences, source identity and gate hash; no overwritten canonical results.
Fields fileByteMatch, inflatedByteMatch, stateDigestMatch. Coverage required on all saves.
state_checksum may prove inflated rather than compressed roundtrip: label precisely.
Avoid old byteMatch aliases or hardcoded stale RNG claims. Manifest schema sots-standalone/2,
status measured|accepted|failed, pairs[], provenance. No leaf percentage for completeness.
Add negative-path tests with fixture/fake runner as needed, and run real canonical pair using
the lead's eventual gate build if available (otherwise defer that integration check).
At completion write checkpoint with modified files, exact tests/results, API shape and blockers.
Do not claim full acceptance from host checks. Main agent will inspect and integrate.

View file

@ -0,0 +1,46 @@
# Final housekeeping quantum — existing proven procedure, GPT-5.5 lab role
User confirmed passwords should be stashed. Previous Terra session found provisioning ISO password
and proved VM146 console autologon after reboot using LSA path. Read its checkpoint PLUS last
section of /tmp/opencode/sots-housekeeping-followup.log (completion details after stale checkpoint).
Preserve source of credential privately, never print secret or command args. No password reset.
Use role lab / model openai/gpt-5.5, actor housekeeping-completion for NEW leases. Previous worker
acquired vm140/vm144/vm146 and spicy-autounattend-credential leases under housekeeping-worker / verifier
/ Terra; inspect lease JSON and completed processes before proceeding. You may ask lead to release
those stale worker leases; do not impersonate its role/model. Lead is authorizing release after
confirming previous worker process stopped, outstanding mount cleaned and SSH/access validated.
Record which resources still held when ending. No delegates/commits or codebase architecture edits.
## Astra corrections/decisions
- VM141 canonical address is **192.168.10.143**. Previous 'No route' check incorrectly used .141.
Do not diagnose guest outage until checking its verified .143 identity/MAC. Other addresses:
VM140=.139, VM144=.144, VM145=.145, VM146=.146. Confirm actual identities from hypervisor.
- Protected-secret presence alone was insufficient (VM144 failed); use existing PROVEN provisioned
password via secure stream, validate LogonUser, set LSA, then reboot free guest to prove login.
- VM146 succeeded. Its current consumer M365Copilot/OfficeHub process appeared after login and
Remove-AppxPackage -AllUsers failed. Prefer targeted per-user removal or disabling its documented
startup entry and stopping this identified consumer process; do not remove generic webview or
system packages indiscriminately. Record any package removal blocked; don't hide it as compliant.
- Active console/passive VNC is not itself a test. Non-disruptive cleanup is allowed if actual
test/tool activity absent. Reboot only known free guests. VM140 already had a logged-in console;
keep its session unless user/test activity demonstrably absent and a reboot is necessary.
## Finish
1. Verify current vm146 SSH+console result, cleanup any temporary credential ISO mount, release
stale leases through lead as noted. Persist last session's actual outcomes to checkpoint.
2. VM144 and VM145: apply proven protected autologon with ISO credential, reboot if free, verify
console re + keySSH + intended debloat policies/startups. VM141 use CORRECT .143 address and
perform same. VM140 verify existing login/config, apply missing non-disruptive cleanup.
3. Ensure all five have targeted consumer startups disabled, update auto-restart/task interference
controls set, no currently identified consumer nag process; preserve SOTS/graphics/runtime/access.
4. Update guides/windows-lab-housekeeping.md and per-VM verify/results/housekeeping/*.json with
exact current result, including actual reboot proof vs config-only. Record model/role accurately.
5. At quantum end update campaign/rollout/housekeeping-worker-state.md and release YOUR leases;
explicitly report any blocked guest/subtask. Stop at 40 steps with exact next action if needed.
Owned files: same tools/windows-housekeeping/, guides/windows-lab-housekeeping.md,
verify/results/housekeeping/, housekeeping-worker-state.md. Routine execution only; Astra handles
any new plan-changing surprise. Existing script mutation bugs may be fixed in own scope.

View file

@ -0,0 +1,42 @@
# Astra continuation — complete free guests and protected autologon
Read housekeeping-worker-state.md and lead-state.md. Same ownership, Terra model, no delegates.
User asked for all five VMs plus passwordless logins; continue beyond policies on only two guests.
## Astra decision on activity
An active dedicated `re` console session or passive VNC proxy ALONE does not constitute a test.
Inventory VM140/144/146 for actual SOTS/game, debugger, capture, UI automation, running scheduled
test tasks and recent harness activity. If absent, apply non-disruptive policies serially without
logging off/rebooting or closing user's tools. The user authorized removing consumer interference
so OneDrive/Copilot presence alone is a target, not a blocker. Actual active test/interactive task
must remain untouched. Report exact process/task/time evidence for any remaining blocked guest.
Use the canonical lease CLI now provided in tools/campaign.py; no custom lock format needed.
Clean up only your previously created empty custom directories if incompatible with new leases.
## Autologon investigation and implementation
Do not stop at "no protected-secret tool verified" without investigating. Supported Sysinternals
Autologon stores password as an LSA secret and is suitable for dedicated lab accounts. Discover
existing installation/infra procedure; use verified Microsoft download if needed. Alternatively
Windows LsaStorePrivateData with a small reviewed script is the same protected-secret mechanism.
Use the existing account password from the documented credential store, never change it or print
it. Do not place it on command lines, in repository/temporary script files, stdout or logs. If a
utility only accepts plaintext command-line passwords, use its UI securely or the LSA API with a
secret passed over a protected channel/in memory, and zero memory when feasible. Preserve remote
SSH key auth. Do NOT use DefaultPassword plaintext registry value. Inspect any existing autologon
configuration without logging secrets; do not read/print password values in inventory.
Verify AutoAdminLogon + username/domain + existence (NOT CONTENTS) of protected secret. Need a
free guest and recorded recovery path to reboot and prove actual autologon. If reboots cannot be
done while viewer/session active, report configuration verified but login-after-reboot unverified.
If credential store lacks the existing password, report that exact missing dependency for user;
do not reset passwords or pretend config-only is demonstrated login.
## Debloat quality
Policies alone may leave current OneDrive/Copilot/Xbox/consumer scheduled startup active. Inventory
startup entries, consumer processes and scheduled tasks, remove/disable targeted consumer startups
and app packages only where safe for dedicated lab. Preserve all game/runtime/remote tooling.
Record exact differences and idempotence verify all intended policy/task/startup settings.
Keep guest-by-guest outcome in evidence and checkpoint. No false all-five completion.

View file

@ -0,0 +1,39 @@
# Housekeeping Worker Checkpoint
Updated: 2026-09-09T21:33:40Z
- Verified targets: VM140 `192.168.10.139`, VM141 `192.168.10.143`, VM144 `192.168.10.144`, VM145 `192.168.10.145`, VM146 `192.168.10.146`; each matched its configured MAC and `SOTS-RE` hostname.
- Model/session: `openai/gpt-5.6-terra`, current OpenCode session. Sources: `campaign/rollout/housekeeping-worker.md`, `campaign/board.md`, `findings/subsystems/running-the-game.md`, `/home/alex/trikilli/services/re-lab.md`, and `/home/alex/trikilli/hosts/spicy/AGENTS.md`.
- Access: key-based SSH as the existing `re` lab account succeeded on all five guests. No credential was read, logged, or changed.
- Activity inventory at 2026-09-09T21:29Z: VM140 had active `re` console session 1 but no SOTS, debugger, capture, UI automation, or running SOTS/test task; VM144 and VM146 had no console user and no matching process/task. The host had passive `qm vncproxy` processes for VM144 and VM146 only. Under the Astra clarification this does not block non-disruptive maintenance. VM141 became unreachable (`No route to host`) during later read-only tooling discovery and remains untouched this continuation.
- Leases: custom directory locks for VM141/VM145 were acquired before the controls-worker lease CLI appeared. Both are now released after verification.
- VM141: all eight policy values and all present selected tasks verify compliant in `verify/results/housekeeping/vm141-result.json`. `sshd` is automatic/running, no SOTS process exists, no reboot performed. The initial missing-value and registry-key recreation defects were corrected in the idempotent script before the final successful run.
- VM145: all eight policy values and all present selected tasks verify compliant in `verify/results/housekeeping/vm145-result.json`. `sshd` is automatic/running, no SOTS process exists, no reboot performed.
- VM140: acquired canonical lease `vm140` as `housekeeping-worker` / verifier / `openai/gpt-5.6-terra` at 2026-09-09T21:32:34Z. Applied the same policy/task cleanup without logging off or rebooting; all eight policy values and all present selected tasks verify compliant in `verify/results/housekeeping/vm140-result.json`. `sshd` remains automatic/running; six `msedgewebview2` processes remain in the active console and were deliberately not terminated because their owning application was not identified.
- Exact changes on each completed VM: disable Windows consumer/soft-landing/spotlight/Copilot, feeds/widgets, Game DVR, OneDrive sync, and logged-in-user automatic-update restart policies; disable present WER QueueReporting, CEIP Consolidator/UsbCeip, and Defender scheduled scan tasks. Maps was already disabled; the OneDrive and Kernel CEIP tasks were absent.
- Protected access: the former assertion that autologon was unconfigured is falsified for VM140: its verified result reports `AutoAdminLogon=1`, `DefaultUserName=re`, a present protected `DefaultPassword` LSA secret, and no domain value. The secret contents were not read. VM145's earlier direct inventory reported `AutoAdminLogon=0`, `DefaultUserName=re`, and the protected secret present; this difference needs per-guest verification. No plaintext registry password was used. Key-based SSH was verified before and after VM140 changes.
- Autologon implementation investigation: no Sysinternals Autologon binary was found on VM145; the documented `pass` inventory did not list a SOTS/re-lab credential entry, while the provisioning ISO exists on `spicy` at its documented location. Added reviewed stdin-only LSA implementation to `tools/windows-housekeeping/Invoke-Housekeeping.ps1`: it validates the existing local `re` credentials using `LogonUser`, writes only the LSA `DefaultPassword` secret via `LsaStorePrivateData`, then sets the non-secret autologon registry fields. It zeroes its unmanaged secret buffer. It has not yet been invoked because VM140 was already configured and the credential source has not been safely exercised.
- VM144 autologon pre-reboot checkpoint: the existing protected `DefaultPassword` secret was present, so `EnableExistingAutologon` set only `AutoAdminLogon=1`, user `re`, and domain `SOTS-RE`; no secret content was read or replaced. The guest had no console user/test activity, `sshd` was automatic/running, and key SSH had just succeeded. Recovery path if console autologon fails: key SSH remains available to set `AutoAdminLogon=0`; no credential reset or plaintext secret is required.
- VM144 reboot result: SSH recovered with `sshd` automatic/running but `quser` reported no user after 30 seconds. Reverted only `AutoAdminLogon` to `0`, preserving the protected secret; final result is `verify/results/housekeeping/vm144-result.json` with all debloat controls compliant and autologon explicitly noncompliant. This is positive evidence that the inherited protected secret cannot be treated as the current credential.
- Credential-source correction: `pass` has no SOTS/re-lab entry. The documented provisioning ISO was read under a canonical `spicy-autounattend-credential` lease through a temporary read-only mount, which was logged on the host. Its password is in `<Password><Value>...` (not the documentation's claimed `<AdministratorPassword>`); it is marked `PlainText=true`. An initial secure stream matched the incorrect tag and delivered no credential; no secret was exposed. The next action uses the corrected tag to stream directly into VM146's LSA configuration stdin, with no secret command-line argument, file, stdout, or log.
- Next action: configure VM146 using the corrected provisioned-password stream, reboot this free guest, and verify actual `re` console autologon plus SSH; unmount the ISO and release both leases afterward. Do not reboot VM140 while its active console remains.
## 2026-09-09T21:57Z housekeeping-completion pre-reboot checkpoint
- Model/session: `openai/gpt-5.5`, actor `housekeeping-completion`, role `lab`, continuation from `campaign/rollout/housekeeping-completion.md`; no delegates/commits/staging. Prior VM146 and `spicy-autounattend-credential` stale leases were lead-released before this quantum.
- Held leases before mutation: `vm140` token `f15ae24...`, `vm141` token `01112d...`, `vm144` token `e56f3a...`, `vm145` token `c9af3e...`, `vm146` token `09f644...`, `spicy-autounattend-credential` token `cac620...` under `housekeeping-completion` / `lab` / `openai/gpt-5.5`.
- Confirmed hypervisor identities: VM140 MAC `BC:24:11:5E:1C:FF` at `192.168.10.139`, VM141 MAC `BC:24:11:8A:11:F0` at corrected `192.168.10.143`, VM144 MAC `BC:24:11:BF:74:10` at `.144`, VM145 MAC `BC:24:11:9A:01:AA` at `.145`, VM146 MAC `BC:24:11:F0:F5:92` at `.146`; all report hostname `SOTS-RE` and matching guest NIC MAC.
- Activity check at 21:56Z: VM140 and VM146 have active `re` console sessions only; VM141/144/145 report no console user. No SOTS/game/debugger/capture/UI automation/running SOTS/test scheduled task was reported on any guest by the explicit process/task query. VM140 will not be rebooted because its active console is being preserved.
- VM146 was re-verified after prior reboot: actual `re` console autologon and key SSH worked. First verify observed Defender scheduled scan re-enabled and `OneDrive.Sync.Service`; rerunning the idempotent Apply disabled/stopped them, and the final Verify was copied to `verify/results/housekeeping/vm146-result.json` with `compliant=true`, no managed consumer processes, OfficeHub absent, SSH running/automatic and protected autologon compliant.
- Exact next action: copy the updated housekeeping script to VM140/141/144/145, apply targeted cleanup; stream the provisioned ISO credential privately into ConfigureAutologon for free VM141/144/145, reboot those free guests one at a time, then verify console autologon plus SSH and copy per-VM JSON artifacts.
## 2026-09-09T22:03Z housekeeping-completion final checkpoint
- Completed the routine assignment under `openai/gpt-5.5` / actor `housekeeping-completion` / role `lab`. No codebase architecture edits, commits, staging, FPU/game/config changes, password resets, blank passwords, or secret logging. The provisioned password was streamed only through stdin from a temporary read-only ISO mount on `spicy` into the guest-side LSA writer; no command-line secret or repository/temporary secret file was created. A post-run host mount check found no remaining autounattend ISO mount.
- Source/tool identities used: `/home/alex/sots-re` current worktree; `tools/windows-housekeeping/Invoke-Housekeeping.ps1` with LSA `ConfigureAutologon`, targeted OfficeHub per-user removal and consumer process/task cleanup; `guides/windows-lab-housekeeping.md`; infrastructure docs `/home/alex/trikilli/services/re-lab.md` and `/home/alex/trikilli/hosts/spicy/AGENTS.md`; prior raw log `/tmp/opencode/sots-housekeeping-followup.log` lines 1500-1802 for continuation basis.
- VM140 (`192.168.10.139`, MAC `BC:24:11:5E:1C:FF`): no active SOTS/game/debugger/capture/test task; preserved active `re` console and did not reboot. Applied updated cleanup; final artifact `verify/results/housekeeping/vm140-result.json` is `mode=Verify`, `compliant=true`, OfficeHub absent, no managed consumer processes, SSH running/automatic, protected autologon configured. Six generic `msedgewebview2` processes remain in the existing console and were not killed because the Astra correction said not to remove generic WebView/system packages indiscriminately.
- VM141 (`192.168.10.143`, MAC `BC:24:11:8A:11:F0`): corrected address was reachable; no console user/test activity before mutation. Applied cleanup, configured LSA protected autologon with credential validation, rebooted, and proved actual `re` console autologon plus key SSH/sshd automatic. Final artifact `verify/results/housekeeping/vm141-result.json` is `compliant=true` with no consumer processes/packages and autologon compliant.
- VM144 (`192.168.10.144`, MAC `BC:24:11:BF:74:10`): no console user/test activity before mutation. Replaced the previously failed inherited-secret approach by streaming the proven credential into LSA, rebooted, and proved actual `re` console autologon plus key SSH/sshd automatic. Final artifact `verify/results/housekeeping/vm144-result.json` is `compliant=true` with no consumer processes/packages and autologon compliant.
- VM145 (`192.168.10.145`, MAC `BC:24:11:9A:01:AA`): no console user/test activity before mutation. Applied cleanup, configured LSA protected autologon, rebooted, and proved actual `re` console autologon plus key SSH/sshd automatic. Final artifact `verify/results/housekeeping/vm145-result.json` is `compliant=true` with no consumer processes/packages and autologon compliant.
- VM146 (`192.168.10.146`, MAC `BC:24:11:F0:F5:92`): prior quantum's reboot proof was independently rechecked in this quantum (`re` console at 17:44 local, key SSH and sshd automatic). Idempotent Apply/Verify cleared a reappeared Defender scheduled-scan state and `OneDrive.Sync.Service`; final artifact `verify/results/housekeeping/vm146-result.json` is `compliant=true`, OfficeHub absent, no managed consumer processes, autologon compliant.
- Artifacts updated: `verify/results/housekeeping/vm140-result.json`, `vm141-result.json`, `vm144-result.json`, `vm145-result.json`, `vm146-result.json`, `guides/windows-lab-housekeeping.md`, `campaign/rollout/housekeeping-worker-state.md`, and `/home/alex/trikilli/hosts/spicy/AGENTS_LOG.md` (host-operation note). All six `housekeeping-completion` leases (`vm140`, `vm141`, `vm144`, `vm145`, `vm146`, `spicy-autounattend-credential`) were released at 2026-09-09T22:03Z. Exact next action: report completion; no blocked guest/subtask remains.

View file

@ -0,0 +1,49 @@
# Windows lab housekeeping — user authorized 2026-09-09
User: "spawn one more agent: housekeeping, each of the 5 windows VMs needs to be de-bloated.
MS bullshit is fouling the tests. also, passwordless logins, etc".
You are openai/gpt-5.6-terra, lab operator. Read applicable AGENTS.md and infrastructure docs in
/home/alex/trikilli (services/re-lab.md) and sots-re findings about running game, VM access,
current campaign/board.md VM rules before touching guests. Five likely guests VM140,141,144,145,146
on spicy; confirm actual identities/IPs. Do not guess targets. No delegation, commits, staging,
push, engine/research/tooling architecture changes. Use apply_patch to create/edit scripts.
Owned repository files: campaign/rollout/housekeeping-worker-state.md,
guides/windows-lab-housekeeping.md, tools/windows-housekeeping/, verify/results/housekeeping/.
Checkpoint every 20 tool calls/15min, before reboot, compaction and stopping. Never print secrets.
## Scope and authority
Inventory then implement targeted de-bloating on all five Windows test guests. Remove/disable
consumer app startup, OneDrive sync, widgets/news/consumer suggestions, Teams/Xbox overlays and
game capture, notification/focus-stealing nags, scheduled consumer updaters, update auto-restarts
and scheduled background scans that demonstrably interfere with deterministic lab runs. Prefer
repeatable PowerShell script + before/after inventory and per-VM results over click automation.
This is dedicated owned lab infrastructure. Preserve runtime dependencies, Windows servicing,
DXVK/Vulkan/graphics/audio, VC runtimes, game data/saves, shim, tools, networking, SSH/remote access,
Samba, guest agent, scheduled SOTS launch task and instrumentation. Do not uninstall random system
packages wholesale, alter game/FPU settings, disable firewall globally, or wipe profiles.
Passwordless means unattended console autologon for the existing dedicated test account and
key-based administrative access when supported; no blank passwords, unauthenticated RDP/SMB/SSH,
or repository-stored credentials. Reuse documented secure credential store. Prefer supported
autologon with protected secret storage. If only plaintext-registry autologon is available, stop
that subtask and report choice to lead rather than silently expose credentials. Do not change the
existing account password or remote authentication without verified access and explicit need.
First check actual guest processes and session activity, current runtime leases/checkpoints and
host task state. No other rollout worker is authorized live VM work. If unrelated tests or agents
are active, do not interrupt: report affected VM blocked and proceed to free ones. Existing board
FREE text may be stale. Acquire exclusive lease using new campaign tool if ready; otherwise hold
a canonical per-VM filesystem lock under campaign/runtime with owner/token and record it in your
checkpoint; coordinate lock format with controls-worker or ask lead. Keep remote changes serial,
verify administration access before/after, one guest at a time. Reboot only when free/needed and
validate login + remote access + interference checks afterward. Record any snapshot/restore point
IDs if using infrastructure's usual inexpensive snapshot procedure. No deleting snapshots/disks.
Required deliverable: idempotent script with inspect/apply/verify behavior and machine-readable
per-VM inventories and results, exact changes, remaining interference, login method and verification,
reboot/access status. No false green if a VM cannot be reached or operation is blocked. Capture
commands, timestamps, guest identities but sanitize credentials and private session data.
Any unexpected evidence requiring scope or architecture change -> checkpoint + Astra lead before
proceeding on affected change. On complete report each VM separately. Continue unaffected work.

View file

@ -0,0 +1,376 @@
# Independent rollout review
## Follow-up verdict — 2026-09-09
Independent execution: openai/gpt-6-astra, logical session `review-followup-1`;
actual harness session ID unavailable. **Selected host/shim baseline passes the reviewed
evidence-integrity scope. Controls require one additional correction (R8 below).**
Full asset/live-game and research-replacement acceptance remain unestablished.
This section supersedes the initial available-tree disposition for the source identities below;
the original findings are retained as history.
### Independently reproduced measurements
- Tooling: **19/19**, publishing: **8/8**, config/source scanner: **7/7**, controls: **36/36**.
Commands: `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s verify/DIR -p 'test_*.py' -v`,
with DIR respectively `tooling`, `publishing`, `config`, `campaign`. Total **70 tests**.
Disposable fixture repositories alone perform Git writes/commits.
- `PYTHONDONTWRITEBYTECODE=1 python3 tools/check_agent_config.py --resolved`: PASS, actual
OpenCode loader and exact model availability. No model execution inferred from availability.
- `campaign/current.json` selected gate SHA-256
`8e14e00ee3ce7478ddfdef8de12183451e858c52d78dc28cffbdee47f5d087d8` and replay
`87f92c2b54625ecbca1f3c0a37e57c43d03a4aff488edf4ea8a09a842cd6279d`: actual retained bytes match.
Gate/replay pass shared structural and publication validators; selection is measurement-only.
- Under `/home/alex/.local/share/sots-runs/rollout-host-20260909-c`, independently rehashed host
executable `78b2562ea2c56351f9f6f0f24d271afcced741eadbc148047780e6dfd101940b` and shim DLL
`381c91aecf10a9093f651f58c884356cd88e0253e79cb3bab32753fff6612c7e`.
**524 engine files and 10 RE execution-tool files** match both retained snapshots and current
source in bytes and modes. All **43** corpus files match their manifest. Engine baseline
`7741d42fc5e4e761e6449bdaf0e4a61d00036a23`; RE baseline
`3bfde5a70d874a723e797a695bbd847fd82c0aa7`; dirty identities come from manifests, not HEAD alone.
- Actual `ctest.xml` exactly matches embedded JUnit rows: **59 unique inventory identities,
52 passed, 7 allowed skips, zero failures**. Positive final summaries are exactly `[43]` for
`mars_stream_save`, `mars_stream_domains`, `app_turn`, `app_turn_record`. Every required check
is true; eight recorded gate commands exit zero; every JUnit output exists without truncation.
Skips: `game_config_replay`, `game_data_realdata`, `game_design_realdata`, `game_design_census`,
`game_sim_smoke_real_save`, `mars_text_realdata`, `mars_vfs_realdata`.
- Retained replay in `/home/alex/.local/share/sots-runs/rollout-replay-20260909` uses turn2 input
and turn3 oracle. Recomputed file/inflated/typed-state hashes of all three saves and complete
ordered diff list match: **62 state differences**, all three equality surfaces false.
Status correctly remains **measured**. This review recalculated saved outputs; it did not rerun
the full engine suite or build anything.
- Additional independent mutations of the selected manifest rejected missing binary, omitted
execution, duplicate execution, zero corpus count, omitted `outputComplete` requirement and
false `outputComplete`. These were in-memory fixtures, leaving selected evidence untouched.
Reproduction recipe for artifact checks: load current pointers with `dashboard.pointer`, run
`gate_valid`/`replay_valid`; rehash both binary paths; compare `gate.file_row` for every source row
under manifest live roots and retained `source`/`re-tooling`; recompute each `input_manifest`;
parse actual XML with `junit_statuses` and compare rows, inventory, allowed skips and corpus
summary counts; use `standalone_report.save_state` and complete `state_checksum.diff` on retained
pair paths. Temporary driver `/tmp/opencode/review_followup_checks.py` is disposable; this recipe,
measurements and the content-addressed selected manifests are durable evidence.
### Prior findings disposition
| Finding | Current disposition |
|---|---|
| R1 | Closed for inspected gate/package: exact unique execution partition, positive per-test corpus summaries, bound executable and output completeness; negatives reproduced. |
| R2 | Closed under lead's revised scope: reporter has no acceptance status/flag; equality is measured or failed, explicit inputs are hashed, inherited SOTS environment stripped, output retained. Equal-pair and require-match negatives pass. |
| R3 | Closed: `--shim` is now boolean and uses the recorded snapshot's MinGW toolchain file; actual selected DLL/hash and successful configure/build are retained. Full assets still unavailable. |
| R4 | Closed for approved controls implementation: current source bindings rehashed on evidence/verdict/promotion, immutable inputs/binaries and exact criterion outcomes required; same-HEAD candidate/integrated mutation tests reproduced. |
| R5 | Closed for actual selected host package: shared validator/publication accept the explicit 52/7 partition and expose limitations. |
| R6 | Closed: intact old recovery accepted, corrupt/missing state rejected, freshness retained at handoff/end, resolution-only Astra entry allowed with ordinary workers blocked; tests reproduced. |
| R7 | Closed for reviewed snapshot-copy defect: copy checks bytes/modes on both sides; current and snapshot inventories match. Pre-copy mutation, symlink and build-named-source tests pass. |
Engine accounting review confirms S13 no longer duplicates child P counters; replay writes survive
the final fold; runtime-only MT word count measures rejection across twists without changing the
explicit serialized state layout. Corpus app tests independently compare committed generator state.
No new engine defect established. Snapshot clean-room scanner and scoped tracecmp path checks pass.
Gate RE identity explicitly covers execution tooling only, not every campaign/control file.
### Completed controls and actual runner evidence
Latest checkpoint `campaign/runtime/checkpoints/controls-bootstrap-620eb9d25a6ad2f06b68353c.json`
passes basis/identity/artifact validation with recovery freshness disabled. Both R4/R6 surprise
records are resolved by the named lead decisions; no open controls surprises existed at inspection.
Actual smoke `campaign/runtime/runs/run-df1472c13f31db3a4d5361f0.json`, SHA-256
`65dd1c1286742cd4d2401af5a229d7d014f60dd329dadee0dee78c499f61d663`, records successful
**architecture-review/Astra** execution: 24 parsed events, no error events, successful stop,
matching fresh session/actor/model checkpoint and intact artifacts. Actual session
`ses_f77cf5062ffeTknrMfnbJMmdNh`; emitted model unavailable, honestly recorded as such.
Canonical config/prompt hashes match. Independently rerunning the actual loader with runner overlay
in recorded cwd reproduces effective hash `4cb65613de34e41eabf780e84cad062f14cbfcdd68569dc874514c50fa7baa5a`
and agent hash `530f4bfeb28c09d36e45565706247ad9822f7c177161e1ee0a71fcb981a76b92`.
This proves the recorded architecture route, not an actual normal Terra worker quantum.
### R8 — MEDIUM: launcher cannot start required final integrated verifier
**Locations:** `tools/campaign.py:156-159` (`ROLE_STATUS`), `tools/run_agent.py:87-89`.
The verifier role permits only `verification`, while `Campaign.verdict` allows `integration`
and final acceptance requires a fresh verdict after integrated evidence changes.
Thus the prescribed explicit-role launcher cannot schedule that final verifier execution.
**Executed reproduction:** in a disposable `verify/campaign/test_controls.py::Controls` fixture,
run `verification()`, `verdict()`, transition to `integration` as lead, add `evidence(integrated=True)`
as lead, then call `run_agent.check_launch(case.c, case.c.load('slice'), 'verifier', 'independent')`.
Observed `ControlError: role cannot launch in this contract status`. This is a launcher/lifecycle
mismatch, not a bypass of the acceptance check. Fixture cleaned up; canonical state untouched.
**Required resolution/check:** lead formally resolves the new review finding; permit the independent
verifier route for final integrated-package review with existing independence/checkpoint/surprise
guards, or define an equally explicit supported final-verifier launch path. Regression must allow
both verification and integration verifier entry and still reject owner/verifier overlap, stale
package and unresolved surprises. No implementation correction made by reviewer.
### Exact remaining integration checks
1. Resolve R8, implement the approved launcher policy, independently rerun its focused regression
and refresh source-bound controls measurements after that source change.
2. Perform the documented normal noninteractive worker smoke under its actual worker role/model,
paired baseline worktrees and intact recovery checkpoint; verify effective config, successful
stop/session, fresh end checkpoint and unavailable-versus-emitted model provenance. Existing
actual smoke covers architecture-review only; fake-process tests cover worker runner logic.
3. Attach the actual integrated controls executable/interpreter, fixture inputs and criterion
result package; obtain an independent verdict over that exact final binding through the supported
lifecycle. `controls-bootstrap` presently remains `needs-revision` with **no evidence array**;
this review is not a lifecycle promotion or machine verdict.
4. Full-profile owner assets/trace inputs and research pilot completion-bearing live controls,
complete writes/events/allocations/RNG/runtime inputs and original differential remain required
for their separate acceptance scopes. Host/shim success and divergent replay do not satisfy them.
Additional reviewed source SHA-256 (gate/engine/reporter identities are retained in selected gate):
| Path | SHA-256 |
|---|---|
| `tools/campaign.py` | `ca4eb2c42e88c1222ec60d6b99c58fffcc72746411c499c4cb0246d899ebbd10` |
| `tools/run_agent.py` | `0f5ccb53dcde59b64fe999768737b6cbd2dabcc1272e5605c1f1ecd86e5d5d2b` |
| `campaign/contract.schema.json` | `a2c76ec042ca097a57c3c05c1e519e392d498d387a31808c7d0f70482d43c201` |
| `verify/campaign/test_controls.py` | `656e5938fa5107022b73b32cf6fc05b6ff6e3e9ab239432d72b304b3f6ea1801` |
| `tools/select_evidence.py` | `a6e648a77bcf799cc774ff9d0de83011283049ed0f0c44f6e08857a8410e9463` |
| `tools/dashboard.py` | `c84aeeea6fb7d5e45ccec8882bacc59182149f108edd9eb1585eab9ede99911c` |
| `tools/check_agent_config.py` | `93115532cb38105777a5c5c20a9f2a808043370e0d4f560a9c82fe8e800076ec` |
No implementation edits, delegates, actual-repository staging/commits, engine builds or lab mutation.
## Historical initial available-tree pass
Reviewer: openai/gpt-6-astra, independent review-worker execution, 2026-09-09.
**Disposition: changes required; rollout acceptance is not established.** Workers were still
implementing during this review. Findings below apply to the identified snapshots; fixes and
final integrated-tree review are pending. No engine builds, lab operations, delegation, staging
or commits were performed by this reviewer. Four selected Python tooling tests passed, but the
adversarial probes below exposed gaps outside those tests.
Pilot delivered first:
- `campaign/contracts/research-replacement.json` — **proposed**, validated by campaign CLI.
- `campaign/pilots/research-replacement.md` — concrete archived W1 workload, full transitive
write boundary, runtime assets/original dependencies, executable acceptance requirements
and blockers. No replacement implementation or acceptance claim.
## Snapshot identities
Canonical RE HEAD `3bfde5a70d874a723e797a695bbd847fd82c0aa7`; engine HEAD
`7741d42fc5e4e761e6449bdaf0e4a61d00036a23`. Both have concurrent uncommitted rollout work;
HEAD alone does not identify reviewed content. SHA-256 at this pass:
| File | SHA-256 |
|---|---|
| `tools/gate.py` | `700f8fcf1a051a37322cd51e2e1bb774f35cd82e0abc622613dc2b79f37e9a42` |
| `tools/evidence.py` | `8235dc7e3bc23e5a942fb6f80be0693a0d2c66057f24a783a41b512d0d31c137` |
| `tools/standalone_report.py` | `6e4aae37ff5ca82f719d1994f1561cb21840d3cf7978f9a2e0a3f4b1019b71d8` |
| `tools/dashboard.py` | `6d8e116f554f8dae222694e3e37daf7b03922187e5fd841d43ee4cd52c69a49a` |
| `tools/campaign.py` | `bd563f43b536841677e49ed9b942e5ed46ad3c53456a921592f281b4f2f3c9a2` |
| `tools/run_agent.py` | `c8aeec109340958bf7850d2a91b4d6b6e53ac0534e97973f6c0869e692a9b7ba` |
| `campaign/contract.schema.json` | `ae4796b1f8e8336ddb63e60d774a81ff965461e4b884b5a2488e3865c6a6c5e0` |
| `opencode.json` | `d24be7fcee57d5eb04c6b7189822a2ca055dd4a70daafbea67f09a120945d49f` |
| engine `src/app/turn.cpp` | `a626ddf80a340de50b70f09bf91c0180d255c533e65edce1532d807fcf5109b4` |
| engine `src/mars/rng/mt19937.cpp` | `0c60775e9437b8eaad49f67a96001c81947c8d9e6d2472e28b2b490515bac95b` |
| engine `tests/app/test_turn.cpp` | `6d45b1d2d065528f14ae83d95314f2b6559e53cc23f1b9e2531c7c09b4b97eab` |
## Findings requiring correction
### R1 — HIGH: gate accepts incomplete execution and missing binary
**Locations:** `tools/gate.py:137-153,162-164`.
Discovery is compared with the 59-name inventory, but actual JUnit cases are not required to
cover that inventory. Only four corpus names must appear in `passed`. There is no nonempty
binary requirement. `corpusNonzero` checks that stdout lacks `"0 save"`; empty output passes,
and CTest `--output-on-failure` normally suppresses successful test output anyway.
**Executed reproduction:** import gate; isolate fake engine/.git and one .sav in a temporary
directory; mock source_manifest/copy_snapshot and command execution (no build); return all 59
names from ctest_names, write JUnit with only mars_stream_save, mars_stream_domains, app_turn,
app_turn_record, return exit 0 and empty stdout for commands, produce no binary. Call main with
explicit engine/corpus/new out. Observed:
```text
gate incomplete JUnit/no output/no binary: 0 passed 4 of 59 binary= {} corpusNonzero= True
```
This tests the validator boundary, not actual CTest behavior. A truncated/misconfigured runner
result must fail rather than rely on CTest usually producing complete output.
**Required fix/check:** exact JUnit identity partition (passed/skipped/failed), no duplicates or
unknown/missing tests, explicit positive corpus counts from machine-readable results, required
binary artifact existence/hash, and negative tests for each omission. Host allowances must be
distinguished from required executed tests. Do not infer a positive count from absent text.
### R2 — HIGH: reporter labels equality-only, unbound execution as accepted
**Locations:** `tools/standalone_report.py:68-74,82-105`; `tools/evidence.py:12-16`.
Reporter requires only schema/status/binary hash from provenance. It does not validate full
gate profile/checks/source/input completeness, required phase execution, missing runtime inputs,
or workload coverage. Caller may supply the same save as input and oracle. `--accept` promotes
three equal digests without any independent execution proof or contract binding.
**Executed reproduction:** use the real turn3 save as both input and oracle, a temporary dummy
binary with matching minimal `{schema,status,profile:"host",binary:{sha256}}` manifest, and mock
only subprocess.run to copy input to `--out` and return 0. Actual reader/reconstruction/digest
checks run. Observed `reporter identical input/oracle, no execution: 0 accepted`.
This is a validation-boundary test, not a claim that current sots_turn is a copy-only program.
`--roundtrip` checks conservation first but does not skip RunStrategicTurn (main.cpp:214-222,318).
**Required fix/check:** keep equality measurement usable, but scoped acceptance requires an
explicit workload contract, full source-bound provenance, positive required phase/branch counts,
known input/dependency completeness and independent verification/integration gates. No-op and
empty/partial provenance fixtures must fail acceptance. Persist/hash all consumed external
engine arguments (data/commands), verify files unchanged over execution, and retain output saves
or a durable reproducible package: currently output files are removed with TemporaryDirectory.
### R3 — HIGH: full gate's toolchain argument rejects valid files and accepts directories
**Locations:** `tools/gate.py:100,107-108,154-156`.
`--shim` must be a directory, then that directory is passed as `CMAKE_TOOLCHAIN_FILE`.
A normal existing toolchain `.cmake` file fails argument validation; a directory cannot supply
the intended toolchain file. Full gate is required for acceptance but this route is unusable
as a conventional CMake toolchain interface. Inspection finding; no build attempted.
**Reproduction:** supply a valid engine/corpus/data and existing toolchain file to --shim;
observe parser rejection at line 108. A directory passes validation then is the literal
`-DCMAKE_TOOLCHAIN_FILE=<directory>` in the configure command.
**Required fix/check:** define/document --toolchain file versus shim source/build artifact;
resolve and hash it, validate configure command in a unit test. Bind produced shim binary as
well as host binary. Full test inputs also include SOTS_M1_TRACE, SOTS_SAVES_JSON, SOTS_GOB_DIR;
current gate inherits these without recording hashes and does not provide an explicit interface.
### R4 — HIGH: campaign acceptance source binding is only baseline path+commit
**Locations:** `campaign/contract.schema.json:26-32`; `tools/campaign.py:299-307,325-335,365-369`;
`tools/run_agent.py:68-84,173,227`.
Runner records actual source manifests, but lifecycle evidence compares `source` only to the
contract's baseline `{path,commit}`. Neither evidence nor verifier verdict references the runner's
actual source digest or a candidate/integrated tree digest. The contract basis is a hash of
task metadata; it is unchanged when uncommitted implementation changes. Integrated status is a
lead-supplied boolean and axis coverage, with no connection to which integrated source was built.
**Reproduction by data flow:** create evidence for source A under a baseline, obtain a bound
verdict, then change implementation bytes without changing HEAD or artifact/contract JSON.
check_evidence and check_verdict have no source-content input to detect source B. Source_after
in run records does not enter these checks. This is a stale-evidence gap even with honest actors;
it is distinct from the documented limitation that editable role strings are not authentication.
**Required fix/check:** bind candidate/integrated source-manifest digests, build binary and
immutable inputs through evidence and independent verdict; transition must validate that binding.
Use per-criterion results or a typed acceptance package rather than treating any hashed artifact
with the same axis label as execution proof. Add a test that changes source content at the same
HEAD and rejects its old verifier/integration result.
Late-published README (lines 27-37) explicitly assigns dirty-source manifest evaluation to the
independent reviewer, not the CLI. Thus this is an acceptance-robustness gap requiring a lead
decision, not a claim that the controls author promised a machine interpretation of arbitrary
criteria. The human procedure must at minimum compare the actual candidate/integrated manifests;
baseline equality in CLI output cannot be presented as that check.
### R5 — MEDIUM: publication rejects valid host-profile skips
**Locations:** `tools/dashboard.py:93-101`; `tools/gate.py:146-150`.
Gate's expected list is all discovered tests, including permitted host skips. Publisher demands
`expected <= passed`, contradicting host skip allowances. A correct host result cannot be
published as scoped host evidence.
**Executed reproduction:** gate_valid with host status passed, nonempty source/input/binary
identities, tests expected=[a,asset], passed=[a], skipped=[asset], failed=[] reports
`required tests not executed`. Same outcome follows for the current 59/52/7 shape.
**Required fix/check:** shared schema distinguishes required executions and approved skips;
validate exact partition and profile policy. Host results must visibly publish limitations,
not be promoted to full acceptance. Gate currently initializes limitations=[] and never fills it.
### R6 — MEDIUM: recovery rejects old durable checkpoints and blocks resolver entry
**Locations:** `tools/run_agent.py:87-99`; `tools/campaign.py:266-278`.
check_launch reuses end-of-quantum freshness validation, requiring a checkpoint younger than
15 minutes even when starting recovery from a successfully completed earlier session. Next-day
resume therefore needs a fabricated new checkpoint before an agent can read/recover the old one.
Separately, open_surprises is checked unconditionally for every role, so even a resolver cannot
launch to investigate an unresolved surprise (despite resolver status mapping to blocked/revision).
**Reproduction:** a structurally valid, matching checkpoint older than 900 seconds fails
check_launch; a resolver/blocked contract with an open surprise fails before role-specific work.
Inspection/data-flow finding; final controls tests were not yet published.
**Required fix/check:** distinguish valid durable recovery state from a fresh end-run checkpoint;
verify identities/basis/artifact hashes on recovery, and require freshness only after this quantum
starts. Permit an explicitly assigned resolver's bounded investigation while affected workers stay
blocked, or document a separate operational resolver launch path that does not pre-resolve evidence.
### R7 — MEDIUM: built snapshot is not itself verified against the source manifest
**Locations:** `tools/gate.py:29-49,57-61,119-129,157-158`.
Manifest hashes live source, then copy_snapshot copies paths without checking copied hashes;
end check hashes live source again. A concurrent A -> B -> A change can copy B while both
live manifests attest A. Filesystem modes and symlink identity/targets are not bound; every
path component starting with `build` is excluded, including possible real source directories.
RE tools/inventory are recorded once but then used live without a post-check.
**Reproduction:** hash source A, write B before copy_snapshot, restore A before after-manifest;
before == after but destination is B. This needs no Git commit or modification of the gate.
**Required fix/check:** hash the copied snapshot and compare its exact file/mode/link manifest
before building; reject unsupported escaping links/submodules and define explicit exclusions.
Snapshot/hash tools and test inventory actually executed. Baseline-pinned isolated worktrees and
leases remain necessary; a before/after check alone does not establish which bytes were built.
## Engine / lead configuration observations
- Engine S13 no longer aggregates child P01..P12 counters; the existing final fold can count
child operations once. CountingRandom measures rejection words with the monotone MT counter;
seed/load reset it, and save_state's explicit layout excludes it. New app test replays reported
words against persisted generator state; new MT test exercises rejection across a twist.
No defect established in these reviewed changes. Integrated independent execution remains pending.
- New lead workflow/architecture clearly distinguish original assistance, partial/full/scoped
evidence, unsupported inputs and roles. Explicit Astra/Terra/5.5 routing and 40-step bounds
appear in config; runner checks model availability and aborts on known mismatch, with no fallback.
- Config permissions primarily guard architecture edit paths and deny worker task calls. They
do not constrain arbitrary shell or enforce exact string-array contract scope, as workflow
correctly acknowledges. Reviewer has not exercised OpenCode's effective merged configuration;
runner overlay binds model/steps but only canonical config bytes are hashed, not expanded prompt
file bytes or all effective configuration. Include these in final provenance/config validation.
- Controls lock is canonical and serialized; leases require matching token/owner and forbid
automatic stealing. Active-run worktree reservations are checked under the same lock. No
concurrency acceptance claim: independent contention/crash-recovery tests are still required.
## Research evidence surprises sent to lead
`verify/results/shim/cr/cr-R1.log:75-94` adds seven drawsites/twelve probes to the narrative's
six interceptors: 25 sites total. Lines 109-115 and raw trace args show runtime CW `0x127f`,
not initialization `0x027f`. Archive save hashes and R1's exact 16-leaf residual independently
reproduced. These corrections and runtime asset text path are detailed in the pilot and checkpoint.
## Reproduction record and remaining review
Executed with PYTHONDONTWRITEBYTECODE=1:
- `python3 tools/campaign.py --state-root /home/alex/sots-re validate research-replacement`: pass.
- Selected unittest methods in `verify.tooling.test_tooling.ToolingTests`: inventory_is_explicit_and_unique,
passed_gate_required, zero_discovered_tests_cannot_match_inventory,
stale_report_output_is_rejected_before_execution (each prefixed `test_`): **4/4 pass**.
- `/tmp/opencode/review_rollout_probes.py`: isolated boundary mocks described under R1/R2/R5;
output recorded above. Temporary fixture files are disposable; this report preserves recipes/results.
- Raw save diagnostic command in pilot: R1 exact-bit/unmasked **16 differences**.
No full local worker suite: one existing tooling test creates a temporary Git commit, excluded
under this review assignment. No reviewer builds while engine source was being changed.
At last inspection controls README/test directory were not yet present; schema and initial tools
were inspected, not their promised completed validation package.
Final refresh at 2026-09-09T21:30:34Z: `campaign/README.md` appeared and was read. Its schema/API
matches this pilot and documents manual criterion evaluation, baseline-versus-dirty-source limits,
and the current fresh-checkpoint/no-open-surprise launch rules. It does not close R4's automatic
source-drift gap or R6's recovery/resolver operational concern. Completed controls test execution
and integrated evidence review remain pending; repository-creating tests need explicit permission
for their temporary Git commits or a non-committing equivalent under this review assignment.
**Next review:** after owners fix/finish, resume from review-worker-state.md, check changed hashes,
re-run these negative cases and finalized controls/publishing tests, then independently review
one stable integrated source-bound gate/replay package. Until then Task B is an initial adversarial
review with final integration review pending, not an approval of workers' future edits.

View file

@ -0,0 +1,83 @@
# Lead checkpoint
Authority/model: active session openai/gpt-6-astra. User authorized architecture rollout and later
added five-VM debloating/passwordless lab access. Extra architecture agents explicitly corrected
to GPT-6 Astra. No commits/pushes authorized or performed.
## Active assignments
- Controls, publishing and independent review/pilot: three explicit GPT-6 Astra CLI sessions.
- Gate, engine accounting, Windows housekeeping: explicit GPT-5.6 Terra bounded workers.
- Lead owns AGENTS/CLAUDE entry points, model prompts/config, engine architecture/README/contribution
policy and integration. Bootstrap uses exclusive files in canonical trees; normal runner uses
paired worktrees. Logs in /tmp/opencode/sots-*-worker.log are transport; durable checkpoints in RE.
## Changes / checks
- Added canonical AGENTS policy, six role prompts, project OpenCode configs with explicit model
selection, auto compaction and 40-step quanta. Removed six old global Claude re-* agent files.
- Replaced engine README's stale numerical claims; documented engine/adapters/phase contracts and
existing generated wire-schema channel. Project configuration loads: opencode agent list includes
all six SOTS roles. Need schema/model drift tests once controls registry is final.
- Engine worker reports 52 pass / 7 explicit skips over fresh 59-test inventory and 43 saves.
- Gate worker delivered first version but needs adversarial review fixes before acceptance:
corpusNonzero absence check, missing JUnit completeness, toolchain argument shape, incomplete
asset/input provenance, source-copy integrity and full-profile handling. Main has inspected these.
## Astra resolutions
1. Gate run during concurrent source mutation: invalid measurement, as flagged. No game-mechanism
inference. Wait for engine/tool source quiescence, fresh gate snapshot and compare exact statuses.
2. Research archive installs more hooks than narrative: archived 16-difference observation survives;
complete instrumentation claim is overturned. Pilot requires complete installed-site manifest,
runtime FPU value and neutral control under exact config/binary/assets. No replacement promotion.
3. Default VM policy: a console login or passive VNC viewer alone is not a running test. Housekeeping
may apply non-disruptive background policies when inventory shows no game/instrumentation/test
execution; reboot/logoff requires stronger freedom and access recovery. Actual active work blocks.
4. Independent R2: remove reporter acceptance authority. --require-match only enforces equality;
valid result is measured. Campaign acceptance requires independent verdict + complete integrated
criteria. R4 actual source-content binding and R6 durable recovery are mandatory control fixes.
5. Snapshot clean-room scanner used git commands although gate snapshots have no .git; errors
could lead to a false OK. Replaced with an actual-file scanner supporting canonical Git trees
and plain snapshots, requiring nonzero inspected files and failing read errors. This closes
a gate-integrity defect without changing scientific acceptance scope.
6. Integrated gate b built host+shim and passed 52 tests/7 named skips, but correctly FAILED
corpusNonzero: CTest JUnit truncated successful output at 1024 bytes, removing final counters.
Set explicit output limits, capture verbose output once and fail if any JUnit output truncates.
Keep b failed; run a fresh gate c. Prior run a hit harness timeout and has no accepted manifest.
7. Password located in provisioning ISO and VM146 actual reboot/autologon succeeded using protected
LSA storage. VM141 outage claim was based on .141 instead of confirmed .143; retry correct guest.
Prior housekeeping session ended at quantum limit with outstanding leases; reconcile cleanup
and actual access, explicitly release stale ownership, then GPT-5.5 lab worker finishes.
## Exact next action
Read independent review, repair bounded worker defects, validate controls/model config, run a
fresh integrated host gate and canonical standalone measurement once sources are stable. Verify
housekeeping guest-by-guest, resolve its access/autologon blockers without disabling authentication.
Publish actual evidence/limitations to current pointers, regenerate projections, review both diffs.
## Integration checkpoint — 2026-09-09T22:03Z
- Fresh gate c passed: host + MinGW shim, 59 identities = 52 passed / 7 explicit skips,
all four corpus summaries = 43. Source/copy/tool/input integrity and clean-room scan passed.
- Canonical reporter measured 62 residual state differences; file/inflated/state mismatch remains.
Gate/replay manifests retained under campaign/evidence and selected in campaign/current.json.
- Independent Astra reviewer rehashed both binaries, 524 engine + 10 RE tool source files,
all 43 corpus saves and reproduced the exact 62 diffs; 19 tooling/8 publishing/7 config tests pass.
- Main re-ran final 36 controls + 7 config tests and live config/model validation, all passed.
- REAL normal noninteractive paired-worktree Astra launch succeeded:
campaign/runtime/runs/run-df1472c13f31db3a4d5361f0.json, status complete, actual session and
fresh canonical checkpoint captured. No source edits; no --auto permission bypass on this smoke.
- Remaining: final independent controls disposition and formal scoped promotion, housekeeping
final per-VM login outcomes and cleanup. No original-game replacement or full-assets acceptance.
## Final checkpoint
Rollout complete; authoritative result `campaign/rollout/RESULT.md`. Controls contract accepted
after source-identical paired handoff, real Terra verification/integration runs and fresh independent
final verdict. All five Windows guest profiles compliant; four reboot/autologon proofs, VM140
existing console preserved, all five independently reachable by key SSH with re console active.
All VM/credential leases released; no agent processes remain. 71 Python tests; fresh host+shim
build; 52 CTest passes/7 named skips over 43 saves; canonical replay measured with 62 residuals.
Code remains uncommitted for review. Next: reviewed integration snapshot -> research pilot.

View file

@ -0,0 +1,54 @@
# Publishing worker checkpoint
2026-09-09 — implementation complete, handoff; model openai/gpt-6-astra; session publishing architecture worker.
No delegates, staging, commits, pushes, or lab actions.
RE baseline HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7; exclusive-file bootstrap in
/home/alex/sots-re (concurrent uncommitted workers); engine baseline from controls checkpoint
7741d42fc5e4e761e6449bdaf0e4a61d00036a23; no engine edits or lab resources used.
Inspected architecture, controls assignment, dashboard, displacement and Forgejo tools and
their dependents. Controls README/schema/checkpoint not yet present. Gate schema is in flight.
Implemented explicit current.json validation/projections and replaced owned strategy/plan/policy.
Read controls checkpoint/schema and engine checkpoint; contract schema now validated directly.
Next exact action: lead reviews publishing diff and current.json interface alongside completed
controls/gate interfaces before selecting any durable current evidence.
No accepted evidence selected; no campaign acceptance claimed.
## Verification and coordination
- `python3 -m unittest discover -s verify/publishing -v`: 8 tests pass, including missing baseline,
malformed current data, unsupported schema, missing file/bad hash, stale source, zero/missing/
duplicate execution, failed gate/pair, empty replay, accepted mismatch, stale provenance/binary,
dirty identity display, visible skips, and overwriting an earlier success with invalid output.
- `python3 tools/dashboard.py`: exit 0; generated board/dashboard show baseline and replay not
established, controls-bootstrap and research-replacement proposed, explicit dependencies.
- `git diff --check`: pass. No live experiments or engine builds executed by this worker.
- Read controls schema/checkpoint and gate/engine checkpoints. Gate expected list includes host
skips: adapted publisher to require exact expected union, positive skipClassification/corpus/
inventory/source checks, and no full-profile skips plus shimBuild. No inferred acceptance.
- Gate worker reports failed/mutating integration source and ephemeral failed evidence. Those
artifacts were not selected. Lead must resolve its recorded surprise before a new baseline run.
- Controls campaign/README.md was still absent at final read; links intentionally target that
assigned forthcoming interface. Publisher validates current controls contract.schema.json.
## Delivered
Owned README, strategy, method rules, backlog and questions replaced with concise current entry
points/policy; scientific domain findings unchanged. Board/dashboard now generated from contracts,
explicit current pointers and runtime surprises. Removed obsolete displacement and Forgejo publisher
after dependent inspection. Publishing docs and focused tests are under tools/ and verify/publishing/.
The script performs read-only evidence validation; only generated Markdown is written on invocation.
Potential follow-up: if controls extends its JSON Schema beyond the currently used subset, extend
the local schema adapter deliberately; if gate/replay schema changes, update adapters and tests.
Implemented interface: current.json uses schema sots-current/1, source identities selected explicitly,
nullable gate/replay path+sha256 pointers, and a next_action. Missing pointers mean not established;
invalid selected evidence produces visibly invalid output and nonzero exit, never old green output.
source is null initially or the exact gate.source object (engine/re manifests including files).
Controls source baseline is a different object (path/commit), intentionally not substituted for
actual gate manifests. Gate/replay adapters use currently implemented sots-gate/1 and sots-standalone/2.
Cross-ownership references for lead: findings/subsystems/research-replace.md lines 6 and 496 and
findings/subsystems/nav-classifier-live.md line 11 refer to obsolete tools/displacement.py.
These are historical scientific findings; annotate references as historical rather than deleting
evidence. No executable dependents of displacement/Forgejo publishing found in initial search.

View file

@ -0,0 +1,40 @@
# Astra publishing architecture
User requests ruthless reorganization; historical work is in Git. You are openai/gpt-6-astra.
Read rollout/architecture-decision.md. No delegates, commits, staging, push or live lab actions.
Use apply_patch; checkpoint every 20 calls/15min and before compaction/stopping to
campaign/rollout/publishing-worker-state.md. Own only:
campaign/board.md, campaign/backlog.md, campaign/open-questions.md, campaign/DASHBOARD.md,
tools/dashboard.py, tools/DASHBOARD_README.md, tools/displacement.py,
scripts/forgejo_campaign.py, README.md, findings/00-strategy.md, guides/method-rules.md.
Lead owns other architecture docs/config, controls architect owns tools/campaign.py and contracts
schema, gate worker owns verification tooling. Coordinate by reading their rollout checkpoints.
Replace live planning stack with one concise plan and machine-derived status. No legacy appendix,
coverage percentage, displacement score, old verified-table parser or Forgejo second source of
truth. Preserve scientific findings/evidence. Delete obsolete displacement and Forgejo publishing
scripts after inspecting dependents; remove/update references in owned files. Report references
outside ownership for lead to fix, do not silently modify another worker's files.
Board + dashboard generated from campaign/contracts/*.json and explicitly selected current
evidence pointers under campaign/current.json (you own current.json). Exact schemas come from
controls-worker; inspect campaign/README.md/checkpoint once ready. Until available implement
clear adaptable interface; do not invent accepted contracts/results. Current gate schema sots-gate/1
includes status passed|failed, profile host|full, source identities, inputs, binary, tests and
limitations. Standalone schema sots-standalone/2 status measured|accepted|failed, pairs and
provenance. Never infer freshness from current HEAD or existence of old artifacts. Label historical
as historical, dirty snapshots by manifest identity; source mismatch stale. Prefer current.json
explicit path+sha256 for gate/replay pointers, validate hash/schema/status and fail on stale/bad
pointer. Missing current baseline should say not established, not green. Summary should show
capabilities/workloads, executed tests/skips, original dependencies, open blockers/surprises,
and next action; no LOC or target percentages. Update dashboard docs + test its negative paths
(you may own verify/publishing/ for focused tests).
Current priority: rollout baseline; then complete research write-set replacement pilot; then
command payload semantics and ship construction; then recorded-command standalone replay.
Pilot remains proposed/blocked pending executable criteria and lease/control evidence. Do not
claim it implemented. Collapse strategy and earned-method rules into concise current policy:
write-set boundaries; complete state inputs; distinct-state/branch coverage; synthetic boundary
tests + real differential; honest failure; original-assisted != independent; Astra resolves
surprises; source-bound evidence; no silent stale status. Domain-level old detail remains in
findings, not giant active board. Replace README with current entry points and operational commands.

View file

@ -0,0 +1,38 @@
# Independent Astra integration verification
Resume from your RE checkpoint in a fresh bounded GPT-6 Astra session. Same owned review/pilot
files; no implementation edits, delegation, commits, lab mutation or engine builds.
Lead resolved R4/R6 formally; controls architect currently implementing followup. Review GATE,
REPORTER, ENGINE and CONFIG first while it finishes. Gate and engine source are now stable.
Current source-bound host+shim baseline is selected by campaign/current.json and retained in
campaign/evidence. Actual build/source/tool snapshot artifacts live durably under
/home/alex/.local/share/sots-runs/rollout-host-20260909-c; prior b FAILED on CTest output
truncation (52 passes/7 skips but missing positive corpus summaries); prior a harness timeout.
Gate c captures verbose/JUnit with large explicit limits and rejects truncation. It PASSED.
Reporter canonical pair is measured, nonmatching, source bound, retained output save and full
diffs at /home/alex/.local/share/sots-runs/rollout-replay-20260909. Reporter has NO acceptance
authority: --require-match only affects equality/exit; status measured or failed. Changes in
lead-state.md. Check all prior R1/R2/R3/R5/R7 claims against ACTUAL current files/artifacts.
Changes since your first pass: snapshot clean-room scanner works without .git and requires
actual source files; gate exact positive per-test corpus summary parsing; outputComplete; source
engine/re keys (RE execution-tool subset, copies kept with hashes including save_reader and
tracecmp dependencies); fixed source-copy checks; safe scoped snapshot CMake tracecmp dir;
shared evidence.validate_gate structural validation used by reporter/publisher; full output saves
retained; reporter strips inherited SOTS env and validates explicit args; scope no fake accepted.
Lead added tools/check_agent_config.py --resolved and select_evidence.py, focused config tests.
Lead independently ran 19 tooling tests and 8 publishing tests; configuration loader/model check
passed. Engine worker passed focused positives and configured-empty/malformed negative corpus.
Verify manifest executable/source/input hashes and required checks, exact test identity partition
and positive counts. Validate selection and reporter semantics. Run local Python test suites and
negative cases without rebuilding. You may rerun small existing binaries if a concrete concern
needs it, but no full repeated engine test suite. Source mutation in disposable test fixtures and
git operations confined to disposable fixture repos are permitted (never commit actual repos).
When controls checkpoint says complete, independently run verify/campaign tests and review R4/R6
sourcebinding/recovery fixes plus runner effective configuration/actual checkpoints. If still in
flight, checkpoint gate verdict and exact remaining controls checks; lead will resume you.
Any unresolved real issue: precise severity/path/repro, don't invent requirements outside scope.
Architectural acceptance is separate from host-pass and still-missing full asset/live-game gate.

View file

@ -0,0 +1,172 @@
# Independent reviewer checkpoint
## CURRENT HANDOFF — follow-up review complete, 2026-09-09
Model openai/gpt-6-astra; logical session review-followup-1; actual harness ID unavailable.
Owned review files only changed. No delegates, implementation edits, builds, lab operations,
actual-repository staging/commits or held leases. Disposable fixture Git mutations authorized.
Verdict and durable recipes/source hashes: campaign/rollout/independent-review.md, follow-up section.
70/70 Python tests passed: tooling 19, publishing 8, config 7, controls 36. Actual loader/model
check passed. Selected host/shim package integrity reproduced: 524 engine+10 RE source rows,
43 saves, exact 59 JUnit identities (52 pass/7 permitted skips), four positive [43] summaries.
Retained replay hashes/diffs reproduced: measured/nonmatching, 62 state differences.
Prior R1-R7 closed within the documented revised scope; full asset/live acceptance remains absent.
Latest controls checkpoint integrity passed. Actual architecture-review smoke events/checkpoint
and effective config reproduced (run-df1472c13f31db3a4d5361f0); emitted model unavailable.
New surprise R8, MEDIUM, independently reproduced: campaign.py:156-159 permits verifier only in
verification; run_agent.py:87-89 rejects verifier in integration despite required final verdict
refresh. Recorded for lead in owned review; canonical surprise mutation outside owned scope was
not performed. Controls acceptance remains pending lead resolution and scoped correction.
Remaining checks: R8 regression/review, actual normal worker-role smoke (existing actual smoke is
architecture-review), final integrated controls evidence/verdict, separate full asset/live gates.
ONE exact next action: lead records and resolves R8 from independent-review.md, then assigns the
bounded launcher correction and independent integration-verifier regression before promotion.
## Follow-up quantum 1 — 2026-09-09, pre-experiment
Model openai/gpt-6-astra; logical session review-followup-1 (harness ID unavailable).
Recovered owned assignment/checkpoint, campaign README/policy and initial R1-R7 findings.
Controls repair handoff now says complete; no resource leases or lab/build operations.
Selected gate digest 8e14e00ee3ce7478ddfdef8de12183451e858c52d78dc28cffbdee47f5d087d8;
selected replay digest 87f92c2b54625ecbca1f3c0a37e57c43d03a4aff488edf4ea8a09a842cd6279d.
Read current gate/evidence/reporter code: positive per-test counts, exact JUnit partition,
copy byte/mode checks, explicit shim boolean and measured-only reporter implemented.
These are observations, not yet independent artifact validation or acceptance.
Next exact action: run local tooling/publishing tests and read-only selected-package hash,
JUnit, corpus and retained replay checks, then inspect completed controls and run their tests.
### Follow-up checkpoint 2 — stable package reproduced
Selected gate/replay digests above independently rehashed. Both binaries match (host
78b2562ea2c56351f9f6f0f24d271afcced741eadbc148047780e6dfd101940b;
shim 381c91aecf10a9093f651f58c884356cd88e0253e79cb3bab32753fff6612c7e).
All 524 engine + 10 RE execution-tool files match current and retained snapshot bytes/modes;
43 corpus files match. Actual ctest.xml equals embedded rows, 59 unique expected identities,
52 pass/7 permitted skip/0 fail; all four corpus summaries [43]; no output truncation.
All eight recorded gate commands exit 0. Recomputed retained input/oracle/output state and byte
hashes plus all 62 state diffs match replay manifest (turn2 -> turn3, measured/nonmatching).
Tooling 19/19, publishing 8/8, config 7/7 passed. Additional missing binary/execution,
duplicate execution, zero corpus and missing/false outputComplete probes rejected.
Recipe currently /tmp/opencode/review_followup_checks.py; durable results are this checkpoint
and selected immutable manifests. Source review of campaign.py/run_agent.py performed;
R4/R6 tests and canonical checkpoint validation not yet executed. No builds/lab/delegation.
Next exact action: run verify/campaign tests and live resolved config check, then inspect
canonical controls checkpoint/run records and persist final scoped verdict.
### Follow-up checkpoint 3 — controls reproduction and final probe
Controls 36/36 passed (6.815s), live check_agent_config.py --resolved passed. Read complete
controls tests, source-binding/lifecycle/recovery/runner code and formal R4/R6 decisions;
both recorded surprises resolved. Canonical latest controls checkpoint is
controls-bootstrap-620eb9d25a6ad2f06b68353c.json. Found actual lead-run smoke record
run-df1472c13f31db3a4d5361f0.json: architecture-review/Astra, complete, 24 events, observed
model explicitly unavailable. Need independently check event/checkpoint/config hashes.
Potential new operational issue: campaign.py ROLE_STATUS allows verifier only in verification,
but acceptance requires refreshed final-package verdict in integration. Runner check_launch
will reject that independent integration session. Probe in disposable controls fixture prepared;
affected launcher acceptance remains pending resolution if reproduced. No source edits/leases.
Next exact action: run /tmp/opencode/review_controls_checks.py to validate actual controls/smoke
artifacts and reproduce the integration-verifier launch guard, then persist scoped review verdict.
Updated: 2026-09-09T21:30:34Z (handoff checkpoint 6). Model: openai/gpt-6-astra.
Session: review-worker initial rollout assignment (no external harness session ID supplied).
Phase: pilot delivered; available-tree independent review delivered; integrated re-review pending.
Owned files: research-replacement contract/pilot, independent-review, this checkpoint.
No delegation, builds, lab I/O, staging or commits performed.
## Progress / next action
- Read architecture-decision, controls assignment, CR findings, archived compare JSON and R1 log.
- Contract README/schema not published at first inspection; keep pilot proposed and wait for actual API.
- Next: inspect raw compressed traces/save differences and engine callback/event interfaces; draft pilot,
then review available worker code. Gate/report tooling currently modified; workers still implementing.
## Surprise for lead: CR narrative understates instrumentation
`verify/results/shim/cr/cr-R1.log:75-94` shows seven successful drawsite detours and twelve
successful probes in addition to the six detours described in findings/subsystems/research-replace.md:317-332.
Thus archived R1 has 25 installed interception sites, not six. Lines 109-115 also show runtime
FPU CW 0x127f, whereas findings line 334 says 0x027f in every run (same reported precision/rounding,
different full word). Do not inherit narrative as a complete instrumentation manifest.
Discriminating check: inspect N/R0 logs and trace metadata; fresh controls must bind complete
installed-site manifests and actual runtime FPU words to the same binary/config/assets.
## Current blockers
- Research replace still omits callback effects, actual ObservedTech element and full event records.
- Archived compare is partial (six undeclared spans, eight unmodelled notes), not acceptance.
- No current runnable pilot acceptance/dependency decision or controls schema yet observed.
## Checkpoint 2 evidence
- Rehashed all four CR saves and turn3 input; hashes match archive narrative. Re-ran exact-bit,
unmasked state checksum: R1 has exactly 16 differences (five primary fields, event/otch records
and counts, five derived leaves). Raw R1 trace confirms allocation 144/2898, RNG left 413,
full runtime CW 4735 = 0x127f. No current acceptance inferred.
- `sots-engine/src/game/events/research_events.h:95-105` supplies runtime TextLookup;
`src/app/event_phase.cpp:10-14` already adapts caller-supplied strings. Therefore CR's claim
that event text inherently requires original PostEvent is too strong. Runtime user assets
are an existing architectural path; the live allocator/ABI adapter and policy remain unresolved.
- Existing `src/shim/hooks/tech_effects.cpp:354-365` DOES have player writeback and an original
node-bore updater dependency. Missing is research-cascade integration and full callback effects,
not the total absence of a tech-effect writeback implementation. Use ApplyTechCompletion, not
the already-researched-guarded ApplyTechEffect (tech_effects.h:156-162).
- Full callback writes can extend to systems, ships, recursive grants and rebellion objects;
CR's five primary player fields are the observed workload subset, not a full write set.
## Checkpoint 3
- Pilot narrative written: campaign/pilots/research-replacement.md (proposed; no acceptance).
- Controls interface now published in controls-worker-state.md and contract.schema.json;
use its string arrays, acceptance {id,axis,criterion}, null checkpoint and full baseline IDs.
- Current HEAD identities independently read: RE 3bfde5a70d874a723e797a695bbd847fd82c0aa7;
engine 7741d42fc5e4e761e6449bdaf0e4a61d00036a23; concurrent changes are uncommitted.
- Early gate/report inspection shows potential fail-open paths: gate corpusNonzero checks absence
of text rather than positive execution; JUnit completeness unbound; reporter unconditional
--roundtrip and --accept checks equality only. Record precise findings after current-code check.
- Read new lead workflow and engine architecture: consistent with separating scoped evidence.
- Next exact action: write schema-conforming proposed research-replacement.json, then run local
tooling unit checks/adversarial reproductions outside repositories and persist review findings.
## Checkpoint 4
- Both pilot files written; JSON conforms structurally to newly published schema, validation next.
- Available reviewer scope: gate/reporter/evidence, dashboard projection, engine accounting diffs,
lead workflow/architecture/config, controls schema/models. Controls CLI/runner/README not yet all
published at last read; final controls review remains pending rather than inferred from intent.
- Engine accounting changes remove parent aggregation and use nonserialized MT word count;
tests now compare persisted generator state. No engine build/run by reviewer.
- Correction to preliminary concern: reporter's --roundtrip validates untouched serialization but
engine then DOES execute RunStrategicTurn; it is not an early-return bypass.
- Prepared `/tmp/opencode/review_rollout_probes.py` for isolated mock-boundary tests: incomplete
JUnit/empty execution output/missing binary gate; equality-only reporter acceptance; host-skip
projection mismatch. Uses real save reader for reporter pair; mocks child process/build only.
No commits/staging in probes. Existing worker test_source_manifest_detects_mutation creates a
temporary commit, so reviewer will omit that test under this assignment's no-commit instruction.
- Next exact action: run PYTHONDONTWRITEBYTECODE=1 python3 /tmp/opencode/review_rollout_probes.py.
## Checkpoint 5 — local results / escalation
- Probe output: pilot schema subset PASS; gate returned 0/passed with 4 of 59 JUnit cases,
empty stdout and binary {}; reporter returned 0/accepted for copy-only mocked process with
real identical input/oracle checksums; dashboard rejected an allowed host skip.
- Four selected tooling tests passed. Omitted temporary-commit test; no repository/engine tests
or builds run. Full controls tests/README still absent at last check.
- Actual controls CLI validation now PASS:
`PYTHONDONTWRITEBYTECODE=1 python3 tools/campaign.py --state-root /home/alex/sots-re validate research-replacement`.
- Read newly published campaign.py/run_agent.py: baseline evidence source identity is only path+HEAD;
end-run source hashes are not tied into acceptance schema. Runner startup also applies 15-minute
checkpoint freshness to resume and rejects open surprises even for resolver role. Review pending
finalized controls docs/tests. No canonical runtime mutated by reviewer.
- Next exact action: persist severity-ranked independent-review.md with precise reproduction,
source SHA-256 identities, available-scope review and remaining integration review requirements.
## Handoff checkpoint 6
- Delivered all four owned files, untracked/uncommitted; no worker source edits.
- `campaign/contracts/research-replacement.json` remains proposed. Actual campaign CLI validation
passed; controls README now published/read and format matches. Pilot SHA-256:
contract `1108d30bf7e28f30b2446014503fc3200a8b8198a8fab0b866b873a81bf7b8b9`;
narrative `3101b8959f28ba2c6ffbac02a82b5ae0e841e7d78bd1f40f05b9d1d2278490ad`.
- `campaign/rollout/independent-review.md` records seven findings (R1-R4 high, R5-R7 medium),
exact code locations/source hashes, reproduced R1/R2/R5 boundary failures, test results,
historical evidence corrections and specific follow-up gates. Owners need to review/fix;
reviewer does not alter their files or certify future changes.
- Controls README confirms human evaluation of dirty-source evidence and criteria. R4 is explicitly
framed as source-binding robustness gap for lead decision, not a false claim of a schema promise.
- Outstanding: worker fixes/final controls tests, stable integrated-tree gate/replay reproduction,
runtime assets and executable pilot acceptance/dependency decisions. No held resource leases.
- Next exact action: lead resumes this reviewer after worker completion to re-read changed file
hashes and re-run R1/R2/R5 adversarial reproductions against the integrated rollout.

View file

@ -0,0 +1,28 @@
# Astra independent reviewer and pilot architect
User requested three extra Astra agents. You run openai/gpt-6-astra. No delegates, commits,
staging, pushing or live VM/Ghidra operations. Read architecture-decision.md. Use apply_patch.
Checkpoint every 20 calls/15min and before compaction/stopping to
campaign/rollout/review-worker-state.md. Own only:
campaign/contracts/research-replacement.json, campaign/pilots/research-replacement.md,
campaign/rollout/independent-review.md and your checkpoint.
Task A: build a concrete research replacement pilot contract from actual CR findings and
archived artifacts, not author summaries alone. Inspect findings/subsystems/research-replace.md,
actual trace/compare/oracle artifacts, engine interfaces and event handling. Describe full write
set, asset inputs, paths to completion-bearing workloads, original dependencies, positive
execution/controls, acceptance criteria and exact current blockers. No replacement code now.
Use contract schema and API from controls-worker (read campaign/README.md and checkpoint once
published); leave status proposed until executable acceptance and required dependencies exist.
Avoid declaring known missing functions already complete. No guessed live addresses/policy.
Task B: independent adversarial review of rollout once workers produce it. Gate worker changes
tools/{gate.sh,gate.py,evidence.py,standalone_report.py}, verify/tooling; engine worker accounting
and tests; lead configs/architecture docs; controls worker campaign.py/run_agent.py/schema;
publishing worker dashboard and state projections. Review scope enforcement and bypasses, model
routing (Astra authority, appropriate workers, no fallback), compaction/checkpoint durability,
stale/incomplete evidence, self-certified acceptance, concurrency races and source hashing.
You may run local read-only/unit tests with temporary artifacts outside repos. Do not duplicate
worker edits or run builds while engine worker is mutating source. Report findings with severity,
reproduction and precise file/line; if worker work not yet available complete pilot first, record
review pending and lead will resume you. Send surprises to main Astra through checkpoint.

View file

@ -0,0 +1,64 @@
#!/usr/bin/env python3
"""Populate clean, disposable paired worktrees with the exact uncommitted integration source."""
import argparse
from pathlib import Path
import shutil
import subprocess
import sys
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT / "tools"))
from campaign import Campaign, ControlError, git_value, source_manifest
def files(root):
return {name for name in git_value(root, "ls-files", "-z", "--cached", "--others", "--exclude-standard").split("\0") if name}
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--engine-worktree", required=True, type=Path)
parser.add_argument("--re-worktree", required=True, type=Path)
args = parser.parse_args()
campaign = Campaign(str(ROOT))
contract = campaign.load("controls-bootstrap")
for kind, target in (("engine", args.engine_worktree), ("re", args.re_worktree)):
target = target.resolve()
source = Path(contract["baseline"][kind]["path"])
if target == source or not str(target).startswith("/tmp/opencode/sots-final-"):
raise ControlError("only rollout-owned sots-final-* temporary worktrees may be populated")
if git_value(target, "status", "--porcelain", "--untracked-files=all"):
raise ControlError("snapshot destination must be clean; never overwrite existing work")
if git_value(target, "rev-parse", "--path-format=absolute", "--git-common-dir") != git_value(source, "rev-parse", "--path-format=absolute", "--git-common-dir"):
raise ControlError("destination is not a linked worktree of this repository")
if git_value(target, "rev-parse", "HEAD") != contract["baseline"][kind]["commit"]:
raise ControlError("destination baseline mismatch")
before = source_manifest(source, kind)
names = files(source)
for name in files(target) - names:
path = target / name
if path.is_file():
path.unlink()
for name in names:
if name.startswith(("campaign/runtime/", "campaign/evidence/")):
continue
src, dst = source / name, target / name
if src.is_symlink():
raise ControlError("source symlink unsupported")
if src.is_file():
dst.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(src, dst)
elif dst.is_file():
dst.unlink() # Reproduce tracked source deletions in this disposable tree.
after, actual = source_manifest(source, kind), source_manifest(target, kind)
if after != before or actual["sha256"] != before["sha256"]:
raise ControlError("source changed or copied integration snapshot differs")
print(f"{kind}: exact integration source {actual['sha256']} at {target}")
if __name__ == "__main__":
try:
main()
except (ControlError, OSError, ValueError, subprocess.SubprocessError) as exc:
print(str(exc), file=sys.stderr)
sys.exit(1)

View file

@ -0,0 +1,23 @@
{
"actor": "rollout-lead",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/decisions/d-2570bf9c76ae66711bdac461.json",
"sha256": "2927a18704e12af380045a08e276f35c0198ba0ef57df8babf419c25405f06b5"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "0dfee4fbd75e35fde1b90350",
"model": "openai/gpt-6-astra",
"next_action": "Independent verifier: read current evidence and decision d-2570bf9c76ae66711bdac461. Rehash unchanged source/package and inspect relevant raw logs by explicit run ID. No full-suite rerun: same bytes were independently reproduced. If valid issue current scoped verdict and fresh runner-session checkpoint. Do not treat historical informal checkpoints as current instructions.",
"role": "lead",
"schema": "sots-checkpoint/1",
"session": "rollout-scope-correction",
"summary": "Astra resolution d-2570bf9c76ae66711bdac461 closes false count contradiction: Astra df147 run has 24 events, Terra cb151 run has 67; prior checkpoint session is author, not run under review. Both observations survive. No source/input changes. Reused the same already independently reproduced 37-test artifact and exact hashes.",
"timestamp": "2026-09-09T22:20:49.584979+00:00"
}

View file

@ -0,0 +1,31 @@
{
"actor": "controls-architect",
"artifacts": [
{
"path": "tools/campaign.py",
"sha256": "54aba1ec42f9c2f495e29a103254ed30c1529b8bad615a3992660b57f5e2aeb4"
},
{
"path": "tools/run_agent.py",
"sha256": "7ca44ace935426df5e2fa8a16ef8252178f538864d0ab423b60e679229d00b8b"
},
{
"path": "campaign/contract.schema.json",
"sha256": "a2c76ec042ca097a57c3c05c1e519e392d498d387a31808c7d0f70482d43c201"
},
{
"path": "verify/campaign/test_controls.py",
"sha256": "52f93be6eb4147e93deef76e353e55abfb69b1b33297b534acc62bde9ac8847e"
}
],
"basis": "1167f2f44aa39b1b6453e9af3e5046c4653ecea9bdee5281f4fcaea60b16e9a9",
"contract": "controls-bootstrap",
"id": "177cfb68c95114436c939aaa",
"model": "openai/gpt-6-astra",
"next_action": "Run python3 -m unittest discover -s verify/campaign -p test_*.py -v and repair ordinary failures.",
"role": "architecture-review",
"schema": "sots-checkpoint/1",
"session": "rollout-controls-repairs",
"summary": "Pre-test checkpoint: implemented source_binding engine/re actual Git file content digest, canonical integrated paths, immutable binaries/inputs and per-criterion outcomes; source-binding CLI; canonical RE artifact references with secret/escape rejection. Runner now separates old recovery from fresh end checkpoints, resolution-only Astra blocked launches, role authority, expanded prompt/effective config hashing, under-lock baseline recheck, config drift detection, successful stop step/session and error-event checks. Added adversarial tests; not executed yet. Owned modified source identities attached. Bootstrap canonical exclusive ownership; same baseline commits as prior checkpoint. No lab/resources/delegation/commits. Logical session rollout-controls-repairs; actual harness session ID unavailable. Decisions R4/R6 implemented pending tests and documentation.",
"timestamp": "2026-09-09T21:47:48.364874+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "rollout-lead",
"artifacts": [
{
"path": "campaign/rollout/lead-state.md",
"sha256": "51647e07c8f076249b99d635b5dc5a72ec974b534153e5db9b6fd865347c30cc"
},
{
"path": "campaign/rollout/independent-review.md",
"sha256": "b51c529af83f0ed0bb683bdd31100dc5df22fa21043bc43801342d94c6c854c0"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "243f539b3219e74f12ef0db7",
"model": "openai/gpt-6-astra",
"next_action": "Independent verifier reproduces controls evidence and records verdict, then lead integrates identical source-bound package.",
"role": "lead",
"schema": "sots-checkpoint/1",
"session": "rollout-integration",
"summary": "Astra-approved R4/R6 repairs integrated; 36/36 control tests passed against actual source binding, alongside the independent gate/report/config review and successful normal Astra paired-worktree launcher smoke. See source-bound controls-suite evidence and independent-review.md. This checkpoint requests independent verifier review, not self-certification.",
"timestamp": "2026-09-09T22:05:53.940738+00:00"
}

View file

@ -0,0 +1,39 @@
{
"actor": "controls-architect",
"artifacts": [
{
"path": "tools/campaign.py",
"sha256": "3c7bbba6e67081279a9a1effbf57674b838af184518c278cec68e0bc78e75488"
},
{
"path": "tools/run_agent.py",
"sha256": "6d8a8a2a408c3e8e2beeaf756d9746ed510f65674719e957222fd01031a10689"
},
{
"path": "campaign/contract.schema.json",
"sha256": "a2c76ec042ca097a57c3c05c1e519e392d498d387a31808c7d0f70482d43c201"
},
{
"path": "verify/campaign/test_controls.py",
"sha256": "b0676746dde22e2a2e938d394c19dda8b4d6a4377b315c05911f4a9dad97f41e"
},
{
"path": "campaign/README.md",
"sha256": "19e3cd4303c2a6ceb550df1fab9c91dda42ea74c30a19bc34de47a8ab66be48e"
},
{
"path": "campaign/contracts/controls-bootstrap.json",
"sha256": "62fd6d9c4e096a6bdf2193245572a92bc99d04413a31b3e4d5ac6bc61473eb2f"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "2f0fe9ac4ec15b15a983bd75",
"model": "openai/gpt-6-astra",
"next_action": "Run the final scoped controls suite and campaign validate, then checkpoint the measured handoff for lead independent integration review.",
"role": "architecture-review",
"schema": "sots-checkpoint/1",
"session": "rollout-controls-repairs",
"summary": "32-test initial repaired suite passed in 5.698s. Added further adversarial candidate-worktree/canonical integration, source add/delete/mode/link, error-then-success and recovery authority/permission checks; final suite pending. Live OpenCode debug config validated generated implementer overlay, expanded prompt/model/40 steps and requested permissions (effective SHA256 25b06304c87586543d0607f0abc3f3d46c366cc664948f33c0900b38ab8b3248; agent SHA256 5252aaec5ac9b7a8b3cc6265937651f09b00f87731e61e1582d9fbe2caa17b7a); no agent launched. README now specifies source_binding, binaries/inputs/outcomes, fixed exclusions, verdict digests, artifact/control separation, recovery/event/config checks and gate sots-gate/1 compatibility. Bootstrap acceptance text updated for approved repairs, so previous checkpoint basis superseded. Source hashes attached. Same canonical bootstrap ownership and baseline identities as recovery; no lab/leases/commits/delegation. Actual harness session unavailable.",
"timestamp": "2026-09-09T21:52:00.945120+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "final-controls-verifier",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/runs/run-2598ca81c443c330e0a4d5b2.json",
"sha256": "7f496b73173f7a764f7cf3690ce17efd36a5d3505a785440450320cc04868bf5"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "49f5c4565f76d2fe5efb4452",
"model": "openai/gpt-5.6-terra",
"next_action": "Run the complete controls unit suite from /tmp/opencode/sots-final-re, compare its observed test inventory against the declared 37 outcomes, then execute an independent held-out duplicate-key contract validation negative control.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-97066391080a3d06dce27a80",
"summary": "Pre-experiment verifier checkpoint. Observations: canonical and both /tmp/opencode/sots-final-* worktrees have expected baseline HEADs (RE 3bfde5a70d874a723e797a695bbd847fd82c0aa7; engine 7741d42fc5e4e761e6449bdaf0e4a61d00036a23), matching canonical Git common directories, and candidate source-binding digests exactly matching integrated evidence (engine ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd; RE 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8). validate and status pass; status integration; no open surprises; no leases/lab actions. Falsifiers before reproduction: any missing/unexpected test, nonzero result, source/input/binary hash drift, actual worktree/common-dir mismatch, a self-certified-only package, or held-out negative rejection failure blocks integrated pass. Required distinct exposures: lifecycle/identity/checkpoint/evidence/lease/runner config-event paths plus old-valid recovery and resolution-only positive cases. Decision: run source-identical suite from RE worktree and independently exercise a held-out malformed JSON duplicate-key control, then inspect actual source-binding rather than counters. No implementation edits.",
"timestamp": "2026-09-09T22:34:32.212060+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "rollout-lead",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/runs/run-2598ca81c443c330e0a4d5b2.json",
"sha256": "7f496b73173f7a764f7cf3690ce17efd36a5d3505a785440450320cc04868bf5"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "4ecea4a353281ce34e064768",
"model": "openai/gpt-6-astra",
"next_action": "INTEGRATION verifier: same source-identical sots-final-* worktrees as your preceding successful reproduction. Rehash current integrated package and same code/input/outcome identities; independently attest its final changed integrated digest. Do not regress to old baseline-only handoff or conflate run IDs. Issue scoped integrated pass if valid, then fresh checkpoint.",
"role": "lead",
"schema": "sots-checkpoint/1",
"session": "rollout-identical-final",
"summary": "Independent verifier reproduced all 37 tests from source-identical isolated sots-final-re and revalidated canonical and paired content hashes. No canonical or paired code/input bytes changed since run-2598ca81c443c330e0a4d5b2. Same package now marked integrated under canonical binding; final current-digest verdict requested.",
"timestamp": "2026-09-09T22:33:35.882911+00:00"
}

View file

@ -0,0 +1,27 @@
{
"actor": "final-controls-verifier",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/verdicts/controls-bootstrap.json",
"sha256": "5c9e747fe3e95a04033e3b933bf6f3d72b84d104f09bb1b356a3220cf0cd979a"
},
{
"path": "campaign/runtime/runs/run-2598ca81c443c330e0a4d5b2.json",
"sha256": "7f496b73173f7a764f7cf3690ce17efd36a5d3505a785440450320cc04868bf5"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "5643d7cec1edd289b0465d5f",
"model": "openai/gpt-5.6-terra",
"next_action": "Astra lead: inspect the current independent verdict and then perform any authorized lifecycle acceptance decision; do not infer universal engine or security acceptance beyond this controls-bootstrap control-tests package.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-97066391080a3d06dce27a80",
"summary": "Final verifier checkpoint for bounded quantum. Decision: issued a scoped PASS verdict for the current integrated controls package; contract status remains integration and no lifecycle/status transition was attempted (verifier lacks that authority). Observations: handoff-alone reproduction in /tmp/opencode/sots-final-re ran `python3 -m unittest discover -s verify/campaign -p 'test_*.py' -v`: exactly 37/37 passed in 6.963s with no skips. Declared inventory and branch/state exposures cover lifecycle bypass, schema/identity, stale/missing checkpoints, evidence source drift and immutable inputs/outcomes, lease collision/WIP, runner model/completion/config errors, plus old-valid recovery and resolution-only positives. Held-out nested duplicate JSON key negative control rejected with ControlError. Actual package state independently rehashed: engine HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23 / digest ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd; RE HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7 / digest 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8; paired common dirs match canonical and evidence binary/input hashes match. No leases, lab actions, implementation edits, open surprises, RNG/game-state or original-assisted workloads. Residual scope: tests/control instrumentation and this exact source package only; no security/authentication or general engine correctness claim. Validation passed after verdict.",
"timestamp": "2026-09-09T22:35:44.097174+00:00"
}

View file

@ -0,0 +1,19 @@
{
"actor": "rollout-lead",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "57763c163ec839aa23b3641f",
"model": "openai/gpt-6-astra",
"next_action": "As verifier, execute canonical campaign/rollout/formal-verifier.md against the canonical source-bound package, not old baseline worktree code. Independently reproduce 37 tests and record scoped pass/fail plus a checkpoint using the runner-provided session.",
"role": "lead",
"schema": "sots-checkpoint/1",
"session": "rollout-r8-integration",
"summary": "R8 fixed under recorded Astra decision: final verifier may launch in integration; all independence, surprise and source guards retained. Fresh 37/37 control tests and new source-bound evidence attached. No source mutation planned during independent verification.",
"timestamp": "2026-09-09T22:12:02.854363+00:00"
}

View file

@ -0,0 +1,31 @@
{
"actor": "controls-architect",
"artifacts": [
{
"path": "campaign/rollout/controls-worker-state.md",
"sha256": "8ec378244f75c36b95856c46b370cc80e046d1ca3d441d8f4d4a0964667adb98"
},
{
"path": "campaign/README.md",
"sha256": "867e4de48e1a1506fea968e94223270e1bf0f2ad05e56b1576d14f14067ca023"
},
{
"path": "campaign/contract.schema.json",
"sha256": "ae4796b1f8e8336ddb63e60d774a81ff965461e4b884b5a2488e3865c6a6c5e0"
},
{
"path": "campaign/models.json",
"sha256": "95f507237a8e4fcf14189da4aa102dfae1dbaa536d4d8db6bcbfc30162ac5443"
}
],
"basis": "1167f2f44aa39b1b6453e9af3e5046c4653ecea9bdee5281f4fcaea60b16e9a9",
"contract": "controls-bootstrap",
"id": "59f425233f0deb9293f550f9",
"model": "openai/gpt-6-astra",
"next_action": "Lead records Astra resolutions for s-410e48d5ae6cc4da0a6ae649 and s-f1c41532e618c77d41538902, specifying source-package and recovery/resolver interfaces, then resumes controls worker from the handoff checkpoint.",
"role": "architecture-review",
"schema": "sots-checkpoint/1",
"session": "rollout-controls",
"summary": "Implemented strict schema/models, guarded campaign CLI, explicit-model bounded paired-worktree runner and 23 passing control tests. Contract validation passed controls-bootstrap and research-replacement. Source identities, tested file hashes, API coordination and exact test results are in controls-worker-state.md. Independent-review R4/R6 were recorded as surprises s-410e48d5ae6cc4da0a6ae649 and s-f1c41532e618c77d41538902; affected interface changes are blocked pending lead resolution. No delegation, staging, commits, actual agent launches or lab I/O.",
"timestamp": "2026-09-09T21:36:14.773967+00:00"
}

View file

@ -0,0 +1,39 @@
{
"actor": "controls-architect",
"artifacts": [
{
"path": "campaign/rollout/controls-worker-state.md",
"sha256": "02ff66f3f0fa978819e5c100e24cfd3752b9041590e2aed36f6abd62ce790f4e"
},
{
"path": "tools/campaign.py",
"sha256": "ca4eb2c42e88c1222ec60d6b99c58fffcc72746411c499c4cb0246d899ebbd10"
},
{
"path": "tools/run_agent.py",
"sha256": "0f5ccb53dcde59b64fe999768737b6cbd2dabcc1272e5605c1f1ecd86e5d5d2b"
},
{
"path": "campaign/contract.schema.json",
"sha256": "a2c76ec042ca097a57c3c05c1e519e392d498d387a31808c7d0f70482d43c201"
},
{
"path": "verify/campaign/test_controls.py",
"sha256": "656e5938fa5107022b73b32cf6fc05b6ff6e3e9ab239432d72b304b3f6ea1801"
},
{
"path": "campaign/README.md",
"sha256": "00f7c793efcb4f4e0d479342fbea6b942d7b782375ddc5ac46a354f93e4383d1"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "620eb9d25a6ad2f06b68353c",
"model": "openai/gpt-6-astra",
"next_action": "Lead runs complete integrated tests and one normal noninteractive launcher smoke, then assigns independent reproduction of the source-bound controls package before promotion.",
"role": "architecture-review",
"schema": "sots-checkpoint/1",
"session": "rollout-controls-repairs",
"summary": "Final repair handoff in controls-worker-state.md. Approved R4/R6 source bindings/immutable binaries+inputs/criterion outcomes/verdict identity and old recovery/resolution-only policies implemented, plus all runner followups and adversarial tests. 36/36 controls suite passed in 6.530s; subsequent checkpoint self-reference regression 1/1 in 0.098s and exact-root permission/subprocess regressions 2/2 in 0.391s. Both contracts validate; pilot remains proposed without evidence. Live OpenCode debug config validated generated implementer routing/prompt/permissions; no agent launch. Source HEADs rechecked RE 3bfde5a70d874a723e797a695bbd847fd82c0aa7, engine 7741d42fc5e4e761e6449bdaf0e4a61d00036a23; exact owned bytes attached. Bootstrap canonical exclusive ownership exception; concurrent work preserved. Gate/report source schemas preserved. No project commits, delegation, lab I/O or leases. Actual harness session ID unavailable; logical session rollout-controls-repairs. Contract unaccepted pending independent integrated reproduction and lead smoke. Prior self-referential checkpoint 2f0fe9ac4ec15b15a983bd75 is superseded and guarded against recurrence.",
"timestamp": "2026-09-09T21:54:48.101952+00:00"
}

View file

@ -0,0 +1,19 @@
{
"actor": "controls-independent-verifier",
"artifacts": [
{
"path": "campaign/rollout/formal-verifier-state.md",
"sha256": "f28012c46c1d7ff51fb7ace8e9a506400a7ce4091414c2d5d2e28b3d414c9fc9"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "6243ba8b2c2da77e7df666a0",
"model": "openai/gpt-5.6-terra",
"next_action": "Lead resolves R8, attaches the changed integrated controls package, and obtains a new independent verdict over that exact digest.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "controls-independent-20260909-formal-1",
"summary": "Independent formal verification reproduced the exact nonintegrated controls package. Current engine binding 7741d42fc5e4e761e6449bdaf0e4a61d00036a23/ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd and RE binding 3bfde5a70d874a723e797a695bbd847fd82c0aa7/82fc34631b2baa2ee74557020f74d68cc4db3c031561210f9933a3f22d7ff7b6 match attached evidence; declared binaries, inputs and result artifact rehash. validate controls-bootstrap passed. Fresh independent suite: 36/36 pass, zero skips, 6.720s; focused old-recovery/candidate-drift/integrated-RE-drift challenge: 3/3 pass, 0.722s. Actual run-df1472c13f31db3a4d5361f0 is complete, return 0, 24 events, zero errors, one stop session, matching checkpoint, and equal source-before/source-after; emitted model unavailable, so it evidences Astra architecture-review smoke only, not Terra-worker execution. Decision: scoped pass for controls-negative-paths only. Residual: Astra review R8 blocks a future integration-status verifier launch and needs resolution/new integrated verdict; no whole-engine or integrated acceptance claimed. No source implementation edits, commits, delegation, lab access, leases or test skips.",
"timestamp": "2026-09-09T22:08:41.670609+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "rollout-lead",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/decisions/d-2570bf9c76ae66711bdac461.json",
"sha256": "2927a18704e12af380045a08e276f35c0198ba0ef57df8babf419c25405f06b5"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "6d3ec66be6274ceb67c32959",
"model": "openai/gpt-6-astra",
"next_action": "Final-controls-verifier: this is INTEGRATION. Compare current integrated package/source/input/outcome hashes to your preceding run-7924472fe12e745111fa4997 verdict. Same tested bytes; integrated marker is the intended digest change. Rehash and issue final integrated scoped verdict if valid, with a fresh checkpoint for current runner session. Prior run-scope correction is resolved; no code changes or redundant suite run needed.",
"role": "lead",
"schema": "sots-checkpoint/1",
"session": "rollout-final-digest",
"summary": "Final-controls-verifier independently passed same exact 37-test source/package after explicit run-scope resolution. Only the evidence integrated marker/digest now changes; source, executables, inputs and outcome bytes are identical. Ready for final scoped verifier attestation.",
"timestamp": "2026-09-09T22:24:16.301936+00:00"
}

View file

@ -0,0 +1,27 @@
{
"actor": "final-controls-verifier",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/surprises/s-abd1c3613c9922cc94c608d5.json",
"sha256": "67899b5dca7185a8cff63027f7e4694009390157bd02f9d1d38866a83999e42d"
},
{
"path": "campaign/runtime/decisions/d-2570bf9c76ae66711bdac461.json",
"sha256": "2927a18704e12af380045a08e276f35c0198ba0ef57df8babf419c25405f06b5"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "711ee56eb917dc02eafc1f8a",
"model": "openai/gpt-5.6-terra",
"next_action": "Astra must resolve s-abd1c3613c9922cc94c608d5 by either authorizing canonical-only integrated verification with explicit scope or providing source-identical paired worktrees; then a fresh verifier must reproduce the full suite and held-out runner-event ablation before issuing any verdict.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-e459b5bcb1b0a0a7cbe960f5",
"summary": "Stop checkpoint after reproducibility surprise. Observation: canonical integrated source binding independently equals evidence (engine ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd; RE 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8); every declared binary, immutable input and outcome artifact hash matches. Assigned paired worktrees are clean at baseline commits but bind differently (engine 949dfb46cb8c42afe3a371e988d63adf1c1f18d7cca50565fd558e5a466cf93b; RE 67b7b60509fe43c8d23382003fed069fb32549094eea0c039b75475e32a7a9eb). The paired RE does not contain tools/campaign.py or verify/campaign/test_controls.py, so cannot reproduce evidence from handoff alone. This falsified the required worktree reproducibility assumption; surprise s-abd1c3613c9922cc94c608d5 is open and contract is blocked. Decision: pause all affected reproduction, held-out ablation, and final verdict; do not treat canonical hash agreement or reported 37 tests as acceptance. No source edits, leases, lab operations, staging, commits, or verdict. Failed prediction/residual: isolated assigned worktree would expose the tested package; it exposes only the pinned baseline. Exact preliminary commands/results: canonical source-binding matched evidence; paired source-binding differed; sha256sum of six declared files matched the contract. Blocker: Astra resolution or provision of source-identical paired worktrees.",
"timestamp": "2026-09-09T22:26:05.482787+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "final-controls-verifier",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/rollout/controls-worker-state.md",
"sha256": "02ff66f3f0fa978819e5c100e24cfd3752b9041590e2aed36f6abd62ce790f4e"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "7a272d19b65f489baf99208c",
"model": "openai/gpt-5.6-terra",
"next_action": "From /tmp/opencode/sots-final-re run the controls unittest suite, then independently inspect held-out test behavior and raw runner event/session/source records.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-2598ca81c443c330e0a4d5b2",
"summary": "Fresh verifier quantum pre-experiment. Observations: all five surprises are resolved; contract is verification with no open surprises. Assigned paired worktrees have the pinned HEADs (RE 3bfde5a70d874a723e797a695bbd847fd82c0aa7; engine 7741d42fc5e4e761e6449bdaf0e4a61d00036a23), share their canonical Git common directories, and their independently recomputed source-binding digests equal canonical/evidence bytes: RE 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8, engine ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd. Declared paired code/input hashes match; evidence JSON itself is deliberately canonical runtime/evidence data and absent from the paired source inventory. Falsifiers before execution: a source/hash mismatch, missing test or raw evidence, any failed/skip/zero test, or a held-out mutation not rejected blocks acceptance and is a surprise if the stated control assumption is falsified. Required exposures: positive 37-test suite plus distinct same-HEAD drift, malformed-input, pending-surprise, and runner event/session states; independently inspect raw run state/event counts rather than counters. No resources leased or lab actions. Decision: reproduce only; no source edits or promotion.",
"timestamp": "2026-09-09T22:30:36.564366+00:00"
}

View file

@ -0,0 +1,27 @@
{
"actor": "final-controls-verifier",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/runs/run-df1472c13f31db3a4d5361f0.json",
"sha256": "65dd1c1286742cd4d2401af5a229d7d014f60dd329dadee0dee78c499f61d663"
},
{
"path": "campaign/runtime/runs/run-cb15199f9272fe496bd10a8a.json",
"sha256": "b59375a6559534adb0b5a9cd159ea0ec787e7b6438e9747ac8a7a469698e0849"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "7fb3c73bd64bba6cf3d2081b",
"model": "openai/gpt-5.6-terra",
"next_action": "Run an isolated held-out source-binding test using a fresh temporary Git fixture with an unlisted executable-mode change at unchanged HEAD; then count/validate raw JSONL events and decide whether to record a verdict.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-2598ca81c443c330e0a4d5b2",
"summary": "Mid-quantum verifier checkpoint before held-out experiment. Reproduction from assigned /tmp/opencode/sots-final-re completed: python3 -m unittest discover -s verify/campaign -p test_*.py -v => 37 tests, 6.849s, OK; no skips or zero execution. Suite exposed lifecycle acceptance refresh, same-HEAD engine and RE source drift rejection, malformed/schema/immutable input failures, pending-surprise launch blocking, lease collision, and runner error/stop/session/config branches. Direct code inspection confirms evidence rehashes source bindings plus binary/input/outcome artifacts and verdict binds evidence/source-binding digests. Raw records identify distinct smoke run df147 (24 events) and earlier Terra verifier cb151 (67), with respectively unavailable observed model, zero errors, return 0 and one actual session as claimed; decision d-2570 scopes that distinction. Current launcher record is running and has source_before only, as expected. Residual: raw JSONL event parsing still to be independently counted and held-out boundary must test an unlisted filename/mode-style same-HEAD alteration; no claim of acceptance or integrated evidence. No leases/lab actions/source edits.",
"timestamp": "2026-09-09T22:31:21.248574+00:00"
}

View file

@ -0,0 +1,31 @@
{
"actor": "final-controls-verifier",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/verdicts/controls-bootstrap.json",
"sha256": "603b60dd3eb6c74e3caea0f9f0848d52853c10fcdd9e8596499b6c39a7155c58"
},
{
"path": "campaign/runtime/runs/run-df1472c13f31db3a4d5361f0.json",
"sha256": "65dd1c1286742cd4d2401af5a229d7d014f60dd329dadee0dee78c499f61d663"
},
{
"path": "campaign/runtime/runs/run-cb15199f9272fe496bd10a8a.json",
"sha256": "b59375a6559534adb0b5a9cd159ea0ec787e7b6438e9747ac8a7a469698e0849"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "86940a479b01400dd7ca6069",
"model": "openai/gpt-5.6-terra",
"next_action": "Lead: attach the current source-bound controls package as integrated evidence in integration, then launch a fresh independent verifier to attest that integrated package before considering acceptance.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-2598ca81c443c330e0a4d5b2",
"summary": "Final checkpoint for fresh bounded verifier quantum. Source identities: canonical and assigned paired RE HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7, engine HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23; paired common directories are canonical and independent source-binding digests match evidence exactly (RE 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8; engine ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd). Observations: declared tools/test/schema/evidence hashes match; source-identical paired reproduction ran 37 controls tests in 6.849s with all passing/no skips. Held-out isolated Git fixture retained HEAD while a previously unlisted tracked file mode change altered source manifest (46557a99 to c4f155d3); expected campaign/runtime exclusion did not alter it. Raw JSONL independently parsed: df147 24 and cb151 67 events, each zero errors, one session, one stop, return 0 and source_before==source_after. No game RNG workload exists; prompt mentions are not treated as RNG accounting. Decision: wrote verifier-scoped pass verdict only; it is independent control-test reproduction, not original-assisted, partial/full game comparison, integrated replay, or acceptance. No failed predictions/surprises, source edits, resource leases, lab actions, staging, commits or promotion. Blocker/residual: contract remains verification with unintegrated evidence; lead must attach source-bound integrated evidence then arrange a fresh independent verifier attestation in integration before any acceptance.",
"timestamp": "2026-09-09T22:32:57.255625+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "rollout-lead",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/rollout/sync_verifier_snapshot.py",
"sha256": "4133e536bfdb0e206ecdfc072062e7674b07b973c7f8b9d7f1a268520523d6eb"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "92b718f7ad621b7dad325071",
"model": "openai/gpt-6-astra",
"next_action": "Verifier: confirm both paired source digests equal current canonical evidence and code/fixtures exist, run controls criterion from assigned sots-final-re snapshot, rehash package, and issue scoped verdict plus fresh checkpoint. Review open-surprise resolutions; only output path differs, content is identical. Do not use old baseline-only sots-launch trees.",
"role": "lead",
"schema": "sots-checkpoint/1",
"session": "rollout-identical-handoff",
"summary": "Source-identical isolated paired integration trees now exist; canonical and paired engine/RE content digests match exact tested package. Previous baseline-only trees were only smoke environments. Code and fixture source present in sots-final-re. No canonical source changes; previous independently reproduced 37-test artifact remains byte-identical.",
"timestamp": "2026-09-09T22:29:15.076468+00:00"
}

View file

@ -0,0 +1,31 @@
{
"actor": "final-controls-verifier",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/decisions/d-2570bf9c76ae66711bdac461.json",
"sha256": "2927a18704e12af380045a08e276f35c0198ba0ef57df8babf419c25405f06b5"
},
{
"path": "campaign/runtime/runs/run-df1472c13f31db3a4d5361f0.json",
"sha256": "65dd1c1286742cd4d2401af5a229d7d014f60dd329dadee0dee78c499f61d663"
},
{
"path": "campaign/runtime/runs/run-cb15199f9272fe496bd10a8a.json",
"sha256": "b59375a6559534adb0b5a9cd159ea0ec787e7b6438e9747ac8a7a469698e0849"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "9868af5d440d819d8d542903",
"model": "openai/gpt-5.6-terra",
"next_action": "Before any test execution, independently compare current paired-worktree manifest entries to evidence/run source manifests; if the difference reaches controls code/input/binary files, record a surprise and pause verdict work; otherwise run the held-out negative-control test and reproduce the suite.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-7924472fe12e745111fa4997",
"summary": "Observations: canonical README, contract, latest checkpoint, workflow, decision d-2570bf9c76ae66711bdac461, evidence artifact, handoff, run records and leases were read. validate passed; contract is verification with no open surprises. Engine/RE paired worktrees are distinct, at baseline commits 7741d42fc5e4e761e6449bdaf0e4a61d00036a23 and 3bfde5a70d874a723e797a695bbd847fd82c0aa7, but current candidate source-binding is engine 949dfb46cb8c42afe3a371e988d63adf1c1f18d7cca50565fd558e5a466cf93b and RE 67b7b60509fe43c8d23382003fed069fb32549094eea0c039b75475e32a7a9eb, not the evidence binding (ccd8... / 6696...). This is a source-identity boundary that must be resolved by inspecting manifests before relying on old evidence. Decision scope correction claims raw counts 24 (df147) and 67 (cb151); both records state unavailable observed model, so claimed model remains requested only. All inspected lab leases are released; none used. Decision: no verdict or source edits; first checkpoint is a verifier recovery record, not acceptance.",
"timestamp": "2026-09-09T22:21:59.627146+00:00"
}

View file

@ -0,0 +1,35 @@
{
"actor": "final-controls-verifier",
"artifacts": [
{
"path": "campaign/runtime/verdicts/controls-bootstrap.json",
"sha256": "ee9ad47b7391e25b7dbaf5406ddfa0f495988438b6d67b61f7f35429537eb6d1"
},
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/decisions/d-2570bf9c76ae66711bdac461.json",
"sha256": "2927a18704e12af380045a08e276f35c0198ba0ef57df8babf419c25405f06b5"
},
{
"path": "campaign/runtime/runs/run-df1472c13f31db3a4d5361f0.json",
"sha256": "65dd1c1286742cd4d2401af5a229d7d014f60dd329dadee0dee78c499f61d663"
},
{
"path": "campaign/runtime/runs/run-cb15199f9272fe496bd10a8a.json",
"sha256": "b59375a6559534adb0b5a9cd159ea0ec787e7b6438e9747ac8a7a469698e0849"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "99a1715514099c8493be8715",
"model": "openai/gpt-5.6-terra",
"next_action": "Lead/integrator: attach a complete source-bound integrated controls evidence package at the canonical integrated binding, then commission a fresh independent verifier verdict because the evidence digest changes; do not promote the present nonintegrated pass.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-7924472fe12e745111fa4997",
"summary": "Final verifier checkpoint. Observations: canonical source-binding exactly equals attached evidence: engine 7741d42fc5e4e761e6449bdaf0e4a61d00036a23/ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd, RE 3bfde5a70d874a723e797a695bbd847fd82c0aa7/6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8; binaries/inputs/outcome rehashed. Paired trees are baseline-pinned/clean; their distinct bindings are expected (canonical evidence was not substituted). validate passed before and after verdict. Reproduction: PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s verify/campaign -p test_*.py -v -> 37/37 pass, 7.087s, no skips/errors/failures. Held-out negative controls old-recovery, same-HEAD candidate drift, canonical-integrated drift, and integration verifier guards -> 4/4 pass, 1.106s. A first selected command incorrectly targeted Runner.test_error_followed_by_success_still_fails as Controls and produced one collection AttributeError; corrected Runner command -> 1/1 pass in 0.246s. This verifier-command residual is not a product pass. Independent raw JSONL parse: df147 24 lines and cb151 67, matching respective records; both zero errors, one session, one stop, return 0 and source_before==source_after. observed_model_status is unavailable in both; requested models are not authenticated. No RNG/stateful game workload applies to this control contract; source state comparison was independently checked. All leases inspected released; none acquired/used. Decisions: issued pass verdict only for exact nonintegrated controls package; no engine/assets/original/replay/RNG/integrated acceptance and no source/lab/architecture mutation. Blocker: contract evidence remains integrated:false, so no acceptance/promotion.",
"timestamp": "2026-09-09T22:23:37.140581+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "controls-independent-verifier",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/runs/run-cb15199f9272fe496bd10a8a.json",
"sha256": "b59375a6559534adb0b5a9cd159ea0ec787e7b6438e9747ac8a7a469698e0849"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "af5cd91c318bf4c4fde759bc",
"model": "openai/gpt-5.6-terra",
"next_action": "Independently rehash canonical integrated package, run complete controls suite, and execute held-out CLI negative control.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-f4ee1aa70be8601ad527689f",
"summary": "Fresh verifier quantum pre-experiment checkpoint. Observations: canonical RE HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7, engine worktree HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23, RE worktree HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7; paired worktrees are clean and distinct. Canonical RE is intentionally dirty with controls package; its attached integrated evidence binds canonical source hashes engine ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd and RE 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8. Candidate clean-worktree binding differs (engine 949dfb46cb8c42afe3a371e988d63adf1c1f18d7cca50565fd558e5a466cf93b; RE 67b7b60509fe43c8d23382003fed069fb32549094eea0c039b75475e32a7a9eb) and is not evidence substitution. All three surprises are resolved. Contract is integration; validate passed. Falsifiers before execution: declared hashes/binding fail to revalidate; suite has zero/skipped/missing named tests; held-out corruption is accepted; actual run lacks a nonempty session, stop, no errors, fresh matching checkpoint, or preserves sources. Required states: valid package, invalid immutable input, old intact recovery, same-HEAD drift, successful versus malformed/error run event. No source edits, staging, commits, lab actions, leases or architecture decisions. Next action: independently rehash canonical package, run complete controls suite, and execute held-out CLI negative control.",
"timestamp": "2026-09-09T22:16:32.579898+00:00"
}

View file

@ -0,0 +1,27 @@
{
"actor": "controls-independent-verifier",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/runs/run-cb15199f9272fe496bd10a8a.json",
"sha256": "b59375a6559534adb0b5a9cd159ea0ec787e7b6438e9747ac8a7a469698e0849"
},
{
"path": "campaign/runtime/surprises/s-4a7d66ebd7d8a8f3ec59f11d.json",
"sha256": "113048249417c2c9f612bc1c577b94612ceca317142c4e90901c7e61c9df2bb7"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "afbcef41803eb3ff4be76392",
"model": "openai/gpt-5.6-terra",
"next_action": "Astra resolves s-4a7d66ebd7d8a8f3ec59f11d after its discriminating raw-log probe, explicitly deciding invalidation/remediation scope before verifier reruns final package validation.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-f4ee1aa70be8601ad527689f",
"summary": "Fresh verifier quantum stopped on an open contradiction. Identity observations: canonical RE HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7 and engine HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23; both assigned paired worktrees were clean, distinct, baseline-pinned. Canonical source-binding rehash exactly matched attached integrated evidence: engine ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd, RE 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8. Independently rehashed all declared binaries, inputs and outcome artifact; all match. validate passed. Reproduction: complete suite 37/37 passed in 6.868s, no skips/errors/failures. Held-out negative-control subset exercised old intact recovery, same-HEAD candidate drift, same-HEAD integrated RE drift and final verifier integration launch guards: 4/4 passed in 0.924s. Independent raw run-state audit found run-cb15199f9272fe496bd10a8a has 67 JSONL events, zero error events, one stop, one actual session, return 0 and source_before==source_after; this agrees with its run record except older verdict/checkpoint incorrectly claimed 24 parsed events. Failed prediction/residual: prior 24-event assertion is false; emitted provider model remains unavailable, so the record proves requested Terra routing and completion guards but not authenticated provider model identity. Recorded open surprise s-4a7d66ebd7d8a8f3ec59f11d and paused: contract is blocked, no new verdict. No source edits, commits, staging, lab/resource actions, leases, delegation or architecture decisions. Exact next action: Astra resolves s-4a7d66ebd7d8a8f3ec59f11d after its discriminating raw-log probe, explicitly deciding invalidation/remediation scope before verifier reruns final package validation.",
"timestamp": "2026-09-09T22:17:53.864591+00:00"
}

View file

@ -0,0 +1,27 @@
{
"actor": "controls-independent-verifier",
"artifacts": [
{
"path": "campaign/rollout/formal-verifier-state.md",
"sha256": "2fbac02f5f22b45e94ee33f9f53779fa059c5e93282d3c2f5ad0af027029a1f4"
},
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/verdicts/controls-bootstrap.json",
"sha256": "f048f57462778cd9abc715e4e76e9d56b873e0deebbd21222bf07f68be191a81"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "b467c2d772260f1f03637133",
"model": "openai/gpt-5.6-terra",
"next_action": "Lead: attach a source-bound integrated controls package; then commission a fresh independent verifier verdict over that changed evidence digest.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-cb15199f9272fe496bd10a8a",
"summary": "Fresh bounded verifier quantum completed. Observations: all open-surprise records are resolved; canonical and paired worktree HEADs equal their baseline commits; canonical source binding exactly matches the current attached evidence (engine ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd, RE 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8); paired candidate binding is distinct and was not substituted. Independently rehashed declared binaries/inputs/outcome. validate passed before and after verdict. Tests: full canonical controls suite 37/37 passed, no skips/errors/failures, 7.049s; held-out recovery/same-HEAD candidate+canonical-integrated drift/integration-verifier negative controls 4/4 passed, 1.093s. Actual non-fake launch record independently parsed as 24 events, zero errors, one session, stop, return 0, matching checkpoint and unchanged sources; its emitted model is unavailable and it is Astra architecture-review, not Terra normal-worker proof. Decisions: fresh verifier pass recorded only for the exact nonintegrated controls evidence. No source edits, commits, staging, lab/resource actions, architecture changes, or integration/engine/RNG/replay claims. Blocker/residual: no integrated evidence/package exists; actual smoke does not establish Terra execution. Exact next action: lead attaches a source-bound integrated controls package, then commission a fresh independent verdict bound to that changed evidence digest.",
"timestamp": "2026-09-09T22:14:45.615476+00:00"
}

View file

@ -0,0 +1,27 @@
{
"actor": "final-controls-verifier",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/decisions/d-2570bf9c76ae66711bdac461.json",
"sha256": "2927a18704e12af380045a08e276f35c0198ba0ef57df8babf419c25405f06b5"
},
{
"path": "campaign/rollout/controls-worker-state.md",
"sha256": "02ff66f3f0fa978819e5c100e24cfd3752b9041590e2aed36f6abd62ce790f4e"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "c5548c12161e48a3db015d61",
"model": "openai/gpt-5.6-terra",
"next_action": "Independently rehash the declared evidence inputs/binaries/outcome/source bindings, then run the complete controls test suite and a held-out runner-event ablation from the paired RE worktree.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-e459b5bcb1b0a0a7cbe960f5",
"summary": "Pre-experiment verifier checkpoint. Observations: canonical contract is integration with no open surprises; candidate paired worktrees are clean and at engine 7741d42fc5e4e761e6449bdaf0e4a61d00036a23 and RE 3bfde5a70d874a723e797a695bbd847fd82c0aa7. Contract evidence claims the 37 named controls tests passed, binds candidate source digests engine ccd8e020... and RE 6696fd52..., and is marked integrated. Falsifiers defined before reproduction: (1) any source/binary/input/outcome hash or source binding mismatch; (2) zero/partial/unexpectedly skipped test execution; (3) negative branches lack distinct state exposure; (4) held-out malformed runner event sequence is accepted; (5) claimed run event counts do not match JSONL records. Required branch exposures: lifecycle/checkpoint, source/input/outcome tamper, model/surprise/lease/WIP, runner error/session/stop/config. Distinct states: accepted/rejected invalid inputs, clean/dirty identity, open/resolved surprise, complete/incomplete run, lease winner/loser. Decision: no verdict yet. No leases/lab actions. Next execution will independently rehash package and run reproduction plus held-out ablation.",
"timestamp": "2026-09-09T22:25:03.799359+00:00"
}

View file

@ -0,0 +1,35 @@
{
"actor": "controls-architect",
"artifacts": [
{
"path": "tools/campaign.py",
"sha256": "ca4eb2c42e88c1222ec60d6b99c58fffcc72746411c499c4cb0246d899ebbd10"
},
{
"path": "tools/run_agent.py",
"sha256": "6d8a8a2a408c3e8e2beeaf756d9746ed510f65674719e957222fd01031a10689"
},
{
"path": "campaign/contract.schema.json",
"sha256": "a2c76ec042ca097a57c3c05c1e519e392d498d387a31808c7d0f70482d43c201"
},
{
"path": "verify/campaign/test_controls.py",
"sha256": "b6ea75ff7d83bad68d4a09d05e8079b6a7f1bb45bea9226373f724e74f2d3717"
},
{
"path": "campaign/README.md",
"sha256": "00f7c793efcb4f4e0d479342fbea6b942d7b782375ddc5ac46a354f93e4383d1"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "d0b99f8ee3e86db13fa8808d",
"model": "openai/gpt-6-astra",
"next_action": "Run the checkpoint bounds/self-reference regression, write final controls-worker-state.md handoff, and persist/validate final checkpoint.",
"role": "architecture-review",
"schema": "sots-checkpoint/1",
"session": "rollout-controls-repairs",
"summary": "Final expanded controls suite passed 36/36 in 6.530s; campaign validate passed controls-bootstrap and proposed research-replacement. Git HEAD rechecked: RE 3bfde5a70d874a723e797a695bbd847fd82c0aa7; engine 7741d42fc5e4e761e6449bdaf0e4a61d00036a23. Identified checkpoint self-reference in prior checkpoint 2f0fe9ac4ec15b15a983bd75: attaching the same contract before saving checkpoint pointer invalidated that artifact hash. Added guard and regression assertion; this checkpoint supersedes the invalid self-referential record and attaches only stable owned files. Targeted guard test pending. R4/R6 decisions remain authority; implementation measurements only, no acceptance or independent verification claim. No lab/resources/delegation/commits; actual harness session ID unavailable.",
"timestamp": "2026-09-09T21:52:54.003215+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "controls-architect",
"artifacts": [
{
"path": "campaign/rollout/controls-worker-state.md",
"sha256": "8ec378244f75c36b95856c46b370cc80e046d1ca3d441d8f4d4a0964667adb98"
},
{
"path": "campaign/rollout/controls-followup.md",
"sha256": "44d0c95978cbc0953d6b1feab4463b29fab68c9d8dad2eca5fd562bb5aee1578"
}
],
"basis": "1167f2f44aa39b1b6453e9af3e5046c4653ecea9bdee5281f4fcaea60b16e9a9",
"contract": "controls-bootstrap",
"id": "d37e0242ac92252f62aa6207",
"model": "openai/gpt-6-astra",
"next_action": "Read verify/campaign/test_controls.py and campaign/contract.schema.json, then implement R4/R6 and runner followup repairs in owned files.",
"role": "architecture-review",
"schema": "sots-checkpoint/1",
"session": "rollout-controls-repairs",
"summary": "Recovery read completed from controls-worker-state.md and prior canonical checkpoint. Lead decisions d-42c6d0b4ee5114e6f2e07c99 (R4) and d-ab717735fc6c1661919f6894 (R6) authorize source binding and recovery repairs. Bootstrap exclusive file ownership exception applies in canonical RE; baseline engine 7741d42fc5e4e761e6449bdaf0e4a61d00036a23, RE 3bfde5a70d874a723e797a695bbd847fd82c0aa7; concurrent uncommitted files preserved. No edits or tests yet. Harness model openai/gpt-6-astra; actual session ID unavailable, logical session rollout-controls-repairs. No leases or lab operations. Gate stays sots-gate/1 source engine/re; reporter measured with require-match. Next inspect tests/schema/config then implement owned controls.",
"timestamp": "2026-09-09T21:43:13.719089+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "rollout-lead",
"artifacts": [
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
},
{
"path": "campaign/runtime/runs/run-cb15199f9272fe496bd10a8a.json",
"sha256": "b59375a6559534adb0b5a9cd159ea0ec787e7b6438e9747ac8a7a469698e0849"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "ee6d1533aec6504184af4c52",
"model": "openai/gpt-6-astra",
"next_action": "As independent verifier read campaign/rollout/formal-verifier.md. Revalidate final integrated evidence against previously reproduced identical hashes, inspect real Terra run-cb15199f9272fe496bd10a8a events and checkpoint, and record final scoped verdict plus fresh runner-session checkpoint. No redundant full suite if source/input bytes unchanged.",
"role": "lead",
"schema": "sots-checkpoint/1",
"session": "rollout-final-integration",
"summary": "Independent Terra verification passed 37/37 and guarded recovery/source/integration-entry tests on exact canonical source. Actual normal Terra verifier run run-cb15199f9272fe496bd10a8a completed with real session, stop, fresh checkpoint and unchanged paired source. Identical canonical package now marked integrated; final independent digest-bound verdict required.",
"timestamp": "2026-09-09T22:15:27.121092+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "controls-independent-verifier",
"artifacts": [
{
"path": "campaign/rollout/formal-verifier-state.md",
"sha256": "089470f08ef084331c84a1b5340765e0e8ab75a43ab4213cfb369cad86bbc8cd"
},
{
"path": "campaign/evidence/controls-suite-1788991911311171323.json",
"sha256": "bd6ae3eba3d3df606e0410676819db47a46094571d0680edbf9b907bf90d693e"
}
],
"basis": "3c54cfd9a34913e0725e7eaa9f5ee04243a1a60d6edb10d0e2971e02dbf0a5d4",
"contract": "controls-bootstrap",
"id": "f5aec983257c6d5851cf00dd",
"model": "openai/gpt-5.6-terra",
"next_action": "Run canonical source-binding and evidence validation, then execute the complete controls suite and held-out negative-control methods.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-cb15199f9272fe496bd10a8a",
"summary": "Pre-experiment verifier checkpoint. Observations: AGENTS, README, contract, latest lead checkpoint, raw evidence/run, independent Astra review and all surprise records were read. All three surprises are resolved. Canonical RE/engine and paired worktree HEADs match pinned baseline commits; canonical trees are dirty and paired trees clean, so candidate binding is not interchangeable with canonical evidence. Plan/falsifiers and distinct state/branch exposures are in campaign/rollout/formal-verifier-state.md. Decision: run no lab actions or source edits; independently rehash/revalidate, reproduce all 37 controls tests, and challenge recovery, same-HEAD drift, and integration-verifier guards. Blocker: no integrated evidence exists; no integrated acceptance will be claimed.",
"timestamp": "2026-09-09T22:13:29.322611+00:00"
}

View file

@ -0,0 +1,19 @@
{
"actor": "launcher-smoke",
"artifacts": [
{
"path": "campaign/agents/lead.md",
"sha256": "7661bbfca972be50a52c735b7f15f5be740158542c3d0cdbdf9a6a2590c7f1ea"
}
],
"basis": "dcdc05132c3da6c058873b664d864c731cb2cfdf5a6d015da2c18a48507f0e2c",
"contract": "launcher-smoke",
"id": "9e8a62fea4de50abd96f27d6",
"model": "openai/gpt-6-astra",
"next_action": "Lead inspects run-df1472c13f31db3a4d5361f0 actual event/session/checkpoint binding and final before/after source identities.",
"role": "architecture-review",
"schema": "sots-checkpoint/1",
"session": "run-df1472c13f31db3a4d5361f0",
"summary": "Observations: explicit Astra launcher reached canonical RE state from paired worktrees; no source mutation. Read canonical AGENTS.md, campaign/README.md, guides/multi-agent-workflow.md, launcher-smoke contract and both surprise records (both resolved; no open surprises found). Contract checkpoint is null; documented architecture bootstrap permits this fresh smoke. Git rev-parse and git status --porcelain succeeded: engine /tmp/opencode/sots-launch-engine HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23 common-dir /home/alex/sots-engine/.git; RE /tmp/opencode/sots-launch-re HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7 common-dir /home/alex/sots-re/.git; both clean and baseline-matched. Run record campaign/runtime/runs/run-df1472c13f31db3a4d5361f0.json records requested openai/gpt-6-astra, architecture-review, launcher-smoke, paired source-before manifests and 40-step overlay; actual emitted model/session and final runner completion remain for lead inspection, not self-attested acceptance. Artifact campaign/agents/lead.md read. Decisions: remain smoke-only, write this checkpoint and stop; no implementation, delegation or promotion. Tests: read-only worktree identity/status checks only; no build or lab tests. Resources: no leases acquired or used, no lab access or mutation; lease directory inspected only, existing ownership untouched; cleanup not applicable. Blockers: none for checkpoint; live-launch acceptance pending independent lead inspection of completed runner provenance.",
"timestamp": "2026-09-09T22:02:10.570990+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "research-problem-resolver",
"artifacts": [
{
"path": "verify/results/research-completion-abi-independent/result-run-eba7860308317f839eb35392.md",
"sha256": "cc32d547e4aa56d573710b457cbe130617441a22db80624ecc549237ba4a9ca2"
},
{
"path": "verify/results/research-completion-abi-independent/run-eba7860308317f839eb35392/manifest.json",
"sha256": "898d24d660226dc0ef050edd1e892296c61d1412165d3857298b5aba45853ebb"
}
],
"basis": "aaddeb76f74bbd1a43671f882770ec84a7d690b4060d060ef1a68f918e8edbb0",
"contract": "research-completion-abi",
"id": "0097da20f564f89191a49da6",
"model": "openai/gpt-6-astra",
"next_action": "Inspect the three ownership raw terminal windows against the archive and record a scoped Astra provenance-repair decision through campaign resolve.",
"role": "resolver",
"schema": "sots-checkpoint/1",
"session": "run-7cc79c9a0461bcbeac0abf28",
"summary": "Resolution-only progress. Read canonical instructions, contract, latest verifier checkpoint, sole open surprise s-4f71bf4a5df4e5fc992bb6b2 and verifier result. Observation: three ownership archive terminal ret bytes contradict declared narrow stop commands; verifier reports hash-matched input/tool and positive static execution. No game-mechanism inference or archive production-history inference. Fresh git checks: assigned engine HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23/common /home/alex/sots-engine/.git; assigned RE HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7/common /home/alex/sots-re/.git. Dirty inventories observed, untouched; runner source_before records exact launch inventory. Historical bindings engine ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd, RE 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8 not freshly recomputed here. No experiments, source edits, delegation or lab access; no lease acquired. Initial relative-path campaign command denied by resolver allowlist; use authorized absolute CLI. Affected verification remains blocked pending raw review and decision.",
"timestamp": "2026-09-10T00:48:48.074888+00:00"
}

View file

@ -0,0 +1,47 @@
{
"actor": "research-abi-analyst",
"artifacts": [
{
"path": "verify/results/research-completion-abi/objdump-2026-09-10-boundary-repair.md",
"sha256": "e7e1fed33fc16c336e1897afa1de01275fc1014a01425b750aaf4347679089c2"
},
{
"path": "verify/results/research-completion-abi/objdump-2026-09-10-dedup-narrow.stdout.txt",
"sha256": "1c2408cd49cc10383bad9fe06d3287476b103205f4155adf64c8a50ccd5205e8"
},
{
"path": "verify/results/research-completion-abi/objdump-2026-09-10-dedup-narrow.stderr.txt",
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"path": "verify/results/research-completion-abi/objdump-2026-09-10-dedup-wide.stdout.txt",
"sha256": "3c9f83d3a98d95ffa68e0595e47f6c3beab3016aa97cd44bf39ac72ed3ec0a84"
},
{
"path": "verify/results/research-completion-abi/objdump-2026-09-10-dedup-wide.stderr.txt",
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"path": "campaign/research/research-completion-abi.md",
"sha256": "c5448feee5d8430e26dea4c07f314c8f8443deb32411b301c318dec3e5893d20"
},
{
"path": "verify/results/research-completion-abi/reva-2026-09-09-index.md",
"sha256": "5cde612099160f3c7ed01afc04c9acacf871879f152cfcf61bb1a78ef19a5cd4"
},
{
"path": "verify/results/research-completion-abi/recovered-static.md",
"sha256": "a59de10a3756f8655ce6b923035d816db2729a2d69f98282ef59d15fb023a2cd"
}
],
"basis": "aaddeb76f74bbd1a43671f882770ec84a7d690b4060d060ef1a68f918e8edbb0",
"contract": "research-completion-abi",
"id": "0ff5933d1610e27b1a3b6bed",
"model": "openai/gpt-5.6-sol",
"next_action": "Lead schedule a fresh independent verifier quantum to reproduce the repaired narrow/wide captures from the pinned binary/tool identities and execute the predeclared ABI branch, equal-versus-description-different, and NaN falsifiers before any semantic promotion.",
"role": "analyst",
"schema": "sots-checkpoint/1",
"session": "run-60351a432e82f814e23b5f6f",
"summary": "Mandatory fresh quantum-end checkpoint. OBSERVATIONS: contract remains needs-revision with no open surprises; requested and registry model are openai/gpt-5.6-sol. Assigned engine worktree is /tmp/opencode/sots-final-research-engine at HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23, common Git /home/alex/sots-engine/.git, source-content SHA256 ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd. Assigned RE worktree is /tmp/opencode/sots-final-research-re at HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7, common Git /home/alex/sots-re/.git, source-content SHA256 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8. Both retain pre-existing dirty inventories; only owned canonical campaign/research/research-completion-abi.md and verify/results/research-completion-abi/ were edited. Owner binary hash matched SHA256 970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841 / MD5 9969481c39f4b33a8a21c48b62abee4c. /usr/bin/objdump SHA256 1eaaef2e7f57c4c7f69115c495e2466f5a8c8e5f3bc42221d092382f30f9d4cd reports 2.38. MEASURED: exact separate narrow stop 0x00825e65 and wide stop 0x00825e67 commands exited zero with empty stderr. Each stdout has 120 instruction lines; all preceding lines match byte-for-byte; terminal 0x00825e64 is c2 versus complete c2 08 00. Narrow stdout SHA256 1c2408cd49cc10383bad9fe06d3287476b103205f4155adf64c8a50ccd5205e8; wide 3c9f83d3a98d95ffa68e0595e47f6c3beab3016aa97cd44bf39ac72ed3ec0a84. Wide matches historical first-window content after rstrip except one terminal blank line. DECISION: Astra stop-boundary prediction held; supersede only old first-window production provenance, not infer its history or self-promote dedup semantics. Updated owned handoff/index/static note and added identity report. TESTS: corrected paired-boundary Python hash/count/terminal/stderr assertions PASS; campaign validate PASS. Two interim ad-hoc assertions failed from overly exact whitespace and then a command typo; corrected check passed and artifacts were unchanged. BLOCKERS: independent-cross-check still requires a distinct verifier reproduction and semantic/NaN challenge; live same-bucket short/long fixtures, full-capacity memory, allocation failure, allocator compatibility, runtime construction and RNG remain unexecuted. No game/lab/Ghidra/VM operation, lease, staging, commit, architecture change or delegation; held resources none and cleanup none.",
"timestamp": "2026-09-10T00:35:20.891518+00:00"
}

View file

@ -0,0 +1,31 @@
{
"actor": "campaign-lead",
"artifacts": [
{
"path": "verify/results/research-completion-abi/run-79357a65226f61d6a86c042d/manifest.json",
"sha256": "9961d182f025c669b116cab8e522fb840798d90776773b70a7dd602a79e1c224"
},
{
"path": "verify/results/research-completion-abi/run-79357a65226f61d6a86c042d/comparison.json",
"sha256": "1b1ba9b7f274b0277ee079c85c17c454f03ccb555160aa2da61a78774a24bc38"
},
{
"path": "verify/results/research-completion-abi/run-79357a65226f61d6a86c042d/report.md",
"sha256": "d5a28f01002f1711cf8575ffd817a8f0998b413c6280d656e6cdad5a90a04477"
},
{
"path": "campaign/research/research-completion-abi.md",
"sha256": "698bdc5e6a96f1b8bf116b28fe61b203c692bbb82741fec80acadd1973ba8837"
}
],
"basis": "aaddeb76f74bbd1a43671f882770ec84a7d690b4060d060ef1a68f918e8edbb0",
"contract": "research-completion-abi",
"id": "0ffeab0aee67fe85d202ef5d",
"model": "openai/gpt-5.6-sol",
"next_action": "Transition to verification and launch research-abi-independent to reproduce complete repaired ownership and dedup windows, challenge truncated and complete boundaries, finish static ownership/NaN/archived-state checks, and preserve explicit runtime limitations.",
"role": "lead",
"schema": "sots-checkpoint/1",
"session": "overnight-lead-loop-2",
"summary": "Reviewed resolved Astra decision d-d4c494ba02ada278030ef473 and analyst repair run run-79357a65226f61d6a86c042d. The source, binary, and tool identities remained pinned. Twenty-two objdump commands and a full ten-window audit repaired six truncated ownership terminal boundaries; narrow/wide preceding lines and raw bytes agree, with no interior drift. Historical captures remain intact and only terminal-byte provenance is superseded. No open surprises remain. This checkpoint authorizes independent static verification only and makes no live allocator-safety or replacement-acceptance claim.",
"timestamp": "2026-09-10T01:05:57.693007+00:00"
}

View file

@ -0,0 +1,39 @@
{
"actor": "research-abi-independent",
"artifacts": [
{
"path": "verify/results/research-completion-abi-independent/verification-plan-run-7d85d45cb2196e07025e5096.md",
"sha256": "57d96ded9d273f7157257837dbeb5325346c014a21d91f5301be4beda8d5fa05"
},
{
"path": "verify/results/research-completion-abi-independent/reproduce_run_7d85d45cb2196e07025e5096.py",
"sha256": "0681a9a4f877b7f511d382ca2b010a1b4a9eb5e4863e46b3aed372e895778bfb"
},
{
"path": "verify/results/research-completion-abi-independent/run-7d85d45cb2196e07025e5096/manifest.json",
"sha256": "e59149945c90adb0b099552069a0e4a0a6c7271dafd40e13f0ec357d7365d784"
},
{
"path": "verify/results/research-completion-abi-independent/run-7d85d45cb2196e07025e5096/independent-state.json",
"sha256": "6463816f322803b2b7b479e1fc116c4ffa33fb2772a3005d492422a00acea433"
},
{
"path": "verify/results/research-completion-abi-independent/result-run-7d85d45cb2196e07025e5096.md",
"sha256": "838e19ee3093a44fa7c11408841b03fe676c16a621bceda67af95a278e8f9178"
},
{
"path": "campaign/runtime/verdicts/research-completion-abi.json",
"sha256": "4f72aec2b1dd577ca230b8369ffba075ff2a85fce449ba638a102217228ac9cf"
}
],
"basis": "aaddeb76f74bbd1a43671f882770ec84a7d690b4060d060ef1a68f918e8edbb0",
"contract": "research-completion-abi",
"id": "10b85ed419fa99a4c148a351",
"model": "openai/gpt-5.6-sol",
"next_action": "Lead reviews the scoped non-integrated PASS and, if integration is authorized, transitions/packages one integrated source-bound evidence array before launching a fresh independent integrated verifier.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-7d85d45cb2196e07025e5096",
"summary": "QUANTUM END. DECISION: Recorded scoped PASS verdict for the current two-record NON-INTEGRATED evidence array; contract remains verification and verifier made no transition. CLASSIFICATION: independent static reproduction plus archived-state inspection only, not original-assisted runtime, partial/full live compare, independent replacement or integrated replay. OBSERVATIONS: assigned identities after work remain engine HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23/common /home/alex/sots-engine/.git/binding ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd and RE HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7/common /home/alex/sots-re/.git/binding 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8; neither assigned tree was edited. Binary SHA256 970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841, objdump 1eaaef2e7f57c4c7f69115c495e2466f5a8c8e5f3bc42221d092382f30f9d4cd, save 978041acd168b56ed8eb3f5e42e78d5e70eae6e6517d75e659a5eb7ca3d60921 and all evidence hashes match. TESTS/REPRODUCTION: python3 verify/results/research-completion-abi-independent/reproduce_run_7d85d45cb2196e07025e5096.py exited 0, executing 22 static windows plus strict save/checksum (24 positive subprocesses, no skips/stderr); py_compile passed; campaign validate passed after verdict. Seven narrow/wide boundaries, 0x2c/0x74 strides, deep-copy and three-delete paths, description and unordered-coordinate branches reproduce. Held-out direct PE parser independently confirmed terminal bytes, plain-ret preceding-byte negative control and defaults. Actual state has EvNxID 4, turn-3 bucket count 2, event ID 3 values; checksum rebuilt 609080 bytes, root e9c161e311f8ef8fad6f1aa1903dcf3f; actual RNG leaf is 2503 bytes/digest 0978fdf34ff7962f76c2de810dc93e0a. No prediction failed/new surprise; prior provenance failures remain historical failures. RESIDUALS/BLOCKERS: no live short/long, capacity, duplicate/NaN, unwind/failure, allocator-family or original differential execution; one archived save does not generalize. No resource/lease/lab action or cleanup.",
"timestamp": "2026-09-10T01:29:09.385280+00:00"
}

View file

@ -0,0 +1,23 @@
{
"actor": "research-problem-resolver",
"artifacts": [
{
"path": "verify/results/research-completion-abi/objdump-2026-09-09-dedup-helper.txt",
"sha256": "3bc3c368f30f2ef2b0d291acad9c0f898b74f4436393d47bf8c942571793dd06"
},
{
"path": "verify/results/research-completion-abi-independent/result.md",
"sha256": "257c48f099c3efd92debbbe66ce5bad8241d0d941ff0d6725b07926e71577b53"
}
],
"basis": "aaddeb76f74bbd1a43671f882770ec84a7d690b4060d060ef1a68f918e8edbb0",
"contract": "research-completion-abi",
"id": "1381c2e77b8c4a68c6809a23",
"model": "openai/gpt-6-astra",
"next_action": "Inspect resolve control semantics and dependent claims, then record a durable Astra repair-only decision for s-5c58b6a921997731f5b5ae1f.",
"role": "resolver",
"schema": "sots-checkpoint/1",
"session": "run-1334385869fb7d5b940d5423",
"summary": "Resolution-only recovery. Read canonical AGENTS, README, workflow, contract, latest verifier checkpoint, sole open surprise s-5c58b6a921997731f5b5ae1f, verifier plan/result and raw dedup archive. Observation: archive declares stop 0x825e65 yet displays c2 08 00 at 0x825e64; verifier reports exact-command c2 and three other matching windows, positive zero-exit static commands, no runtime execution. Direct git identity checks: engine HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23/common /home/alex/sots-engine/.git; RE HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7/common /home/alex/sots-re/.git. Historical bindings ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd and 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8 not freshly recomputed: source-binding command denied by resolver permission overlay. Binary SHA256 970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841 is verifier-reported, not independently hashed here. No experiment, source edit, delegation or lab access; no lease acquired or cleanup needed. Decision pending: invalidate exact-command provenance, authorize only bounded read-only repair by an authorized subsequent worker, retain affected interpretation/acceptance hold pending raw paired-boundary capture. No stale-build or game-mechanism diagnosis.",
"timestamp": "2026-09-10T00:22:50.344764+00:00"
}

View file

@ -0,0 +1,35 @@
{
"actor": "research-abi-analyst",
"artifacts": [
{
"path": "verify/results/research-completion-abi/objdump-2026-09-09-turnevents.txt",
"sha256": "f95bbd2674aaa074feb70ebb13ec4877b3ceef3d2aafe5810b8b0ec337cfbb8b"
},
{
"path": "verify/results/research-completion-abi/recovered-static.md",
"sha256": "411a57a689f18aa29c92a57485884399fb6b0804ecf069dde24249e920be19bd"
},
{
"path": "verify/results/research-completion-abi/reva-2026-09-09-index.md",
"sha256": "b7124dac96f23866c1983b9b98bbdbb92611a3e2a08cd200a244001ad70ff62a"
},
{
"path": "campaign/research/research-completion-abi.md",
"sha256": "35cad2b199eab53f310d6b30f49cb3ba22f5264931770fe56634ad935b2828ce"
},
{
"path": "campaign/runtime/surprises/s-8996365dab2cd6dc0e17bb9f.json",
"sha256": "0749e5f0710a572a5682f5fac4e951892f543356433c261d293f1b32ac5b7bd1"
}
],
"basis": "aaddeb76f74bbd1a43671f882770ec84a7d690b4060d060ef1a68f918e8edbb0",
"contract": "research-completion-abi",
"id": "26d1c4fa6bd58b6a442e0241",
"model": "openai/gpt-5.6-sol",
"next_action": "Launch an openai/gpt-6-astra resolver for surprise s-8996365dab2cd6dc0e17bb9f to characterize helper 0x0046f8c0 and decide whether EvDsc participates in 0x00825d40 dedup before any affected ABI work resumes.",
"role": "analyst",
"schema": "sots-checkpoint/1",
"session": "run-8566a5bc5aa2bd9a1936b201",
"summary": "End-of-quantum checkpoint; affected work paused. Source identities: assigned engine HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23, binding ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd; assigned RE HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7, binding 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8. Both are linked to the canonical common dirs and baseline commits. Canonical RE digest observed as e74ef6cff202ee35a6fdc38d63842b4826a074e34502dfc2981a33ffea912bd4 and was not substituted. Binary dumps/sots.exe SHA-256 970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841 matched prior provenance. Measured static observations: new GNU objdump 2.38 capture covers 0x00885380/0x00825d40/0x00879eb0 and transitive outer TurnEvents append/growth/count*0x18 allocation/deep copy/destruction, nested PlayerEvent count*0x74 allocation/copy/destruction, and static partial-construction unwind. Get-or-create returns the last matching turn and on miss appends a deep-copied empty bucket before setting turn. Prune checks only a leading stale run and removes n-1 via deep shift; zero/one stale and stale-after-fresh are distinct branches. No recovered helper draws RNG. Static unwind edges are observed but live allocation failure and allocator safety remain unexercised. Conflict: FindDuplicate calls 0x0046f8c0 with candidate/stored +8 description strings after action/location/position/message/image checks and accepts only a false AL result, contrary to inherited prose that EvDsc is omitted. Decision: recorded open surprise s-8996365dab2cd6dc0e17bb9f; contract is blocked and dedup interpretation is explicitly unresolved pending Astra. I did not inspect that helper after the block. Verifier-facing falsifiers now name description-only difference, zero/one/two stale buckets, stale-after-fresh, duplicate turn buckets, spare/full outer capacity, and empty/nonempty nested vectors. Artifact hashes: new raw capture f95bbd2674aaa074feb70ebb13ec4877b3ceef3d2aafe5810b8b0ec337cfbb8b; recovered-static 411a57a689f18aa29c92a57485884399fb6b0804ecf069dde24249e920be19bd; provenance index b7124dac96f23866c1983b9b98bbdbb92611a3e2a08cd200a244001ad70ff62a; handoff 35cad2b199eab53f310d6b30f49cb3ba22f5264931770fe56634ad935b2828ce. Tests: source-binding commands succeeded; campaign validate listed all four contracts without error; status confirms blocked/open surprise; sha256sum matched all listed artifacts. No commit/stage/push. Resources: all canonical leases observed released; this actor holds none; no VM, Ghidra, build-host, or ReVa mutation; no cleanup required. Blockers: Astra resolution of dedup conflict; no live long-string/full-capacity fixture; no executed allocation failure; no live allocator-safety proof; 0x0084ee30 full local window remains a verifier cross-check.",
"timestamp": "2026-09-09T23:49:54.354638+00:00"
}

View file

@ -0,0 +1,19 @@
{
"actor": "research-abi-independent",
"artifacts": [
{
"path": "verify/results/research-completion-abi-independent/verification-plan-run-eba7860308317f839eb35392.md",
"sha256": "9d8626c8c3556c1d430484acbc1a5dd4fd3284706ac6e04c3fa95ed1854780f2"
}
],
"basis": "aaddeb76f74bbd1a43671f882770ec84a7d690b4060d060ef1a68f918e8edbb0",
"contract": "research-completion-abi",
"id": "47d1fd3aedce21f0ac2b2e7b",
"model": "openai/gpt-5.6-sol",
"next_action": "Run fresh unfiltered narrow/wide dedup and ownership/TurnEvents objdump captures against the hash-matched executable, then independently inspect decoded branches and archived save state.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-eba7860308317f839eb35392",
"summary": "PRE-EXPERIMENT CHECKPOINT. OBSERVATIONS: contract is in verification; campaign status reports no open surprises and validate passes. Paired engine HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23/common /home/alex/sots-engine/.git/binding ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd; paired RE HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7/common /home/alex/sots-re/.git/binding 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8. Both have pre-existing dirty inventories; verifier has not edited either paired tree. Canonical owner input dumps/sots.exe hashes to 970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841; /usr/bin/objdump hashes to 1eaaef2e7f57c4c7f69115c495e2466f5a8c8e5f3bc42221d092382f30f9d4cd and reports GNU 2.38. Prior provenance surprise is resolved by Astra and repaired handoff asks fresh independent reproduction. DECISION: fixed falsifiers, branch exposures, distinct states, NaN held-out challenge and narrow-boundary ablation in attached owned plan before execution. No VM/Ghidra/shared resource used; no lease held. BLOCKERS/LIMITS: no live allocator or game execution is authorized; result can only be independent static reproduction plus archived-state checking.",
"timestamp": "2026-09-10T00:40:37.977204+00:00"
}

View file

@ -0,0 +1,19 @@
{
"actor": "research-abi-independent",
"artifacts": [
{
"path": "verify/results/research-completion-abi-independent/verification-plan.md",
"sha256": "a18737d98e6009ea314e9d37b077042e853d886d3ea2cf438b8b4340845aa008"
}
],
"basis": "aaddeb76f74bbd1a43671f882770ec84a7d690b4060d060ef1a68f918e8edbb0",
"contract": "research-completion-abi",
"id": "49350005b48eb04a30cd156f",
"model": "openai/gpt-5.6-sol",
"next_action": "Run the four unfiltered objdump commands from the analyst handoff against the independently rehashed dumps/sots.exe into a verifier-owned raw capture, checking exit status and requested range coverage.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-6c7a726f5a2849ef0407876f",
"summary": "Pre-experiment verifier checkpoint. Observation: contract is in verification, campaign status and validate succeed, and all six canonical surprises are resolved with none open for this contract. Requested model matches campaign/models.json verifier registry. Assigned engine worktree HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23, common dir /home/alex/sots-engine/.git, binding ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd; assigned RE worktree HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7, common dir /home/alex/sots-re/.git, binding 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8. Both have the expected pre-existing dirty inventories; no source worktree edits were made. Input independently hashes SHA256 970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841 and MD5 9969481c39f4b33a8a21c48b62abee4c; GNU objdump is 2.38. Decision: fixed falsifiers, branch exposures, distinct states, scope labels, and a held-out NaN negative control in the attached verifier-owned plan before reproduction. No lab resource is leased or touched. Tests so far are identity/hash/status checks only; no independent instruction reproduction has started. Blocker: live allocator safety and live empty/short/long fixtures remain unavailable and cannot be promoted by static work.",
"timestamp": "2026-09-10T00:15:54.329971+00:00"
}

View file

@ -0,0 +1,31 @@
{
"actor": "campaign-lead",
"artifacts": [
{
"path": "verify/results/research-completion-abi/objdump-2026-09-10-boundary-repair.md",
"sha256": "e7e1fed33fc16c336e1897afa1de01275fc1014a01425b750aaf4347679089c2"
},
{
"path": "verify/results/research-completion-abi/objdump-2026-09-10-dedup-narrow.stdout.txt",
"sha256": "1c2408cd49cc10383bad9fe06d3287476b103205f4155adf64c8a50ccd5205e8"
},
{
"path": "verify/results/research-completion-abi/objdump-2026-09-10-dedup-wide.stdout.txt",
"sha256": "3c9f83d3a98d95ffa68e0595e47f6c3beab3016aa97cd44bf39ac72ed3ec0a84"
},
{
"path": "campaign/research/research-completion-abi.md",
"sha256": "c5448feee5d8430e26dea4c07f314c8f8443deb32411b301c318dec3e5893d20"
}
],
"basis": "aaddeb76f74bbd1a43671f882770ec84a7d690b4060d060ef1a68f918e8edbb0",
"contract": "research-completion-abi",
"id": "4ac63c901e8518e992ada67c",
"model": "openai/gpt-5.6-sol",
"next_action": "Transition the repaired contract to verification and launch a fresh independent verifier to reproduce the repaired package and execute its predeclared static ABI, dedup-description, prune-boundary, and NaN challenges.",
"role": "lead",
"schema": "sots-checkpoint/1",
"session": "lead-continuation-20260910",
"summary": "Reviewed Astra decision d-d2a9b8be6399a6abaa0e05a5 and the completed analyst repair run run-60351a432e82f814e23b5f6f. The analyst independently rebound paired source identities, owner binary and /usr/bin/objdump 2.38; separate narrow and wide raw stdout/stderr streams confirm identical preceding instructions and the predicted c2 versus c2 08 00 terminal bytes. The historical archive was retained and only its first-window provenance was superseded. Contract has no open surprises. This lead checkpoint records lifecycle handoff only and makes no semantic, live allocator-safety, or replacement-acceptance claim.",
"timestamp": "2026-09-10T00:37:31.919594+00:00"
}

View file

@ -0,0 +1,39 @@
{
"actor": "research-lead",
"artifacts": [
{
"path": "campaign/research/NEXT.md",
"sha256": "26d68c2ae39955dad2e32ae6e2a9e5e2b4cd556a95396c8afc30390ff39cc2cc"
},
{
"path": "campaign/research/research-completion-abi.md",
"sha256": "febea2b2dc987d2007b2c4fbefec412baea348369669bfd9e61fef5443ad25c4"
},
{
"path": "campaign/research/record-observation-crosscheck.md",
"sha256": "2c5bce97a156fd15b5f443d07c22baaef2dca97d08ffa901e20a44f0eed2ca53"
},
{
"path": "campaign/research/research-callback-order.md",
"sha256": "2a45e484e33012a0096951f615d88e685323ce57b5bed3f33c149d98fa6dd8d4"
},
{
"path": "verify/results/research-callback/INDEX.md",
"sha256": "e563a0f942b5e2d8959058c40c7c9a3a090efb2043f5d7982038fc7ba7dc20aa"
},
{
"path": "verify/results/research-completion-abi/recovered-static.md",
"sha256": "2a8c2bcd5cdbd4bcf57e6d959e0d3d889af26eb452bdbcd1fca24a7f073fa32a"
}
],
"basis": "aaddeb76f74bbd1a43671f882770ec84a7d690b4060d060ef1a68f918e8edbb0",
"contract": "research-completion-abi",
"id": "4d159f96e28ddbec063de65c",
"model": "openai/gpt-5.6-sol",
"next_action": "Launch the bounded Sol analyst on nested TurnEvents construction/growth and event duplicate/prune functions 0x00885380, 0x00825d40 and 0x00879eb0, checking raw instructions and exceptional cleanup.",
"role": "lead",
"schema": "sots-checkpoint/1",
"session": "sol-routing-resume",
"summary": "User changed normal campaign loop routing to openai/gpt-5.6-sol and reserved openai/gpt-6-astra for problem resolution. Existing static ABI evidence remains unchanged; no open surprises or lab leases. Campaign/model/OpenCode validation and 43 routing/control tests pass. The prior Astra checkpoint remains historical provenance and is superseded for recovery by this Sol checkpoint.",
"timestamp": "2026-09-09T23:37:15.850763+00:00"
}

View file

@ -0,0 +1,51 @@
{
"actor": "research-abi-independent",
"artifacts": [
{
"path": "verify/results/research-completion-abi-independent/verification-plan-run-eba7860308317f839eb35392.md",
"sha256": "9d8626c8c3556c1d430484acbc1a5dd4fd3284706ac6e04c3fa95ed1854780f2"
},
{
"path": "verify/results/research-completion-abi-independent/result-run-eba7860308317f839eb35392.md",
"sha256": "cc32d547e4aa56d573710b457cbe130617441a22db80624ecc549237ba4a9ca2"
},
{
"path": "verify/results/research-completion-abi-independent/reproduce_run_eba7860308317f839eb35392.py",
"sha256": "8587d1d7e7bb787e1cb7e54d56c5a149669d01c0f5c9b6ea74081adb486800d2"
},
{
"path": "verify/results/research-completion-abi-independent/run-eba7860308317f839eb35392/manifest.json",
"sha256": "898d24d660226dc0ef050edd1e892296c61d1412165d3857298b5aba45853ebb"
},
{
"path": "verify/results/research-completion-abi-independent/run-eba7860308317f839eb35392/dedup-wide.stdout.txt",
"sha256": "cb10ca40246bc57fd5431ab099008727fe5be90c22bd7f57fad1cb30301f002c"
},
{
"path": "verify/results/research-completion-abi-independent/run-eba7860308317f839eb35392/observed-alloc.stdout.txt",
"sha256": "9ba611f8263c9bf08e9c0ee915000f97184698c1b0bbd64ea416c65b4a237cbc"
},
{
"path": "verify/results/research-completion-abi-independent/run-eba7860308317f839eb35392/player-append.stdout.txt",
"sha256": "4981f5eb0ffeaa800f2f8f8c04739a53964c2f3f3f47dffd58fbab9488faf895"
},
{
"path": "verify/results/research-completion-abi-independent/run-eba7860308317f839eb35392/player-copy.stdout.txt",
"sha256": "7f3faf8b68de34d1e5ac0214a8949e205c03473c2a1772be3d42452c94307460"
},
{
"path": "verify/results/research-completion-abi-independent/run-eba7860308317f839eb35392/turn3-save-reader.json",
"sha256": "3524bb954988f167503345d37349b3f9f529e10e45eb5eccd3aab1ab365bd929"
}
],
"basis": "aaddeb76f74bbd1a43671f882770ec84a7d690b4060d060ef1a68f918e8edbb0",
"contract": "research-completion-abi",
"id": "54f3ffbf418146a024f7681e",
"model": "openai/gpt-5.6-sol",
"next_action": "Launch an authorized openai/gpt-6-astra resolver for surprise s-4f71bf4a5df4e5fc992bb6b2 to inspect the three truncated ownership captures and prescribe provenance repair before any affected ABI verification resumes.",
"role": "verifier",
"schema": "sots-checkpoint/1",
"session": "run-eba7860308317f839eb35392",
"summary": "QUANTUM-END CHECKPOINT. VERDICT: FAIL/BLOCKED for independent-cross-check; open surprise s-4f71bf4a5df4e5fc992bb6b2. OBSERVATIONS: paired identities independently matched handoff: engine HEAD 7741d42fc5e4e761e6449bdaf0e4a61d00036a23/common /home/alex/sots-engine/.git/binding ccd8e02083e8d2e2b3e97976ace2273c8f924dfc02a39e919004eaf3544c50fd; RE HEAD 3bfde5a70d874a723e797a695bbd847fd82c0aa7/common /home/alex/sots-re/.git/binding 6696fd5201e144843617cbf6d78b41b5287ad5dcc9fa1e8aaa861d52b64e72e8. Pre-existing dirty inventories were not edited. Input SHA256 970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841 and objdump SHA256 1eaaef2e7f57c4c7f69115c495e2466f5a8c8e5f3bc42221d092382f30f9d4cd/version 2.38 matched. Fresh owned reproducer ran 28 windows: all subprocesses return 0, disassembly outputs nonempty, stderr empty. Direct bytes support repaired dedup: EvDsc helper call, caller cleanup, zero-to-match, inline/heap and byte/length inequality. Held-out NaN challenge supports mismatch for unordered coordinates via fucompp/fnstsw/test ah,0x44/jp. Narrow ablation reproduces c2 truncation versus wide c2 08 00. Strict save parse directly recovers event id 3, exact strings, loc 0/action 1/CID 0 and three 0x7f7fffff words; archived parse only. FAILED PREDICTION/SURPRISE: ownership archive exact commands stop one byte into ret 4 at 0x57e5e3, 0x86c62d, 0x7694bf yet archive prints complete c2 04 00; fresh same commands print c2 only. Affected ownership provenance cannot pass. Manifest instruction_lines is explicitly invalid as a coverage count because it includes the function-label line; raw bytes/address inspection is authoritative. DECISION: paused affected interpretation and recorded surprise rather than treating matching semantics as success. TESTS: campaign validate passes after surprise; campaign status is blocked with that open surprise. CLASSIFICATION: independent static reproduction plus archived-state check only, not original-assisted runtime, partial/full compare, replacement, integrated replay, allocator safety or RNG execution. BLOCKERS: Astra provenance disposition/repair; live ownership/event fixtures, allocation failure, RNG and integrated replay remain absent. RESOURCES: no VM/Ghidra/shared lab action, no lease, no cleanup required. No commit/stage/push.",
"timestamp": "2026-09-10T00:46:50.822111+00:00"
}

Some files were not shown because too many files have changed in this diff Show more