Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
198 commits
Select commit Hold shift + click to select a range
9cd415e
feat(protonpotts): pre-register the P4d dump that discriminates the b…
maraxen Oct 8, 2026
74e6341
feat(protonpotts): pre-register the protonpotts_features wave
maraxen Oct 8, 2026
ef937c3
docs(protonpotts): §40 -- protonpotts_features graded pass by record;…
maraxen Oct 8, 2026
444abb9
feat(protonpotts): P6 conversion and pre-register the P4e encoder dum…
maraxen Oct 8, 2026
5eee993
docs(protonpotts): §41 -- P6 conversion; P4e dump and protonpotts_enc…
maraxen Oct 8, 2026
1776591
feat(protonpotts): P8 merge and energy, and pre-register the P4f ener…
maraxen Oct 8, 2026
cb54390
test(protonpotts): float32 tolerances in the energy unit tests
maraxen Oct 8, 2026
b736f9b
docs(protonpotts): §42 -- P8 merge and energy; P4f and protonpotts_en…
maraxen Oct 8, 2026
6484594
feat(protonpotts): P8 ProtonPottsDriver, family plumbing, ProtonPotts…
maraxen Oct 8, 2026
fb4a378
fix(protonpotts): blank insertion code in residue lookup
maraxen Oct 8, 2026
ec396f1
test(run): include protonpottsmpnn in the family-literal, prefix and …
maraxen Oct 8, 2026
b326276
feat(cli): --protonpotts-options-json, and its CLI test
maraxen Oct 8, 2026
3f5c9a4
feat(protonpotts): pre-register the protonpotts_driver wave
maraxen Oct 8, 2026
64c7252
docs(protonpotts): §43 -- ProtonPottsDriver; protonpotts_driver grade…
maraxen Oct 8, 2026
fb76923
docs(protonpotts): §44 -- P9 decisions and the debt filed for what is…
maraxen Oct 8, 2026
5ee5be1
docs(protonpotts): §45 -- P9 recon, verified findings, and their cons…
maraxen Oct 8, 2026
14f4c7d
wip(protonpotts): P4g pH-design dump script (smoke pending; not yet p…
maraxen Oct 8, 2026
c288688
feat(protonpotts): pre-register the P4g pH-design dump
maraxen Oct 8, 2026
bd03207
feat(protonpotts): pH-design conditional and block energies with iden…
maraxen Oct 8, 2026
5a4a93c
feat(protonpotts): pH-design config for block_descent / greedy_energy…
maraxen Oct 8, 2026
2366a30
feat(protonpotts): host-side pH placement planning (ph_plan)
maraxen Oct 8, 2026
e529ac3
fix(protonpotts): P4g dump loads structures with the pipeline's own p…
maraxen Oct 8, 2026
3345213
docs(protonpotts): §46 -- P4g graded pass by record after one failed …
maraxen Oct 8, 2026
09804a9
feat(protonpotts): pre-register the protonpotts_ph_block wave criteri…
maraxen Oct 8, 2026
f9cf421
feat(protonpotts): JAX block descent for pH design (ph_descent)
maraxen Oct 8, 2026
8804e43
feat(protonpotts): protonpotts_ph_block wave script (criteria pre-reg…
maraxen Oct 8, 2026
9991cfb
feat(protonpotts): optional CDF token order in the block-descent samp…
maraxen Oct 8, 2026
66b00f1
docs(protonpotts): §47 block wave graded pass; pre-register the proto…
maraxen Oct 8, 2026
62eaaca
feat(protonpotts): per-structure pH design orchestration (ph_design) …
maraxen Oct 8, 2026
9d866a1
feat(protonpotts): centre-free greedy energy block descent (ph_greedy)
maraxen Oct 8, 2026
b2f8806
test(protonpotts): fix three test bugs found on first execution (samp…
maraxen Oct 8, 2026
80b9654
feat(protonpotts): protonpotts_ph_greedy wave script (criteria pre-re…
maraxen Oct 8, 2026
12b7614
docs(protonpotts): §48 greedy wave graded pass; pre-register the prot…
maraxen Oct 8, 2026
107a65e
feat(protonpotts): sample (pH design) and score:selectivity in the fa…
maraxen Oct 8, 2026
897997a
test(protonpotts): placement has no residue-type restriction, so do n…
maraxen Oct 8, 2026
756e10d
feat(protonpotts): protonpotts_ph_driver wave script (criteria pre-re…
maraxen Oct 8, 2026
30ca245
docs(protonpotts): amend the protonpotts_ph_driver lambda control bef…
maraxen Oct 8, 2026
866f642
fix(protonpotts): center_count default in config_from_options; driver…
maraxen Oct 8, 2026
82bf625
docs(protonpotts): §49 -- protonpotts_ph_driver graded pass; P9 close…
maraxen Oct 8, 2026
475dcb1
docs(protonpotts): §50 -- P10 plan (knob surface, combined ledger veh…
maraxen Oct 8, 2026
5dedc40
feat(protonpotts): P10 S1 -- weights arm, ProtonPottsMPNN artifact ke…
maraxen Oct 8, 2026
20d7e00
feat(redsox): extractor learns an optional ProtonPottsMPNN root; refe…
maraxen Oct 8, 2026
6ecbc15
test(protonpotts): knob semantics, input and structure knobs
maraxen Oct 8, 2026
a8a2cbe
test(protonpotts): knob semantics, optimiser knobs
maraxen Oct 8, 2026
3bfb0ff
feat(protonpotts): P10 S2/S3 -- ProtonPotts knob surface: 50 alias ro…
maraxen Oct 8, 2026
e7dcd50
chore(protonpotts): P10 S4a -- move the seven wave scripts and the ch…
maraxen Oct 8, 2026
cdf4054
feat(protonpotts): P10 S4b -- protonpotts_parity vehicle, 47 manifest…
maraxen Oct 8, 2026
ff74b4b
docs(protonpotts): P10 S5 -- ADR, MODEL_FAMILIES, redsox README group…
maraxen Oct 8, 2026
ae17b34
fix(test): pin spec.protonpotts to None in the mock sampling spec
maraxen Oct 9, 2026
272a9da
refactor(protonpotts): block_zscales maps its blocks through xtrax, n…
maraxen Oct 9, 2026
432f4e4
chore(redsox): P10 re-wave -- nine ledger rows (eight rewritten, prot…
maraxen Oct 9, 2026
e8fb872
prereg(export): X6a ProtonPotts scoring graphs (table, energy) at V=3…
maraxen Oct 9, 2026
a034244
feat(export): X6a protonpotts_export_gate script (table + energy grap…
maraxen Oct 9, 2026
3b0fc29
feat(browser): ProtonPotts JS input builder (featurizer + label encod…
maraxen Oct 9, 2026
4d4cf66
prereg(export): X6b ProtonPotts JS scorer vs the real driver under No…
maraxen Oct 9, 2026
e34bf55
feat(export): X6b protonpotts_score_gate script
maraxen Oct 9, 2026
861ba5e
prereg(export): X6c ProtonPotts scoring page in headless Chromium vs …
maraxen Oct 9, 2026
76e7e6f
feat(export): X6c protonpotts_browser_parity script
maraxen Oct 9, 2026
a2664ce
feat(browser): pin the validated ProtonPotts scoring graphs (LFS) and…
maraxen Oct 9, 2026
f51dcbe
test(host): restore family modules and drivers after the seam tests; …
maraxen Oct 9, 2026
15b841c
prereg(protonpotts): score:ddg wave sidecar (debt #2618 item 1)
maraxen Oct 9, 2026
041e994
feat(protonpotts): score:ddg wave script (debt #2618 item 1)
maraxen Oct 9, 2026
16adb0e
docs(protonpotts): spec 52 -- #2620 resolved, ddg wave graded, browse…
maraxen Oct 9, 2026
7c47295
docs(protonpotts): ADR decisions 11-13 -- per-block pH browser graph,…
maraxen Oct 9, 2026
e3ed708
docs(protonpotts): spec 53 -- decoder plan D1-D3 and browser B1-B2, w…
maraxen Oct 9, 2026
c14526d
prereg(protonpotts): P4h decoder dump sidecar (AR with injected unifo…
maraxen Oct 9, 2026
f5e0dd0
feat(protonpotts): P4h dump_protonpotts_decoder script
maraxen Oct 9, 2026
115eb62
fix(protonpotts): P4h dump -- a None designed_residue_mask means ever…
maraxen Oct 9, 2026
6e89b0b
feat(protonpotts): 30-token decoder module (untied AR with per-residu…
maraxen Oct 9, 2026
4b19b8b
prereg(protonpotts): protonpotts_decoder wave -- aminx 30-token decod…
maraxen Oct 9, 2026
08877c1
feat(protonpotts): protonpotts_decoder wave script (per-step comparis…
maraxen Oct 9, 2026
d6486cf
test(protonpotts): decoder X-zeroing test uses a bias that keeps the …
maraxen Oct 9, 2026
8e4758b
prereg(protonpotts): amend the decoder wave -- token order stated, ni…
maraxen Oct 9, 2026
af58b06
fix(protonpotts): decoder wave compares in aminx token order and draw…
maraxen Oct 9, 2026
df694ca
fix(protonpotts): decoder wave uses upstream's float32-stored default…
maraxen Oct 9, 2026
2043272
docs(protonpotts): spec 54 -- decoder oracle graded, decoder wave sta…
maraxen Oct 9, 2026
2e2444b
fix(protonpotts): block potentials sum by one-hot matmul, not repeate…
maraxen Oct 9, 2026
2f10166
prereg(protonpotts): revise the decoder oracle and wave after the fir…
maraxen Oct 9, 2026
8a64ca8
feat(protonpotts): ar_x_bias configuration in the decoder dump and wa…
maraxen Oct 9, 2026
10b8252
feat(protonpotts): B1 groundwork -- loop-free pH functions for export…
maraxen Oct 9, 2026
568688a
prereg(export): X7a per-block pH graphs on real structures -- ORT-CPU…
maraxen Oct 9, 2026
80c59b5
feat(export): X7a protonpotts_ph_export_gate script
maraxen Oct 9, 2026
fa37dfd
docs(protonpotts): spec 54.1 -- D2 graded (a54ce791 fail by rule, the…
maraxen Oct 9, 2026
4856459
test(browser): planner test builds the neighbour table only for cases…
maraxen Oct 9, 2026
99cc787
test(browser): correct a hand-written blockTable expectation (positio…
maraxen Oct 9, 2026
bd28175
prereg(export): X7b the shipping JS pH design loop vs design_structur…
maraxen Oct 9, 2026
880c987
feat(browser): JS pH design loop (PhDesigner), its Node runner and th…
maraxen Oct 9, 2026
1363cc8
docs(protonpotts): spec 54.2 -- X7a per-block pH graphs graded (d5918…
maraxen Oct 9, 2026
ee7b800
prereg(export): X7c the shipping pH design page in headless Chromium …
maraxen Oct 9, 2026
c24fc4c
feat(export): X7c protonpotts_ph_browser_parity script
maraxen Oct 9, 2026
bcb76fb
docs(protonpotts): spec 54.3 -- X7b JS pH design loop graded (f0523ef9)
maraxen Oct 9, 2026
7875b90
feat(protonpotts): decode_export (encode and decode graph functions, …
maraxen Oct 9, 2026
3aac262
prereg(export): X8a 30-token decoder graphs (encode, decode) on real …
maraxen Oct 9, 2026
c477924
feat(export): X8a protonpotts_decode_export_gate script
maraxen Oct 9, 2026
c26bb2c
docs(protonpotts): spec 54.4 -- X7c shipping pH page graded in Chromi…
maraxen Oct 9, 2026
197abde
docs(protonpotts): spec 54.5 -- X8a decoder graphs graded (cd5fe181)
maraxen Oct 9, 2026
ff5b0eb
release(protonpotts): pin the per-block pH graphs (X7a manifest 131a6…
maraxen Oct 9, 2026
12c7718
prereg(export): X8b the JS ProtonPotts sampler from PDB text vs the u…
maraxen Oct 9, 2026
58480ae
feat(export): X8b protonpotts_sampler_gate script and Node runner
maraxen Oct 9, 2026
03f7e0a
fix(export): sampler places uniforms unshifted (padding decodes last)…
maraxen Oct 9, 2026
9b2d64a
prereg(export): X8c the shipping ProtonPotts sampler page in headless…
maraxen Oct 9, 2026
a5d6346
feat(export): X8c protonpotts_sampler_browser_parity script
maraxen Oct 9, 2026
0bc9ab2
docs(protonpotts): spec 54.6 -- B2 JS sampler graded in Node and Chro…
maraxen Oct 9, 2026
4fc9f70
prereg(protonpotts_parity): fold the decoder and ddg waves into the v…
maraxen Oct 9, 2026
eea8f7b
docs(protonpotts): spec 55 -- D3 re-scoped from the upstream source (…
maraxen Oct 9, 2026
4615e18
fix(redsox): declare the decoder and ddg wave dynamic-load sites (clo…
maraxen Oct 9, 2026
4695300
prereg(oracle): P4i N-row decoder dump for the engine's mpnn_sample (…
maraxen Oct 9, 2026
ffcf3c7
feat(oracle): dump_protonpotts_sample (N-row shim, binder-designed in…
maraxen Oct 9, 2026
cb9c90b
feat(protonpotts): sample_rows (N independent decodes over shared enc…
maraxen Oct 9, 2026
19c0c24
feat(protonpotts): per-row forced_tokens in sample_rows (oracle repla…
maraxen Oct 9, 2026
cf39743
prereg(protonpotts_sample): wave grading the N-row mpnn_sample sample…
maraxen Oct 9, 2026
0ea754b
feat(protonpotts): protonpotts_sample_parity wave script
maraxen Oct 9, 2026
c20e964
docs(protonpotts): spec 55.1 -- vehicle folded to 9 waves / 61 contro…
maraxen Oct 9, 2026
4d963b9
prereg(oracle): revise P4i claim 2 (single-chain cells have an all-Tr…
maraxen Oct 9, 2026
6465a96
fix(oracle): P4i mask check requires True and False only for multi-ch…
maraxen Oct 9, 2026
cefccdb
prereg(oracle): disclose the P4i key-set defect found by the first gr…
maraxen Oct 9, 2026
38ce8fc
fix(oracle): P4i mask check allows the default preparation to lack th…
maraxen Oct 9, 2026
1193e54
feat(protonpotts): lift the mpnn_sample refusal -- ph_sample, driver …
maraxen Oct 9, 2026
83d7190
fix(protonpotts): sample_rows on the xtrax-planned map (L-DRV R1 forb…
maraxen Oct 9, 2026
97779d7
fix(protonpotts): sample_rows passes the xtrax iterator its single tu…
maraxen Oct 9, 2026
4c54a97
ledger: protonpotts_parity -> run 1045798b (10 waves, 69 controls, pa…
maraxen Oct 9, 2026
eecbfb9
docs(protonpotts): spec 55.3 -- final re-wave 1045798b (10 waves, 69 …
maraxen Oct 9, 2026
a4fe628
ci: pin UV_PYTHON=3.13 for unit-tests (uv resolved CPython 3.15; torc…
maraxen Oct 10, 2026
2495729
docs(protonpotts): spec 56 + pre-register the P4j methods dump (autor…
maraxen Oct 10, 2026
2ea187f
feat(protonpotts): P4j dump script -- real engine, injected draws, pe…
maraxen Oct 10, 2026
2b2ef6b
docs(protonpotts): pre-register the protonpotts_ph_methods wave (44 c…
maraxen Oct 10, 2026
130d3b7
feat(protonpotts): host-loop pH methods -- autoregressive, converged_…
maraxen Oct 10, 2026
e8bef27
feat(protonpotts): protonpotts_ph_methods wave script (sidecar 2b2ef6…
maraxen Oct 10, 2026
7f809ca
test(protonpotts): the decoder field's self dependence is indirect, s…
maraxen Oct 10, 2026
d3f83ad
fix(protonpotts): Draws accepts any recorded stream; knob test indexe…
maraxen Oct 10, 2026
a4ce289
docs(protonpotts): P4j sidecar revision -- the float64 oracle must be…
maraxen Oct 10, 2026
efb1dad
fix(protonpotts): P4j builds the engine in the run's dtype (float64 o…
maraxen Oct 10, 2026
b90a989
fix(protonpotts): P4j sidecar revision note belongs inside the proven…
maraxen Oct 10, 2026
47df6f8
fix(protonpotts): P4j sidecar parses (revision note on one line, vali…
maraxen Oct 10, 2026
a11da51
fix(protonpotts): wave stops a free replay at its first fragile event…
maraxen Oct 10, 2026
5d39f32
style(protonpotts): ph_methods lint (file-level directive for annotat…
maraxen Oct 10, 2026
cba30ef
style(protonpotts): ph_methods typed signatures, ruff --add-noqa for …
maraxen Oct 10, 2026
b3704d0
docs(protonpotts): P4j sidecar second revision -- float64 units must …
maraxen Oct 10, 2026
42ea7cb
fix(protonpotts): P4j float64 units cast the engine's input features …
maraxen Oct 10, 2026
737b604
perf(protonpotts): gibbs sweep as one jitted lax.scan (one dispatch p…
maraxen Oct 10, 2026
9801f81
fold protonpotts_ph_methods into the vehicle (11 waves, 89 controls);…
maraxen Oct 10, 2026
465ba14
ledger: protonpotts_parity -> run 33360f39 (11 waves, 89 controls, pa…
maraxen Oct 10, 2026
150fce8
revert ProtonPottsOptions to its graded content: the new design knobs…
maraxen Oct 10, 2026
5342042
docs(protonpotts): spec 56.2 (new knobs are not options fields) and t…
maraxen Oct 10, 2026
a22f234
ledger: protonpotts_parity -> run 97ecf392 (11 waves, 89 controls, pa…
maraxen Oct 10, 2026
994b684
browser: pH and sampler pages take reps/warmup/planted_ms (defaults u…
maraxen Oct 10, 2026
22ad632
X9: ProtonPotts browser bench script (scoring, pH design, sampler pag…
maraxen Oct 10, 2026
c8092c6
X9 sidecar amendment: per-repetition shape, warm-up, isolation and th…
maraxen Oct 10, 2026
d94120d
X9 bench: X7c-order pH uniforms, per-repetition shape checks, warm-up…
maraxen Oct 10, 2026
bac26b8
X9 bench: scoring expect_sig counts the native row (19 variants -> 20…
maraxen Oct 10, 2026
1ee79cf
X10: pre-register the deployed ProtonPotts site gate (built dist/prot…
maraxen Oct 10, 2026
6ab6379
ProtonPotts deployable site: site/protonpotts UI + worker (CDN ORT 1.…
maraxen Oct 10, 2026
85b8c3e
X10: deployed ProtonPotts site gate script (graded cells.json, subpat…
maraxen Oct 10, 2026
45fdd7c
X11b: pre-register the Node gate for the browser pH host-loop methods…
maraxen Oct 10, 2026
644839f
X10: sampler PLANTED control rolls the single flat stream (roll_unifo…
maraxen Oct 10, 2026
d3b7b81
Browser pH host-loop methods: converged_mcmc(_combined), two_phase, g…
maraxen Oct 10, 2026
9672832
X11b runner: pass the replay as design()'s 5th argument (it went into…
maraxen Oct 10, 2026
9c58fed
P4k: pre-register the upstream sweep_order (knn/energy) block-descent…
maraxen Oct 10, 2026
99bacaf
#2621 phase 1: block_descent sweep_order knn/energy ported (upstream …
maraxen Oct 10, 2026
1a84375
X11b sidecar amendment (before any graded run): replace the 1e-5 fixe…
maraxen Oct 10, 2026
d00759f
X11b: implement the amended measured rule -- JS records per-pick prob…
maraxen Oct 11, 2026
c5be0c6
ph_methods JS test: events carry the drawn probabilities (stale deepE…
maraxen Oct 11, 2026
8ff7305
protonpotts_ph_knobs wave: pre-register sweep_order knn/energy parity…
maraxen Oct 11, 2026
9ec32e7
protonpotts_ph_knobs wave script: shipped _visit_order -> block_table…
maraxen Oct 11, 2026
781e4ed
#2621: expose sweep_order, global_weight, zscale_mode, adjacent_repea…
maraxen Oct 11, 2026
aacaf14
ProtonPotts site: pH method selector (block_descent + converged_mcmc/…
maraxen Oct 11, 2026
bb8df41
X11b sidecar amendment 2 (after graded fail 0bd45441, before the conf…
maraxen Oct 11, 2026
e1c7382
X11b gate: amendment 2 in code -- PROB_BOUND 5e-3, --seed-offset for …
maraxen Oct 11, 2026
ff8f688
protonpotts_ph_knobs sidecar amendment (after fail cf69cf4c): f32 sco…
maraxen Oct 11, 2026
5d2a463
protonpotts_ph_knobs: amended f32 score band in code (10x max of upst…
maraxen Oct 11, 2026
0a4580d
X11b sidecar amendment 3 (after held-out error 63cdd52a, before the n…
maraxen Oct 11, 2026
9800476
X11b amendment 3 in code: T=0 argmin traces (JS draws.argmins; refere…
maraxen Oct 11, 2026
3b093dd
protonpotts_parity vehicle sidecar REVISION 261011 (before the re-run…
maraxen Oct 11, 2026
6311e48
protonpotts_parity: fold the ph_knobs wave (P4k root, wave_argv, WAVE…
maraxen Oct 11, 2026
7318a5f
sidecar_ledger: rewrite all nine rows from the 6311e481 re-wave (veri…
maraxen Oct 11, 2026
63f22b0
X11c pre-registration: JS pH methods in headless Chromium at 1 and 4 …
maraxen Oct 11, 2026
800a16a
X11c: browser parity gate for the JS pH host-loop methods (new harnes…
maraxen Oct 11, 2026
92e04a2
P4m pre-registration: upstream block descent with the three objective…
maraxen Oct 11, 2026
079550d
X7d pre-registration: JS block_descent sweep_order knn/energy vs desi…
maraxen Oct 11, 2026
ffc4198
P4m: dump script for the objective knobs (global_weight, adjacent_rep…
maraxen Oct 11, 2026
04b52dc
X7d: JS sweep_order port (knn, energy ranker) + gate, harness page an…
maraxen Oct 11, 2026
b1e7e5b
X12 pre-registration: deployed site vs graded X11c (pH methods) and X…
maraxen Oct 11, 2026
885c871
X12: deployed-site gate for the pH methods and sweep_order harness pa…
maraxen Oct 11, 2026
d6fbed5
X12 amendment 1 (before any run): compare the fields the deployed wor…
maraxen Oct 11, 2026
b0b4da6
P4m2 re-registration after P4m b69bd83d FAILED self_live (self_weight…
maraxen Oct 11, 2026
252c1f9
P4m2: dump script (copy of P4m's; only the self_weight configurations…
maraxen Oct 11, 2026
cbb1a09
P4m3 re-registration after P4m2 f436cd91 also FAILED self_live (self_…
maraxen Oct 11, 2026
bf80010
P4m3: dump script (copy of P4m2's; self_live also accepts block_self0…
maraxen Oct 11, 2026
b48e9e7
protonpotts_ph_objective_knobs wave pre-registration: aminx global/ad…
maraxen Oct 11, 2026
71b6f48
#2621: port global_weight / adjacent_repeat_weight / self_weight in b…
maraxen Oct 11, 2026
2c74f85
protonpotts_ph_objective_knobs wave script: P4m3 replay of global_wei…
maraxen Oct 11, 2026
6f44772
protonpotts_ph_objective_knobs wave: a null visit_order (sweep_order …
maraxen Oct 11, 2026
7816c81
protonpotts_ph_objective_knobs amendment 1 (after efce8c0a FAIL 87/88…
maraxen Oct 11, 2026
50433bf
protonpotts_ph_objective_knobs wave: amendment 1 in code (f32_upstrea…
maraxen Oct 11, 2026
a8dbfa1
protonpotts_parity vehicle sidecar REVISION 261011 (before the re-run…
maraxen Oct 11, 2026
8a25ac5
protonpotts_parity: fold the ph_objective_knobs wave (P4m3 root, wave…
maraxen Oct 11, 2026
2cf0acb
test_ph_sweep_order: the three objective knobs are ported now (only z…
maraxen Oct 11, 2026
35813bd
sidecar_ledger: protonpotts_parity row -> 931ab51a at 2cf0acb9 (13 wa…
maraxen Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ jobs:
runs-on: ubuntu-latest
env:
PYTHONDONTWRITEBYTECODE: 1
# requires-python is ">=3.13" with no upper bound, so uv otherwise resolves CPython 3.15, which torch has no wheel for.
UV_PYTHON: "3.13"
steps:
- uses: actions/checkout@v4
with:
Expand Down
95 changes: 85 additions & 10 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
name: Deploy browser ProteinMPNN demo
name: Deploy browser demos (ProteinMPNN + ProtonPotts)

# Manual dispatch ONLY. Publishing model weights (when
# AMINX_MODELS_RELEASE_TAG is set) is a deliberate act, not something a push
# to main should trigger silently -- see the redistribution-rights note on
# the "Fetch released model weights" step below.
# AMINX_MODELS_RELEASE_TAG or AMINX_PROTONPOTTS_MODELS_RELEASE_TAG is set) is a
# deliberate act, not something a push to main should trigger silently -- see
# the redistribution-rights notes on the "Fetch released" steps below.
#
# One workflow deploys both sub-sites: the ProteinMPNN demo at the site root and
# the ProtonPotts demo at /protonpotts/. Both come out of ONE build invocation
# (tools/build_site.py), so the allow-lists and the import rewrites are checked
# together and a refusal publishes nothing.
on:
workflow_dispatch:

Expand All @@ -25,12 +30,9 @@ jobs:
# No node, no npm, no install step: the page loads site/*.mjs and
# site/*.js as written, so assembling the site is a copy with an
# allow-list (tools/build_site.py). python3 is already on the runner.
- name: Verify the site allow-list matches the tree
- name: Verify the site allow-lists match the tree
run: python3 tools/build_site.py --check

- name: Build the site (no model weights yet)
run: python3 tools/build_site.py --out dist

# 🔴 WEIGHTS REDISTRIBUTION IS A DELIBERATE, OPT-IN ACT. ProteinMPNN's
# checkpoint license must be confirmed to cover public redistribution
# via GitHub Pages BEFORE this variable is ever set -- do not set
Expand All @@ -45,11 +47,60 @@ jobs:
mkdir -p models
gh release download "${{ vars.AMINX_MODELS_RELEASE_TAG }}" \
-p 'p07_sample_L*.onnx' -D models/
# Rebuild WITH the fetched weights; --models-dir only ever copies
# The build below passes --models-dir models; it only ever copies
# the two exact filenames tools/build_site.py allow-lists
# (p07_sample_L128.onnx / p07_sample_L256.onnx), never a stray
# *.onnx.data.
python3 tools/build_site.py --out dist --models-dir models

# 🔴 PROTONPOTTS WEIGHTS: the same redistribution rule as above, and in
# addition the ProtonPottsMPNN checkpoint license must be confirmed to
# cover public redistribution BEFORE AMINX_PROTONPOTTS_MODELS_RELEASE_TAG
# is set. Three tarballs are expected on that release, one per kind:
# protonpotts-scoring.tar, protonpotts-ph.tar, protonpotts-decoder.tar.
# Each is extracted into pp_models/<kind>/, where tools/build_site.py
# reads its MANIFEST.json and copies only the files that manifest names.
- name: Fetch released ProtonPotts weights
if: ${{ vars.AMINX_PROTONPOTTS_MODELS_RELEASE_TAG != '' }}
env:
GH_TOKEN: ${{ github.token }}
PP_TAG: ${{ vars.AMINX_PROTONPOTTS_MODELS_RELEASE_TAG }}
run: |
mkdir -p pp_downloads
for kind in scoring ph decoder; do
asset="protonpotts-${kind}.tar"
dest="pp_models/${kind}"
mkdir -p "$dest"
gh release download "$PP_TAG" -p "$asset" -D pp_downloads/
# --no-same-owner: the archive is ours, but extract it as the
# runner user regardless of what it recorded.
tar -xf "pp_downloads/$asset" -C "$dest" --no-same-owner
if [ ! -f "$dest/MANIFEST.json" ]; then
echo "::error::$asset did not contain $dest/MANIFEST.json after extraction"
exit 1
fi
done

# ONE build. Each flag appears only when its weights were fetched above:
# --models-dir for the ProteinMPNN tag, and the three --protonpotts-*-dir
# flags together for the ProtonPotts tag. With neither tag set, this is the
# bare build and the pages report missing models at runtime, as before.
- name: Build the site
env:
MPNN_FETCHED: ${{ vars.AMINX_MODELS_RELEASE_TAG != '' }}
PP_FETCHED: ${{ vars.AMINX_PROTONPOTTS_MODELS_RELEASE_TAG != '' }}
run: |
args=(--out dist)
if [ "$MPNN_FETCHED" = "true" ]; then
args+=(--models-dir models)
fi
if [ "$PP_FETCHED" = "true" ]; then
args+=(
--protonpotts-scoring-dir pp_models/scoring
--protonpotts-ph-dir pp_models/ph
--protonpotts-decoder-dir pp_models/decoder
)
fi
python3 tools/build_site.py "${args[@]}"

# No release tag configured: point the built site at a remote model
# base instead of shipping weights inline (e.g. a release asset URL,
Expand All @@ -76,6 +127,30 @@ jobs:
env:
AMINX_MODEL_BASE_URL: ${{ vars.AMINX_MODEL_BASE_URL }}

# The ProtonPotts analogue of the step above, for the built
# dist/protonpotts/config.js. Gated on its own remote base and on NO
# ProtonPotts release tag, for the same reason: a locally bundled weight
# set must not be pointed away from.
- name: Point the built ProtonPotts site at a remote model base
if: ${{ vars.AMINX_PROTONPOTTS_MODELS_RELEASE_TAG == '' && vars.AMINX_PROTONPOTTS_MODEL_BASE_URL != '' }}
run: |
python3 - "$AMINX_PROTONPOTTS_MODEL_BASE_URL" <<'PY'
import sys
from pathlib import Path
base_url = sys.argv[1]
path = Path("dist/protonpotts/config.js")
text = path.read_text(encoding="utf-8")
rewritten = text.replace(
'export const MODEL_BASE = "./models";',
f'export const MODEL_BASE = {base_url!r};',
)
if rewritten == text:
raise SystemExit("dist/protonpotts/config.js did not contain the expected MODEL_BASE line")
path.write_text(rewritten, encoding="utf-8")
PY
env:
AMINX_PROTONPOTTS_MODEL_BASE_URL: ${{ vars.AMINX_PROTONPOTTS_MODEL_BASE_URL }}

- uses: actions/configure-pages@v5
- uses: actions/upload-pages-artifact@v3
with:
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/parity-audit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ jobs:
env:
PYTHONDONTWRITEBYTECODE: 1
PRXTEIN_PARITY_TIER: parity_audit
# requires-python is ">=3.13" with no upper bound, so uv otherwise resolves CPython 3.15, which torch has no wheel for.
UV_PYTHON: "3.13"
steps:
- name: Checkout Aminx repository
uses: actions/checkout@v4
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/parity.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ jobs:
env:
PYTHONDONTWRITEBYTECODE: 1
PRXTEIN_PARITY_TIER: parity_heavy
# requires-python is ">=3.13" with no upper bound, so uv otherwise resolves CPython 3.15, which torch has no wheel for.
UV_PYTHON: "3.13"
steps:
- name: Checkout Aminx repository
uses: actions/checkout@v4
Expand Down
2 changes: 2 additions & 0 deletions .praxia/docs/INDEX.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

## Specs
- [261007_potts-onnx-export-scope](specs/261007_potts-onnx-export-scope.md) — Scope, phase plan and acceleration levers for shipping Potts-family ONNX exports, reusing the ProteinMPNN split-export process
- [261007_protonpottsmpnn-support](specs/261007_protonpottsmpnn-support.md) — V1 scope (inference + design) for porting ProtonPottsMPNN into aminx, with the atomworks featurization re-scoped as a front end rather than a feature algebra, and a decision rule for when tensor-level parity is required versus whole-pipeline agreement
- [261006_aminx-cisternal-cutover](specs/261006_aminx-cisternal-cutover.md) — Make aminx agent-native through cisternal: a manifest-driven plugin bundle of targeted skills (using-aminx router + five task skills), an aminx-mcp server wired with @cisternal.tool over host.runner (launched via uvx by default, switchable to a local venv), cisternal provenance/telemetry for campaign runs; the Typer-to-cyclopts CLI port is deferred.
- [261006_runner-length-bucketing-xtrax-adoption](specs/261006_runner-length-bucketing-xtrax-adoption.md) — The core runner trims each batch from the loader's max_length to the smallest xtrax BUCKET_LADDER rung that covers it, then re-pads the outputs. On by default, with length_bucketing=False to opt out. Also retires the private bucket ladders and dead xtrax duplicates, and adopts device_memory_budget and loop_scaling. Closes
- [261002_streaming-xtrax-migration-scope](specs/261002_streaming-xtrax-migration-scope.md) — Opus-tier scoping report (task 261002_streaming-xtrax-migration, debt #2421): premise check, current-state map, xtrax capability map, gap analysis, target architecture, preemption/resume design, staged plan, asks of xtrax, decisions. Includes the verified reuse-safety defect in the campaign row hash.
Expand Down Expand Up @@ -95,6 +96,7 @@

## Decisions
- [261008_per-row-closure-staleness](decisions/261008_per-row-closure-staleness.md) — Ledger rows go stale only when a changed path is in that row's import closure, not on any scoped-prefix change; fail-safe rules, declared edges, and a run-time loaded-files check.
- [261008_protonpottsmpnn-v1-scope](decisions/261008_protonpottsmpnn-v1-scope.md) — What ProtonPottsMPNN V1 ships (score:energy/ddg/selectivity and pH design on the Potts energy), what is refused and tracked as debt, and the choices that put it in the ledger as one combined vehicle.
- [261005_tiling-plan-discarded-stage2-2371](decisions/261005_tiling-plan-discarded-stage2-2371.md) — Measured evidence that BatchPlanner says Vmap+Bucket for the sample axes while execution is a Python loop, plus the T2.GATE blocker on deleting aminx's duplicate strategy types
- [261004_laser-pdb-output-scope](decisions/261004_laser-pdb-output-scope.md) — Decision request: upstream LASEr writes PDBs through backbone N-H imputation, titratable-H cleanup with a geometric H-bond detector, and probability B-factors -- none of which the spec names; choose minimal writer vs full parity port
- [261004_sample-dist-pilot-fixtures-and-low-t](decisions/261004_sample-dist-pilot-fixtures-and-low-t.md) — Decision request before the Potts sample_dist pilot runs: spec names no pssm or tied fixture, and the T=0.1 near-margin control looks unworkable (as with ProteinMPNN 260929)
Expand Down
74 changes: 74 additions & 0 deletions .praxia/docs/decisions/261008_protonpottsmpnn-v1-scope.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
---
title: ProtonPottsMPNN V1 -- scope, the 30-token vocabulary, and how it enters the redsox gate
description: What ProtonPottsMPNN V1 ships (score:energy/ddg/selectivity and pH design on the Potts energy), what is refused and tracked as debt, and the choices that put it in the ledger as one combined vehicle.
status: accepted
task_id: 261008_protonpotts-p10
date: '261008'
supersedes: ''
backlog_ids: '5781'
---
# ProtonPottsMPNN V1 -- scope, the 30-token vocabulary, and how it enters the redsox gate

Spec: `.praxia/docs/specs/261007_protonpottsmpnn-support.md` (sections 42-51). Implementation: PR #211.

## Decisions

Taken by the user over 261007-261008 (each is quoted from the session where it was made, in the spec's section 11 and
sections 42-49):

1. **Protonation labels are consumed, not assigned** (spec 11a). aminx reads pre-assigned labels from a JSON file; the
end-to-end labeller (HBPLUS binary plus a FLAML ensemble) is out of scope.
2. **The pH design engine is in V1** (11b), restricted to block descent and the centre-free greedy on the Potts energy.
MCMC, two-phase and Gibbs methods are refused naming debt #2616; decoder-backed design and the 30-token decoder are
refused naming #2617; upstream knobs that are not exposed are #2621; known gaps of the pH surface are #2622;
ProteinSMC kernels for the Potts-head families are #2615.
3. **Each inference path declares its alphabet** (11c). The v6 vocabulary is 30 tokens and is a property of the path,
not a module constant; result arrays carry a `vocabulary` attribute, and aminx's token order differs from upstream's.
4. **Own options class**: `ProtonPottsOptions`, not `PottsMPNNOptions`, most of whose knobs do not apply.
5. **No fallback to stock MPNN.** A purpose the driver does not run is refused.

## Decided in P10, flagged for reversal

6. **One combined ledger vehicle, `protonpotts_parity`, not seven rows.** The seven waves share sealed dumps, so a row per
wave would multiply manifest rows (47 either way: each control is a row) without adding independence. The vehicle
runs the waves unchanged as subprocesses and reports controls as `<wave>.<control>`. The cost: a change that stales
one wave re-runs all seven (minutes of CPU, not hours).
7. **The wave scripts and the checkpoint converter moved from `scripts/protonpotts/` to `scripts/parity/`.** The closure
scanner only reads `src/` and `scripts/parity/`, and the `scripts/protonpotts/` tree is unscoped, so leaving them
there would have put the measuring code outside the row's closure. Earlier graded runs keep their records under the
old paths; only path strings in the moved files changed.
8. **The `protonpottsmpnn_` weights arm is inert** like the two it joins (no vehicle slug carries the prefix). Adding it
follows the spec; tightening it would be a separate decision about a pre-registered criterion.
9. **Known gap, not closed:** `scripts/convert_weights.py` (loaded by the converter) is outside every scoped prefix, so
editing it cannot stale the row. The converted weights are still pinned by the checkpoint sha and graded against
upstream whenever the row runs.
10. **`block_zscales` maps its blocks through xtrax, and L-DRV gets no new allowlist reason.** An earlier P10 draft added a
`memory_bounded_map` reason for the one carry-free `lax.scan` in `block_zscales`. The user asked for it to be composed in
xtrax instead (261009): the block axis is an `AxisSpec`, `plan_axis_strategy` chooses a vmap or tiles of it from the
memory budget (each block holds a V^B joint), and `make_axis_dispatch_via_xtrax` builds the map, padding a ragged last
tile and slicing the padding off before the pool. The three genuinely sequential loops keep `sequential_dependency`.
The axis is declared in `ph_descent.py`, not `aminx/tiling/axes.py`, because the host runner imports that registry
and an edit there would stale every row; move it there with the next wave that touches shared files.

## Consequences

- Every existing ledger row's closure includes `host/runner.py` and `run/`, which P8 edited, so all eight are stale and
the final `launch_wave.sh --stale-only` re-wave re-runs them with the ninth row.
- `record_trajectory` is accepted and changes nothing (trajectories are not recorded); its knob test says so.
- Three families now sit in `tests/knob_gate`: 50 alias rows and 23 knob-semantics tests cover ProtonPottsMPNN, and the
closure self-test pins that a Potts change reaches the ProtonPotts row, never the reverse, and that no family reaches LASEr.

## Decided 261009 (user): browser shape and the decoder

11. **pH design in the browser is a per-block graph driven by a JS loop**, not one sweep graph. Block descent is a host-side
sweep over placement blocks on the Potts energy; each block's conditional energy is one loop-free graph call and JS owns
the sweep, the convergence test and the injected uniforms. This follows the Potts export lesson (no in-graph `Loop`/`Scan`:
control flow forces device copies on WebGPU, and the monolith was abandoned for the split in the ProteinMPNN export). Graded
by the same ladder as scoring: export gate (ORT-CPU/ORT-Web), Node loop gate against the real driver, headless Chromium gate.
12. **The 30-token decoder is implemented now (debt #2617)**, ahead of the remaining browser work. It is the shared blocker for
plain ProtonPotts `sample`, the decoder-backed pH methods (`autoregressive`, `mpnn_sample`, `selective_source='decoder'`, the
whole-chain `gibbs` baseline, `backend='mpnn'`) and a browser sampler. Order: upstream oracle dump (draw-shimmed AR step, as the
Potts and LASEr oracles did) -> port and grade the V=30 decoder -> driver `sample` path -> decoder-backed pH methods ->
browser export. Each step is a pre-registered wave with negative controls; no tolerance is widened.
13. **Browser work is sequenced behind its blockers**, not built speculatively: per-block pH graph first (needs nothing new),
decoder graphs after the decoder is graded.
Loading
Loading