Commit 8c46de0
authored
Cross-asset Kuramoto: integration + shadow validation + offline robustness + governance (#355)
* feat(governance): research-line registry + combo_v1 × 8-FX closure
Adds a machine-readable registry of research lines with terminal
fail-closed policy enforcement:
- config/research_line_registry.yaml: canonical record schema;
records combo_v1_fx_wave1 as REJECTED / verdict=FAIL with
wave2_authorized=false, parameter_rescue_allowed=false,
same_family_same_substrate_retest_allowed=false, and
allowed_next_action=new_fx_native_prereg_only.
- scripts/registry_validator.py: importable API + CLI gate.
`--check-pair <family> <substrate>` exits 2 with BLOCKED when a
rejected (family, substrate) pair is re-attempted.
- tests/test_research_line_registry.py (12 tests, all passing):
registry file present, line rejected, flags coherent,
allowed_next_action in vocabulary, all rejected lines have
coherent flags, same-family same-substrate blocked,
different-family same-substrate allowed, same-family
different-substrate allowed, SHA fields present (40 char),
CLI blocks rejected pair (exit 2), CLI passes open pair (exit 0).
- results/wave1_fx/: complete closure evidence package for the
first research line to be formally rejected:
CANONICAL_FAIL_NOTE.md (verdict + exact statement)
ROOT_CAUSE.md (evidence-tiered: PROVEN/PLAUSIBLE/RULED_OUT)
POSTMORTEM_SUMMARY.md (decision-grade, 485 words)
VERDICT.md (machine-generated from Run B)
PREREG.md (the locked preregistration)
universe.json (8 FX majors locked)
fold_manifest.csv (222 walk-forward folds)
panel_audit.json
run_a_gross/ + run_b_net/ (full evidence trees)
audits/ (topology + null-portfolio + turnover/exposure)
lock_sha and complete_sha in the registry entry point to the
standalone workspace where the closure was originally produced;
they are retained as audit trail pins, not as GeoSync commits.
No signal code changed. No parameter tuned. combo_v1 on the
8-FX daily cross-sectional panel is falsified and registry-blocked.
* feat(research): FX-native foundation (MODE_A_PRE_DEMO, DEFERRED)
After combo_v1 × 8-FX was closed, the question remained: is there a
technically coherent FX-native mechanism worth a new pre-registration?
MODE_A_PRE_DEMO executed (docs-only, no diagnostics, no prereg draft):
- DATA_CONTRACT.md — 8-FX substrate pinned from locked artefacts
- DRO_ARA_DEPENDENCY.md — INDEPENDENT_OF_DRO_ARA for MODE_A deliverables
- KURAMOTO_RELATION.md — honest comparison vs already-mature cross-asset
Kuramoto line (Sharpe +1.262 OOS on disk)
- INPUT_GAPS.md — 4 of 6 distinct FX-native mechanism classes
blocked by missing rates/options/L2/calendar
- SCHEDULING_DECISION.md — DEFER_UNTIL_POST_DEMO (demo-critical path active)
- HUMAN_GATE_MEMO.md — two admissible MODE_A gates (DEFER / ESCALATE);
ABORT requires MODE_B diagnostics first
Terminal decision: DEFER_UNTIL_POST_DEMO.
No signal research, no data processing, no scripts — pure
decision-grade documentation. The only mechanistically-distinct
FX-native corridor with in-repo inputs is DXY-residual cross-section;
a Track-B 8-FX Kuramoto floor test would be the cheap empirical read
before any DXY-residual work.
When MODE_B is eventually authorised (post-demo), the entry point
is the six files under results/fx_native_foundation/.
* feat(core): cross-asset Kuramoto module + demo + 8 invariants
Integration of the spike at ~/spikes/cross_asset_sync_regime/
(composite SHA 9e76e3b5...) into core/cross_asset_kuramoto/.
Behaviour-preserving port; numerics bit-exact vs spike.
core/cross_asset_kuramoto/ (5 modules, mypy --strict clean):
__init__.py — public API (12 exports)
types.py — frozen dataclasses: PanelSpec, Regime,
RegimeThresholds, StrategyParameters, BacktestResult
signal.py — load_asset_close, build_panel, build_returns_panel,
extract_phase (Hilbert), kuramoto_order (R(t)),
classify_regimes (fixed q33/q66 on train 70%)
engine.py — simulate_rp_strategy (risk-parity in regime bucket,
vol-target 15%, cap 1.5×, 1-bar lag, 10 bps cost),
compute_metrics, drawdown_series
invariants.py — INV-CAK1..8: parameter freeze, universe freeze,
determinism, no-future-leak, cost-model required,
fail-closed, scale-invariance, turnover bounded
scripts/
demo_cross_asset_kuramoto.py — single-command demo driver
(--full / --reproduce-only / --verify-only)
run_walkforward_phase5.py — Phase 5 WF re-verification
tests/core/cross_asset_kuramoto/ (36 passed + 1 xfail):
test_parameter_lock.py — 7 tests · parameters match lock
test_determinism.py — 3 tests · INV-CAK3 bit-exact rerun
test_no_future_leak.py — 1 pass + 1 xfail (OBS-1 Hilbert
non-causality preserved per C11)
test_invariants.py — 14 tests · INV-CAK1..8 each fail-closed
test_walkforward_integrity.py — 4 tests · WF fold boundaries
test_cost_model.py — 4 tests · INV-CAK5 cost positivity
test_module_boundary.py — 2 tests · no forbidden imports
(backtest/, execution/, strategies/),
no combo_v1 references
test_no_stale_markers.py — 1 test · no TODO/FIXME/HACK/XXX
results/cross_asset_kuramoto/:
PARAMETER_LOCK.json — every parameter frozen at spike value
(seed 42, R_WINDOW 30, DETREND 60,
VOL_TARGET 0.15, VOL_CAP 1.5,
COST_BPS 10, LAG 1, etc.)
INPUT_CONTRACT.md — data paths + universe + time convention
INTEGRATION_NOTES.md — OBS-1 Hilbert caveat documented
REPRODUCTION_RESULT.md — bit-exact vs spike (max_abs_dev 8e-17)
WALKFORWARD_VERIFICATION.md — 5 WF folds match spike bit-exactly
COST_MODEL.md — Sharpe at 1x/2x/3x baseline
PIPELINE_AUDIT.md — alignment + ffill materiality
demo/ — equity_curve, risk_metrics, fold_metrics,
drawdown_analysis, cost_sensitivity,
invariant_status + DEMO_BRIEF.md
OOS Sharpe (70/30): 1.26185 (spike 1.26185, Δ < 1e-9).
Walk-forward median Sharpe 0.942 (spike 0.942, 4/5 folds positive,
fold 3 2022 negative — spike-known limitation preserved).
Cost sensitivity: Sharpe 1.26 / 1.15 / 1.03 at 1x/2x/3x (10/20/30 bps).
INV-CAK3 deterministic · INV-CAK5 cost-required · INV-CAK7 scale-invariant
all test-enforced. No parameter change. No universe change. No signal
logic edit.
* feat(ops): shadow validation rail + systemd automation + 4-file test pack
Append-only evidence rail running in parallel to the frozen module.
Daily shadow cycle = runner -> evaluator -> renderer -> git push.
scripts/ (4 entries):
run_cross_asset_kuramoto_shadow.py — daily runner; produces
dated evidence under shadow_validation/daily/YYYY-MM-DD/
(run_manifest.json, signal_snapshot.csv, target_weights.csv,
turnover.csv, cost_estimate.csv, realized_pnl.csv,
invariant_status.csv, pipeline_status.csv, run_log.txt).
Fails closed on hash mismatch (exit 1), missing asset (exit 2),
invariant violation (exit 3). Idempotent per dated dir.
evaluate_cross_asset_kuramoto_shadow.py — append-only live_scoreboard
and predictive envelope (block-bootstrap from demo OOS returns,
seed 20260422, block 20, 500 paths, 90-bar horizon). Gate
engine with closed vocabularies (STATUS_VOCAB + GATE_VOCAB).
render_cross_asset_kuramoto_shadow_report.py — <=500-word
SHADOW_SUMMARY.md; surfaces OBS-1, DP3, DP5 caveats verbatim.
push_shadow_evidence.sh — fail-open commit+push hook. Default
repo path resolved relative to script location via
BASH_SOURCE/.., no hardcoded workspace path.
tests/ops/ (4 files, 15 passed + 1 skipped):
test_cross_asset_kuramoto_shadow.py — runner contract (5)
test_predictive_envelope.py — seed reproducibility;
envelope seed 20260422 differs from the offline-robustness
seed 20260501 (truly independent stress views)
test_live_scoreboard_schema.py — column contract +
gate-vocabulary exhaustiveness (9 synthetic scenarios)
test_operational_incident_logging.py — append-only + schema
ops/systemd/ (user-scope, no root required):
cross_asset_kuramoto_shadow.service — Type=oneshot, Restart=no,
ReadWritePaths restricted to shadow_validation/ + ~/.cache;
4 ExecStartPost chain: runner -> evaluator -> renderer -> push.
WorkingDirectory=%h/GeoSync (path parameterised via systemd %h).
cross_asset_kuramoto_shadow.timer — 22:00 UTC daily,
Persistent=true for catch-up after reboot/offline.
README.md — install / uninstall /
verification + contract notes.
results/cross_asset_kuramoto/shadow_validation/ (seed evidence from
the first real run on 2026-04-10):
VALIDATION_PLAN.md — scope of observer vs frozen rail
LOCK_AUDIT.md — Phase 1 hash audit (all green)
ACCEPTANCE_GATES.md — 20/40/60/90-bar gate table
DRIFT_NOTE.md — envelope method + seed
SHADOW_SUMMARY.md — most recent render
LIVE_STATE.json — pointer; overwriteable
live_scoreboard.csv — append-only eval rows
predictive_envelope.csv — 90-bar envelope quantiles
operational_incidents.csv — manual_tick logged as LOW severity
daily/2026-04-10/ (9 files) — first day's evidence bundle
No signal code changed. No parameters touched. combo_v1 closure
and FX-native deferral both hash-verified unchanged.
* feat(analysis): offline robustness packet (5 phases, parallel to shadow)
Read-only analyses of the already-validated cross-asset Kuramoto line.
No writes to core/, demo/, or shadow_validation/; verified by
path-literal AST scan in test_cak_offline_no_interference.py.
scripts/ (6 entries):
analysis_cak_leave_one_out.py — regime + tradable LOO sweeps
analysis_cak_data_treatment.py — 4 fill policies (strict,
ffill-1, ffill-3, no-ffill)
analysis_cak_asset_attribution.py — per-asset gross/cost/net +
DD anatomy (top-3 episodes)
analysis_cak_benchmark_family.py — BF1 equal-weight, BF2 BTC,
BF3 20-bar momentum, BF4
vol-targeted EW (matched
cost/lag unless buy-and-hold)
analysis_cak_envelope_stress.py — block-bootstrap at 20/40/60/90
bars, seed 20260501 (distinct
from shadow seed 20260422)
render_cak_offline_robustness_report.py — regenerates
NO_INTERFERENCE_REPORT.md
tests/analysis/ (5 files, 13 passed):
test_cak_offline_no_interference.py — AST + path-literal scan;
every write-site routes only to offline_robustness/
test_cak_offline_schemas.py — CSV column contracts (6 CSVs)
test_cak_envelope_stress_reproducible.py — seeded determinism;
asserts offline seed ≠ shadow seed
test_cak_source_hashes_frozen.py — 28 protected artefacts
hash-identical to Phase 0
test_cak_loo_determinism.py — baseline + regime-BTC LOO
bit-exact across reruns
results/cross_asset_kuramoto/offline_robustness/:
LOCK_AUDIT.md · SOURCE_HASHES.json (28 paths, repo-relative)
LEAVE_ONE_ASSET_OUT.md + leave_one_asset_out.csv (15 rows)
DATA_TREATMENT_AUDIT.md + data_treatment_audit.csv (5 rows)
ASSET_ATTRIBUTION.md + asset_contribution.csv (6 rows)
+ drawdown_anatomy.csv + fold_asset_attribution.csv
BENCHMARK_FAMILY.md + benchmark_family.csv (6 rows)
ENVELOPE_STRESS.md + envelope_stress.csv (5 rows)
ROBUSTNESS_SUMMARY.md (590 words, 5-phase synthesis)
NO_INTERFERENCE_REPORT.md (regenerated after copy: verdict PASS,
28/28 hashes match current GeoSync bytes)
All CSVs are small, review-relevant. No bulk intermediate outputs
(per-bar topology metrics, null-simulation raw samples) are
committed — they can be regenerated deterministically from the
scripts if needed.
Key structural finding (full detail in ROBUSTNESS_SUMMARY.md):
- Regime universe is robust (8/8 regime-LOO omissions leave Sharpe
in [1.23, 1.62]; four raise it).
- Tradable universe is concentrated in GLD (dropping it collapses
Sharpe 1.26 -> 0.53); TLT is a net drag (-13.5% of OOS net).
- Fill-policy materiality confirmed at ΔSharpe 0.22.
- Kuramoto beats all 4 benchmarks on Sharpe (+0.39..+0.51) under
matched cost/lag parity.
- Recovery probability after early envelope-dip stays <14% at every
20/40/60/90-bar horizon.
* fix(ci): resolve mypy ModuleSpec narrowing + whitelist frozen-artefact SHA-256 pins
python-quality (mypy):
importlib.util.spec_from_file_location returns ModuleSpec | None; a
bare assert on spec.loader did not narrow spec itself. Add explicit
'assert spec is not None' before module_from_spec() in the two
offline-robustness helper functions. Same pattern applied in
test_cak_envelope_stress_reproducible.py and test_cak_loo_determinism.py.
Local pytest still 15/15 green; local mypy 0 errors.
secrets-supply-chain (false positives on SHA-256 content addresses):
- .secretsignore: add path patterns for JSON files whose SHA-256
entries are legitimate frozen-artefact identity pins, not secrets
(SOURCE_HASHES.json, daily run_manifest.json, wave1_fx universe.json).
- scripts/run_cross_asset_kuramoto_shadow.py: add inline 'pragma:
allowlist secret' on EXPECTED_PARAM_LOCK_SHA256 constant (line 65).
That constant is a locked artefact identity, not a credential.
results/cross_asset_kuramoto/offline_robustness/SOURCE_HASHES.json:
Regenerated against current-branch byte state so INV-CAK-analogue
source-hash-frozen test stays consistent after the pragma edit.
'regenerated_utc' field added for audit provenance.
No signal code touched. No frozen parameter modified. No evidence CSV
changed. combo_v1 closure remains intact and registry-blocked.
* fix(ci): regenerate detect-secrets baseline + skip LOO tests w/o spike data
secrets-supply-chain (remaining JSON false positives):
.secretsignore is a detect-secrets pre-commit file-level filter; CI
scans with --baseline .secrets.baseline. Regenerated the baseline
(detect-secrets 1.5.0, same version as CI) so the 4 frozen-artefact
JSON files (PARAMETER_LOCK.json, SOURCE_HASHES.json, daily/*/run_
manifest.json, wave1_fx/universe.json) are registered as
known-acceptable Hex High Entropy String findings. Baseline count
77 -> 90; no new secret-like content introduced — only content-
addressable SHA-256 hashes that already failed scan in prior runs.
python-fast-tests (tests/analysis/test_cak_loo_determinism.py):
The two tests call the analysis module's _run(), which loads spike
CSVs from ~/spikes/cross_asset_sync_regime/data/. That bundle is
not present on GitHub-hosted runners. Added pytest.skipif guard
so tests skip rather than fail — determinism is a property of the
computation, not of the runner's disk layout. Both tests still run
locally where the bundle exists (verified: 2/2 pass).
SOURCE_HASHES.json regenerated against current branch bytes so the
companion hashes-frozen test stays consistent.
No signal logic touched. No parameter modified. No evidence CSV
edited. combo_v1 closure enforcement unchanged.
* fix(ci): guard evaluator against empty live-ledger + align secrets baseline
python-fast-tests (tests/ops/test_live_scoreboard_schema.py::test_scoreboard_appends_not_overwrites):
When the spike paper-state ledger is absent (as on CI runners),
_load_live_ledger returned an empty DataFrame, but
_compute_live_metrics then accessed live["net_ret"] before the
n==0 early-return, raising KeyError on the schema-less empty frame.
Added a guard: if live.empty or "net_ret" not in live.columns,
return the empty_metrics dict immediately. Evaluator now exits 0
with a BUILDING_SAMPLE / OPERATIONALLY_UNSAFE scoreboard row when
no ledger is available (verified locally against /tmp nonexistent).
secrets-supply-chain (2 remaining Hex High Entropy String hits):
Regenerated .secrets.baseline AFTER finalising SOURCE_HASHES.json
byte content — earlier regen had picked up the intermediate hash.
Baseline now records:
results/cross_asset_kuramoto/PARAMETER_LOCK.json
results/cross_asset_kuramoto/offline_robustness/SOURCE_HASHES.json
results/cross_asset_kuramoto/shadow_validation/daily/2026-04-10/run_manifest.json
results/wave1_fx/universe.json
as known-acceptable Hex High Entropy String findings (4 entries
out of 90 total baseline entries). No new secret-like content.
SOURCE_HASHES.json regenerated against current-branch byte state
(including the evaluator empty-ledger guard above) so the hashes-
frozen test stays consistent through the fix chain.
No signal logic changed. No parameter touched. No evidence CSV
modified. combo_v1 closure enforcement intact.
* fix(ci): update the correct detect-secrets baseline + UTF-8-safe YAML reader
secrets-supply-chain (root cause: wrong baseline file in prior fix):
CI invokes 'detect-secrets-hook --baseline .github/detect-secrets.baseline'
(verified in .github/workflows/pr-gate.yml:456). The previous fix
updated .secrets.baseline (used by the local pre-commit hook), which
CI ignores. Regenerated .github/detect-secrets.baseline with the
4 frozen-artefact JSON files recorded as known-acceptable Hex High
Entropy String findings (PARAMETER_LOCK.json, SOURCE_HASHES.json,
daily/*/run_manifest.json, wave1_fx/universe.json). Baseline count
6 -> 91. Both .secrets.baseline and .github/detect-secrets.baseline
now stay consistent.
python-fast-tests (UnicodeDecodeError in test_combo_v1_fx_wave1_rejected):
scripts/registry_validator.py:load_registry opened the YAML file
without an explicit encoding. On the GitHub-hosted runner the
default C.UTF-8 / ASCII locale caused a UnicodeDecodeError on the
em-dashes ('—', 0xE2 0x80 0x94) in the YAML comments. Added
explicit 'encoding="utf-8"' to the open() call.
SOURCE_HASHES.json regenerated to reflect the registry_validator.py
byte-change above.
No signal logic touched. No parameter modified. No evidence CSV
edited. combo_v1 closure intact.
* fix(ci): accept detect-secrets-hook baseline self-updates
detect-secrets-hook (the CI entry-point, not 'detect-secrets scan') auto-
updates the baseline in-place when it finds file/line drift, then exits
non-zero with 'please git add'. My prior 'detect-secrets scan' regen
produced a baseline without the exclude-files filter block and with
stale .github/detect-secrets.baseline self-entries that the hook keeps
pruning. Re-ran locally with the exact CI invocation
detect-secrets-hook --baseline .github/detect-secrets.baseline \
--exclude-files '^(INVENTORY\.json|\.github/detect-secrets\.baseline)$' \
<changed-files>
which produced a stable baseline (subsequent re-run exit 0). Committed
the stabilised baseline. Delta: adds the exclude-files regex to
filters_used, prunes the old self-entries for the baseline file.
No signal code changed. No parameter touched. No evidence edited.
* fix(ci): address Codex P1 findings — partial-dir retry + empty-ledger regression tests
Two P1 findings surfaced by the Codex reviewer on PR #355.
P1 #2 — partial-dir quarantine on retry (scripts/run_cross_asset_kuramoto_shadow.py):
When a prior run failed after _fail_closed() created run_dir with only
run_log.txt, the next invocation saw _already_written() == False and
fell through to run_dir.mkdir(parents=True, exist_ok=False), raising
FileExistsError and aborting the runner. This blocked clean retries
after any transient failure.
Fix: between _already_written() and mkdir(exist_ok=False), detect
run_dir.exists() — meaning prior attempt left partial evidence —
quarantine-rename it to <name>.incomplete.<YYYYMMDDTHHMMSSZ>, log an
operational_incident (incident_type=incomplete_dir_retry, severity=LOW),
then proceed with mkdir(exist_ok=False) on the now-clean path. The
quarantined dir stays on disk as append-only audit evidence of the
failed attempt.
P1 #1 — empty-ledger guard regression tests (tests/ops/test_codex_p1_regressions.py):
The guard itself landed in commit 2882850 ('fix(ci): guard evaluator
against empty live-ledger') — _compute_live_metrics now returns
empty_metrics when live.empty or 'net_ret' not in live.columns.
Codex is reading an earlier snapshot of the PR. Added three regression
tests pinning the fix:
* test_empty_ledger_returns_zero_bar_metrics_not_keyerror — direct
_compute_live_metrics(pd.DataFrame()) call returns 0-bar dict, no
KeyError.
* test_schema_only_ledger_returns_zero_bar_metrics — DataFrame with
the right columns but zero rows also returns 0-bar cleanly (the
n==0 branch).
* test_evaluator_cli_exits_0_with_missing_paper_equity — end-to-end
CLI with --paper-equity pointing at a tmp-path missing file must
exit 0 (BUILDING_SAMPLE / CONTINUE_SHADOW via the outer gate).
Plus two tests for P1 #2:
* test_runner_quarantines_partial_daily_dir — monkeypatches DAILY_ROOT/
SHADOW_DIR/INCIDENTS into tmp_path, simulates the partial-dir
scenario, confirms rename + fresh mkdir path without touching
real evidence.
* test_runner_retry_logic_matches_source_flow — meta-regression that
asserts the runner source contains the three markers of the fix
('incomplete_dir_retry', '.incomplete.', 'run_dir.rename(quarantine)'),
catching accidental reverts.
All 5 new tests pass locally. Full suite now 83 passed + 1 xfail (OBS-1
documented). mypy --strict, ruff, black all clean on changed files.
SOURCE_HASHES.json regenerated so the hashes-frozen test stays
consistent with the runner byte-change.
No signal logic touched. No frozen parameter modified. No evidence CSV
edited. combo_v1 closure enforcement intact.
* fix(ci): refresh detect-secrets baseline for new SOURCE_HASHES entries
P1 #2 fix (incomplete_dir_retry quarantine in runner) changed
scripts/run_cross_asset_kuramoto_shadow.py bytes, which propagated to
SOURCE_HASHES.json line 26 (the recorded hash of that script). The
detect-secrets-hook saw the new Hex High Entropy String as an
unapproved finding and blocked the CI gate.
Re-ran 'detect-secrets scan --baseline .github/detect-secrets.baseline'
to register the updated SOURCE_HASHES.json line-by-line hashes as
known-acceptable findings. Subsequent detect-secrets-hook runs exit 0
(verified twice locally against the exact CI invocation).
* chore(shadow): log incident before SystemExit(2) on missing asset
Self-audit weak-point closure — found by reviewing the runner for
audit-trail completeness after the Codex P1 fixes.
scripts/run_cross_asset_kuramoto_shadow.py::_target_run_date:
Previous behaviour on missing-asset CAKInvariantError was a bare
SystemExit(2), leaving the operator with only the process exit code
to debug. Now appends a row to operational_incidents.csv with
incident_type='missing_asset', severity=CRITICAL, description
containing the asset name and data_dir, then raises SystemExit(2)
from the original exception. Closes the audit gap that the
existing hash-mismatch and invariant-violation paths already
covered.
tests/ops/test_codex_p1_regressions.py:
- New test_missing_asset_logs_incident_before_exit pins the
incident-before-exit behaviour (monkeypatched INCIDENTS path to
tmp_path so real evidence rail is untouched).
- Lifted two nested imports (pandas, datetime) to module top.
- 6/6 tests pass locally; mypy --strict + ruff + black all clean.
SOURCE_HASHES.json regenerated (runner .py byte-change); CI
detect-secrets.baseline updated via 'detect-secrets scan' and
verified via local invocation of the CI hook command (exit 0).
84 passed + 1 xfail across all cross-asset Kuramoto test suites.
No signal logic touched. No frozen parameter modified. No evidence
CSV edited. combo_v1 closure enforcement intact.1 parent 1b97529 commit 8c46de0
137 files changed
Lines changed: 56447 additions & 389 deletions
File tree
- .github
- config
- core/cross_asset_kuramoto
- ops/systemd
- results
- cross_asset_kuramoto
- demo
- offline_robustness
- shadow_validation
- daily/2026-04-10
- fx_native_foundation
- wave1_fx
- audits
- run_a_gross
- run_b_net
- scripts
- tests
- analysis
- core/cross_asset_kuramoto
- ops
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
0 commit comments