ThomasHeisig commited on
Commit
b4bec0c
·
verified ·
1 Parent(s): 3f92245

Sync GitHub main 6bb97fb9a95926f8118bd61bec366af28afa0e5c

Browse files
.gitattributes CHANGED
@@ -1,11 +1,15 @@
1
  # Keep source and documentation deterministic across Windows/Linux checkouts.
2
  * text=auto
 
 
3
  *.py text eol=lf
4
  *.toml text eol=lf
5
  *.yaml text eol=lf
6
  *.yml text eol=lf
7
  *.md text eol=lf
8
  *.json text eol=lf
 
 
9
  *.bib text eol=lf
10
  *.cff text eol=lf
11
  *.diff text eol=lf
 
1
  # Keep source and documentation deterministic across Windows/Linux checkouts.
2
  * text=auto
3
+ research/reviews/DETERMINISM_REPRODUCTION_20261024/artifacts/pip-freeze.txt -text
4
+ research/experiments/EXP-EMB001B-UNSEEN-V4-20261024/pip-freeze.txt -text whitespace=cr-at-eol
5
  *.py text eol=lf
6
  *.toml text eol=lf
7
  *.yaml text eol=lf
8
  *.yml text eol=lf
9
  *.md text eol=lf
10
  *.json text eol=lf
11
+ # Preserve the original failed R2 audit bytes, including its Windows line endings.
12
+ research/calibrations/CAL-S1-TOPO-REFERENCE-DYNAMICS-REUSE-R2/failed-before-format-restoration-20261024.json -text
13
  *.bib text eol=lf
14
  *.cff text eol=lf
15
  *.diff text eol=lf
.github/workflows/review-portal.yml CHANGED
@@ -33,7 +33,7 @@ jobs:
33
  python -m review_portal.build --check
34
  python -m compileall -q review_portal
35
  - name: API, consent, privacy and statistics tests
36
- run: python -m pytest review_portal/tests/test_portal.py -q
37
  - name: JavaScript contract tests
38
  run: |
39
  node --check src/dashboard/static/review/app.js
@@ -43,6 +43,8 @@ jobs:
43
  run: python -m playwright install --with-deps chromium
44
  - name: Browser checks on desktop and mobile
45
  run: python -m review_portal.tests.browser_smoke
 
 
46
  - name: Upload synthetic UI screenshots
47
  if: always()
48
  uses: actions/upload-artifact@v6
@@ -68,9 +70,11 @@ jobs:
68
  steps:
69
  - uses: actions/checkout@v7
70
  - uses: actions/configure-pages@v6
 
 
71
  - uses: actions/upload-pages-artifact@v5
72
  with:
73
- path: src/dashboard/static/review
74
  - name: Publish questionnaire ONLY, never response data or the runtime
75
  id: deployment
76
  uses: actions/deploy-pages@v5
 
33
  python -m review_portal.build --check
34
  python -m compileall -q review_portal
35
  - name: API, consent, privacy and statistics tests
36
+ run: python -m pytest review_portal/tests/test_portal.py review_portal/tests/test_static_export.py -q
37
  - name: JavaScript contract tests
38
  run: |
39
  node --check src/dashboard/static/review/app.js
 
43
  run: python -m playwright install --with-deps chromium
44
  - name: Browser checks on desktop and mobile
45
  run: python -m review_portal.tests.browser_smoke
46
+ - name: Static export under GitHub Pages project subpath
47
+ run: python -m review_portal.tests.browser_static
48
  - name: Upload synthetic UI screenshots
49
  if: always()
50
  uses: actions/upload-artifact@v6
 
70
  steps:
71
  - uses: actions/checkout@v7
72
  - uses: actions/configure-pages@v6
73
+ - name: Build collection-disabled export package
74
+ run: python -m review_portal.build_static --output "${{ runner.temp }}/review-pages"
75
  - uses: actions/upload-pages-artifact@v5
76
  with:
77
+ path: ${{ runner.temp }}/review-pages
78
  - name: Publish questionnaire ONLY, never response data or the runtime
79
  id: deployment
80
  uses: actions/deploy-pages@v5
.github/workflows/stage1-maintenance-refresh.yml CHANGED
@@ -98,7 +98,6 @@ jobs:
98
  scripts/verify_stage1_topology_reference_r1.py \
99
  scripts/freeze_stage1_topology_reference_r1.py \
100
  reference/stage1_topology_brian2/integrator_probe.py \
101
- reference/stage1_topology_brian2/synapse_probe.py \
102
  reference/stage1_topology_brian2/runner.py \
103
  tests/test_stage1_reference_replication_contract.py \
104
  tests/test_stage1_reference_preflight.py \
 
98
  scripts/verify_stage1_topology_reference_r1.py \
99
  scripts/freeze_stage1_topology_reference_r1.py \
100
  reference/stage1_topology_brian2/integrator_probe.py \
 
101
  reference/stage1_topology_brian2/runner.py \
102
  tests/test_stage1_reference_replication_contract.py \
103
  tests/test_stage1_reference_preflight.py \
.github/workflows/stage1-topology-reference-prefreeze.yml CHANGED
@@ -52,17 +52,24 @@ jobs:
52
  run: |
53
  test -z "$(git status --porcelain)"
54
  python -m pytest tests/test_stage1_reference_replication_contract.py tests/test_stage1_reference_preflight.py tests/test_stage1_reference_r2_contract.py tests/test_stage1_reference_r2_preflight.py -q
 
 
 
55
  - name: Audit canonical mechanism semantics
 
56
  run: python scripts/audit_stage1_reference_mechanisms.py
57
  - name: Verify reference package independence
58
  run: python scripts/check_stage1_reference_independence.py
59
  - name: Verify R2 reference seed freshness
60
  run: python scripts/check_stage1_reference_seed_freshness_r2.py
61
  - name: Validate immutable R1 dynamics parity reuse for R2
 
62
  run: python scripts/verify_stage1_reference_dynamics_reuse_r2.py
63
  - name: Run exact R2 topology mapping parity
 
64
  run: python scripts/run_stage1_reference_topology_mapping_r2.py
65
  - name: Commit immutable pre-freeze audit artifacts
 
66
  shell: bash
67
  run: |
68
  git config user.name "github-actions[bot]"
 
52
  run: |
53
  test -z "$(git status --porcelain)"
54
  python -m pytest tests/test_stage1_reference_replication_contract.py tests/test_stage1_reference_preflight.py tests/test_stage1_reference_r2_contract.py tests/test_stage1_reference_r2_preflight.py -q
55
+ - name: Revalidate frozen R2 without rewriting bound artifacts
56
+ if: hashFiles('research/preregistrations/PREREG-S1-TOPO-REFERENCE-R2.freeze.json') != ''
57
+ run: python scripts/check_stage1_frozen_prefreeze.py
58
  - name: Audit canonical mechanism semantics
59
+ if: hashFiles('research/preregistrations/PREREG-S1-TOPO-REFERENCE-R2.freeze.json') == ''
60
  run: python scripts/audit_stage1_reference_mechanisms.py
61
  - name: Verify reference package independence
62
  run: python scripts/check_stage1_reference_independence.py
63
  - name: Verify R2 reference seed freshness
64
  run: python scripts/check_stage1_reference_seed_freshness_r2.py
65
  - name: Validate immutable R1 dynamics parity reuse for R2
66
+ if: hashFiles('research/preregistrations/PREREG-S1-TOPO-REFERENCE-R2.freeze.json') == ''
67
  run: python scripts/verify_stage1_reference_dynamics_reuse_r2.py
68
  - name: Run exact R2 topology mapping parity
69
+ if: hashFiles('research/preregistrations/PREREG-S1-TOPO-REFERENCE-R2.freeze.json') == ''
70
  run: python scripts/run_stage1_reference_topology_mapping_r2.py
71
  - name: Commit immutable pre-freeze audit artifacts
72
+ if: hashFiles('research/preregistrations/PREREG-S1-TOPO-REFERENCE-R2.freeze.json') == ''
73
  shell: bash
74
  run: |
75
  git config user.name "github-actions[bot]"
.pre-commit-config.yaml CHANGED
@@ -29,22 +29,34 @@ repos:
29
  language: system
30
  pass_filenames: false
31
  types: [python]
 
 
 
 
 
 
 
 
 
 
 
 
32
  # Trailing whitespace, EOF newline, merge conflicts
33
  - repo: https://github.com/pre-commit/pre-commit-hooks
34
  rev: v5.0.0
35
  hooks:
36
  - id: trailing-whitespace
37
- exclude: ^(research/(experiments/|preregistrations/|publications/|registry/evidence/|generated/data/)|docs/99-archive/)
38
  args: [--markdown-linebreak-ext=md]
39
  - id: end-of-file-fixer
40
  # Frozen experiment manifests are evidence artifacts and must not be
41
  # byte-rewritten by an automatic formatting hook.
42
- exclude: ^research/(experiments/|preregistrations/|publications/|registry/evidence/|generated/data/|generated/verification/)
43
  - id: check-merge-conflict
44
  - id: check-yaml
45
  - id: check-toml
46
  - id: check-added-large-files
47
  # Publication and the explicitly listed immutable trace hashes are checked
48
  # by empirical-data-integrity. All other paths retain the 500 KiB cap.
49
- exclude: ^(research/publications/|research/experiments/EXP-EMP-20260910/(024-embodied_timing_v1|027-brian2_single_neuron_v1)/runs\.json\.gz$|research/experiments/EXP-EMP-20260913-A3/(064-embodied_timing_v1|068-brian2_single_neuron_v1)/runs\.json\.gz$)
50
  args: [--maxkb=500]
 
29
  language: system
30
  pass_filenames: false
31
  types: [python]
32
+ - id: determinism-artifact-integrity
33
+ name: verify immutable determinism reproduction artifacts
34
+ entry: python scripts/verify_determinism_reproduction.py
35
+ language: system
36
+ pass_filenames: false
37
+ always_run: true
38
+ - id: embodiment-v4-artifact-integrity
39
+ name: verify immutable embodiment V4 trace archive
40
+ entry: python scripts/verify_emb001b_unseen_v4.py
41
+ language: system
42
+ pass_filenames: false
43
+ always_run: true
44
  # Trailing whitespace, EOF newline, merge conflicts
45
  - repo: https://github.com/pre-commit/pre-commit-hooks
46
  rev: v5.0.0
47
  hooks:
48
  - id: trailing-whitespace
49
+ exclude: ^(research/(reviews/DETERMINISM_REPRODUCTION_20261024/artifacts/|experiments/|preregistrations/|publications/|registry/evidence/|generated/data/)|docs/99-archive/)
50
  args: [--markdown-linebreak-ext=md]
51
  - id: end-of-file-fixer
52
  # Frozen experiment manifests are evidence artifacts and must not be
53
  # byte-rewritten by an automatic formatting hook.
54
+ exclude: ^research/(reviews/DETERMINISM_REPRODUCTION_20261024/artifacts/|experiments/|preregistrations/|publications/|registry/evidence/|generated/data/|generated/verification/)
55
  - id: check-merge-conflict
56
  - id: check-yaml
57
  - id: check-toml
58
  - id: check-added-large-files
59
  # Publication and the explicitly listed immutable trace hashes are checked
60
  # by empirical-data-integrity. All other paths retain the 500 KiB cap.
61
+ exclude: ^(research/publications/|research/experiments/EXP-EMB001B-UNSEEN-V4-20261024/raw-traces\.zip$|research/experiments/EXP-EMP-20260910/(024-embodied_timing_v1|027-brian2_single_neuron_v1)/runs\.json\.gz$|research/experiments/EXP-EMP-20260913-A3/(064-embodied_timing_v1|068-brian2_single_neuron_v1)/runs\.json\.gz$)
62
  args: [--maxkb=500]
MIRROR_MANIFEST.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "canonical_repository": "https://github.com/Thomas-Heisig/MHRN",
3
- "canonical_sha": "556dd5e06ac1c3d71c9c00d4c66aa230c72c6007",
4
  "generated_by": ".github/workflows/sync-huggingface.yml",
5
  "rolling_mirror": true,
6
  "raw_experiment_data_included": false,
 
1
  {
2
  "canonical_repository": "https://github.com/Thomas-Heisig/MHRN",
3
+ "canonical_sha": "6bb97fb9a95926f8118bd61bec366af28afa0e5c",
4
  "generated_by": ".github/workflows/sync-huggingface.yml",
5
  "rolling_mirror": true,
6
  "raw_experiment_data_included": false,
docs/04-integration/EXTERNAL_REVIEW_DEPLOYMENT.md CHANGED
@@ -1,6 +1,6 @@
1
  # External Review Deployment
2
 
3
- **Status:** deployment design for the isolated review portal
4
  **Scope:** public questionnaire, optional online collection and sanitized descriptive export
5
 
6
  ## Security boundary
@@ -22,10 +22,34 @@ encrypted storage outside Git
22
 
23
  ## Option 1: GitHub Pages, export-only
24
 
25
- The existing workflow `.github/workflows/review-portal.yml` verifies the portal and publishes only `src/dashboard/static/review` when Pages is enabled. Start it manually with `publish_pages: true`, or set the repository variable `MHRN_REVIEW_PAGES_ENABLED=true`.
26
 
27
  This mode has no central response storage. Participants export their JSON/CSV locally. The export is not automatically sent anywhere.
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  ## Option 2: Hugging Face Docker Space
30
 
31
  Create a public Docker Space and use `review_portal/Dockerfile.huggingface` as the Space Dockerfile. Configure the Space port as `7860`.
 
1
  # External Review Deployment
2
 
3
+ **Status:** export-only GitHub Pages preparation selected on 24 October 2026; no new deployment or independent approval asserted.
4
  **Scope:** public questionnaire, optional online collection and sanitized descriptive export
5
 
6
  ## Security boundary
 
22
 
23
  ## Option 1: GitHub Pages, export-only
24
 
25
+ The workflow `.github/workflows/review-portal.yml` verifies the portal and builds an allowlisted package with `python -m review_portal.build_static --output <new-directory>`. Only this package is uploaded when Pages is enabled. Start publication manually with `publish_pages: true` on `main`; preparation alone does not run this workflow. Avoid enabling the automatic publication variable until the published configuration has been reviewed.
26
 
27
  This mode has no central response storage. Participants export their JSON/CSV locally. The export is not automatically sent anywhere.
28
 
29
+ The prepared package uses relative assets for the project subpath, explicitly disables API discovery and blocks network connections through `connect-src 'none'`. Admin pages and collector files are excluded. A browser test opens `/MHRN/index.html`, exports a synthetic answer and verifies that no API requests occur. The package includes an export-specific privacy page and SHA-256 manifest. Instrument questions, version and reviewed-materials revision remain unchanged.
30
+
31
+ Local verification on 24 October 2026: 57 Python tests, six JavaScript model tests,
32
+ catalogue byte check, workflow YAML check and the static browser scenario passed.
33
+ The browser scenario verified the project subpath, a synthetic JSON download,
34
+ disabled online controls, privacy page, mobile layout and zero API requests.
35
+ These results verify the prepared package, not the deployed site or independent review.
36
+
37
+ ### Selected deployment and acceptance boundaries
38
+
39
+ | Area | Export-only preparation | Remaining production check |
40
+ | --- | --- | --- |
41
+ | Address | `https://thomas-heisig.github.io/MHRN/`; no custom domain purchase | Confirm actual Pages URL and whether an existing site would be replaced |
42
+ | TLS | GitHub Pages-managed HTTPS | Verify actual certificate and HTTPS enforcement after publication |
43
+ | Response storage | Browser memory; optional local draft/export | No central database; users manage their own local files |
44
+ | Backups | Rebuild public assets from reviewed Git commit and package hashes | Keep the release commit/package available; no server response-backup claim |
45
+ | Study settings | Local review context; central collection disabled | Any future collection requires a separate concrete study configuration |
46
+ | Legal/privacy | Export-specific notice with public project contact and GitHub hosting disclosure | Human review of actual deployment and intended use remains open |
47
+ | Independent review | Not asserted by technical tests | Record actual reviewer, scope, findings and conflicts before claiming completion |
48
+
49
+ GitHub reports Pages enabled for this repository, but that is not proof that the prepared package is live. The local GitHub CLI credentials could not be verified; no settings or public site were changed during preparation.
50
+
51
+ GitHub Pages documents both its project URL structure and security-related visitor IP logging in [About Pages](https://docs.github.com/en/pages/getting-started-with-github-pages/what-is-github-pages). HTTPS behavior is described in [Securing Pages](https://docs.github.com/en/pages/getting-started-with-github-pages/securing-your-github-pages-site-with-https). Hosting logs are distinct from questionnaire responses. Before central collection, information duties must be assessed against the actual processing; see the [official Article 13 text](https://www.ms.niedersachsen.de/startseite/uber_uns/datenschutzerklaerung-nach-dsgvo-181391.html).
52
+
53
  ## Option 2: Hugging Face Docker Space
54
 
55
  Create a public Docker Space and use `review_portal/Dockerfile.huggingface` as the Space Dockerfile. Configure the Space port as `7860`.
docs/05-quality/SCIENTIFIC_MATURITY_METHOD.md ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Wie die wissenschaftlichen Reifegrade zu lesen sind
2
+
3
+ Stand 2026-10-24. Die Prozentwerte sind ein **gewichteter Dokumentations- und
4
+ Bearbeitungsindex**, keine Wahrscheinlichkeit einer wahren Hypothese, keine
5
+ Konfidenz, kein Anteil vorhandener Intelligenz und keine biologische Reife.
6
+ Die Gewichte sind Projektentscheidungen, nicht empirisch kalibrierte Parameter.
7
+
8
+ ## Kriterien und Berechnung
9
+
10
+ | Kriterium | Gewicht | Was bewertet wird |
11
+ | --- | ---: | --- |
12
+ | Forschungsfrage | 15 % | explizite, zugeordnete RQ/H |
13
+ | Protokoll | 20 % | vorab operationalisierter und eingefrorener Prüfplan |
14
+ | DATA | 20 % | passende, prüfbare Messdaten im ausgewiesenen Geltungsbereich |
15
+ | Reviewte Evidenz | 20 % | fachliche Human Review und kanonische EVID-Promotion |
16
+ | Unabhängige Replikation | 15 % | tatsächlich unabhängige Prüfung/Bestätigung |
17
+ | Attribution | 10 % | nachvollziehbare Quellen- und Beitragszuordnung |
18
+
19
+ Die bestehende Statusskala lautet `met=1`, `partial=0.5`, `open=0`.
20
+ Für jede Stufe gilt `score = Summe(Gewicht × Statuswert)`. Das angezeigte
21
+ Stage-Mittel ist der ungewichtete Mittelwert der elf Stufen 0–10. Es ist
22
+ keine Vollständigkeitsmetrik des Gesamtforschungsprogramms: die Auswahl und
23
+ Granularität der Stufen beeinflussen es. Rundung erfolgt erst zur Anzeige.
24
+ `not_applicable` darf nicht still als Erfolg zählen: im aktuellen Manifest
25
+ sind alle sechs Kriterien anwendbar; eine Änderung braucht einen neuen
26
+ Berechnungsvertrag einschließlich Nennerregel.
27
+
28
+ `partial` ist grob und verlangt eine dokumentierte Begründung. Beispielsweise
29
+ trennt Stufe 1 fachliche Human Review und kanonische Promotion als zwei
30
+ Teilvoraussetzungen. Bei Stufe 0 steht `partial` für einen externen
31
+ Softwarevergleich plus interne Wiederholung, ausdrücklich nicht für eine
32
+ bereits unabhängige Replikation. 0.5 bedeutet weder halbe Sicherheit noch
33
+ eine halbe erfolgreiche Studie. Status und Quellen bleiben fachlich zu prüfen.
34
+
35
+ ## Pflichtprüfungen sind nicht verrechenbar
36
+
37
+ Ein hoher Summenwert darf fehlende Freigaben nicht ersetzen. Vor einem Claim
38
+ müssen RQ/H-Zuordnung, Testadäquanz und tatsächliche kausale Intervention,
39
+ vorab festgelegte Auswertung, gültige vollständige DATA, saubere
40
+ Quellprovenienz, fehlerfreie Ausführung und kanonische Human Review passen.
41
+ `EvidenceEngine.promote_validated_experiment` verlangt Source-Freeze und
42
+ Human Review; weitere Eignungsprüfungen erfordern inhaltliche Bewertung und
43
+ sind nicht allein durch diese Prozentrechnung automatisiert. Eine Aussage
44
+ über unabhängige Replikation benötigt einen unabhängigen Nachweis.
45
+
46
+ Diese Voraussetzungen werden **nicht als zusätzliche numerische Abschläge
47
+ oder geheime Caps** in den Index eingerechnet. Sie begrenzen separat, welche
48
+ Aussage zulässig ist. Ein Score von 92.5 % kann daher zusammen mit der Grenze
49
+ „keine unabhängige Replikation“ auftreten. Das ist keine 92.5-%-Bestätigung.
50
+
51
+ ## Audit und Korrektur vom 2026-10-24
52
+
53
+ Im bisherigen Dashboardmanifest stimmten nur Stufen 0 und 1 mit der
54
+ angegebenen gewichteten Statussumme überein. Für die anderen neun waren keine
55
+ maschinell nachvollziehbaren Abschläge hinterlegt. Die alten Werte wurden in
56
+ `research/reviews/MANUSCRIPT_FOLLOWUP_20261024/maturity-score-audit.json`
57
+ aufbewahrt. Das aktuelle Dashboard zeigt jetzt die nachgerechnete Summe;
58
+ Kriterienstatus, Quellen, Human Reviews und EVID-Register wurden dabei nicht
59
+ hochgestuft. Die numerische Änderung ist eine Berechnungskorrektur und kein
60
+ neuer Forschungsfortschritt. Historische Publikationswerte bleiben datierte
61
+ Darstellungen und dürfen nicht rückwirkend als so berechnet ausgegeben werden.
62
+
63
+ Die Prüfung `scripts/check_scientific_maturity_integrity.py` kontrolliert nun
64
+ zusätzlich eindeutige vollständige Kriterien und Übereinstimmung von Score
65
+ und Gewichtung. Sie bestätigt interne Konsistenz, nicht wissenschaftliche
66
+ Gültigkeit. Andere technische Gate-/Engineering-Prozentwerte haben andere
67
+ Nenner und dürfen nicht mit diesem Index vermischt werden.
docs/05-quality/STAGE1_REFERENCE_R2_PREFREEZE_20261024.md ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Stage-1 reference R2 — pre-freeze verification, 24 October 2026
2
+
3
+ Status: engineering/method validation only; no confirmatory reference DATA,
4
+ human evidence decision or independent replication is created by these checks.
5
+
6
+ ## Source restoration
7
+
8
+ Commit `c6009b4e` reformatted the import in
9
+ `reference/stage1_topology_brian2/synapse_probe.py`. Its bytes consequently
10
+ ceased to match the historical R1 calibration. The probe was restored from
11
+ `28d07e67` only after verifying identical Python ASTs and the exact recorded
12
+ SHA-256 `d05bae8f00b97758cb96662acbb0f2e58cd7860776871b5edf6fd4ed09e576da`.
13
+ The original calibration and its recorded hash were not changed. A regression
14
+ test now guards this byte-preservation contract, including cosmetic edits.
15
+
16
+ The failed pre-restoration audit remains at
17
+ `research/calibrations/CAL-S1-TOPO-REFERENCE-DYNAMICS-REUSE-R2/failed-before-format-restoration-20261024.json`.
18
+ The current result is separate in that directory's `result.json`.
19
+
20
+ ## Verified preparation
21
+
22
+ - Python 3.13.14 and Brian2 2.10.1 in an isolated Windows environment.
23
+ - Topology mapping: all 18 cases pass, using calibration seeds separate from evaluation.
24
+ - Immutable dynamics reuse: all nine recorded source hashes match; historical
25
+ integrator, reset and synapse artifacts retain their original bytes.
26
+ - Independence scan: no forbidden imports or canonical target leakage detected.
27
+ - Seed freshness: no collisions at the checked baseline; this check must be
28
+ repeated at the final clean freeze commit.
29
+ - R2 preregistration prose now distinguishes its active seed block from the
30
+ earlier R1 block, without changing the registered seed list or decision bounds.
31
+
32
+ The mapping script supports direct invocation. The freeze script now uses
33
+ `sys.executable` for subprocesses and requires an explicit ISO `--freeze-date`,
34
+ preventing a new freeze from silently inheriting the draft's September date.
35
+
36
+ ## Freeze and execution boundary
37
+
38
+ Use a clean, committed tree and Python 3.13 with Brian2 2.10.1. Run the R2
39
+ contract/preflight/freeze-CLI tests before:
40
+
41
+ ```text
42
+ python scripts/freeze_stage1_topology_reference_r2.py --freeze-date YYYY-MM-DD
43
+ ```
44
+
45
+ Supply the actual freeze date. The script refuses a dirty tree or existing
46
+ freeze. The freeze must bind the source commit, calibration artifacts, runner,
47
+ verifier and preregistered criteria. Its completion is not authorization to run
48
+ the reference evaluation: `execution_authorized` stays false. A subsequent
49
+ human execution-authorization record must bind the reviewed freeze and runner.
50
+ Project-side reference replication can earn partial replication credit only.