Skip to content

Technical documentationInternal

For the team and anyone taking the product over. Not linked from the site and not indexed.

Technical documentation pages

Known issues and risks

25 October 2026: stored-Dark and Stage G matrix follow-up

The CI run exposed these additional groups. The bounded native Protein repair and its acceptance are recorded below; the other groups retain their respective owners.

Id Severity Description Evidence Impact Status Suggested fix
REL-713 Medium Native Protein PNG capture can block rendering beyond the existing 20-second download-event bound. CI 40218546355 phone experimental-selection.spec.ts:10 fails both attempts after a successful Download click and prompt lazy-chunk load. Frames/snapshots stop during native capture. Local before diagnostics at unchanged image dimensions measure synchronous GPU readback of 4.46–6.73 seconds and RAF gaps of 4.68–6.90 seconds. Mol* upgrades captures to 16-pass multisampling and AO128 independently of viewport quality. Phone export may appear stalled; the scientific qualification assertions after download are not reached. Repaired by the bounded native pass and independently metered writer, preserving output dimensions and truthful settings. The accepted source head, permanent three-project checks and exact Fast evidence are recorded in docs/progress/bounded-native-capture-acceptance-2026-10-25.md; this does not close the incomplete full matrix. Preserve geometry, camera, dimensions, markings and qualification; record actual effective settings, serialize captures and restore state. No timeout increase, downsampling or generic screenshot substitute.
REL-714 Medium New Assay scientific-refusal export cases time out waiting for CSV downloads. CI 40218546355 phone and Dark: SCI-198 in inhibition-special.spec.ts and SCI-197 in survival.spec.ts; scientific refusal assertions reach export, but CSV assertions do not finish. The tests omit native save-picker suppression. Exported refusal content lacks completed browser coverage in those projects. Open investigation; issue-repair/Assay test owner. Investigate native picker handling first; preserve refusal semantics and download bounds. Do not treat scientific assertions alone as export acceptance.
REL-715 Low Bioreactor playback overlay remains visible after expected completion in Dark. CI 40218546355 bioreactor-simulator/motion.spec.ts, desktop-dark. Alignment-slide timing separately fails once then passes; that is a flake, not the same established cause. Motion/completion coverage is incomplete. Open investigation; Bioreactor motion owner. Inspect actual playback completion and overlay ownership without increasing timeouts; preserve separate flaky evidence.
REL-716 Medium Assay action-row checks see the keys container but cannot obtain the last action's bounding box. CI 40218546355 improvements/work-action-placement.spec.ts: the tabbed composite fails in Assay; the untabbed Assay case is flaky in Dark. Patent's distinct synthetic-heading failure remains REL-710. Action placement lacks completed responsive verification. Open investigation; shared action-row/Assay owner. Establish whether the action is hidden, stale or wrongly selected before changing the layout or locator.
REL-717 Medium Molecule's GSRS-origin save scenario exhausts its 45-second test bound. CI 40218546355 molecule-workbench/origin-save.spec.ts, desktop. Current trace does not yet establish the failing operation's root cause. The save/recovery scenario lacks completed verification. Open investigation; Molecule save/recovery owner. Not automatically REL-678 or REL-529. Inspect the failed operation and retained state before assigning an existing root cause.
REL-718 Medium The full matrix exceeds its unchanged 60-minute job cap on shards 1 and 11, leaving no JSON reports for 679 cases. CI 40218546355 on b5e6d7e6a: ten of twelve reports, 3,396 of 4,075 cases; 48 Pipeline desktop cases have no report. Shard 1 reaches late Pipeline checks; shard 11 reaches native Protein evidence before cancellation. Stage G row 11 cannot close; absent cases cannot be passed or recorded into the baseline. Open; CI/CTO owner. Two-second gate passes, but this does not complete browser coverage. Diagnose workload and obtain complete actual CI evidence with unchanged assertions and timeout policy; do not substitute logs or local passes for missing reports.

| REL-719 | Low | Public-theme/intro timing and concurrent Dark reference/settings checks have intermittent failures not established as candidate-caused or host-caused. | On product 0d2c57ca0, a two-worker run had two Dark failures and a settings flake; the complete isolated Dark group had 16 passes and one public-theme flake at its 30-second intro wait. A predetermined three-trial main-product comparison and three-trial candidate control then each passed without retries, with identical public-test body and fresh-storage precondition. All outcomes and setup are in docs/progress/bounded-theme-control-2026-10-25.json. | A clean paired control does not establish two-worker reliability or erase earlier failures. | Open; shared shell/showreel and reference-test reliability owner. REL-312 is a related historical title, but recurrence is unconfirmed. CTO bounded-control ruling permits accepted functional coverage with this follow-up retained; final writer checks remain separately recorded. | Investigate intro completion, actionability and source-load timing with original 45-second case, 20-second action and 30-second intro limits. Do not rerun until green, expand the baseline or assert host-load causality. |

Local evidence below is on product 53eca0225: exact titles, attempts and isolated comparisons are in docs/progress/desktop-dark-local-findings-2026-10-25.json. CI 40218546355 is on b5e6d7e6a; its report comparison is recorded in docs/progress/desktop-dark-integration-2026-10-25.md. Neither certifies later literature-origin head fa34117ae. Existing REL-580, REL-583, REL-672 and REL-674 retain their identities. The baseline stays unchanged pending complete comparison and owner attribution. Recorded failures are not waived checks; paused product ownership is unchanged.

Id Severity Description Evidence Impact Status Suggested fix
REL-675 Medium Three Study comparisons cannot find Edit conclusion in the Study conclusion region. Existing identity from handover §4.7; objects/run-comparison.spec.ts:406,558,598. Reproduced on 53eca0225 with original configuration and stored Dark, both attempts. Later comparison/conclusion assertions are not reached. Open; shared Study/workflow owner. Restores the existing handover identity to this register. Establish the intended editable surface, then fix product or cite the contract behind a precise locator change.
REL-676 Low Bench skeleton and live shell can both match .suite-shell. Existing handover §4.7 identity; smoke/research-workspace.spec.ts:55; full local Dark failure has the duplicate locator. Workspace/rail coverage is unstable at startup. Open; shared shell owner. Restores the handover identity. Await the intended live surface or repair overlapping identity; no retries or arbitrary .first().
REL-677 Medium Five Calc workspace cases use obsolete or absent rail, arrival and action selectors. Existing handover §4.7 identity; lab-calculators/workspace.spec.ts:78,115,133,194,247. Original-configuration reproduction fails all five; CI confirms desktop/Dark and both phone handoffs. Later work/export checks are not reached. Open; Calc/shared workflow owner; Calc product remains paused. Resolve the intended shared surface and cite its product change when correcting expectations.
REL-720 Medium Molecule's Dark SVG export lacks the ground rectangle required by its export assertion and uses pale strokes. molecule-workbench/workspace.spec.ts:337; same 53eca0225 build passes original empty storage and fails both isolated stored-Dark attempts. The exported depiction can lose its intended ground; later ZIP assertions are not reached. Open; Molecule depiction/export owner. Newly exposed by genuine Dark coverage. Review the export ground contract and pixels with the CDO; preserve the assertion and paused product ownership.
REL-703 Medium Three search tests expect automatic PubChem suggestions or combined lookup progress after SEC-02 made typing local. CI: improvements/oct16-fixes.spec.ts:113, search/catalogs.spec.ts:159, smoke/feedback-states.spec.ts:13. CTO traces the mismatch to e1edbb79b; progress now says UniProt only. Stale tests obscure the explicit lookup/privacy contract. Open; issue-repair/shared-search owner. Align coverage to the approved explicit-query contract, citing its source change; never restore automatic PubChem requests for old tests.
REL-704 Medium Assay File-flow table choices or refusal text remain hidden in the Paste-only container. Local data-grid.spec.ts:134, project-file.spec.ts:147, round-trip.spec.ts:190; .pzfx also reproduced with original configuration. CTO verified PzfxTables is inside the Paste-only hidden container while file input selects File; related refusals need their own surface confirmation. A parsed file can lack a visible next action. Open; Assay import owner; local product evidence is 53eca0225, current CI occurrence reported separately. Expose the File-flow controls; do not force-click hidden controls or switch input modes in the test.
REL-705 Low Assay keyboard handoffs and routine-week cases fail focus/focus-visible assertions. Ten local titles; figure focus also reproduced with original configuration. Assay's fixture already selected Dark. Later scientific/export assertions are not reached. Open; Assay/shared keyboard-helper owner; D-0080 applies without deleting/skipping checks. Establish focus ownership and modality transitions from the traces.
REL-706 Medium Assay handoff checks lack arrival strips; a phone plate-sheet check finds two refusal messages. Local assay-analyser/workspace.spec.ts:270,342, H20 also reproduced with original configuration; CI shard 6 lab-calculators/plate-sheet-handoff.spec.ts:144 has a strict-mode collision. Handoff/refusal coverage is incomplete. Open investigation; shared handoff/Assay owners. These are not assumed one root cause. Identify the intended arrival/refusal surface; do not conceal duplicates with .first().
REL-707 Medium Save consumers expect “Saved on this device” and old panel modes; current capture reports “Work and result saved on this device.” and inspector mode. Five Calc bench-execution titles in all three CI projects; local Sequence design-revision and CI phone. Original-configuration Calc reproduction matches. Later recovery, timer and interchange checks are hidden. Open; shared save-work/spec owners with Calc/Sequence owners. Follow the exact current contract and cite its source change, retaining downstream assertions.
REL-708 Medium Calc first-tube preparation seeks Record result in the obsolete Save/Details dialog. lab-calculators/serial-preparation.spec.ts:55, all three CI projects. The ordinary dilution save is not reached. Open; shared save-flow/spec owner; Calc product remains paused. Align the explicit flow to its approved surface, citing the product commit.
REL-709 Medium Bench/library/recovery checks lack a recovered item, plate wells or legacy transfer action. Local objects/bench-dashboard.spec.ts:316, rich-records.spec.ts:40, workspace-study.spec.ts:345; first two also fail in CI phone shard 8. Saved-record presentation and recovery coverage is incomplete. Open investigation; Bench/store owner. No common root cause is assumed. Triage each retained assertion against saved data and intended Library presentation.
REL-710 Medium Patent checks expect synthetic Examplix or public export version 5; the current export is version 7. Local improvements/work-action-placement.spec.ts:87, patent-exclusivity/workspace.spec.ts:224; CI phone confirms missing synthetic heading. Later action/export checks are not reached. Open investigation; Patent/public-contract and shared-shell owners. Verify real data and the export contract before changing exact expectations.
REL-711 Medium Five Plasmid flows fail in restriction alternatives, pending admission, Reset, Sequence handoff and explicit NCBI fetch. Local assembly.spec.ts:263,325, map-defects.spec.ts:78, sequence-handoff.spec.ts:149, workspace.spec.ts:375; exact assertions retained in the JSON. Own-sequence assembly is separately flaky. These flows lack completed browser verification. Open investigation; Plasmid/shared save/handoff owners; product remains paused. Classify each trace against its contract before changing product or expectations.
REL-712 Medium Sequence consumers seek old start headings, arrival/actions and save surfaces. Eight local titles in design-revision, pcr-product and workspace; CI phone confirms start, Cell arrival, accession and large-paste cases. Save wording also belongs to REL-707. Selection, handoff and persistence checks stop at absent controls. Open investigation; Sequence/shared workflow owners; product remains paused. Resolve each surface and cite its product change when adjusting expectations; retain scientific/persistence assertions.

Two current-line repairs retain their original failed evidence: the public transition explicitly scopes its fresh-Light setup (REL-540/570), and the Protein kinase reference follows 0649c8399's “Residue-level SIFTS mapping”, retaining chain A and selected residue 790. Both pass in the focused 51-case desktop/phone/Dark run on d257bb513; final landing is recorded separately. The two no-JavaScript timeouts pass in both isolated configurations and remain local observations, not established theme defects. Flakes remain separately identified rather than being counted as clean passes.

25 October 2026: sample-only plate diagnostics hidden

Id Severity Description Evidence Impact Status Suggested fix
REL-702 Medium Fit settings hides all plate diagnostics and derived layout advice when every plate has no positive/negative control wells: the whole block is gated by a non-null Z′ result, although sample-pattern tests are independently defined for a single-concentration group. On integrated 46556ba09, all six existing control-plate browser cases pass but all twelve new sample-only reference cases fail across desktop/phone/dark because no diagnostic details render. The frozen plate inputs import successfully and Fit is selected. fit-settings.tsx wraps PlateDiagnosticsList and the suggestion in plates.some(p => p.zPrime !== null). The CSO’s 13 October contract permits sample patterns and reading-unit effects when control span is unavailable. Scientists cannot inspect either a valid sample comparison or its truthful withholding reason without unrelated control wells. Fixed on main by PR #36 (802f34462, Fast 40227125033). Actual plates show their existing diagnostics independently, while the complete Z′ subgroup retains its own original gate. All 21 functional cases and eight Light/Dark/phone captures pass with the frozen sample-only inputs; calculations and layout rules are unchanged. —

25 October 2026: local production-preview literature origin

Id Severity Description Evidence Impact Status Suggested fix
REL-701 Medium Under next start, a same-origin literature POST to 127.0.0.1 was refused with 403: Next supplied a localhost request URL while the browser's Host and Origin were 127.0.0.1. The loopback recovery helper ran only outside production mode. Independently reproduced by root and CTO on the built route, port 3330: matching 127 Origin plus malformed JSON returned 403 while matching localhost reached 400. Two new native regressions failed before the change, including incorrect admission of an Origin matching the normalised URL instead of the actual loopback Host. Local production-preview literature searches could not reach request validation; existing mocked browser routes hid the mismatch. Built on claude/codex-copy-register-repairs: loopback recovery no longer depends on NODE_ENV. Both hosts, canonical Host spelling, port, URL scheme, absent hosted settings and exact Origin remain required; forwarded headers are unused. Native positive/negative regressions cover all four public literature entry paths. Rebuilt production acceptance: 48 real HTTP cases passed across localhost/127 hosts and all four paths; 21 desktop/phone/dark browser cases passed without skips, retries or flaky results, including the real 127.0.0.1 API regression. Final exact-head Fast/landing is recorded in the linked validation record. Preserve hosted, missing/null/foreign Origin and malformed Host refusals; see docs/progress/literature-origin-maintenance-2026-10-25.md.

25 October 2026: account-backup response qualification

Id Severity Description Evidence Impact Status Suggested fix
REL-700 Medium After a lost upload response and reload, the account-backup panel said the backup "failed to upload", although the server outcome was unconfirmed. The durable-retry browser case expected different pending wording and never reached its retry checks. Reproduced identically on main 2139bf4d3 and candidate 02dc3f4c0, desktop-account and phone-account, at e2e/objects/workspace-backup.spec.ts:46. backup-queue.ts retains the body/id/checksum and marks the unacknowledged attempt failed; workspace/backups.tsx renders backupText.failedCount. Both baseline and candidate runs had two passes and these two failures. An unacknowledged response was described as a known server upload failure; this also concealed two later stale browser expectations. Built on claude/codex-issue-repairs (25 October 2026), on the CPO and CTO's memos: failed-attempt count says "not been confirmed"; the queue and acknowledgement safeguards are unchanged. The exact browser expectations follow this correction and d52235db7a's existing snapshot/download wording. Full desktop-account and phone-account scenarios pass, including same-body/same-id retry, checksum acknowledgement and checked download (4/4 across both projects). Verify same-body/same-id retry after reload, matching checksum acknowledgement and checked recovery download; preserve the expired-account/mismatched-download refusal.

25 October 2026: Protein F-2 continuation findings

The live F-2 continuation closes three implementation defects found during review: extraction previously lacked enforced retained/output byte bounds; JavaScript UTF-8 encoding could replace malformed surrogate strings accepted by the reader; and a rehashed schema3 result could strip its scientific qualification. Pre-insertion encoded budgets, explicit malformed-Unicode refusal, and required retained-facts qualification now cover these cases, with negative tests. None changes frozen reference bytes or historical reader meanings.

A bounded limitation remains: chain-only model-server views can be inspected but cannot be prepared as new schema3 evidence, whose independently frozen inner admits only whole-entry PDBe/RCSB sources. Preparation now gives a source-specific refusal rather than a generic write error. Whole-entry fallback files with real chain/model identity and missing SIFTS remain eligible for qualified unavailable receipts. Live export refuses pending mapping and labels resource-limited correspondence unassessed, never absent.

Local full-suite verification uses a case-sensitive APFS fixture volume because the existing set-A.fastq and set-a.fastq paths collide on the Mac checkout. Both unchanged fixtures are tested; no Sequence expectation is weakened. This is a local filesystem constraint, not a product change.

25 October 2026: the 11A alignment slide (Stage H, BR11.4)

Rows the BR11 rulings allocated to Compare › Two measured runs (docs/progress/roadmap-run.md, the coordinator's id allocation of 24 October 18:50 UTC; the CTO's revision-2 memo, rows REL-589 and REL-592, renumbered), closed or opened by Builder E on claude/stage-h-public.

Id Severity Description Evidence Impact Status Suggested fix
REL-651 Medium At 375 the 11A panels' x-axis title ran past both edges of its SVG and was clipped, losing the event's threshold ("Elapsed time from Inoculation to OD600 = 0.15 (h)" lost "OD600 = 0.15") Seen in Stage H BR2; the CDO's and CSO's screen 9 memos (S9-7); the CTO's revision-2 memo (REL-589); src/components/tools/bioreactor-simulator/chart-plot.tsx drew the title as one centred <text> The axis said elapsed time from an event without saying which event, on every phone Fixed (BR11.4, 25 October 2026): KitPlot wraps the title inside the SVG at word boundaries (axis-title.ts, titleLines), never inside "a = b", between a number and the word after it or before a parenthesised unit, at 11 px with no ellipsis; the SVG grows by a line per extra title line, and reserveLabel keeps a panel's height when its title changes. Unit test axis-title.test.ts; the browser spec asserts the title's box inside its panel at 375 —
REL-652 Low The "Checking both sources" line in Compare › Two measured runs (data-comparison-checking) carries role="status", an implicit live region beside the view's one status bar (the same defect as screen 7's) The CTO's screen 9 memo, "One announcement"; src/apps/bioreactor-simulator/views/measured-comparison.tsx A screen reader may hear "Checking" announced on its own besides the status bar's messages Open: the accessibility pass (D-0080); it holds no merge Drop the role; the view announces through say() and the host's announcer
REL-654 Medium In Compare › measured runs the header's Export menu offered the simulator run's items (figure, PNG, CSV, Print, scenario JSON) beside the comparison's own The CTO's revision-2 memo (REL-592, renumbered): bioreactor-workspace.tsx registered exportItems(…) with no comparison-mode input, before the comparison's early return A person comparing measured runs could export a simulation they were not looking at Fixed on main by BR4.2 (53cfea72, 24 October 2026): the workspace registers no items while runsMode (Compare › Two measured runs) is on, so the menu lists only measured-comparison-json and measured-comparison-csv; the browser test "Source details keep every hash … the Export menu lists only the comparison's items" (e2e/bioreactor-simulator/measured-comparison.spec.ts) counts the menu's items. Confirmed as BR11.4's merge condition on 25 October 2026 (BR11.4) —
SCI-271 Low The 11A coverage note's source range counts blank rows that are never plotted: Run A in the comparison spec reads "Source elapsed range [-0.5, 2] h" while its first plotted reading is at 0 h The CSO's screen 9 memo, citing measured-comparison.ts (alignedElapsedExtentHours takes every row); the CTO's revision-2 memo (SCI-258, renumbered) and rev3 sign-off table The note says a source covers time where none of its plotted readings are Open (owner: Builder E, BR11.4 step 4b or later): the BR11.4 slide leaves the range as it was The words or the range are the CPO's with the CSO; if the range changes and it feeds the combined time range or the 0.5.0 fixture, it is a method change: a version, the oracle and the published file
SCI-272 Low With a 24 h simulation reference attached, the combined time range runs to 24 h and the measured readings sit in the first tenth of each panel's axis (about 21 px per 0.5 h at 1440) The CPO's revision-2 memo ("the union with a long reference squeezes the measured readings"); the CTO's rev3 sign-off table; the reference's elapsed times join the range in projectMeasuredComparison The measured panels become hard to read whenever a long reference is attached Open (owner: Builder E, BR11.4 step 4b or later); not a BR11 gate Whether the reference joins the range, or a range control: a CPO and CSO question; a range change is a method change as above

24 October 2026: Protein construct cropper and uploaded PAE (Stage F F3)

Rows REL-690 to REL-699 are Stage F F3's (Builder F3, claude/stage-f-f3), from the F3 brief (docs/design/protein-f3-reviewed-brief.md), the CSO, CPO and CTO F3 memos of 23 October 2026 and the CPO's codex-review memo item 3. The cases are verification 0.9.0 (construct-coordinates-v1.json, pae-upload-v1.json), frozen before any consumer changed. They close the two F-3 bullets of "Stage F continuity inventory — 23 October 2026" below.

Id Severity Description Evidence Impact Status Suggested fix
REL-690 Medium The construct cropper never received the protein's selection, so a region could reach it only by retyping, and every keystroke was clamped and coerced (Number(value) || 1, Math.max/min), then rounded and clamped again by the engine src/components/suite/protein/construct-cropper-panel.tsx before this change (start/end onChange); src/lib/seq/construct-cropper.ts:371-372; CPO codex-review memo item 3 A typed 2000 on a 1,210-residue protein silently became 1210, and a blank became 1, so the construct shown was not the one asked for Fixed 24 October 2026: the bounds are text drafts admitted whole by src/lib/protein/construct-draft.ts (digits only, safe integers, 1 ≤ start ≤ end ≤ length); an invalid draft stays as typed with its reason, and the table, FASTA and hand-offs are withheld until it is valid. "Use selected region (UniProt X–Y)" applies the current selection when pressed and never otherwise; the default and reset draft is full length —
REL-691 Medium The cropper's start and end were mounted state that survived a change of protein or sequence, so a construct and its FASTA could be shown for the previous entry's coordinates Same file, useState initialised once from the confidence suggestion A copied or sent construct could belong to a protein no longer on screen Fixed 24 October 2026: the draft is owned by the accession and the exact sequence; when either changes it resets to full length in the same render and says "Construct draft reset for the current protein sequence." The copy key is keyed by the FASTA, so no earlier copy's state shows —
REL-692 Medium The construct engine uppercases and strips every non-letter before slicing, so a sequence with a blank, a dash or a stop would be sliced in shifted coordinates (MA CDEFGH, 4–6, is CDE raw but DEF cleaned) src/lib/seq/construct-cropper.ts:370; acceptance plan "F3 construct" A construct reported for residues the researcher did not ask for Fixed in the panel 24 October 2026: a parent sequence that is not ASCII letters is refused with its reason and no construct; the engine and its v2 fixtures are unchanged and no other caller opens it to new input. For the CSO's actual-candidate review —
REL-693 High The uploaded PAE viewer read the file with an unbounded FileReader, parsed it with JSON.parse and parsePae on the main thread into nested arrays, drew an N × N canvas, had no read-error handler, size or cell cap, cancellation or ownership, and kept its matrix across protein and model changes; a slower older read could replace a newer upload src/components/suite/protein/pae-heatmap.tsx before this change; CTO F3 memo A large or hostile file could stall the page; an old matrix could sit under a new protein's name Fixed 24 October 2026: a dedicated cancellable worker (pae-upload.worker.ts, client and protocol in src/components/tools/protein-explorer/) reads, hashes, parses and decodes with the CTO's bounds (16 MiB refused before reading, on both sides; 2,000 a side; 4,000,000 cells; 10 s watchdog over the whole job), decodes straight into one transferred Float64Array (src/lib/protein/pae-decode.ts) and returns a preview of at most 1,024 pixels a side. Each upload is one attempt; a newer upload, a changed protein, sequence or model, or unmount cancels it, and a late reply is never installed. A changed context clears the matrix with "Uploaded PAE cleared because the protein or model changed." No main-thread fallback —
REL-694 Low parsePae (and the upload decoder, which keeps its routing) reads an array whose first entry has a pae key as the single-element wrapper, so a pair list written as {i, j, pae} is refused as unrecognised, although the pair branch would read i, j and pae src/lib/protein/pae.ts:306-313; pae-upload-v1.json refusal pairs-pae-key A pair-list file in that spelling is refused rather than read; no file is misread Open, kept as is: the admitted formats and routing are the D-0090 parser's, and widening them is a parser change for the CSO Order the wrapper test after the pair-entry test, with a new fixture case, if a provider is found to write that spelling
REL-695 Medium The heatmap's hover clamped the pointer into the matrix, read a missing cell as 0 (?? 0), and labelled cells "Aligned i → scored j", residue words for a file whose association with the protein is unknown; it also called an optional selection callback on every move pae-heatmap.tsx before this change A pointer outside the matrix read a real-looking 0 Å, and the words implied residue numbering the file does not carry Fixed 24 October 2026: hover reads the original cell at floor(y/H·N)+1, floor(x/W·N)+1 (src/lib/protein/pae-preview.ts); outside the matrix it reads nothing; the label is "Matrix row i, column j: PAE v Å"; the upload is labelled "Uploaded PAE · {file}" with the CSO's note that its coordinates are the file's, not residue numbers, and that the app has not checked it belongs to this protein or model (CSO ruling of 24 October 2026); the data, chains and onResidueSelect props are gone, so no upload can drive the protein's selection —
REL-696 Low The cropper swallowed a clipboard failure with no message construct-cropper-panel.tsx before this change (catch {}); CPO codex-review memo A failed copy looked like nothing happened Fixed 24 October 2026: the cropper uses the suite's CopyButton, which shows "Copy failed" with its remedy and announces it —
REL-697 Low The FASTA header said {accession} residues {start}-{end} ({tag}), which reads as if the interval numbered the tagged sequence; the tag, an added initiator Met, an omitted parent Met and a cleavage scar mean no offset maps one to the other Same file; acceptance plan "F3 construct" (1–8 with N-terminal His6: A, parent 2, is output 11) A reader could number the tagged sequence by the parent interval Fixed 24 October 2026 (CSO ruling of that day, item 8): ">{label} | source UniProt {accession} release {release} residues {s}-{e} (UniProt numbering) | {tag}, N-terminal or C-terminal (or no tag) | tagged sequence {n} aa, numbered from 1", then "source Met1 omitted; the tag supplies the initiator Met" or "initiator Met added" when they apply; the tagged column reads "Tagged, from UniProt residues s–e". Sequence and Calc still receive the exact tagged body with alphabet=protein, and no range —
REL-698 Low The construct engine's label puts a C-terminal tag's part before the protein name, so His6 after residues 2-100 of X is labelled -HIS6X(2-100) rather than X(2-100)-HIS6; the label heads the FASTA header and the copied file src/lib/seq/construct-cropper.ts:417-419 (tagPart is -{TAG} for C-terminal and is always prefixed); pinned in src/components/suite/protein/construct-cropper-coordinates.test.ts A C-terminal construct's FASTA name reads as if the tag were N-terminal with a stray dash; the header's own fields say C-terminal correctly Closed on 25 October 2026 (claude/stage-f-exit): the engine puts the tag part on its own side, HIS6-X(2-100) for N-terminal and X(2-100)-HIS6 for C-terminal (src/lib/seq/construct-cropper.ts), with hand-derived cases in construct-cropper.test.ts and the pinned header changed with it —

24 October 2026: the public scale-up and kLa pages (Stage H, BR11.3)

Rows the BR11 rulings allocated to the public calculator pages (docs/progress/bioreactor-stage-briefs/br11-rulings.md, §1.15 and §1.16), closed or opened by Builder E on claude/stage-h-public.

Id Severity Description Evidence Impact Status Suggested fix
REL-657 Medium At 375 the scale-up page's table had no phone form: it sat in an overflow-x-auto region, so Pg/V was off the right edge with no affordance, and the Rule column ran one word per line ("The / small / vessel"); at every width the row heads were centred under a left-aligned header (the th default) The CDO's screen 11 review (docs/board/memos/2026-10-24-cdo-bioreactor-br11-screens10-11.md, R11-9); the CTO's rev3 sign-off, question 3; src/apps/bioreactor-simulator/islands/scale-up.tsx The figure's caption sends readers to the table for the numbers, and at 375 one column of it could not be read without a sideways scroll Fixed (BR11.3, 24 October 2026): below sm the rows are DataTable's <dl> cards (its recipe from data-table.tsx, DS §6.12), above it the table, both in the server HTML with CSS choosing; row heads left-aligned. Importing DataTable was not needed (its recipe only). The island's chunk list measured 23,967 bytes gzip before and 24,156 after (+189), recorded as a defect fix, not against BR11.5's 0.3 KB —
REL-661 Medium The public kLa calculator's verdict ("Inside Van 't Riet's and Hughmark's ranges." or the outside list) did not carry D-0130's Unverified label in the server HTML, although Van 't Riet's unread range decides it (KlaEstimate.unverifiedRange); the Van 't Riet reasons named no Unverified state, and volume-high gave no bound The CTO's rev3 sign-off (REL-661 allocated); D-0130; the CSO's ruling docs/board/memos/2026-10-24-cso-bioreactor-kla-rel-661-words.md and the CPO's …-cpo-bioreactor-kla-volume-high-key.md A visitor could read a range verdict decided by an unread source as settled (D-0043) Fixed (BR11.3, 24 October 2026): calculators.kla.unverified ("Unverified: Van 't Riet's range not yet checked against Van 't Riet 1979.", derived from RANGE_FLAG_WORDS.line) after inside and after the outside reasons whenever unverifiedRange holds; the three Van 't Riet reasons end "; Unverified)"; volume-high is calculators.kla.volumeHigh(vMax) with the bound read from VAN_T_RIET[medium].vMax × 1,000 (2,600 / 4,400 L) and the figure's volumeHighShort takes the same string. Tests: islands/kla-figure.test.ts, e2e/bioreactor-simulator/kla-figure.spec.ts (the label in the server HTML at the defaults; 250 rpm) —
REL-668 Medium With non-coalescing broth chosen, the kLa answer is moved by Van 't Riet's unread non-coalescing coefficients, but nothing beside the answer said so: only the option label "(salts; unverified constants)" and the general note further down The CSO's ruling docs/board/memos/2026-10-24-cso-bioreactor-kla-rel-661-words.md §3; src/lib/hosts/transfer.ts (VAN_T_RIET["non-coalescing"].read: false) An answer resting on unread constants without D-0043's label beside it; a page-release condition with REL-661 Fixed (BR11.3, 24 October 2026): calculators.kla.unverifiedMedium ("Unverified: non-coalescing kLa correlation not yet checked against Van 't Riet 1979.", derived from the flags line's words) under the answer whenever that medium is chosen; the figure also marks the broth, the constants note and the line's label "(unverified)" in the warning ink —
REL-669 Medium The public scale-up page's kLa verdicts ("extrapolated" in each row's kLa cell, and the figure's "; kLa extrapolated" flags) carried no D-0130 label, although Van 't Riet's unread range decides every one of them (KlaEstimate.unverifiedRange, always true while D-0130 holds) The coordinator's allocation of 24 October 2026 (the last id in BR11's range), from Builder E's checkpoint; D-0130; the CSO's rule that every verdict from such an estimate carries the label (docs/board/memos/2026-10-24-cso-bioreactor-kla-rel-661-words.md) A range verdict decided by an unread source read as settled (D-0043); a page-release condition for the scale-up page, as REL-661 is for the kLa page Fixed (BR11.3, 24 October 2026): calculators.scaleup.unverified (the CSO's words, equal by test to the kLa page's label and to RANGE_FLAG_WORDS.line plus a stop) under the table whenever unverifiedRange holds, and the same sentence after the figure's note; asserted in the server HTML by scale-up-figure.spec.ts —
REL-667 Medium The scale-up page's no-result line for constant kLa said only "No agitation up to 10,000 rpm gives the small vessel's kLa here." when the bisection was not bracketed, whichever end failed: scaleUp returned null for the rule without saying whether even 1 rpm already gave the large vessel more kLa or even 10,000 rpm still gave it less, so the sentence could not say which, and "up to" hid the 1 rpm end The CSO's screen 11 review (docs/board/memos/2026-10-24-cso-bioreactor-br11-rev3-signoff.md); src/lib/hosts/scaleup.ts (g(lo) <= 0 && g(hi) >= 0, then null) A reader could not tell why the rule failed (a small vessel run so slowly that any agitation over-transfers at scale, against one that no speed in the bracket can match) Fixed (BR11.3, 24 October 2026): scaleUp returns noKla: "lo" | "hi" | null with the bracket exported as KLA_RPM_BRACKET (no number moved; SCALEUP_VERSION stays 1.0.0); the table and the figure read the CSO's two forms, "No agitation from 1 to 10,000 rpm gives the small vessel's kLa here: even at 1 rpm the correlation gives the large vessel more." or "…: even at 10,000 rpm the correlation gives the large vessel less.", with the bounds formatted from the constant. scaleup.test.ts sweeps 4,000 seeded cases over the page's field bounds and checks the claim at the named end; inside those bounds only "lo" occurs, and "hi" is exercised below a ratio of 1 —

24 October 2026: methods pane and method records

Found while building the methods work now on the v0.5 roadmap (docs/roadmap-v0.5.md, item 1); both are about main as it stands.

Id Severity Description Evidence Impact Status Suggested fix
SCI-260 Low Six method records that results carry are in no app's methods sheet, so no Methods pane or public methods page lists them: restriction-cloning-from-map and feature-transfer (src/lib/seq/methods-plasmid.ts), plate-sheet (src/lib/dilution/plate-sheet-method.ts), cell-line-resolution (src/lib/cells/resolve.ts), combination-normalise and combination-technical-mean (src/lib/assay/combination/methods.ts). Found 24 October 2026 by scanning every implementation record in the code against the sheets' methods. The sheets do not show every method a result goes through (CSO R3). Partially fixed on branch (25 October 2026), Assay two records only; integrated acceptance pending CSO/CPO/CTO architecture 6745219af: existing normalisation and technical-mean 1.0.0 records added before HSA/Bliss through the lazy Combination group, with separate bounded verified notes and the same existing 0.15.0 reference association. No engine, pin, version, reference or shared Methods UI change. Four Plasmid/Calc/Cell records remain open for their owners. See docs/progress/method-context-metadata-2026-10-25.md
REL-580 Medium Four Methods dialog browser cases fail on main at 85f2a3c9 because nothing mounts MethodsDialog (src/components/suite/shell/methods-dialog.tsx) any more: no file imports it. The top bar's Methods key, the limits line and the palette open the inspector's Methods pane (methods-quick-pane.tsx, mounted from app-shell.tsx), on phones as a sheet. The failing cases are e2e/smoke/methods-dialog.spec.ts "Calc's Methods key opens the dialog…" (desktop), "the limits line's Methods and checks opens the dialog at every width…" (desktop, phone) and "every app's dialog opens from its key…" (desktop); shared-shell.md still describes the dialog as the live surface. Reproduced on a build of 85f2a3c9 (24 October 2026, desktop and phone projects); grep -rn methods-dialog src finds only the file itself. They are not in docs/progress/e2e-baseline.json. The spec and the docs describe a dialog no visitor can open. The dialog's copy button and full method cards are unreachable in the workspace. Open Decide with the CDO and CPO whether the dialog returns. Then either remount it or retire it, its spec and its docs paragraph in favour of the pane's.

24 October 2026: Codex workflow review (b877cae82 → 6ccc319a, on main at 0489ba5ec)

These rows record the defects the workflow review confirmed. Each was found on main at 0489ba5ec, by reproduction, a measurement or a direct file read; each row's Evidence column cites its finding. The review is docs/reviews/2026-10-24-codex-workflow-review/README.md, and every row's Evidence names its finding id (CW-nn) there. The id ranges were allocated by the coordinator. None of these defects is fixed in the review.

Id Severity Description Evidence Impact Status Suggested fix
REL-560 High The example Study's own Assay work cannot be reopened or repeated. The example writer stores an Assay v6 record with sourceId/importReview but no tableDecisions, and the editable reader refuses it. CW-01: src/components/suite/workspace/example-study-science.ts:47; reader src/components/tools/assay-analyser/saved-record.ts:302 returns {"problem":{"code":"decisions"}} on the record dumped from a fresh example. In the browser, Resume opens "No assay open / Untitled assay" ("That assay is not in this browser."); Repeat is offered but refuses ("The exact saved inputs are unavailable"). The populated walkthrough's main scientific work is a dead end; an offered action always fails. Fixed on claude/workflow-finish: the writer adds the import's empty row decisions, read through readTableDecisions; no fit input, curve, qualification code or verification changes. Tests "CW-01: the example's stored Assay object passes the strict reader…", "CW-01: the row decisions change no fit input, curve, qualification code or verification…" and "CW-01: a repeat of the example's Assay work reads its source…" in src/components/suite/workspace/example-study-science.test.ts; "every Assay object the suite writes itself passes the strict reader (CW-01)" in src/lib/workspace/suite-assay-writers.test.ts; e2e/assay-analyser/example-study-work.spec.ts (opens with the Results tab's IC50 and qualifications; Repeat from the Work card creates a run). Repeat stays offered on every card; the writer invariant and its test are the gate (the CTO's ruling) Write a reader-valid v6 record. Add a unit test that the stored example passes readAssayDataStrict and a browser test that opens and repeats it. Offer Repeat only when the source reads.
REL-561 High Repeat with new readings, started inside Assay, writes the new run but leaves the scientist on the previous run, with the dialog open and Create enabled. A second click creates a second run. CW-02: src/components/suite/workspace/repeat-assay-action.tsx:62-64. Reproduced: repeat works 1 → 2 after two clicks; after reload the heading is still the previous run. Navigation code unchanged in this range; not tested on b877. New readings can be entered into the earlier run; duplicate runs. Fixed on claude/workflow-finish. Cause confirmed in the browser: the new work resumed by #s=handoff=<id>, the same-document popstate skipped the arrival key, and the page stamped the old mine= back. Assay work now resumes at #s=mine=<ref> (resume-href.ts), and the dialog drops its source (Create disabled) after the write and closes before navigating. Tests "Assay work resumes at its own record's address…" in src/lib/workspace/resume-href.test.ts; e2e/assay-analyser/repeat-lands.spec.ts (the "— repeat" heading, dialog closed, one work per click, the new run after reload) Close the dialog and navigate to the new work's ref. Disable Create after success. Add a browser test asserting the "— repeat" heading.
REL-562 High A recovery file made by main before the workflow merge is refused when its Study has a research brief. CW-03: src/lib/workspace/bundle.ts:209-213 compares checkStudyData output with unmigrated data. Reproduced: a b877 export (format 4, Study schema 4, research.nextStep) gives "Invalid Study data or unsupported fields."; the same file without the brief is accepted. The server backup route shares the validator (src/app/api/workspace/backups/route.ts:50). Earlier recovery files and backups cannot be restored although formats 1–6 are declared readable. Fixed on main (6a1439a23, from claude/workflow-finish-storage): validateStudyBundle checks the Study migrated by its schemaVersion (currentStudy, through objects/study-migration.ts), returns the file as written, and restore writes schema 5. Test "a format-4 recovery file with a schema-4 research brief restores its next step" in src/lib/workspace/bundle.test.ts (schemas 4 and 3; a dangling linked task and an unknown field are still refused) Migrate r.study.data by schemaVersion before the canonical check. Add v3/v4 fixtures with nextStep, or refuse schema ≤4 with its own message.
REL-563 Medium Raw-row Study writers skip the 4→5 migration. They stamp schema 5 on unmigrated data and drop research.nextStep/nextWorkId. CW-04: src/lib/workspace/save-work-subjects.ts:28-43, src/lib/workspace/study-lifecycle.ts:11-27. checkStudyData returns {research:{objective:"o"}} for a v4 brief (node check). One Save into a schema-4 Study loses its next step, and the migration can no longer run. Fixed on main (6a1439a23, from claude/workflow-finish-storage): one readStudyRow (study-lifecycle.ts) migrates the row before checkedStudy and saveWorkSubjects change it, so repeat setup, task move, bench execution and empty-Study delete inherit it. Tests "one Save into a schema-4 Study keeps its research next step" and "moving a task between schema-4 Studies migrates both research briefs" in src/lib/workspace/save-work-subjects.test.ts Migrate in checkedStudy and saveWorkSubjects before modifying, or refuse schema <5. Add a regression test.
REL-564 High The workflow landing renamed shared labels without running or updating the consumer browser specs. CW-05: 87 exact name: "Save work" locators in 44 spec files; "Resume saved inputs" in 15 files. On main the objects/desktop batch fails 99 of 155, none of them in e2e-baseline.json; 49 wait for a "Save work" button. The sibling reviews attribute 19 Pipeline, 33 Molecule and 15 Protein cases to the same rename. Counts for all projects are in the review §5. Main's browser projects are red; real regressions are hidden among stale expectations. Partly fixed: CW-05a on main (f96e18a69); CW-05b on claude/workflow-finish (92f677610, 49b245032, d2e86c73e); remaining titles in docs/progress/2026-10-24-workflow-finish.md. CW-05b continued on claude/workflow-finish-specs (24 October 2026): 31 spec files follow D-0120, both helper races fixed (openWorkDetails waits for the resumed task; /o#work waits for the hydrated Bench). Remaining: REL-578, REL-579, REL-581 and REL-582. Eleven further specs still looked stale and were not yet run, among them objects.spec, j3, literature/study-summary, outliers-power and Protein dossier. Second pass on claude/workflow-finish-specs-2 (25 October 2026, from main c9dc27912; test files only): 50 candidate files run on desktop, phone and desktop-dark against a production build of the base (the grep's and the review's candidates, the literature Study specs, all of e2e/smoke/ and molecule-workbench/arrival-save at the coordinator's request). 16 spec files and two helpers now follow the product, each change citing it: D-0120's Study notes disclosure, Results, Materials & sources, "From your Library", the Bench's Recently viewed disclosure, Continue working leading the Bench, Add to study without a kept view and the Library's empty line; the one Save and All work in intermediate-dilution; the Export Study dialog (35489e980) through the new chooseCompleteStudyZip; the Library's List/Cards group (35489e980); the restored sidebar rows (8866b7bac); Sequence's start and Calc's inputs-first layout (b92578a2f); the tab-row work actions and the Inspector hiding them (0814cb534); the phone's page-tools notice (2b3119f41); and Pipeline's /^Save to / checks, which had matched nothing since D-0102, now read the Save key. Product defects left failing on main's head: REL-674, REL-672, REL-673. Still failing and already recorded: REL-551 (phone drug-pipeline-explorer/workspace.spec.ts, now :309), REL-580 (methods-dialog.spec.ts, also on desktop-dark), REL-583 (stage0-accessibility.spec.ts:72, desktop). Load only, passing at one worker: notepad.spec.ts:66, popup-close.spec.ts:73, usability-header.spec.ts:47, batch-statistics-actions.spec.ts:14 (desktop-dark). Align each expectation to D-0120's rename, citing it. Triage the remaining failures in the product and record any that remain.
REL-565 Medium Study PDFs never print the character-substitution list, while the success toast says it is in the final section. CW-06: src/lib/workspace/study-report-pdf.ts:47 adds && document.studyId; the overview document sets studyId: "" (study-report-overview.ts:169). Reproduced on the example Science PDF (18 pages, substitutions present, no section). Substituted characters in scientific text are not disclosed in the PDF. Fixed on claude/workflow-finish: the list follows substitutions alone; test "the prepared overview PDF discloses its character substitutions" in src/lib/workspace/study-report.test.ts Condition the list on substitutions only. Add an overview-document test.
REL-566 Medium Copy on the rebuilt screens keeps the old vocabulary and names actions that no longer exist. CW-09: rendered "8 objects · 7 saved work", "6 records linked", "Link a record", Restore preview "Objects / Saved tasks", and a "Resume" button under "Continue working". Copy says "Save to Bench", "Save work first", "Record result separately" and "Open Save work" (content/apps/bench.ts, study-dashboard.ts, workspace-portability.ts, lab-calculators.workflow.ts, lab-calculators.normalization-plan.ts, protein-explorer.evidence.ts, sequence-toolkit/shared.ts). Contradicts D-0120 and sends scientists looking for missing buttons. Open Copy sweep agreed with the CPO, and with the CSO where "record" is scientific.
REL-567 Medium The action cluster is not Save · Send to · More in every app. CW-14: rendered at 1440, Assay (plus "Save as a template"), Plasmid and Bioreactor show Save · More with Send to inside More (variant="row"). Protein and Molecule show Save · Send to · More. Inconsistent action placement across apps. Open Use the subject variant, or have the CDO record each exception.
REL-568 Low The same Study is counted differently on the Bench and on its page. CW-18: the example shows "8 objects" on its Bench card and "6 records linked / Materials & sources 6" on its page; the Bench count includes the Experiments. Two numbers for one fact. Open One definition and one label.
REL-569 Low Saving unchanged Assay work again records another ResultSnapshot. CW-19: reproduced, results 1 → 2 with no edit; the first result and input were byte-identical. Duplicate rows in result history. Open Reuse the unchanged checkpoint for deterministic Assay fits, or label repeats.
REL-570 High The desktop-dark Playwright project renders Light unless a spec sets suite:theme. CW-25: playwright.config.ts:103-106 sets only colorScheme; Light has been the default since d4c434828. The CTO counts 101 spec files with no Dark set (docs/board/memos/2026-10-24-cto-desktop-dark-project.md, on claude/inspiring-hopper-b8hqfd). The workflow's own workflow-entry.spec.ts was one of them. "Passes in Dark" claims resting on those files are Light runs. Fixed on claude/codex-issue-repairs (25 October 2026): adopted the CTO-owned abfe8078 project-level stored theme and probe. Desktop/phone keep Light; desktop-dark stores Dark before the first page. Final project probes recorded with this branch acceptance. Store the theme at project level, as the CTO memo rules, then re-run.
REL-571 High Assay Growth, qPCR, enzyme kinetics and inhibition results cannot be recorded. Their capture paths still require Assay work schema version 5, while Assay work now saves at version 6 or later. CW-26 (found in the fix phase, 24 October 2026). src/apps/assay-analyser/workspace-adapter.ts:75 (qPCR), :151 (growth), :179 (inhibition), :231 (thermal) and :264 (kinetics) test stateRef.schema.version !== 5; calibration (:58) and dose response (:89) compare with data.v. Reproduced on main 27237b64a: saving the shipped Growth, qPCR and enzyme-kinetics examples shows "Work saved; the current result could not be saved…". The stored work is {"id":"assay-analyser.assay","version":6} with the calculated result present. The gate dates from 839bba802 (10 October); D-0120's one Save now attempts it on every save. Scientists cannot keep results for four Assay modes; each save shows a failure. Fixed on claude/workflow-finish: the five captures compare with data.v (each mode's sub-record reader is independent of the record version); tests "…the write path's record (v6 or above) with a calculated result captures a ResultSnapshot (CW-26)" and "…a record at every written version, up to the current 8, captures…" per mode in src/apps/assay-analyser/capture-record-version.test.ts, and e2e/assay-analyser/result-capture.spec.ts (each shipped example: "Work and result saved on this device."). Thermal was the same gate once Tm is found; the start's melt example saved before its run correctly keeps no result. The CSO confirmed the gate on 24 October 2026 with two conditions: a v2 growth record's Gompertz fit is set to null in the captured input (done, test "a stored Gompertz fit stays out of the captured input" in growth-persistence.test.ts), and the missing qPCR interval method pin is REL-575 Compare with data.v as calibration does, after the CSO confirms each mode's reader accepts versions 6 to 8. Add a capture test per mode at the current version.
REL-574 Low A Study PDF's substitution list named the line feed (U+000A) as "rendered as "?"", though no line break is ever drawn. Found when CW-06 made the list print again (24 October 2026). The example's Science and Business PDFs list U+000A; pdftotext finds no "?" in either. layoutStudyReport inspected each text raw (src/lib/workspace/study-report-pdf.ts:40), while wrapReportText splits on line breaks and other whitespace before drawing. The disclosure listed a substitution that never happened. Fixed on claude/workflow-finish: headings, paragraphs, facts and captions are inspected as wrapped and drawn; axis and series labels, drawn unwrapped, are inspected raw. Test "the substitution list names only characters the PDF draws" in src/lib/workspace/study-report.test.ts. Inspect report text as wrapped.
REL-575 Low A recorded qPCR result does not name the Welch fold-change interval method among its methods, though its interval numbers and qualification are recorded. The CSO's review of CW-26 (24 October 2026): captureQpcrWorkspaceResult (src/apps/assay-analyser/workspace-adapter.ts:83) lists only qpcr-relative-expression; the export names qpcr-fold-change-welch-interval 1.0.0 (src/lib/assay/qpcr/report.ts:3). The recorded result's provenance omits the method that produced its interval. Fixed on main by PR #35 (713854d9a, Fast 40222540805). New supported qPCR v2 captures retain quantity and Welch-policy pins; historical snapshots and all current guards remain unchanged. Stored-output/reload and recovery evidence is in docs/progress/capture-provenance-2026-10-25.md. —
REL-576 Low A Study PDF's substitution line reads U+2032 rendered as "'", which prints as a row of quote marks, and a bare code point tells a reader nothing. The CDO's and CPO's reviews of CW-06 (24 October 2026); the line comes from t.substitution in content/apps/workspace-study-report.ts:23. The disclosure is correct in the text layer but hard to read in print. Fixed on claude/codex-study-evidence-wording: content-owned ASCII names describe the encoder’s exact replacement scalars in order, preserving repeats and an explicit unknown-name fallback. Actual Business/Science text and six raster pages verify status, named characters and complete infinity wrapping. Encoder/fonts and original scientific text are unchanged; final CI/landing is tracked in docs/progress/study-evidence-repairs-2026-10-25.md. Preserve the exact encoder receipt and original Unicode in the readable HTML; do not guess unknown character names.
REL-577 Low At 375 px the Assay Analysis select runs past the right edge of its column. The document does not scroll sideways. The CDO's captures for CW-26 (24 October 2026), cw26-after-375-dark.png; also present on main 27237b64a, so it predates the fix phase. The CPO asked for this row. The select's end is cut off at phone width. Open Constrain the select to its column at 375 px (CDO).
REL-670 High Signed-out, the Bench's "Recover browser work" never leaves its loader, so pre-account browser Studies cannot be reached for recovery from the Bench. Found by CW-05b (24 October 2026): e2e/objects/bench-dashboard.spec.ts:316 and e2e/objects/workspace-study.spec.ts:343 fail on desktop, phone and desktop-dark, and identically on a production build of main 27237b64a. readyScope requires canRead (src/components/suite/objects/object-list.tsx:188, :205-206), which signed-out access lacks; it came with 35489e980 in Codex's workflow line. The explicit legacy recovery path the storage contract keeps (createLegacyStudyBundle) has no working entry on the Bench. Open; product defect for the next visible fix, with the CDO and CPO gates Let the signed-out recovery view resolve its scope without canRead, keeping writes refused; the two specs are the test.
REL-579 Low Revealing a Study material (the highlighted card) sometimes leaves focus elsewhere. Found by CW-05b (24 October 2026): e2e/objects/unified-save.spec.ts:77 fails intermittently on all three projects and on main 27237b64a's build. A focus log showed the card present and visible but not focused in 3 of 4 runs. The reveal focuses once, in one animation frame (src/components/suite/objects/study-page.tsx:215-223). The keyboard user lands away from the material they asked to see. Open Focus once the card is mounted and visible, not in a single frame.
REL-581 Low The Library card for a rich record shows a material summary where the specs expect the plate preview. Found by CW-05b (24 October 2026): e2e/objects/rich-records.spec.ts:40 fails on all projects and on main 27237b64a's build; the summary replaced the preview in 35489e980 (Codex's workflow line). Whether that was intended is not recorded. If unintended, the plate preview is lost from the Library. Open; for the CDO and CPO: keep the summary and align the spec, or restore the preview A seat ruling, then the spec or the card.
REL-582 Low On a phone, the Assay round trip draws its arrival sentence twice. Found by CW-05b (24 October 2026): e2e/assay-analyser/round-trip-walk.spec.ts:109 fails on phone, identically on main 27237b64a's build. A repeated sentence at 375 px. Open Find the second render path and keep one.
REL-583 Low Opening a Bench view's library no longer moves focus to its "Pinned Library items" heading when focus has not moved (REL-237). Found 24 October 2026 after tonight's integration (main f1d5fc780): e2e/smoke/stage0-accessibility.spec.ts:72, as aligned to D-0120 on claude/workflow-finish-specs, passes on a build of 92f34634a (before the integration) and fails on desktop and phone, 3 of 3 repeats each, on that branch merged with f1d5fc780; the branch changes no product file. The cause is in the integrated set (Stages E to H and the methods code pages); not yet bisected. Keyboard and screen-reader users land away from the view they opened (an accessibility item, D-0080). Open; recorded against the integration of 24 October 2026 under D-0135, owners told Bisect the integrated lines on this spec; restore the focus move.
REL-584 Medium After CW-26, e2e/bioreactor-simulator/measured-review.spec.ts "named pasted growth keeps repeats…" failed on main's head on desktop and phone: the one Save now records the result, and the spec still pressed a separate "Record result" key and opened the old /o#objects queue. Found by Stage H's Builder B at 3c6a89924 (main 688ed4ce merged), 24 October 2026, and passed to this line by the coordinator. The key went with D-0120's one Save (5d02f5223); the saved-work queue is the Bench's #work since D-0120. Main red on one title. Fixed on claude/workflow-finish-specs: the spec relies on save()'s "Work and result saved on this device." and then checks the recorded snapshot, and it opens All work through the shared openAllWork; 9/9 on desktop, phone and desktop-dark Align the spec to D-0120, citing it.
REL-674 Low The Inspector's own close button no longer remembers the person's choice: after closing it and reloading, Calc and Sequence open the docked Inspector again. Found by CW-05b's second pass (25 October 2026): e2e/smoke/inspector-limits.spec.ts:9, "lab-calculators: blank start, active method inspector and remembered close" and "sequence-toolkit: …", fail at :58 (after the reload, aria-expanded is "true") on desktop and desktop-dark, on a production build of main c9dc27912; phone passes, where the Inspector does not dock. Since b92578a2f (23 October, Codex's workflow line) the close calls closeAuxiliary (src/components/suite/shell/app-shell.tsx:331-334, :994), which closes Methods and calls insp.hide(), a choice for this page only; before it the close called insp.toggle (src/components/suite/shell/use-shell-layout.ts:255-264), which writes suite:<slug>:inspector-open where the Inspector docks. D-0060 respects "a person's explicit open/closed choice" and asks for "remembered choices" to be verified. A person who closes the Inspector gets it back on every reload of Calc and Sequence. Open; product defect left failing on main's head (D-0074), for the shell's owner Let the close button record the docked choice as the toggle does, still closing Methods; keep hide() for the apps' own transient closes. The spec is the test.
REL-672 Low At 375 px the Ki from IC50 task page is 394 px wide, so the page scrolls sideways. Found by CW-05b's second pass (25 October 2026): e2e/smoke/apps.spec.ts:58 "task page assay-analyser/ki-from-ic50 answers with its app's headers and is indexable" fails on phone, "page is 394px wide in a 375px viewport", on a production build of main c9dc27912, 2 of 2 runs. Measured: the answer's method chip, "Ki from IC50, competitive (Cheng–Prusoff)" (an inline-flex max-w-full chip whose label is truncate, so nowrap: src/components/tools/assay-analyser/panels/parts.tsx:39-43), has a 331 px min-content; the card's grid sets columns only from lg (src/apps/assay-analyser/islands/ki.tsx:46), so its one implicit column takes 357 px inside a 303 px card. Not bisected: both files are unchanged since 13 October. The 375 px rule (it holds in v0, D-0080) is broken on one public task page. Open; product defect left failing on main's head (D-0074), for the Assay owner Give the card a base grid-cols-[minmax(0,1fr)] column, or the chip min-w-0, so the label truncates.
REL-673 Low The workspace loader's "Loading Drybench …" line fails colour contrast in Light: 4.1:1 where 4.5:1 is required. Found by CW-05b's second pass (25 October 2026): e2e/smoke/suite-theme.spec.ts:66 "light chosen at home follows every app and public page" failed once on phone under two workers (axe color-contrast, serious, at div[data-workspace-loader] > p, "Loading Drybench Cell…": foreground #6a767b on #f3f0e8, 12 px), and passed 24 of 24 with one worker on three projects: axe meets the loader only when it is still on screen. The colours are the loader's own text-fg-muted on the canvas (src/components/suite/feedback/workspace-loader.tsx:34), not a fade. Low-vision readers may not read the loading line on a slow load. Open; an accessibility item recorded for the pass, not fixed by loosening (D-0080) Give the line a token that meets 4.5:1 on the canvas; the spec's axe gate is the test.
SCI-250 Medium The example Study is marked Complete although its confirmation is only planned and 6 of 7 next steps are open. CW-10: src/components/suite/workspace/example-study.ts:125. Rendered "Study status: Complete" on the page and at the top of the Business PDF. Reads as finished research. Fixed on claude/codex-study-evidence-wording: only newly loaded examples start In progress. The completed reanalysis, planned confirmation, six open next steps, scientific records, marker and completed seed receipt remain unchanged. Actual stored state, reload, later user Complete choice and both PDF modes are verified; final CI/landing is tracked in docs/progress/study-evidence-repairs-2026-10-25.md. Keep existing user/older Study statuses unchanged; retain the distinct seed-receipt completion flag.
SCI-251 Medium The example's headline curve reports "a confidence bound is unresolved" where the R reference finds a finite interval. No test ties the captured endpoint to the reference. CW-11: src/apps/assay-analyser/workspace-adapter.ts:128-129; reference profile −7.721 to −7.408 log10 M, poorlyDetermined: false (pipeline/assay-analyser/fixtures/prism-erlotinib-hcc827.reference.json); the oracle test excuses refit-unresolved (src/lib/fit/fixtures.test.ts:166-170). An engine limit reads as a property of the data. Open Name it an engine limit, citing the reference interval and date. Add a test comparing the captured endpoint with the reference.
SCI-252 Medium Captured context mislabels the solvent field and drops units; lw also describes a numeric vial weight as a formula-weight basis. CW-12: content/apps/essential-context.ts:7 labels dmso "Solvent limit", although the field is "solvent in the stock (%)" (src/components/tools/lab-calculators/address.ts:126). fw, pur and dmso print without units (src/lib/workspace/study-context-presentation.ts:11). A preparation value is misread. Fixed on branch (25 October 2026), integrated acceptance pending CSO/CPO/CTO architecture 6745219af: content-owned Formula weight (g/mol), Weight from the vial (g/mol), Purity (%) and Solvent in stock (%) labels feed the recognised recipe context and full report exact rows. Literal captured values, zero and missingness remain; explicit nonempty unit declarations are shown separately and literally. No conversion, compactor/state-policy change, component-fraction relabelling, replay or snapshot rewrite. See docs/progress/method-context-metadata-2026-10-25.md
SCI-253 Medium "Not recorded" also covers values that were withheld and fields that do not apply. CW-13: the Business PDF lists Mass, Reagent and Formula as "Not recorded" on dilution plans, and "Example status: Not recorded" on the example's own plans; private labels are replaced by "Not recorded" (src/lib/workspace/essential-context.ts:31,36,64). States the record does not support. Open Distinct Withheld and Not applicable states; omit fields that do not apply to the operation.
MNT-212 Medium plasmid-workspace-chunk turned red. CW-07: 195.4 → 197.1 / 196 KB (my build of 0489ba5ec against the Fast 40078473414 artifact). pipeline-route-js and molecule-workspace-route grew to 165.0 / 165. A formerly green row is red; two rows sit on their ceiling. Fixed on main at 6a1439a23 by the CW-03/CW-04 storage branch's lever (the CTO's size ruling of 24 October 2026): snapshots.ts no longer loads the work store, and the row is 190.2 of 196 in Fast 40107207911's size artifact, with no Plasmid file edited. The coordinator's ruling of 24 October 2026, 14:22 UTC, had left CW-07 to the account resuming Stages B–D on 27 October; the start-view split stays optional headroom for that account Repair without raising the ceiling.
MNT-213 Medium The line committed 51.8 MiB in 314 evidence files, 12 images over 400 KB and raw CI logs. CW-08: largest PNG 824,852 B; 36 .gz files; docs/reviews/2026-10-22-ui-refinement alone is 179 files. Every checkout and deploy carries it; over the CTO's §8 caps (10 MB / 150 files). Pruned forward on main at ec3b8f938 (CW-08): 120 files and 9.65 MB remain in the three directories, each with an evidence.json manifest. The guard against new growth, scripts/check-committed-growth.mjs (D-0126), runs in the Fast chain's check-write-once job; on b877cae82..0489ba5ec it refuses 35 gzipped raw logs or archives, 13 images over 400 KB (decimal KB, as size-check's; 12 over 400 KiB), 314 files and 54.28 MB against the 150 and 10 MB, and 4 copied JSON summaries Prune forward with an evidence.json manifest; no history rewrite. Rule B3 (a later version names an unchanged earlier file by path and SHA-256 instead of re-copying it) is not built and the guard makes no allowance for re-copied publications (the CTO, 24 October 2026): whichever app re-publishes next builds B3 first, in its own branch (the resolver in content/apps/routes.ts, the docs block and the apps.test.ts file-exists check).
MNT-214 Low Two new on-demand export modules have no marker or budget row. CW-21: src/lib/workspace/prepared-study-export.ts and src/components/suite/workspace/study-pdf-export.ts carry no displayName. Growth there is invisible to size-check. Open Add markers and rows, or show they fold into a budgeted chunk.
MNT-215 Low Technical docs out of step. CW-23: docs/technical/storage-and-state.md:85 says format 5 is emitted (:444 says 6). build-test-and-ci.md omits the five new budget files. This register gained prose sections but no rows for the line's own defects. The docs mislead a team taking over. Partly addressed on main by PR #35: verified writer format 6, accepted formats 1–6, historical session minimum 5 and the actual 22-owner budget inventory are documented. No format/reader/budget behavior changed. The original wider issue-register coverage observation remains unreviewed/open. Finish the wider register-coverage review; MNT-214’s unmarked export-module coverage remains separate.
MNT-216 Low A Fast check job stalled in npm test for 15 minutes with no output, hit its 20-minute limit and was reported as cancelled, not failed. Run 40113356948, attempt 1, on claude/workflow-finish-guard 27b7f6ed0 (24 October 2026): the log stops at 17:00:32 mid-run and the job ends at 17:15. Attempt 2 on the same commit passed. The guard's own git-repository test passes 5/5 locally in 7–8 s. Another branch's check job hit the same limit that afternoon while still progressing (40110048647, in the size step). No cause found. A hung test costs a 20-minute run and reads as cancelled, so the hanging file is never named. Open Give npm test a per-file timeout so a hang fails with its file's name (for the CTO).
PRC-26 Medium Design and IA consultation is not shown before build. CW-15: every CDO/CPO memo of the line was first committed with the code it advises on. 5da828f98 changed shared shell files with no memo. The memos are Codex-run seat agents' and cite paths outside the repository. There is no CPO rendered acceptance. D-0109's before-build gate is unmet on the record. Open CDO rendered sign-off and CPO IA acceptance of the built screens (2026-10-24 workflow review memos).
PRC-27 Low Decision cross-references resolve to other decisions. CW-16: docs/board/decisions/README.md:127-129 and D-0120:5, D-0121:5, D-0122:14 cite D-0116–D-0118 (the Pipeline and Molecule decisions on main). docs/design/research-workspace-principles.md:228,239 link a file that does not exist. Readers follow the wrong decisions. Open Register erratum and corrected design-document citations; past bodies unchanged.
PRC-28 Low Design contracts contradict what ships. CW-17: research-workspace-principles.md:32,39,81,83,115-117,205 and instrument-design-system.md:35-36 still prescribe five tabs, an Objects library in Cards, Save to Bench and Send to inside More. The contract does not govern. Open Rewrite under CDO review.

24 October 2026: captured-input and export follow-ups

The intermediate 5b187d85e production build passed, but strict size comparison against exact main 0284eb6ea had three regressions: Home 225.7/225 KB, report document 44.0/40 KB and Menten 40.1/40 KB. No cap was raised. Pure unchanged reader/content/import leaves and direct overview preparation address these; final measured acceptance remains required.

Its canonical production QA found a real export defect: shipped published Assay v6 captures omit editable tableDecisions, so the new complete editable-reader check refused a valid result and PDF. Captures now validate scientific rows, units, layout/settings and mode records independently of editable bookkeeping, without rewriting old captures or weakening the editable reader. Version 1–8 malformed-row/unit cases and the actual shipped example capture-to-PDF path pass. The retained Batch-0 storage also generates both report audiences locally. Schema-classified rejected import diagnostics reuse the existing overview grouping by reason/disposition with exact totals; the full HTML/recovery retains individual issues. Critical scientific facts are not truncated. Edited dataset lineage stays explicit. The ZIP export helper now carries the original Study's lifetime guard through final download. Context grouping, preflight ordering and a long next-task label repair the intermediate layout findings. These checks are implementation evidence, not participant, buyer, retention or adoption evidence. The b784 production follow-up closes Home (218.3/225 KB) and Menten (38.9/40 KB), but exposes physical report-context duplication: family 80,421/40,000 bytes and overview 11.4/5 KB. The CTO directs restoration of the original notebook import identity as a bounded measured repair. Its 27 canonical production browser cases pass on desktop/375/dark; all 36 pages of the two browser PDFs were visually reviewed by the coordinator. The compact assignment disclosure is now implemented. The notebook restoration alone did not repair size: the 45648 production pin builds but reports 83.3/40 KB and overview 11.3/5 KB. Attribution identifies the HTML-only recovery owner loading shared PDF orchestration and complete HTML dispatching to nested overview. Those false owner edges are separated; the next measurement is still required.

The exact 56724671b owner repair reduces the report family to 51,729 bytes but still exceeds 40 KB; overview remains 11,309/5,000 bytes. The CTO authorised a measured provisional active-capture evidence owner, separating existing strict preparation from pure formatters without moving narrative or layout out of their caps. On base 633a47568 plus the recorded source digest, Build ID 3ECgl2UBmCddxleMfH0rw passes with report 22,030/40,000 and overview 4,991/5,000. The existing-budget comparison against exact main 0284eb6ea passes (27 inherited overruns/unmatched, none grown). New evidence preparation is 28,363 bytes across all availability contexts; the CTO approved its initial 32.7 KB family ceiling from measured × 1.15 rounded upward to 0.1 KB. No existing ceiling changes; this is not yet final exact-head release acceptance. Full potential action closures are retained, including increased HTML cost; transferred reader bytes are not presented as whole-action savings. Both retained-example document models and PDF bytes exactly match the pre-stage implementation. The two meaningful new evidence tests cover detached deep immutability/origin identity and delayed-method lifetime refusal. Final affected browser checks remain with the coordinator; no new external scientific or participant validation is claimed.

Final Fast 40051511335 passes 7,652 units but its Linux size artifact must not be called green from the earlier Mac comparison. The coordinator retrieved the product-tree-equivalent Linux main artifact (run 40039719888, artifact 12538219984): Calc A280 and product page stay within the inherited comparison, while Bioreactor is 137.8 → 138.4 KB, beyond the unchanged 0.5 KB tolerance. The CTO's bounded repair removes unrelated Bench/list copy from Bioreactor's existing static closure: two save consumers import the same nine save strings from one content leaf, with the original public copy object preserved. All copy values and component bodies match; guards, responsive chart and 11 px labels are unchanged. One measured build and a fresh official Linux comparison are required; no cap, marker, matcher or tolerance changes are authorised by this correction.

23 October 2026: workflow bundle boundaries

The scientist-workflow branch repairs the four recorded execution-command, Assay-summary, export-builder and Home size overruns. The full comparison also exposed report-family and populated-example action costs after removing eager imports; narrow unchanged reader/content boundaries bring those rows within their existing ceilings. Complete route, action and actual browser inventories are retained in docs/progress/scientist-workflow-size-2026-10-23/. This is provisional source progression, not main/release acceptance: the unchanged Michaelis–Menten island remains 40,091 gzip bytes before and after this batch, over its 40 KB ceiling, and must clear the final integrated strict check. No ceiling, scientific reader, engine or fixture was weakened.

23 October 2026: Study workflow follow-ups

Fixed on the dashboard review branch: selected existing work/results can join another Study without changing original scientific records; one checklist item drives the next task; materials open compatible app operations; result/paper citation actions populate the explicit conclusion draft. The CTO re-audit closes reproduced missing-state inclusion and private paper-pointer collision defects. Complete recovery dependencies and concurrent edits are checked before membership commits; unavailable private citation pointers restore as fresh identities. Its independent focused run passes 40/40. Frozen paper findings retain passages, limitations, source status and supporting report provenance separately from recorded results. The residual Bench archive checkbox is now below Continue working, matching Recent studies and All Studies. Final verification and branch-only acceptance limits are recorded in docs/progress/2026-10-22-ui-audit-refinement.md.

23 October 2026: Study card alignment

Fixed on the dashboard refinement branch. Missing objective and status rows made adjacent Study cards place counts and badges at different heights. Shared cover/body grid tracks preserve wrapping titles, small cards reserve one objective line, and badges/app marks sit with the footer at the bottom. The existing desktop height target is retained; stacked phone cards size to their content. Include archived now appears below the cards on Bench and All Studies. Evidence is under docs/reviews/2026-10-22-ui-refinement/study-card-alignment/; this is branch verification, not main/production acceptance.

23 October 2026: Library item popup text overlap

Fixed on the dashboard refinement branch. Library's descendant button selector forced multiline menu actions to the compact row-control height, causing Send to descriptions and browser-local qualifications to overlap. The selector now targets only direct row controls, and the shared Menu panel sets its own left alignment and normal whitespace. Its bottom padding is removed so scrolled text cannot peek out below the pinned Close row. Natural menu row heights, existing copy and qualifications, coarse-pointer minimum targets and the pinned Close row remain. The regression covers desktop and 375 px in both themes; evidence is under docs/reviews/2026-10-22-ui-refinement/item-popup/.

The Bench heading mismatch is also corrected: Continue working and Recent activity share the existing section-header treatment outside their bodies. Activity's Bench rows are compact without reducing text or hiding qualifications; full Activity view is unchanged. Both obsolete helper lines are removed. Measurements and captures are under the same review's bench-density/ folder.

23 October 2026: Bench workflow simplification

Resolved in the dashboard refinement branch: app backing-state cards appearing alongside the same scientific subject; browser-history addresses presented as saved work; duplicate Study content across sections; routine Save and Record result choices; and raw private result IDs on the conclusion face. The current example uses current app schemas and a new run marker. Scientific snapshot history and scope guards remain. Final acceptance evidence is recorded in docs/progress/2026-10-22-ui-audit-refinement.md; branch changes are not a claim of main/production acceptance.

A consolidated register of open defects, risks and gaps for technical due diligence, gathered from the project's own records and checked against the code at 17e455b on 10 October 2026. Rows SCI-14 to SCI-16, REL-11, MNT-10 and MNT-11 and the SCI-02 recheck were added on 11 October 2026 from the merged Wave 1 continuation and Wave 3 work (c01e56f). Rows SCI-17 to SCI-19, DAT-11 to DAT-14, REL-12, REL-13, MNT-12 and MNT-13 were added on 11 October 2026 from Wave 4, the discovery line (docs/progress/wave4-discovery.md; the CSO's, CPO's and CTO's merge reviews of 11 October in docs/board/memos/), checked against the code on main at 73540ee. Rows REL-16 and REL-17 were added on 11 October 2026 from the UI design review (docs/reviews/2026-10-11-ui-design-review/README.md) of 76e9f76. Rows SCI-35, SCI-37, REL-33 and MNT-17 were added on 12 October 2026 with the oracle environment (pipeline/oracle-env/). Rows REL-29, REL-32, REL-34 and REL-35 were added on 12 October 2026 from the lost-work fix (D-0068 rule 8), checked against the code on main at 851fa23 and the branch claude/lost-work-draft. Row REL-41 was added on 13 October 2026 from the REL-32 work on claude/lost-work-rel32. Each row names its evidence; rows taken from a record without a fresh check say so in their status. On 21 October 2026 eleven ids that parallel branches had taken twice were renumbered, the row that reached main first keeping its number (rows moved: REL-310 → REL-455 (the mutagenesis budgets) and REL-456 (reference.py's about()); REL-311 → REL-457 (the planned-analysis time zone) and REL-458 (the mutagenesis hand-off); REL-312 → REL-459 (the workbench CSV); REL-378 → REL-480, REL-379 → REL-481, REL-380 → REL-482 and REL-381 → REL-483 (the 20 October audit's landing, Verified and J3 rows); SCI-180 → SCI-226 and SCI-181 → SCI-227 (library 2's origin entry and its GenBank /note)); dated memos and decisions keep the old ids. REL-378 also once named the aligner's listing bound, now REL-385. Each id is used once (content/technical-docs.test.ts).

How to read this register

Issues are grouped by kind, in this order: security, scientific correctness, data and licensing, reliability, maintainability, and process and governance. Within each table rows are sorted by severity:

Severity Meaning
High Can expose a credential or user data, put a wrong or unsupported number in front of a user, block a transfer or sale, or break CI or a product feature on a known date
Medium Weakens a defence or a stated policy, or leaves a correctness or provenance gap that is labelled or bounded
Low Documentation drift, hygiene, or a narrow edge case

Status values:

  • Confirmed, open: checked in the code for this page and still present.
  • Open (recorded): listed as open in the named record; the code was spot-checked where stated, otherwise not rechecked.
  • Partly addressed: some of the recorded problem has been fixed since the record was written; the remainder is described.
  • Held for the General Counsel: a legal question recorded under D-0010. This page records the facts and does not conclude it.
  • Accepted for now: the CEO accepted the risk on the date given.
  • Unverified: carried from a record and not reproduced here.
  • Fixed: found and fixed on the date given; the row stays so the change can be traced.

Sources gathered: docs/NEXT.md, docs/HANDOVER.md, docs/board/open-questions.md, the scientific audits in docs/science/ (open findings only), the UI/UX audit in docs/reviews/2026-10-10-ux-audit/README.md, eleven reviewer reports (each checked in the code; see Reviewer reports checked), and a search of the code for TODO, FIXME, XXX and HACK comments. That search found none in src/, content/, scripts/, pipeline/ or e2e/; the only matches for "todo" are the Study next-steps feature (StudyTodo). No code was changed for this page.

Dates that will break something

Date (UTC) What happens Evidence
1 November 2026, 05:17 First monthly run of snapshots.yml after hand-over. It opens a pull request from snapshots/refresh; nothing merges itself .github/workflows/snapshots.yml
20 November 2026, about 23:00 npm run snapshot-staleness fails: the weekly staleness job goes red, because the complete response letter reference page's pinned capture (content/seo/data/rheumatoid-arthritis-2026-10-05.json, retrieved 5 October) is within 14 days of its 60-day expiry SNAPSHOT_WARN_DAYS = 14 in src/components/tools/drug-pipeline-explorer/snapshot.ts; scripts/snapshot-staleness.mjs lists the reference captures with the presets
1 December 2026, about 15:50 scripts/snapshot-freshness.mjs starts printing a warning in the CI check job (45 days) WARN_DAYS = 45 in scripts/snapshot-freshness.mjs; the seven preset snapshots and index.json carry retrievedAt 2026-10-17T15:49:45.862Z (regenerated under wording rule 3, REL-221)
2 December 2026, about 15:50 npm run snapshot-staleness also flags the preset snapshots (within 14 days of the 60-day expiry) SNAPSHOT_WARN_DAYS = 14; scripts/snapshot-staleness.mjs
3 December 2026, about 15:50 npm test fails on every branch and pull request, and therefore CI and the snapshot workflow's own test step, because an example snapshot is more than 46 days old src/components/tools/drug-pipeline-explorer/precedent/snapshot-age.test.ts lines 40 to 46
4 December 2026, 22:58 The complete response letter reference page's pinned capture expires (60 days): the page then shows its "expired" message and no products SNAPSHOT_MAX_AGE_DAYS = 60, snapshotIsStale; content/seo/data/rheumatoid-arthritis-2026-10-05.json carries retrievedAt 2026-10-05T22:58:18.637Z; a refresh is a new dated file in content/seo/data/
16 December 2026, 15:49 The Pipeline app stops showing the example snapshots (60 days): the landing examples and the Pipeline welcome show nothing offline. snapshot-freshness.mjs fails the CI check job SNAPSHOT_MAX_AGE_DAYS = 60, snapshotIsStale; all seven snapshots and index.json carry retrievedAt 2026-10-17T15:49:45.862Z
21 December 2026 npm test fails because the FDA precedent snapshots are more than 76 days old (90 less 14) snapshotDueForRefresh in src/components/tools/drug-pipeline-explorer/precedent/snapshot-age.ts; all five precedent files carry retrievedOn 2026-10-05
3 January 2027 The FDA precedent snapshots become stale. The view keeps showing them and says so PRECEDENT_MAX_AGE_DAYS = 90; snapshotExpires("2026-10-05") is 2027-01-03T00:00Z
30 days after Cellosaurus publishes release 57 The weekly cellosaurus-release job in scheduled.yml fails (a warning annotation before that) until the snapshot is refreshed by snapshots.yml's cellosaurus job and merged NEWER_FAIL_DAYS = 30 in pipeline/cellosaurus/fetch-release.py; the served snapshot is release 56.0
14 February 2027, about 18:30 npm run snapshot-staleness prints a warning for the Cellosaurus snapshot (120 days after its retrieval) CELL_LINE_WARN_DAYS in scripts/snapshot-staleness.mjs; retrievedAt 2026-10-17T18:27:34Z in src/lib/cells/snapshot-manifest.ts
15 April 2027, about 18:30 npm run snapshot-staleness fails: the weekly staleness job goes red (180 days); CI prints a warning CELL_LINE_FAIL_DAYS in the same script
27 September 2027 npm run check-licences -- --release starts failing for sources whose licence page was read on 27 September 2026 (UniProt in Protein, Cell and Sequence); under npm test the twelve months run from each app's updated date instead, so npm test is unaffected Earliest licenceReadOn in the registry's sourceMeta; Build, test and CI

A refresh of the preset snapshots merged and deployed before 1 December 2026 resets their rows, and a new dated reference capture resets the reference page's two rows; a refresh also needs a new dated examples fixture (build_examples.py examples-<date>.json). The procedure is in Data pipeline.

Security

Id Severity Description Evidence Impact Status Suggested fix
SEC-01 High The Europe PMC branch of the single-provider literature search sends the OpenAlex API key as Authorization: Bearer ${OPENALEX_API_KEY} to www.ebi.ac.uk src/app/api/literature/route.ts:53-56; the URL is built by searchUrl in src/lib/literature/europe-pmc.ts:78. The other OpenAlex call sites add the header only for OpenAlex (src/lib/literature/sources.ts:38, src/lib/literature/search/providers.ts:120) Whenever the key is set, every keyword search through /api/literature (called by src/components/suite/literature/client.ts:10) discloses the paid key to a third party, which may log it Fixed 17 October 2026: header removed on Europe PMC call, verified by route unit test Add the header only on the OpenAlex branch, as the other call sites do. Rotate the key on any deployment where it has been set
SEC-02 Medium Typed text is sent to PubChem while the user types, with no consent step, while the network layer declares PubChem as a service needing consent for every lookup usePubchemSuggestions (src/lib/search/use-pubchem-suggestions.ts:12,19) sends 3 to 120 typed characters, debounced 250 ms, to /api/search/compounds, which forwards them to PubChem autocomplete (src/app/api/search/compounds/route.ts:5-14). Callers: the command palette (src/components/suite/objects/palette.ts:99), literature search (src/components/suite/literature/literature-search.tsx:104), Calc's reagent picker (src/components/tools/lab-calculators/panels/reagent-picker.tsx:57) and Molecule's query bar (src/apps/molecule-workbench/views/query-bar.tsx:73). DEFAULT_SERVICES.pubchem has consent: "always" (src/components/suite/net/limiter.ts:57); Molecule's and Calc's registry endpoints say consent: "none" (content/apps/molecule-workbench.ts:158, content/apps/lab-calculators.ts:156). No non-test code calls fetchWithTimeout with the pubchem service, so the "always" setting is never exercised Text a person types into the suite-wide palette (for example an internal compound code) leaves the browser for a third party without a choice. The response is cacheable (Cache-Control: public, max-age=3600, s-maxage=86400) and the text is in the request URL, so it can sit in CDN caches and request logs. The two configurations contradict each other Partly fixed on claude/codex-issue-repairs (25 October 2026): the shared hook no longer sends typed drafts; autocomplete responses and upstream fetches are private/no-store. All four consumers keep local suggestions. Direct explicit lookups still need the existing consent gate and registry/limiter/privacy alignment; that remainder stays open (CTO/CPO repair memos of 25 October). Decide the consent rule for suggestions (CPO and CSO) and make the limiter, the registry and the privacy host table agree. Consider local-only suggestions until a person asks for remote ones, and Cache-Control: private, no-store
SEC-03 Medium /literature is served with the object pages' CSP, but the client-side navigation guard classifies it as a public page OBJECT_ROUTE_SOURCES includes /literature (content/apps/routes.ts:160); documentPolicyBoundary returns "public" for it (src/components/suite/navigation/document-policy.ts:8-15). document-policy.test.ts has no /literature case A soft navigation from a public page (no CSP) to /literature runs the literature workspace in a document with no CSP; leaving /literature for a public page keeps the object policy. Moves between /o and /literature, which share a policy, force a full reload Fixed in existing code; reconciled 25 October 2026 on claude/codex-issue-repairs: the literature segment already belongs to the objects boundary. Added both-direction regressions for /literature and /literature/app; corrected the technical page. Return "objects" for /literature (or give it its own boundary that matches its header rule) and add both directions to the boundary tests
SEC-04 Medium The account page /workspace has no CSP or other security headers No rule in suiteHeaders (content/apps/next-config.ts:92-104) or content/csp.ts matches /workspace; frame-ancestors appears only in content/csp.ts:80 and src/lib/technical-docs/headers.ts:28, and nothing sets X-Frame-Options In account mode the page that handles sign-in, backups and the Stripe checkout and portal buttons can be framed by another site and runs without a script or connect policy Fixed on claude/codex-issue-repairs (25 October 2026): a dedicated account CSP and standard security headers cover /workspace/:path*; connections are self-only, workers refused and framing forbidden. A separate account document boundary forces navigation between differing policies. Static Next bootstrap retains inline scripts. Add a header rule for /workspace with a self-only policy and frame-ancestors 'none', and a test in content/csp.test.ts
SEC-05 Medium Literature POST routes accept a request that carries no Origin header /api/literature (src/app/api/literature/route.ts:16-17), /api/literature/search (src/app/api/literature/search/route.ts:10-11), and /api/literature/discover and /api/literature/fulltext through requestBody (src/lib/literature/sources.ts:83-86) reject only a mismatched origin. The AI routes require an exact match (extractionOrigin, src/lib/literature/extraction-access.ts:6-10), as do the account routes (sameOriginRequest; src/lib/workspace/billing-policy.test.ts:53) Any non-browser client can use these routes as an open proxy to Europe PMC and OpenAlex, spending the deployment's shared OpenAlex allowance and, with SEC-01, its key. Browsers send Origin on cross-site POSTs, so cross-site browser requests are still refused Partly fixed on claude/codex-issue-repairs (25 October 2026): all four literature POST paths require a present exact Origin before body/provider work, preserving bounded loopback development. Origin is forgeable by non-browser clients; deployment-level per-client/provider abuse controls remain open. Require Origin (or Sec-Fetch-Site: same-origin) as the AI routes do, and add a per-client rate limit at the host
SEC-06 Low The technical documentation used one shared Basic-auth credential and the application did not limit password guesses src/lib/technical-docs/access.ts and src/proxy.ts as of 17e455b Everyone shared one identity with no per-person revocation or record of access; online guessing was limited only by password length. The same Markdown was readable by anyone with repository access Fixed 13 October 2026 by D-0081: the credential check and its variables are removed and /technical opens to any request; it stays unlinked, out of the sitemap and noindex (the overview) None. Protecting the area again would be a new decision; D-0052 recorded the options
SEC-07 Low The Stripe webhook does not check WORKSPACE_ACCESS_MODE src/app/api/workspace/billing/webhook/route.ts:8-16 checks only the Stripe key, webhook secret and signature; billingAdminClient (src/lib/workspace/server.ts:24-28) does not check accountsEnabled, unlike accountClient (server.ts:12) In browser mode, a deployment that has Stripe and Supabase service credentials set still writes subscription records on signed events, contrary to "credentials alone do not activate account mode" (docs/workspace-setup.md). An attacker needs a valid Stripe signature, so the exposure is low Fixed on claude/codex-issue-repairs (25 October 2026): browser mode returns private/no-store 503 before Stripe construction, signature verification or reconciliation. Account-mode signature/event handling remains. Route regression checks use configured credentials and assert zero provider/writer calls. Decide whether reconciliation while accounts are off is intended (it would keep entitlements current through a mode switch); if not, answer 503 unless accountsEnabled
SEC-08 Low /api/search/compound returns any caught exception's message with status 422 src/app/api/search/compound/route.ts:22-24. The intended messages come from pubchemCalculatorPayload (src/lib/search/compound-payload.ts:22,24,28), but the same catch receives network, timeout and JSON errors Runtime error text reaches the client, and an upstream outage is reported as an unprocessable request rather than 503, so the client cannot tell the two apart Fixed on claude/codex-issue-repairs (25 October 2026): owned typed payload refusals retain their actionable content-owned 422 messages; unknown fetch, JSON and runtime exceptions return a fixed 503 without their diagnostic message. Input 400, missing compound 404 and valid local/remote payloads are preserved. Throw a typed error for the three payload refusals and map it to 422 with copy from content/; answer everything else with a fixed 503, as /api/search/compounds does
SEC-09 Low The AlphaFold DB endpoint still widens img-src for a PAE image that no code renders cspAlso: ["img-src"] at content/apps/protein-explorer.ts:192; audit M9 (copy fixed, rendering parked) A CSP allowance with no use Fixed on claude/codex-issue-repairs (25 October 2026): removed the unused AlphaFold image permission from the registry; API connections remain declared. Protein and inherited object policies have regression coverage. Remove the allowance and its test until the image is rendered, or render it

Scientific correctness

The docs/science/2026-10-11-scientific-audit.md rechecked main 38b6148b with three specialist subagents and independent adversarial probes. Its findings below are open; an audit is not a fix or external scientific sign-off. Detailed source lines, reachability and primary references are in that report and its archived specialist reports.

The 10 October 2026 audit found the engines it re-derived correct against independent oracles and placed its defects at the display, recording and provenance layers. Its Critical items C1 to C5 and Material items M3 to M10 are fixed or diagnosed in this tree (the fix commits 7f0699a, 2a52165, c3a06ee, e001f08, 9a91cb9, 14cd997 and 8194f0d are ancestors of 17e455b). The table lists what remains. Method detail is in Science overview and Oracles and verification.

Id Severity Description Evidence Impact Status Suggested fix
SCI-01 High No named human scientific reviewer, and no validation with practising scientists Q-19 in docs/board/open-questions.md; docs/NEXT.md ("Stage 0 scientific review and real-scientist validation"); docs/reviews/2026-10-08-simulated-users/README.md (six of 24 fictional profiles run) All nine apps are in preview. Correctness rests on automated oracle comparisons and AI-assisted audits, which docs/science/2026-10-10-scientific-audit-of-the-7-to-10-october-changes.md states are not certification by an external specialist Open (recorded) Appoint the reviewer and the independent fixture sign-off Q-19 describes before any app leaves preview
SCI-02 Medium Methods shipped without a published independent fixture, methods entry or decision record (audit M1) Audit M1. Rechecked here: Sequence 0.4.0 now publishes pcr-product.json and fragment-search.json in its manifest. On the Wave 1b/3 branch, Calc publishes master mix and intermediate dilution under 0.2.0 and ten Wave 3 fixtures under 0.3.0, and Assay publishes both calibration fixtures and the Wave 1 sets under 0.2.0 and 0.4.0. Still open: relative-irls-reference.json sits in public/verification/assay-analyser/0.2.0/ but not in its manifest.json; qPCR, A260, the 2 µL rule and Calc's OD600 paired calibration have no published fixture. Literature tools, canonical search catalogues, the fourteen Education tools and Molecule descriptions have no decision record Breaks roadmap rule 1 ("Every new method ships with an independent reference fixture and a methods entry, or it does not ship"); a reader cannot check these methods from published files Partly addressed Generate and hash the missing fixtures from external oracles, register them in verificationSets, and record or park the features
SCI-03 Medium Owczarzy 2004 and 2008 read in abstract only; constants and Mg²⁺ ranges rest on the same authors' patent and the Biopython oracle; the 2008 ranges and Ka carry "Unverified" Q-24; the CSO's rulings docs/board/memos/2026-10-10-cso-tm-condition-ranges.md and docs/board/memos/2026-10-20-cso-tm-salt-sources-read.md; docs/science/evidence/sequence-stage-literature-2026-10-14/ (santalucia-1998, owczarzy-2004, owczarzy-2008); src/lib/seq/tm.ts, content/apps/sequence-toolkit/tm.ts Condition limits shown to users may be wrong at the edges; D-0043 permits the label in preview only. Until the CSO's 20 October rulings are applied, the shipped copy still cites equation 7 (it is equation 8) and unread equation numbers, and says the 2004 equation covers typical PCR buffers, the opposite of its source Open (narrowed) SantaLucia 1998 read in full on 14 October 2026. Apply the CSO's R2 to R9 and R11 (the SCI-09 builder); a person fetches Owczarzy 2004 and 2008 so a reader can clear or revise "Unverified"
SCI-04 Medium Plasmid and the task-page Tm do not show the Tm condition limit line added for M4; live primer design also drops the engine’s extrapolation notes from candidates and receipts (11 October MOL-6) Audit section 8, M4 row The same Tm engine is presented with its extrapolation warning in one place and without it in others Fixed across live, saved and exported surfaces, 11 October 2026 Add the limit line to the Plasmid and task-page Tm surfaces
SCI-05 Medium The rescued E. coli Bioreactor golden fails intermittently at a located DO-setpoint crossing Audit M8; Q-23; docs/reviews/2026-10-07-workflow-reliability/science-performance.md A golden check that can fail on a correct run cannot gate a release Fixed located-rescue event classification; original goldens and tolerances unchanged; 11 October 2026 See dated fix report and negative controls; independent human scientific review remains SCI-01
SCI-14 Medium The R cross-checks named by the CSO for the Wave 1 continuation (confint for the Michaelis–Menten profile intervals, nls(SSfpl) for thermal shift, nls for the inhibition global fit) were not run: R was not installed in the build container about.crossCheck in pipeline/assay-analyser/oracles/fixtures/{michaelis-menten-profile,thermal-shift,inhibition-global}.json; docs/progress/wave1b-assay.md, "Rules held" and "Open questions" These three methods are "verified" against one oracle (SciPy) only; a shared modelling assumption between engine and SciPy script would go unnoticed Open (recorded); flagged for the CSO Run the cross-checks where R 4.4 is available and record them beside the fixtures (new files; write-once)
SCI-15 Medium Serial dilution 1.0.0 made the last tube to R·W, so the last point was C/(f − 1) of the tube before instead of C/f; 2.0.0 corrects it, but saved serial recipes pinning dilution 1.0.0 are not marked when opened src/lib/dilution/serial.ts header; the registry limit in content/apps/lab-calculators.ts ("any plan printed from 1.0.0 is affected"); docs/NEXT.md, Wave 3 open items A plan printed or exported under 1.0.0 under-dilutes its last point; reopening recomputes under 2.0.0 without saying the numbers changed Fixed with read-time notices and downstream qualifications, 11 October 2026 Show a notice when a recipe's pinned dilution version is below 2.0.0
SCI-06 Low Van 't Riet's non-coalescing kLa coefficients are unverified until the 1979 paper is read VAN_T_RIET["non-coalescing"].read is false at src/lib/hosts/transfer.ts:168; the range text says it was compared with an OCR scan (transfer.ts:20-23) Labelled "Unverified" in the app under D-0025 Open (recorded). The label reaches every output the non-coalescing coefficients move: since 11 October 2026 (BIO-02, SCI-34) setup 2.1.0 attaches unverified:van-t-riet (rule non-coalescing-source@1) over every affected run interval, so it shows on the screen flags, the rescue text, recorded qualifications, provenance, the reports and exports (src/lib/hosts/setup.ts:174-214; setup.test.ts, qualification-capture.test.ts). The paper is still unread, so the coefficients stay Unverified; Van 't Riet's range, compared with an OCR scan only, is a separate gap (Stage H BR3.7; the CSO's memo of 24 October 2026, ruling 4) Read and archive Van 't Riet 1979 (roadmap Wave 5; the CFO costs access, held for the General Counsel); if it cannot be obtained, the coefficients stay Unverified to the pre-live pass, then are replaced or removed (D-0025)
SCI-07 Low Assay minor findings Audit section 4, "Assay": a sample exactly at the zero-standard response is not interpolated (spot-checked: strict inequality and value >= 0 in src/lib/fit/calibration.ts:22,26); generic 4PL calibration refusals; noisy flat data reported as a solver failure; Monte Carlo p depends on row order; wide-table header ambiguity; df = 1 calibrations accepted without qualification; old wording in four-pl.ts and rules.ts headers; results CSV lacks weighting and fit-version columns Edge cases and unclear refusals; no wrong headline value was reported Open (recorded) Work the audit's list in order of user exposure
SCI-08 Low Calc minor findings Audit section 4, "Calc": float noise in CSV under a "full precision" claim; the intermediate panel scales with * 1e6 instead of scaleByPow10 (spot-checked: src/components/tools/lab-calculators/panels/intermediate-panel.tsx:23,26); wrong remedy for a weak stock; 1e-400 mM pasted as 0; the default "EDTA" row is the disodium dihydrate at 372.238 g/mol Display precision and copy issues; reloaded values such as 7.700000000000001 µL Open (recorded) As the audit recommends
SCI-09 Low Sequence and Plasmid minor findings Audit section 4: Tm and structure engines disagree on buffer admissibility; /translation header claims equivalence with Biopython for partial CDSs without a fixture; a label-only CDS edit drops the source gene feature from export; PCR GenBank writer skips sanitising; tail length 400 against the engine's 200; the 3.1 MB UniProt index downloads on every Sequence visit Mostly export fidelity and copy Partly fixed 12 October 2026 on claude/sequence-wave6-debt, each with a unit test: the label-only CDS edit keeps its gene (genbankFeatures, genbank-export.test.ts); the PCR GenBank writer applies Plasmid's asciiNote (pcr-product.test.ts); one tail limit, PCR_LIMITS.tail (200) from src/lib/seq/pcr-limits.ts, in both panels' tail fields, the design search and the primer-set reader, the address keeping its 400-character link guard so a longer tail reaches the engine's named refusal (sequence.test.ts). Still open: the buffer admissibility disagreement, the /translation partial-CDS claim, the 3.1 MB index on every visit As the audit recommends for the open three
SCI-10 Low Bioreactor, Molecule, Protein, Literature and Education minor findings Audit section 4: reference.py docstrings and transfer.json still describe model 1; SciPy pin moved without note; AlphaMissense "19 possible substitutions" copy (fixed in Wave 4: the mean now shows its n); isoform qualifiers dropped; one-word quotes accepted by the literature quote-support check; brand names map to the ChEMBL parent; AUTH_LAST mapping unverified (present at src/lib/literature/search/query-parser.ts:22); Education: 1LBG described as containing the inducer (still at content/education.ts:135), and other wording Wording and provenance; the literature quote check overstates its guarantee Open (recorded) As the audit recommends
SCI-11 Low Molecule does not show the approved-drug population band for the Lipinski counts Audit section 8, C2 row ("needs a library rebuild and is not shown") A comparison context is missing, not wrong Open (recorded) Rebuild the library with the counts
SCI-12 Low ATP Synthase and DNA Replication Education tools do not meet the design's own entry rule (audit M11) Audit M11; content/education.ts Teaching scope only Set aside by the CEO on 10 October 2026 (docs/NEXT.md) Re-point or cut, as the audit proposes
SCI-16 Low Wave 1 continuation decisions awaiting the CSO and CPO docs/progress/wave1b-assay.md, "Open questions": four builder's rules for thermal shift (k box, valley condition, "failed" at the iteration cap, a contradicted direction refused); "poorly determined" applied to Km only; the kcat interval shown (the CPO's memo said none); the initial-rate CSV still exports the RSS of a bound or failed fit (src/components/tools/assay-analyser/kinetics-export.ts:47); no Ki interval; one melt per condition with no replicate summary; the fixtures were run under Python 3.11.17 against a 3.11.15 pin Labelled and bounded; no wrong headline value reported Open (recorded) Rule on each and record the outcome
SCI-13 Low Declared limits of scope docs/science/2026-10-scientific-audit-implementation.md, "Remaining work and launch policy": the corrected scope "does not justify quantitative Bioreactor forecasts, calibrated weighted assay inference or clinical variant interpretation" A risk of over-claiming if copy or sales material strengthens these Standing limitation Keep the refusals and qualifications the record lists; do not strengthen claims because tests pass
SCI-17 Medium No practising scientist reviewed Wave 4 as a whole; Stage F replaces live pLDDT and predicted canonical focus with bounded exact correspondence, while AlphaMissense and whole-Wave review remain held CSO Wave 4 merge review, "Risks"; docs/progress/wave4-discovery.md step 9; docs/NEXT.md (Wave 4 section) The aligner and the substitution check rest on automated oracles (Biopython 1.88, Python RDKit, the AlphaMissense files) and one EMBOSS Needle cross-check Partly addressed by landed Stage F F-1b; F-2, held AlphaMissense and whole-Wave review remain Include Wave 4 in Q-19; retain held AlphaMissense scope and independent scientific review limits
SCI-18 Low DEF-W4-4: the aligner counts an X against X column as identical but not similar (BLOSUM62 X/X is −1), and the summary does not say so src/lib/protein/align/report.ts (report, identities by letter equality, similar by pairScore > 0) Identity and similarity can be inconsistent for sequences with X Confirmed, open (CSO, low) State the convention beside the result, or count X–X as neither
SCI-19 Low Aligner verification edges: the largest fixtured co-optimal set is 8 alignments; the oracle checks U/O before the cell limit while prepare checks the cells first, and no fixture covers both CTO Wave 4 merge review, "Risks"; src/lib/protein/align/policy.ts; pipeline/protein-explorer/align_reference.py Thin evidence for the co-optimal set D2 will depend on Confirmed, open Add a tie-dense set and a combined-refusal case as new write-once fixtures
SCI-126 Low Every app's docs page said "None has been published yet" in its verification section, beside the published sets five apps list there docsCommon.verificationGate in content/apps/suite.ts; the CSO's ruling of 14 October 2026 (risks), before the methods and checks dialog linked to those sections A reader could take the published fixtures for absent Fixed: the gate sentence no longer says it; the generated verification block says "No verification set has been published for this app yet." only for an app with no set and no reference package (docs-blocks.marketing.tsx)
SCI-127 Low The plate preparation sheet’s control explanation made a blanket claim that the analysis app does not subtract blanks content/apps/lab-calculators.plate-sheet.ts, controlsMeaning; CSO memo docs/board/memos/2026-10-16-cso-print-and-recorded-methods.md The preparation plan could misstate the measured-readout analysis and imply fixed response roles for its controls Fixed 16 October 2026 on claude/feature-02-printable-bench-sheet: copy says the preparation plan assigns neither response endpoints nor background subtraction; analysis selects control roles and any subtraction method None
SCI-128 Low qPCR explained every calibrator-containing group as having zero difference, although calibrators can span conditions qpcr/quantity.ts, qpcr/interval.ts; CSO qPCR-result-reading amendment, 16 October 2026 Correct stored group values could receive a false explanation Fixed on claude/feature-04-qpcr-interpretation: shared panel/report reason states declared calibrator membership; calculations and reason keys unchanged; split-condition regression None
SCI-171 Low Calc's cell seeding has no "Cell line" field yet: the CPO's ruling 7 gives it one (a label only, through the @Object picker's cell-line target), but Calc's files are queued behind rebuild 1, the Calc start, REL-211 and E11 (the CPO's Calc queue, ruling 10) E10's record, docs/progress/enterprise-actions/cell-line.md; content/apps/object-picker.ts (the target exists) A seeding plan does not name its line Open; queued When the Calc queue reaches it: an ObjectPickerPill target="cell-line" beside the seeding inputs, kept as a workspace binding as Assay's plates do
SCI-172 Low Bioreactor's runs have no cell line (host context): F5 names it, but no session in this run edits a Bioreactor file (the CTO's ruling 5; the CEO's exclusion) The CTO's memo of 17 October 2026, ruling 5 A run does not name its host line Open; waits for Bioreactor's owner The same picker target and binding, by Bioreactor's owner
SCI-220 High The .ab1 reader refuses real instrument files: checkAbif requires the directory entry's data size to be exactly 28 × the entry count, and real files allocate more src/lib/seq/reads/abif.ts:104. Biopython 1.88's Tests/Abi/3730.ab1, 3100.ab1 and 310.ab1 (tag biopython-188, read 20 October 2026, not committed) give data sizes 3,584, 4,032 and 3,584 against 28 × count 3,444, 3,640 and 3,164, and are refused as bad-directory. With that one comparison relaxed to at least 28 × count in a throwaway copy, all three read, with bases and values equal to Biopython's and the base caller as the CSO's ruling 4 expects. The literature reading of the ABIF specification reported the same strictness, with user-defined element types and a missing major-version check No real trace file can be read; the synthetic fixtures all write exact sizes, so the tests pass Fixed on claude/sequence-readers (20 October 2026), not yet on main: the CTO's bounds (ruling 1 of 20 October 2026) are built as worded, with the CTO's fixtures; the three public files read, bases and values equal to Biopython's, and under Q43 as amended again 3730.ab1 and 3100.ab1 read as quality scores and 310.ab1 names another base caller. Closes when the readers branch merges Accept a data size of at least 28 × count (and decide on user-defined element types and the major version) under the CSO's and CTO's ruling, with fixture cases written the way instruments write them
SCI-209 Medium Plasmid's annotation methods entry and source credit cite Gotoh 1982 ("Smith and Waterman 1981; Gotoh 1982") and write the gap cost as "gap open -5, gap extend -2", but Gotoh 1982 has not been read: on 14 October 2026 the publisher refused every route (captcha, openaccess 0). The CSO's rule is that no citation is shown before its source is read, and that no gap cost is written as "open 5" or "−5" beside a source that uses v + uk src/lib/seq/methods-plasmid.ts:112; content/tools/plasmid-map.ts:75-79; docs/science/evidence/sequence-stage-literature-2026-10-14/gotoh-1982.md; the CSO's ruling of 20 October 2026, docs/board/memos/2026-10-20-cso-aligner-sources-read.md, ruling 6 A methods entry cites a paper no one on the project has read, and states the gap cost in a form that may not match it Open; for Plasmid's owner (Stage C) Drop "gap open -5, gap extend -2," and keep the formula already in the entry; remove Gotoh 1982 from the shown citation, the source name and the credit until it is read; check Smith and Waterman 1981 under the same rule. src/lib/seq/features/align.ts stays byte-identical (D-0108)
SCI-210 Medium Protein's methods sheet says the pairwise aligner uses "Gotoh's affine-gap dynamic programming" with no reading of Gotoh 1982 behind it (the paper was not obtainable on 14 October 2026) content/apps/protein-explorer.methods-sheet.ts:59; the CSO's ruling of 20 October 2026, docs/board/memos/2026-10-20-cso-aligner-sources-read.md, ruling 6 A methods entry names a paper's algorithm without the paper having been read Open; for Protein's owner Reword without the attribution, with Protein's owner, as Sequence's aligner entry does under route (c): "a three-state affine-gap programme, as Biopython 1.88's PairwiseAligner; attribution to Gotoh 1982 not checked against the paper"

Findings confirmed on 11 October 2026

The confirmed code defects below were repaired on 11 October 2026; see docs/science/2026-10-11-scientific-audit-fixes.md. P2 in the original audit maps to Medium here. Import-only and worked-example-only exposure is intentional in the descriptions. Existing SCI-04, SCI-05 and SCI-15 are not counted again; SCI-15 additionally affects old-result viewing and Assay handoff, which need the same known-method-defect notice.

Id Severity Description Evidence Impact Status Suggested fix
SCI-20 Medium Z′ quick-tool silently drops invalid controls, including instrument saturation markers docs/science/2026-10-11-scientific-audit.md, ASSAY-01; source parser reproduction: 100,100,OVER vs 0,0 yields Z′=1 Ordinary paste can imply perfect control quality after an observation disappears Fixed; focused regression checks, 11 October 2026 Report located parse issues and withhold until corrected or deliberately excluded
SCI-21 Medium Assay readings/rates exports bypass current-result checks for derived columns docs/science/2026-10-11-scientific-audit.md, ASSAY-02; inconsistent imported session exports rate1000, fitted1.1111, residual≈0 Stale fits/corrections can escape through nominally raw exports; normal panel edits clear results Fixed; focused regression checks, 11 October 2026 Validate all derived columns; keep raw rows exportable with stale derived values unavailable
SCI-22 Medium Retained Assay result settings can contradict their hashed inputs docs/science/2026-10-11-scientific-audit.md, ASSAY-03; imported kinetics unit changed only in result settings records Km2M instead of2µM Current-result check and frozen Bench capture accept conflicting scientific units Fixed; focused regression checks, 11 October 2026 Check canonical result/input settings consistency at read, display, export and capture
SCI-23 Medium Michaelis–Menten fitting can fail solely because equivalent data use M instead of µM docs/science/2026-10-11-scientific-audit.md, ASSAY-04; independent scalar-reference case19 Ordinary well-supported data can become unavailable; fail-closed, not a wrong estimate Fixed; focused regression checks, 11 October 2026 Normalize optimization scales and select equivalent converged candidates with justified tolerances
SCI-24 Medium OD600 paired calibration accepts a negative slope as usable docs/science/2026-10-11-scientific-audit.md, CALC-01; decreasing OD-density pairs yield R²1 and3e8 cells/mL Live form presents a physically unsuitable calibration as a successful estimate Fixed; focused regression checks, 11 October 2026 Require positive slope in the OD wrapper; retain basis and define qualification policy
SCI-25 Medium Buffer suitability uses25°C pKa for a target at another working temperature docs/science/2026-10-11-scientific-audit.md, CALC-02; Tris4°C pKa8.7103 admits target7.5 and refuses9.2 The chosen ±1 suitability rule is misapplied; setpoint arithmetic was not shown wrong Fixed; focused regression checks, 11 October 2026 Use working-temperature pKa and same-temperature overlapping steps for the stated rule
SCI-26 Medium Sequence revision misses changed joined-feature order and partial-end identity docs/science/2026-10-11-scientific-audit.md, MOL-5; changed extracted CDS ATGTAA→TAAATG reports annotations unchanged Live revision review and exported correspondence can misstate biological annotation equivalence Fixed; focused regression checks, 11 October 2026 Compare ordered orientation-aware feature paths and mapped partial endpoints
SCI-27 Medium New assembly engines violate circular-end, overlap and final-site invariants docs/science/2026-10-11-scientific-audit.md, MOL-1/2/3/4: rotated EcoRI geometry, empty Gibson product, phantom and retained Golden Gate sites Latent general-input defects; current callers are fixed worked examples, whose shown products were not demonstrated wrong Fixed; focused regression checks, 11 October 2026 Fix circular coordinate/strand frames, coherent overlap coverage and final-circle recognition-site scans before general inputs
SCI-28 Medium Saved compound-series scores reference library row positions without release identity docs/science/2026-10-11-scientific-audit.md, DISC-01; simulated library reorder changes retained neighbour CHEMBL1528→CHEMBL2 A routine reference update can silently reattribute a saved score Fixed; focused regression checks, 11 October 2026 Store stable compound IDs, structures and library version/hash; never reinterpret old indices
SCI-29 Medium Series CSV exports inorganic QED withheld on-screen docs/science/2026-10-11-scientific-audit.md, DISC-02; NaCl exports QED0.24339242075148573 Export removes an existing scientific applicability qualification Fixed; focused regression checks, 11 October 2026 Share the screen/export projection; export unavailable value plus reason
SCI-30 Medium Pipeline coverage calls explicitly recorded phase NA missing docs/science/2026-10-11-scientific-audit.md, DISC-03;73/751 frozen trial rows explicitly contain NA Evidence-completeness display/export misclassifies not-applicable as unrecorded Fixed; focused regression checks, 11 October 2026 Retain recorded-applicable, recorded-NA and missing as separate states
SCI-31 Medium Saved full-text evidence does not bind paragraph PMCID to cited paper docs/science/2026-10-11-scientific-audit.md, DISC-04; inconsistent saved PaperA/paragraphB passes quote validation Recovered/imported evidence can export wrong-paper attribution; no ordinary live-fetch mix-up demonstrated Fixed; focused regression checks, 11 October 2026 Require canonical paper/context identity agreement, including nested assistance supports
SCI-32 Medium Saved compound-series result bodies are not deeply validated or bound to input docs/science/2026-10-11-scientific-audit.md, DISC-05; malformed member and changed SMILES with old result both accepted Inconsistent imports/recovery can display or export unrelated cached chemistry Fixed; focused regression checks, 11 October 2026 Strict semantic result reader, row mapping, finite bounds and input digest
SCI-33 Medium Serial preparation flags do not become saved warning qualifications docs/science/2026-10-11-scientific-audit.md, CONT-01; actual capture gives reportable status despite transfer/carrier flags Ordinary Record result loses warnings at envelope/status level; detailed projections still retain them Fixed; focused regression checks, 11 October 2026 Map flags and thresholds to qualified status and consistent warning qualifications
SCI-34 Medium Bioreactor method/export and verification claims diverge from implemented evidence docs/science/2026-10-11-scientific-audit.md, BIO-02; feed-DO dilution absent from method paragraph, declared gates tighter than actual tests, verification flag absent on main run Reports can misdescribe equations and strength of verification; already noted in app-bioreactor technical review Fixed; focused regression checks, 11 October 2026 Align methods/claims to code and exact gates, propagate qualifications; do not loosen tests
SCI-35 Medium Three Assay oracle fixtures of version 0.4.0 were recorded with their R cross-checks not run, because R was not in the build container on 10 October 2026 pipeline/assay-analyser/oracles/fixtures/inhibition-global.json, michaelis-menten-profile.json and thermal-shift.json, about.crossCheck ("R nls cross-check not run", "R confint cross-check not run", "R nls(SSfpl) cross-check not run"); published under public/verification/assay-analyser/0.4.0/ SciPy stands alone as the oracle for inhibition, Michaelis–Menten profile bounds and thermal shift; each badge must say "R not run" (CSO memo of 11 October 2026, §3) Closed 12 October 2026 for the fixtures: the three are re-recorded in the oracle image under the CPU-class pin as inhibition-global-v2.json, michaelis-menten-profile-v2.json and thermal-shift-v2.json, published under 0.5.0, each with about.environment and an R cross-check that ran (R nls 11 of 11; R's direct likelihood-ratio profile on 7 of 7 cases with an interval, with confint 4 of 7 recorded beside it; the zero-residual case has no interval and counts in neither by the CSO's ruling, docs/board/memos/2026-10-12-cso-michaelis-menten-profile-r-cross-check.md; R nls(SSfpl) 7 of 7). The 0.4.0 files stay as published. The registry, the engine tests and the badges moved to the -v2 files on 12 October 2026 (CSO sign-off memo of that date); the badges cite R 4.4.3 and, for the profile, R's direct profile rather than confint Add the R cross-checks to the three scripts, rerun them through the Oracles workflow and publish the result as a new fixture version recording about.environment and about.crossCheck; the CSO rules on the new version. Never regenerate the 0.4.0 files in place
SCI-36 Medium Dose-response results are accepted by readAssayData with no hash to their readings, so a results block that does not belong to its readings is shown, exported and captured to Bench as if it did (the four Wave 1 modes already refuse that through result-integrity.ts) The architecture record of 12 October §1 and the CTO's rulings on it (ruling 4 and "The two section 1 findings"): model.ts:593, :641; SCI-35 is taken by the oracle-environment branch A session file or object edited outside the app, or results left over from different readings, read as fitted numbers Fixed 12 October 2026 on claude/assay-foundation-1 (A-0's v6 completion): inputHash written by runFit; verified on open (withheld with a warning), before the exports that carry fitted numbers (only verified results reach them) and before Bench capture (writeNumbers, captureAssayWorkspaceResult); pre-v6 results carried only when they agree with the readings value for value, with the hash written at upgrade; withheld results kept in withheldResults with the CSO's notice on every open until a refit (the CSO's ruling of 12 October 2026); the object tab (object-tab.tsx), which still showed the stored results and charts unchecked, closed by useCheckedResults (the results upgradeToV6 would carry: verified, or pre-v6 and consistent; otherwise the CSO's withheld sentence), A-0 after commit 3b StoredResults.inputHash over doseResponseInput(data) written by runFit, verifyDoseResponseResults on open, before every export that carries a fitted number and before Bench capture, pre-v6 results carried only after the consistency check the CTO's ruling 4 gives (the CSO confirms it)
SCI-37 Low limiting_model starts nls from the polish halt, which moves with the machine (Compound C Bottom −3.19e6 under R 4.3.3, −1.79e6 in the image); from one halt nls did not converge and the script stopped (Oracles run 1). No number a user reads is affected; the limit (352.1813324) reproduces. (The CSO's wording, memo of 12 October 2026, docs/board/memos/2026-10-12-cso-sci-37-reference-oracle-version-2.md) Oracles run 38263006728, drift job 114859399498 (12 October 2026), image oracle-env:cefe041954d26e12 (R 4.4.3, drc 4.0-0 by its DESCRIPTION). The committed fixtures/drc-reference.json was written under R 4.3.3 (Ubuntu packages), MASS 7.3-60.0.1, jsonlite 1.8.8; it records the power-law limit only for MTT Compound C, from a polished point at Bottom ≈ −3.19×10⁶, logIC50 ≈ 5.03, Hill ≈ −0.52. C30 and C33 took the step branch (polished |Hill| 67.7 and 95.5), which fits no nls Version 1 is sound as gated: src/lib/fit/fixtures.test.ts:131-141 compares only the report, the withheld state and objectiveInfimum on C30, C33 and Compound C, whose polished points and bestFit are optimiser halts. Separately, pipeline/oracle-env/compare_fixtures.py's exact comparison reports drift on those curves every run, because drc's halt moves too (365.664 against 365.051), and pipeline/assay-analyser/README.md:306-308 is wrong for them Ruled by the CSO, 12 October 2026; diagnosed (Oracles run 38266902208, diagnose_reference_limit.R, image oracle-env:284fe866af0d704e, R 4.4.3 with OpenBLAS 0.3.26 pthread): the failure is MTT Compound C, the one curve whose limit is a power law. Polishing stops at a different point along the valley (Bottom −1.79×10⁶, logIC50 4.55 here against −3.19×10⁶, 5.03 committed; Hill −0.522 both). From this run's point nls converges in 8 iterations to the committed limit (objective 352.1813324); from the committed point the same nls exceeds 1,000 iterations; from the committed limit it converges in 1. C30 and C33 stay step limits. In run 38266906174 reference.R completed. So the stop is not a version or cap difference but where an optimiser halts on a flat valley, which moves with the machine (REL-33); the limit itself is unchanged. reference.R is not edited (its SHA-256 is pinned by src/lib/fit/fixtures.test.ts) Oracle version 2 (CSO ruling): a data-derived start in limiting_model (at each k, near and B by linear least squares; optimize over k) and both NLS_TOLERANCES as fit_nls does, no higher cap and no deterministic polishing; re-recorded in the image as a new fixture version with about.environment, checked against version 1 before publication; the walk fixture re-recorded too; the drift comparison made tolerance-based at one hundredth of the acceptance tolerances. Version 1 (0.1.0, 0.2.0, walk 0.3.0) stays as published. Note for the reference oracle's version 2 (CTO memo of 12 October 2026, docs/board/memos/2026-10-12-cto-two-flaky-titles-and-the-micro-sign.md): fixtures/drc-reference.json holds the micro sign as the eight ASCII characters <c2><b5> (the UTF-8 bytes of U+00B5 printed by R under a non-UTF-8 locale on 6 October) in six places: $.about.rules.reasonTexts at character 144, and five expected.*.reason values (lines 4265, 8834, 9343, 9350 and 10664, from the µM unit label at reference.R:121); the published 0.1.0 and 0.2.0 copies hold the same six. reasonTexts is written at reference.R:932 and nothing in the repository reads it; no test reads the five reasons. The image runs R in a UTF-8 locale and writes U+00B5, so the drift job reports these strings until version 2 is recorded; nothing published is rewritten
SCI-38 Low A4's summary across saved assays (the Study's Evidence tab) counts every saved dose-response assay in the Study as one experiment; there is no way to group two assays that are one experiment or to leave one out, and the biological confirmation is asked each time, not stored src/components/tools/assay-analyser/panels/across-assays.tsx A person whose Study holds two runs of one experiment cannot get a summary without moving one assay out of the Study (the confirmation, unticked, keeps them from a wrong n) Open (12 October 2026, the A4 builder) Per-assay inclusion and experiment ids stored on the Study, a shared-contract change for the CPO; the stored declaration would follow AssayData.experiments
SCI-41 Low Rates taken from progress curves enter the Michaelis–Menten fit and its profile intervals as observations without their own window uncertainty (the two-stage uncertainty assay.md names) src/lib/kinetics/progress-rates.ts, progressReadings; the kinetics method paragraph (kineticsCopy.progress.method) and the limits block say so The Km and Vmax intervals describe scatter between the wells' rates only, not the precision of each window slope; with few reads per window they can be narrower than the data justify Open, stated in the method paragraph and limits (A6, 13 October 2026) A CSO ruling on whether to carry each slope's standard error into the fit (weights) or qualify the interval sentence when the rates came from progress curves
SCI-42 Low Plate diagnostics (signal window, SSMD, Z, edge and row/column patterns) are on screen as unit-tested before their oracle fixture is published, and their methods entry cites Sittampalam 1997, Iversen (AGM), Zhang 2007 and Welch 1947 from memory src/lib/fit/plate-diagnostics.ts; pipeline/assay-analyser/oracles/plate_diagnostics.py written, not run (GitHub Actions stopped by the spending limit, 13 October 2026); the fixture test is a todo until the file exists The numbers are checked against hand cases only; a defect the fixture would catch could sit on screen until publication Open (13 October 2026) Run plate_diagnostics.py in the oracle image, publish as 0.11.0, switch the method to verified; read the four papers and date the citations
SCI-43 Low Limits from blanks and dilution series in Standard curve are on screen as unit-tested before their oracle fixture is published; their citations (Currie 1968, MacDougall et al. 1980) are from memory; spike recovery is built on claude/assay-spike-recovery (13 October 2026) and verified against spike-recovery.json (0.11.0, Oracles run 38420985979) src/lib/fit/calibration-limits.ts; pipeline/assay-analyser/oracles/calibration_limits.py written, not run (GitHub Actions stopped by the spending limit, 13 October 2026); the fixture test is a todo until the file exists; spike recovery held by the CSO's memo of 13 October 2026 (item 9) because it needs new stored fields The numbers are checked against hand cases only until publication; a person cannot yet compute spike recovery in the app Open (13 October 2026) Run calibration_limits.py in the oracle image and publish as 0.11.0, switch the method to verified; read and date the citations; a CTO ruling on the record version for the spike fields, then build spike recovery to the memo's formula
SCI-44 Low The pre-submission check (A-4.1) does not yet carry four of the CSO's items: the caption's vehicle clause that replaces a "hidden zero" finding (4(a)); the experiment-summary findings (k = 2, members left out), because the summary is recomputed on request and not stored; growth's "a parameter withheld while others are reported", which applies to the full-curve fit; and Compare's stale check is the cheap one (results time, results hash, curves), the Compare panel re-verifying the input hash docs/board/memos/2026-10-13-cso-pre-submission-check.md, "Builder's note on application"; src/components/tools/assay-analyser/pre-submission.ts A reviewer's question in those four places is not listed before export; nothing wrong is shown Confirmed, open (13 October 2026); 4(a), the caption's vehicle clause, done in 42c1552b (A-0 builder) Caption clause done; store the summary's outcome or read it when shown; add the growth rule with the full-curve recording
SCI-50 Low The weekly oracle drift check reruns fdr.py and groups.py, which write under oracles/fixtures/family-6-fdr/ and family-2-groups/, while the recorded files are committed at the top level (fdr.json, groups.json), where publish.py reads them pipeline/assay-analyser/oracles/fdr.py and groups.py (FAMILY_DIR); publish.py reads fixtures/*.json only; .github/workflows/oracles.yml, drift job; found 13 October 2026 when publishing 0.11.0 (b47144a3) The drift job may report the two files as new rather than compare them with the committed copies, so drift in these two fixtures would go unseen or show as noise; the published fixtures and the oracle tests are unaffected Confirmed, open (13 October 2026) Record a -v2 lineage of each script that writes to the top level (the next free fixture version), so the drift check compares like with like; or let the drift check match a written file to the committed one by name when its own path is absent
SCI-70 Low A-4 items 7 (influence halos) and 3(a) (the design calculation) are shown since their fixtures were published (0.11.0, 13 October 2026), but 3(c)'s push into a Calc plan is deferred (the suggestion goes to Study notes instead, the CPO's ruling on the power plan; docs/NEXT.md); the halos are drawn on the curve detail's chart only, not on the small multiples; and the fixtures cover fewer cases than the CSO listed: no leave-one-out fit that becomes a step (the oracle does not reimplement the engine's no-finite-minimum test, bestStep), no exact tie in V_c, and no rule (vi) curve (a gate in the caller, tested in units) docs/board/memos/2026-10-13-cso-a4-diagnostics.md, "Builder's note on application"; the oracle scripts' docstrings A planned concentration is copied by hand into Calc; three edge cases rest on unit tests, not the oracle Confirmed, open (13 October 2026) Build the Calc push when Calc takes a linked note (a CPO consult and a contracts update); add the step case with an oracle of the engine's step test
SCI-71 Low The pre-submission check's log-axis rule (axis-log-hidden; REL-141, the CSO's figure-axes memo ruling 1(f)) is built and unit-tested but reads its counts from an input (logAxis) that nothing fills yet: log y and the caption's shared count arrive with FigureSettings v3 on claude/assay-figure-editor src/components/tools/assay-analyser/pre-submission.ts (LogAxisCounts); docs/board/memos/2026-10-13-cso-figure-axes.md on that branch Until wired, a figure on log y could hide data without the check listing it (the caption still counts it) Fixed 13 October 2026 on claude/assay-figure-editor (5c3365d0): logAxisCounts in figure/axes.ts, from the caption's axisFacts, fills logAxis in pre-submission-panel.tsx (the workspace passes the zero-dose rows); unit test in figure/v3.test.ts None
SCI-39 Medium A single-well profile interval on the sigmoid Tm assumes independent readings; adjacent readings of a melt are often serially correlated, and then the interval is far too narrow src/lib/thermal/tm-intervals.ts (tmProfile); the coverage simulation in pipeline/assay-analyser/oracles/thermal_tm_intervals.py, published as thermal-tm-intervals.json (0.11.0) In 1,000 simulated melts per design it covered the true Tm in 96.5 percent of independent melts, 89.1 percent at AR(1) ρ 0.2, 73.6 percent at ρ 0.5, 33.6 percent at ρ 0.9 and 0.0 percent with a sloping baseline; shown as a 95 percent interval, it would overstate the precision of one well's Tm Mitigated by withholding (A5, 13 October 2026): the CSO ruled the single-well interval never displayed, stored or exported, after a lag-1 residual test (withhold when n < 20 or r1 > 1.645/√n) still let undercovering intervals through at ρ 0.5; the panel says why and shows the residuals' r1 as a diagnostic, and the replicate-well mean and SD with n is the only Tm spread shown A correlation-aware interval (for example a profile under an AR(1) error model) with its own fixture and coverage run, for a later stage and a new CSO ruling
SCI-45 High Assay's own text readers take a comma followed by three digits as a decimal comma in any tab- or semicolon-delimited file: "1,234" from a US-locale spreadsheet export reads as 1.234, a silent thousandfold error parseNumber in src/lib/table/delimited.ts with decimalComma: delimiter !== "," at plate.ts:177, kinetic.ts:86, response-template.ts:151 and in import-review.ts; found 13 October 2026 by the data grid builder while applying the CSO's comma rule (addendum to docs/board/memos/2026-10-13-cso-column-statistics.md, item 3) to the grid A plate or table pasted with thousands separators and tabs is fitted on values a thousand times too small, with no refusal Fixed on claude/assay-data-grid, 13 October 2026: parseNumber reads through the grid's classification with the file's evidence (fileComma) in every Assay text reader; an ambiguous cell is refused and listed, named "Comma is ambiguous" in the review; the policy line states the rule; no published reader fixture changed its reading (the unit suite unchanged at its fixtures); src/lib/table/comma.test.ts None; the CSO is the verification gate (addendum item 3)
SCI-80 Medium The screening campaign's oracle fixture is not recorded, so its engine is checked only by the builder's local NumPy and SciPy run; its method citations (Zhang 1999, Malo 2006) were given from memory and not re-read src/lib/screening/screening-oracle.test.ts fails on the missing pipeline/assay-analyser/oracles/fixtures/screening.json; the CSO's red line "shipping before cases a to k pass" (docs/board/memos/2026-10-13-cso-screening.md); a local run of screening.py --local on 13 October 2026 passed all 9 cases against the engine (not a record) Until recorded, the screening numbers are not verified against a recorded oracle; the CSO holds the gate Fixture recorded 13 October 2026: Oracles run 38419872312 (job 115374849341), screening.json SHA-256 b6bd3ed0a891214f59242d89207d46d983ff1b5957ee70335af888fccf12025b, published as 0.11.0; screening-oracle.test.ts passes all 9 cases (a to k). Open only for the citations, to be verified before the methods entry is published Run screening.py in the pinned image, publish the fixture, re-run the test
SCI-110 Low A5's outlier-candidate oracle cross-check (pipeline/assay-analyser/oracles/r/outlier_checks.R) compares Grubbs' p with outliers::grubbs.test(two.sided = TRUE), which folds a doubled one-sided p above 1 to 2 − p, so in a group with no candidate R's p can be small (res = 0.99 gives 0.02; res = 1 gives 0) CSO memo of 13 October 2026, docs/board/memos/2026-10-13-cso-outlier-candidates.md, ruling 1(e) as amended; the package's code as read by the A-2 family 7 builder A5's control-group cross-check could record a spurious disagreement or, if its p were ever used, a spurious candidate; the engine's own bound min(1, 2n·P(T > t_G)) is unaffected Fixed: the fixture applies the guard against the package's folded p (CSO exit memo). r/outlier_checks.R takes G from grubbs.test, records the package's p only where it does not fold (folded where 2·res > 1) and gates on car::outlierTest(lm(x ~ 1)); the family 7 oracle (column_outliers.py) applies the same guard (CSO Stage A exit memo of 13 October 2026, docs/board/memos/2026-10-13-cso-stage-a-exit.md, section 2) None
SCI-100 Low At 99 percent the engine's lower limit of median survival differed from R's where the lower pointwise band is not monotone: case level-99 group A, R 2, engine 1 pipeline/assay-analyser/oracles/fixtures/survival.json (0.11.0, run 38423667888); quantileTime in src/lib/stats/survival.ts. R's lower band is 0.318 at t = 1 and 0.323 at t = 2; quantile.survfit finds the crossing with approx(), which sorts the band, so it takes the largest value at or below 0.5 One interval bound differed from R in an edge case Fixed in the engine on the CSO's ruling (memo addendum of 13 October 2026); all 34 cases agree. Open: confirm the mechanism in R and add a second non-monotone case at the next fixture version The fixture version after 0.11.0
SCI-90 Medium The nonlinear relationship fits label their intervals "approximate profile interval" without the coverage simulation the CSO requires first (nonlinear memo, ruling 17: 2,000 seeded replicates per family; a family below 0.90 ships its intervals as not available). The simulation ran at 95 percent only, while the panel also offers 90 and 99 percent and the engine profiles at the level chosen; the Spearman interval's simulation has the same gap src/lib/relate/nonlinear.ts, src/lib/relate/correlation.ts, src/components/tools/assay-analyser/relationships-limits.ts; nonlinear-coverage.json and relationships.json (0.11.0) record their settings at a nominal 0.95; the CSO's Stage A exit memo of 13 October 2026 (docs/board/memos/2026-10-13-cso-stage-a-exit.md), section 4 At 90 or 99 percent an interval could be shown, labelled approximate at that level, with a coverage claim no simulation supports Reopened 13 October 2026 for 90 and 99 percent (CSO exit memo); those levels show coverage not checked until simulated; 95 percent confirmed. The gates are keyed by level (NONLINEAR_COVERAGE_CLEARED through nonlinearCoverageCleared, SPEARMAN_INTERVAL_CLEARED through spearmanIntervalCleared) and only 0.95 is cleared: at 90 and 99 percent the nonlinear intervals read COVERAGE_NOT_CHECKED without the approximate-interval limits line, and the Spearman interval is withheld (SPEARMAN_CI_LEVEL). The 95 percent closure stands from claude/assay-relationships (nonlinear_coverage.py, Oracles run 38426565308, nonlinear-coverage.json 0.11.0: 2,000 replicates per family, coverage 0.945 to 0.957, no unresolved sides), tied to the engine by nonlinear-coverage-oracle.test.ts Record coverage at 0.90 and 0.99 from the same replicates (gates 0.80 and 0.98) and the Spearman cells at both levels, under a new fixture version, then clear those keys. Follow-up, not a reopening: a harder two-phase design (rates about 5-fold apart) at the next fixture version
SCI-46 Low Relative potency (Compare) is on screen as unit-tested before its fixture is published; and for a weak curve whose C50 lies near the top concentration, the engine's own profile on that curve stops at refit-unresolved (so ρ reads "withheld: unbounded interval") where the SciPy comparison oracle finds a crossing ("withheld: poorly determined") src/lib/fit/relative-potency.ts; oracles/relative_potency.py written, not run (GitHub Actions stopped by the spending limit, 13 October 2026); its case rp05-weak shows the difference in a local dry run; the own profile is profileLogIC50 in ci.ts, used by A4's comparison Both withhold ρ, with a different reason; once the fixture is published its rp05 comparison will read red on the reason until the own-profile refit is reconciled Closed (13 October 2026): relative_potency.py refuses a held refit at the search box (own_profile_boxed), so rp05 reads "withheld: unbounded interval" in the oracle as in the engine; relative-potency.json was recorded in the image (Oracles run 38425424281) and published as 0.11.0; the engine agrees on all 9 cases, rp05 included, and the method is verified. Diagnosed 13 October 2026 by the A4 builder: the engine is right and the oracle's crossing is a box artefact. On rp05's Test curve (C50 −4.10, highest concentration −4.25) the upper side's held refits drive Bottom to the search box's lower edge (−1120.2) from log C50 ≈ −2.1; the engine refuses a nuisance refit at the box (refit-unresolved), while the oracle's bounded least_squares accepts it and its RSS, lifted by the pinned Bottom, passes the threshold (106.9) at −2.139. Refitted without the box, the held RSS levels off near 97.4 out to log C50 = 6, so no crossing exists and the bound is genuinely unbounded (SciPy 1.18.1 locally, not the image's 1.13.1). src/lib/fit/profile-box.test.ts pins the engine's statuses on those points None
SCI-60 Low qPCR efficiency from a dilution series and geNorm M are on screen as unit-tested before their fixture is published; the pasted dilution series is not stored, so after a reload only the carried efficiency's source line records it, and the extrapolation flag needs the series pasted again src/lib/assay/qpcr/efficiency.ts, panels/qpcr-efficiency.tsx; oracles/qpcr_efficiency.py written, not run (GitHub Actions stopped by the spending limit, 13 October 2026) A person who reloads cannot see the series' levels again without the original table; the carried value and its source line remain Open (13 October 2026) Publish the fixture as 0.11.0 and switch the methods to verified; storing the series is a record change (QpcrData, a CTO ruling on its version)
SCI-61 Low Reporter ratios and the background-subtracted viability percent are on screen as unit-tested before their fixtures are published; the reporter pairs one firefly block with one Renilla block (one plate), and points on the ratio curves cannot be excluded from the chart (the ratio block is not one of the imported blocks, so decisionKeyOf finds no key; exclude on the plate map instead) src/lib/fit/reporter.ts, src/lib/fit/normalise.ts, panels/reporter-ratio.tsx; oracles/reporter_ratio.py and oracles/viability_normalisation.py written, not run (GitHub Actions stopped by the spending limit, 13 October 2026) A multi-plate dual-luciferase import must be analysed one plate at a time; chart exclusion is unavailable in ratio mode Open (13 October 2026) Publish both fixtures as 0.11.0 and switch the methods to verified; pair several plates; map ratio-curve points to their plate-map keys
SCI-120 Medium GR metrics (A-1 second pass) are checked only against their published definition and the CSO's hand cases, not against the GRmetrics package (Bioconductor, not in the oracle image): its bounds, its GRmax (fitted or observed, or the lower of the top two concentrations) and its GR_AOC normalisation are recalled, not verified; and the three new A-1 fixtures (two-phase-dose-response.json, agonist-antagonist.json, gr-metrics.json) are written but unpublished while GitHub Actions is stopped CSO memo of 13 October 2026, docs/board/memos/2026-10-13-cso-gr-metrics.md, risks; src/lib/growth/gr.ts; the oracle tests are named todos A GRmax or GR_AOC could differ from what the package reports for the same data; the limits line says "not checked against the GRmetrics package" and the method stays "unit-tested", never "verified" Open; owner the dose-families builder Run the package's example dataset at build time only and compare; publish the three fixtures through the Oracles workflow, then remove the limits sentence
SCI-121 Medium The agonist and antagonist analyses' R cross-check disagrees with the SciPy oracle on 3 of 7 fitted cases: the global Gaddum/Schild fit's pA2 by 0.011 (competitive) and 0.017 (shallow slope) log units, and an own log EC50 by 1.9e-4 (Furchgott, full maxima); the engine agrees with SciPy on all 8 cases agonist-antagonist.json (0.11.0), about.crossCheck (R nls port, drc 4.0-0); src/lib/fit/antagonism-oracle.test.ts Until it is known which optimum is right, pA2, s, pKB, KA and τ stay "unit-tested" Fixed, 13 October 2026: the oracle refits each fit in R and SciPy from the other's estimates and records every residual sum of squares (crossCheck.minima, oracles/agonist_antagonist_v2.py writing agonist-antagonist-v2.json, 0.13.0). The global disagreements were the R port's: its control rows carried log[B] = NA, which nls's default na.action dropped, so R's global fits had no control curve; carried as lb = 0 R agrees within 2e-9. The remaining own log EC50 (Furchgott, full maxima, 1.9e-4) is drc stopping at a higher residual sum of squares (74.87326 against 74.87255; nls from SciPy's estimate stays at SciPy's). SciPy, and so the engine, holds the lowest on every fit; gaddum-schild-global, gaddum-noncompetitive and operational-model-furchgott are verified None
SCI-122 Low The header comment of src/lib/fit/rules.ts described rule (ii) as the flat-line F-test; the code has gated on the within-plate permutation rank-trend test since the October scientific audit src/lib/fit/rules.ts header, rule (ii); CSO memo docs/board/memos/2026-10-13-cso-negative-result.md section 3 A reader of the code is told the wrong test withholds the C50 Fixed 13 October 2026 (A-4 item 12): the comment names the permutation test and the F-test as a diagnostic only —
SCI-123 High The calibration inverse-prediction interval was too narrow whenever the standards were replicated: the fit to the standard means takes s² from their residuals, which estimates σ²/r, and the unknown's term used it as σ² (σ²/(r·m) where it should be σ²/m) The CSO's exit memo of 13 October 2026 (docs/board/memos/2026-10-13-cso-stage-a-exit.md, section 2); src/lib/fit/inverse-prediction.ts before 14 October; on calibration-inverse.json's linear-replicates case the half-width was 0.028 against 0.039 corrected; simulated coverage of method 1.0.0 was 83 to 91 percent at a nominal 95 (calibration-inverse-v2.json, 0.13.0) Intervals on replicated standards, the usual ELISA design, claimed more precision than the data held; standards read once were right Fixed 14 October 2026 on claude/assay-inverse-fix: method 2.0.0 pools the reading variance from the individual readings over N − p degrees of freedom and withholds the interval for unequal replicate counts (unequal-replicates), the CSO's ruled method; the corrected oracle, R investr over the individual readings and a coverage simulation (94.4 to 95.5 percent) recorded as calibration-inverse-v2.json at 0.13.0; CALIBRATION_VERSION 1.3.0, so stored results ask for a re-run. Consequence, development only (the CTO's ruling of 14 October 2026): a build at main 704aa1fe refuses a record carrying the new reason whole —
SCI-47 Low Observation, not a defect: on noisy flat data the fitter refuses most curves as unidentifiable or not converged before rule (ii) runs (44 of 60 simulated curves: 24 wells, eight concentrations in triplicate, uniform noise ±5 around 100 or 3) fitFourPL refusals in src/lib/fit/four-pl.ts; analyseCurve in src/lib/fit/analyse.ts; CSO memo docs/board/memos/2026-10-13-cso-negative-result.md, addendum A9 Refusing an unidentifiable midpoint is correct. Before the addendum such curves could carry no negative result; they now carry the stored response evidence (refusedEvidence) and get one when eligible. Results stored before 13 October carry none until refitted Recorded 13 October 2026 (A-4 item 12) None needed; refit old results to state the negative result
SCI-51 Medium Recorded results captured while an assay was blind keep their codes ("Sample 01" is a different compound in each assay); the Study's summary across saved assays now leaves out blind assays, but any other Bench view that groups recorded results by compound label could pool different compounds Recorded results keep their exact inputs (ResultSnapshot); panels/across-assays.tsx (fixed for live assays); the CTO's storage review of 3d934d40, finding 6 A summary a scientist reads could pool two compounds under one code Partly addressed (13 October 2026): across-assays fixed; other groupings by label to be checked by the CSO Record blind results as such and never group them by code
SCI-124 High The Patent app's seven rules (src/lib/exclusivity/trace.ts, trace_reference.py) were implemented from the CSO's memo of 13 October 2026 and the brief, without the Orange Book Preface or the Purple Book's notes read from the FDA's site, and no regulatory-affairs reviewer has signed them (Q-19); R6 (tentative approvals) is a note only, since the products file carries no tentative-approval marker and the Drugs@FDA join is a later ruling docs/board/memos/2026-10-13-cso-patent-app.md §A to §G; docs/design/brief-patent.md §6; the release gates in docs/roadmap-v0-depth.md Stage I A rule read wrongly puts a wrong date beside a product's name, with a citation that makes it look checked Open; the 18 October CEO-authorised candidate restores alpha discoverability with captured rows and explicit review-pending notices. Mechanical transcription does not satisfy the Q-19 reviewed-release gate (D-0077) Transcribe F1 to F7 from the FDA's files of a stated date; the reviewer signs the rules and the fixtures; then the Drugs@FDA join for R6 as its own ruling
SCI-125 High Patent's summary misses the pediatric date of a substance patent on the FDA's real files: the Orange Book's *PED row carries no substance or product flag (the flags sit on the base row only), so latestSubstancePatent is read from the base row; for Eliquis (NDA 202155) it reports US 6,967,208 at 21 November 2026 where the FDA's *PED row lists 21 May 2027. The synthetic fixture flags its *PED rows, so the tests and the Python reference agree and miss it The first capture, 14 October 2026 (data/exclusivity, current/orange-book/patent.txt: N~202155~001~6967208*PED~May 21, 2027~~~~~); the engine run on a store built from it; src/lib/exclusivity/trace.ts (summary.latestSubstancePatent) and pipeline/patent-exclusivity/trace_reference.py A scientist reading the Protection tiles on real data sees the substance patent's date six months early; the dates table itself lists the *PED row correctly (R2) Fixed on 14 October 2026 on the CSO's ruling of that day: a *PED row listed without flags reads its base rows' substance and product flags (exact key, only when they agree), marked as inherited (TracedDate.inherited) on screen, in the inspector and in the exports; both implementations (pedReadings in trace.ts, ped_readings in trace_reference.py); the fixture fixtures/ped-inheritance holds the Eliquis rows verbatim from the capture with the files' hashes, and invented rows for disagreeing and missing base rows (reference-ped.test.ts); Eliquis's latest substance patent now reads 21 May 2027, marked. The Orange Book Preface's own description of *PED rows is still to be read before release None beyond the Preface reading, already a release gate in docs/design/brief-patent.md
SCI-170 Medium Plasmid's schematic gel chained bands: resolvedBands compared each size with the smallest member of the current band, so 1,000, 960 and 922 bp were drawn as one band although 1,000 and 922 differ by 7.8 percent, while the copy said "within 5 percent of each other"; the oracle used the same rule, so the fixtures agreed src/lib/seq/gel.ts, pipeline/plasmid-map/reference.py resolved_bands; Plasmid, "Known gaps"; the CSO's ruling 3 of 17 October 2026 A band drawn as one that a scientist would see as two, under copy that said otherwise; no picker verdict moved (trio v2 against v1: 43 of 4,157 digests' bands, 0 verdicts) Fixed (17 October 2026, claude/stage-c-gel): gel rules 2, a fragment joins a band within 5 percent, inclusive, of its largest fragment; oracle changed first with the CSO's hand cases (gel-bands-v1.json), trio v2 published beside v1; GEL_METHOD 2.0.0, PICKER_METHOD 1.1.0 None
SCI-226 High Library 2's origin entry pucOri was displayed "pUC ori" but carries the pBR322 base: DQ059139.1's 668 bases are identical to pBR322 (J01749.1 2478..3145) and differ from pUC19 (L09137.2 811..1478) only at pUC19 1308, so pBR322 was called a 100 percent "pUC ori" match. The submitters' note was taken as the name, and other records in hand split at that base whatever they are named The CSO's memo of 20 October 2026 (docs/board/memos/2026-10-20-cso-puc-ori-call.md), the bases read from pipeline/plasmid-map/records/; found when the browser matrix on claude/stage-c-land failed workspace.spec.ts:161 and :501 A false name on pBR322 that a scientist reads Fixed (20 October 2026, claude/stage-c-library-rebuild): renamed "ColE1-type origin" with the CSO's description, id kept, library 2 rebuilt in place as features.a7b9c65fae.json before it reached main; the Inspector carries the limit line "Does not distinguish the pUC origin from the pBR322 origin." on this entry's calls; goldens puc19@2 and pbr322@2 pin both spans and the mismatch at 1308
SCI-227 Medium The exported GenBank /note of a ColE1-type origin call does not yet carry the entry's limit sentence, so the claim leaves the app without its limit (the CPO's ruling 5, confirmed by the CSO on 20 October 2026: the sentence exactly once) A library call's /note is assembled in src/components/tools/plasmid-map/genbank-export.ts (around line 160), which the claude/sequence-wave6-debt branch holds while it is in the merge queue; the Inspector already shows the line A GenBank file names the family without saying the call cannot tell the pUC origin from the pBR322 origin Fixed (21 October 2026, claude/stage-c-library-rebuild, after claude/sequence-wave6-debt landed): genbank-export.ts appends the sentence from content/apps/plasmid-map.entry-limits.ts as the last /note of the entry's calls; genbank-export.test.ts checks it appears exactly once on pBR322 and pUC19 and on no other call
SCI-213 Medium The DNA aligner's first banded rule (the edge-touch rule, then a seeded exit and entry bound) was not a proof; on long references stray words make banding fall back or band-limit src/lib/seq/align/place.ts (branch claude/sequence-dna-aligner, not merged); the fixture case band-widened showed the edge-touch rule alone accepting 145 where the optimum is 247; a 2,000-base read on a 1,000,000-base random reference had 96 seed diagonals; on a circle, seeds starting at or beyond n were skipped Banded acceptance stays off (BANDED_ACCEPTANCE = false): over the cell limit the result is band-limited with no number Built behind the switch: the CTO's B.1 (the CSO's Q3(c) bound; seeds over the whole text, unfolded; per-cluster bands; one rerun at b0 + 1; full-table fallback; edge asserted; the builder's bound retired) and B.5's property test, green with every route reached. Open until the CSO has read the head and the switch is turned on The CTO's count filter for long references (B.3) waits for the CSO's confirmation of its lemma; the weekly 20,000-pair row is the CTO's for the scheduled matrix
SCI-214 Medium The DNA aligner decided a wrap past one turn, and gave placement groups, only from the alignments it listed: over the listing cap a wrap among unlisted co-optimal alignments was missed, and the oracle's own wrap check stopped at its 20,000 enumerated src/lib/seq/align/report.ts, pipeline/sequence-toolkit/align_reference.py (branch claude/sequence-dna-aligner, not merged); F3 of the CSO's first reading (12 October 2026), with the CTO's method; the fixture case ties-wrap-unlisted (2,048 co-optimal alignments, the shown one inside one turn) A circular result over the cap could have carried numbers for a set that wraps Fixed on 12 October 2026: one forward pass over the optimal-path graph (groups in gotoh.ts, Programme.groups in the oracle) gives the groups, hulls and longest span exact at any count; the oracle checks it against Biopython's partition wherever enumerated None
SCI-215 High The DNA aligner's reporting layer, shared by the oracle: an insertion or deletion whose extent varies among the co-optimal alignments was marked common, judged node by node; on a circle, pairs, groups and the hull were taken by text index, so one placement near the origin split in two and its shared pairs were lost; an insertion after a free leading gap was reported after position 0 (on a circle, without crossesOrigin) src/lib/seq/align/report.ts, gotoh.ts, pipeline/sequence-toolkit/align_reference.py (branch claude/sequence-dna-aligner, not merged); the CSO's final reading of 14 October 2026, ruling 4 items 1 to 3 (the refuter's three published rows, among them minus-ambiguity semiglobal-read plus; the brute force's split placement) A difference shown as fixed that is not; a placement split or a shared pair missing on a circle; a wrong coordinate Fixed on 14 October 2026, before the set is published (as 0.8.0): for an insertion or deletion, common needs the run and both bounding nodes on every optimal path, computed twice in the oracle (programme and enumeration); that pass also applied the bounding rule to single pair columns, which the CSO's re-reading found and corrected (SCI-217); positions in the reference's own numbering, a node and its copy n letters on folded together by exact BigInt path counts where both are marked; the hull the shortest arc; refAfter after the last letter consumed, a free leading gap counted. difference-common.test.ts holds common and the shared pairs to enumeration on 300 small tie-dense pairs None
SCI-216 Medium The DNA aligner gave NaN placement, hull and coverage when no co-optimal alignment pairs a letter (semiglobal-read), and a region let a whole-circle comparison and a read longer than a circle through src/lib/seq/align/report.ts, policy.ts and the oracle (branch claude/sequence-dna-aligner, not merged); the CSO's final reading, ruling 4 items 4 and 5 An undefined state with no case; an unruled stated-origin method, and a false line about the reference outside the region Fixed on 14 October 2026: the state no-paired-letter (score and count, nothing placed); region-whole-circle refused, and a read longer than a circle refused with or without a region; cases no-paired-letter, refuse-region-whole-circle, refuse-read-longer-than-circular-region The CPO's words for the new state and refusals
SCI-217 Medium The DNA aligner judged a substitution or ambiguity column common by the bounding rule meant for insertions and deletions, so a pair that every co-optimal alignment holds read as not common when a neighbour varied report.ts, align_reference.py and difference-common.test.ts (branch claude/sequence-dna-aligner, not merged; the CSO's re-reading of 14 October 2026, filed 20 October, D1); ambiguity-both-sides semiglobal-read minus, G10/N11: in uniquePairs yet common: false A fixed difference shown as varying; the row contradicted its own convention Fixed on 20 October 2026, before the set is published (0.8.0): a pair column is common by its own node; the engine, the oracle (programme and enumeration) and difference-common.test.ts all take the node rule None
SCI-205 Low On a circle, an insertion or deletion bounded by semiglobal-read's free end gap was marked not common when one co-optimal alignment sat a turn of the text later, since the free gap's node was compared by text index report.ts, gotoh.ts and the oracle (branch claude/sequence-dna-aligner, not merged; the CSO's re-reading of 14 October 2026, filed 20 October, D2); ACGACAC circular, read CCGTTTT: TTTT inserted after position 3 in every alignment An indel shown as varying Fixed on 20 October 2026, before the set is published (0.8.0): a free end gap next to a run adds no condition beyond the run's nodes; case free-gap-bound-circle None
SCI-206 Low A region of a circle took the whole circle's shortest-arc hull, which could run through positions never compared hullOf in report.ts and hull_of in the oracle (branch claude/sequence-dna-aligner, not merged; the CSO's re-reading of 14 October 2026, filed 20 October, D3); TCCCT, region 2 to 5, read G, global: hull 5 to 2 across the origin A hull holding a position outside the region Fixed on 20 October 2026, before the set is published (0.8.0): on a linear text, a region of a circle included, the hull runs from the least to the greatest paired position in the region's own order, in the reference's numbering; case region-hull-inside None
SCI-207 Medium In semiglobal-read, where some co-optimal alignments pair letters and others pair none, the engine reported aligned with an alignment that placed nothing and a hull from the pairing minority, and the oracle crashed on such inputs report.ts and the oracle (branch claude/sequence-dna-aligner, not merged; the CSO's re-reading of 14 October 2026, filed 20 October, D4); AAAA against CCC: seven alignments, five placing nothing A placement where an equally good alignment places none of the read Fixed on 20 October 2026, before the set is published (0.8.0): no-paired-letter wherever the optimum is one gap of the whole read, with the full count; the oracle writes it; case no-paired-letter-mixed The CPO's words for the widened state
SCI-208 Low The strand verdict read ambiguous when both equal strands placed nothing report.ts and the oracle (branch claude/sequence-dna-aligner, not merged; the CSO's re-reading of 14 October 2026, filed 20 October, D5); the published no-paired-letter row An ambiguous placement named where nothing is placed Fixed on 20 October 2026, before the set is published (0.8.0): the strand is none where the better strand, or either of two equal strands, places nothing The CPO's words for a strand of none
SCI-211 Low The oracle's intent check for D3 (a region's hull from the least to the greatest paired position in the region's own order) reads only the better strand, which on region-hull-inside is minus, so the check is vacuous for the case it was written for pipeline/sequence-toolkit/align_reference.py (check_intents), branch claude/sequence-dna-aligner; the CSO's reading of 6cf9cbf5, 20 October 2026, ruling 1 (D3) and ruling 4.5 None on published values: the published row and the harness hold D3, and reverting D3 fails that row (the CSO's reproduction) Open; next fixture set The intent check reads the plus strand (the CSO's ruling 4.5)
SCI-212 Medium On the three wraps-past-one-turn strands the engine returns no score, count or certified text, so the fixture's Biopython block on those strands is never compared with the engine report.ts (the wrap return in strandResult) and align-harness.test-support.ts (checkStrand), branch claude/sequence-dna-aligner; the CSO's reading of 6cf9cbf5, 20 October 2026, ruling 1 (D6 note) and ruling 4.3 Unverified numbers if a surface ever showed a score or count on a wrap strand Open; before any surface One of the CSO's two: the engine returns the score and count on a wrap and the harness compares Biopython's block with them, or no surface shows any number on a wrap strand (with the CTO, alongside the count-free fold)

Wave 8 B1 source review (11 October 2026, uncommitted branch): same-source reimport could display a stale window, and restore could downgrade a source-declared synthetic origin. The draft now keys window text by the immutable arrival and enforces origin at the reader. It also rejects stale imports/downloads and incomplete comparison capture. Focused unit checks pass; the browser regressions and full gate remain pending. These are draft corrections, not a release claim; see Bioreactor.

Patent captured-source findings (18 October 2026, CSO Patent-store ruling; fixtures and fixes pending, SCI-124 remains open):

Id Severity Description Evidence Impact Status Suggested fix
SCI-228 High Purple Book reference-product expiry is omitted from the trace in both implementations Captured B125757 lists 2035-04-26; the trace reports orphan expiry 2030-04-26 Summary and date-window omit a listed date Fixed in the 18 October candidate after independent source fixture; release checks pending Independent 30-application trace and served-roundtrip checks
SCI-229 Medium Purple text-only dates display as absent and the blank notice checks only generic expiry B761088 contains Date TBD; B125757 has a reference-product date Supplied source text or dates appear missing Fixed in the 18 October candidate; release checks pending Retained Date TBD text, four-column blank detection and CSV export
SCI-230 High PIV joins use name prefixes, wrong application types and the first digit run in brand names 63 rows lack numeric keys; Stalevo 50 21485 is read as 000050 Uncertain or wrong rows attach as product facts Fixed in the 18 October candidate on CSO identity ruling; release checks pending Exact isolated NDA token to N-type product rows; 76 unresolved rows retained separately
SCI-231 Medium Source and code-list dates fall back to capture/build dates All five current metadata files lack dataAsOf; no dated code snapshot Provenance implies an FDA date not present in the evidence Fixed in the 18 October candidate; release checks pending Unknown source/code dates stay null; capture, check and build remain separate

| SCI-236 | Medium | PIV supplied date text displayed/exported as blank | Captured piv:20 supplies Pre-MMA, with a correctly null ISO date | Text is mistaken for absent source data | Fixed in 18 October candidate on CSO follow-up; release checks pending | Preserve all five source date texts separately from parsed ISO; unplaced rows stay unplaced | | SCI-237 | Medium | NCE-1 duplicated in protection view, inspection rows and CSV | trace.nce1 already points to an R4 entry in trace.dates | Duplicate listed fact and inflated count | Fixed in 18 October candidate on CSO follow-up; release checks pending | Use trace.dates alone for row collections; retain nce1 only as latest summary pointer | | SCI-238 | Low | Stage E's ChEMBL fallback test fixture pairs a real ChEMBL id with a structure ChEMBL does not record for it | e2e/molecule-workbench/origin-save.spec.ts:17,39 returns CHEMBL1355736 with Cn1c(=O)c2[nH]cnc2n(C)c1=O; ChEMBL API, read 24 October 2026 (ChEMBL_37), records CHEMBL1355736 as the monohydrate Cn1c(=O)c2nc[nH]c2n(C)c1=O.O, parent CHEMBL190. The production route returns ChEMBL's own canonical_smiles (src/app/api/search/molecule/route.ts) | A test described as production-shaped teaches a wrong id–structure pair and does not exercise a hydrate | Fixed on claude/stage-e-finish: the fixture uses ChEMBL_37's recorded Cn1c(=O)c2nc[nH]c2n(C)c1=O.O, read on 24 October 2026; the exact-receipt round trip passes | Use ChEMBL's recorded SMILES with its read date, or a clearly synthetic id | | SCI-239 | Low | What a saved retrievedAt means is not stated, though E1 now persists it | GSRS receipts carry the curation date 2026-10-08 (src/lib/search/curated-structures.ts), not the lookup time; ChEMBL receipts carry the client clock at lookup (use-workbench.tsx), while the server caches ChEMBL responses (revalidate: 86400), which Next.js may serve stale after a day and keeps when revalidation fails | A scientist citing a reopened receipt may take either date as the moment the source was read | Fixed on claude/stage-e-finish: a Molecule limits line states each origin's date meaning, and app-molecule.md explains it beside the origin list. The ChEMBL wording, first "kept for up to a day", was corrected on 24 October 2026 to "usually less than a day before but possibly longer" (the CSO's closing review of Stage E) | Add a limits line and a methods sentence stating each origin's date meaning | | SCI-255 | Medium | Molecule's Side by side comparison judged and exported scores the scorecard withholds, mixed the library's stored QED with current descriptors, and showed failed analyses as computing | CSO, CTO and CPO comparison memos of 23 October 2026 (source findings at views/bench/compare.tsx and exports.ts before E2): Rule of 5 for every column without the organic-domain gate; picked QED from drug.qed; Column dropped error state, so a failed pick pulsed for ever; the CSV labelled picked rows chembl and had no reasons | A scientist could read a pass/fail or QED for a structure the method does not apply to, or a stored library QED as a current result | Fixed on claude/stage-e-finish (E2): comparison-model.ts and use-comparison.ts give the table and CSV one snapshot with explicit states, reasons, the domain gate and both sources; regression-first semantic tests (10) and four browser cases | — | | SCI-256 | Medium | Molecule's walk example series was kept as a note without its results while the screen said it was saved | CSO memo docs/board/memos/2026-10-24-cso-molecule-e3-e5-contract.md (E3 point 8): loadExampleSeries wrote the note with results: null before describing and set savedRef, so the panel showed "Saved in this browser" and the "Recorded results … not recalculated" line; reopening the note read it as withheld ("lacks a verified … receipt") though nothing was withheld | A scientist reopening the walk's series saw its results withheld, and an export of that note would have carried no results | Fixed on claude/stage-e-finish (E3, 24 October 2026): views/bench/series-example.ts keeps the note as pendingNote while describing and completeExampleNote writes the described record into it once (only while it still holds the same table and mapping without results), then marks the series saved; the CPO's choice (a), docs/board/memos/2026-10-24-cpo-molecule-e3-e5-strings.md | — | | SCI-261 | Low | Molecule's series table shows ethanol's Crippen logP as "-0.00" | CDO memo docs/board/memos/2026-10-24-cdo-molecule-e3-e5-built-review.md (condition 6; frame docs/progress/molecule-stage-checks-2026-10-24-e3-e6/frames/e3-0-ready-table-1440-light.jpg, row S9): a value that rounds to zero keeps its minus sign through toFixed(2) in views/bench/series.tsx | A reader may take a signed zero for a measured negative logP | Fixed, 24 October 2026 (the CSO's ruling in docs/board/memos/2026-10-24-cso-molecule-stage-e-closing-review.md): a value that rounds to zero at the shown precision displays "0.00", never "-0.00" — the series table's f2 (views/bench/series.tsx) and formatValue (science.ts, signDisplay: "negative"), which the scorecard and comparison use; the CSV keeps the record's full-precision number | — | | SCI-280 | Medium | The series ZIP credited every row of an example-sourced series to ChEMBL, under the neighbour library's receipt | CSO memo docs/board/memos/2026-10-24-cso-molecule-stage-e-closing-review.md (E3): rowSource: () => (now.record.source ? "chembl" : "rdkit") in src/apps/molecule-workbench/exports.ts tagged every row of an example-sourced record, including an edited (derived) example and a row the person added, as ChEMBL ("ChEMBL 37 (CC BY-SA 3.0)"); the rows' source_version and retrieved_at_utc were the neighbour library's receipt (2026-09-28), not the example's (CHEMBL1134804, retrieved 2026-10-11); the README's "copied from the record" left out the five provenance columns | An export credited a person's own or changed rows to ChEMBL, and dated the example's rows wrongly | Fixed on claude/stage-e-cso-close (24 October 2026): series-evidence.ts seriesRowProvenance builds the five columns from the row's own origin (an unchanged example's ChEMBL receipt, otherwise RDKit); the README names where they come from and a changed example's line carries the share-alike notice; series-evidence.test.ts checks both cases and classifies every CSV column as copied (equal to its record path), worked out, or provenance | — | | SCI-281 | Low | A series row's hand-off carries no series note, row number, recorded versions or library receipt | CSO memo docs/board/memos/2026-10-24-cso-molecule-stage-e-closing-review.md (E4; the CSO's E4 contract, point 4): seriesRowPayload (src/apps/molecule-workbench/series-objects.ts) sends the CompoundPayload only; docs/technical/app-molecule.md states the gap | A receiving app cannot trace a compound back to the series row and the methods it was described under; low risk, since Calc recomputes the weight from the formula and labels the retained figure "reported" | Open; for the CTO (payload field or recorded gap) | Carry the series ref, row, versions and receipt in the hand-off, or keep this as a recorded limit | | SCI-282 | Low | Current-rule overlays on retained series results are not labelled in the series table | CSO memo docs/board/memos/2026-10-24-cso-molecule-stage-e-closing-review.md (the CSO's E5 contract, point 4): the table judges the Rule of 5 through lipinski() and QED applicability through domainOf (views/bench/series.tsx) under today's rules, beside results retained under recorded versions | A reader may take a current-rule judgement for part of the retained record | Open; the CPO words the label | Label the overlay columns as current rules (the ZIP README already says QED applicability uses today's domain rule) | | SCI-283 | Low | The search index resolves "Theophylline" to the hydrate CHEMBL1355736, not the parent CHEMBL190 | CSO memo docs/board/memos/2026-10-24-cso-molecule-stage-e-closing-review.md (carried from the CSO's Codex review memo; one ChEMBL API read on 24 October 2026): public/data/search/compounds.e83eedfbcc1e.json | A name search lands on a hydrate record rather than the parent compound | Open; entity resolution, verified by one API read only | Re-check the index build's name-to-parent mapping and rebuild if confirmed |

Data and licensing

Facts only; every legal conclusion is held for the General Counsel (D-0010). Sources and licences per app are in Data sources; dependency licences in Dependencies and licences.

Id Severity Description Evidence Impact Status Suggested fix
DAT-01 High The Pipeline example snapshots retrieved 17 October 2026 expire on 16 December 2026 and break npm test from 3 December 2026 See Dates that will break something Pipeline's offline fallback and the landing examples disappear; CI goes red on every branch Open; refresh workflow exists. Headline dates reconciled 25 October 2026 against the current pinned captures and the Dates table; no retrieval date or threshold was changed. Merge the 1 November snapshot pull request and redeploy; confirm the monthly workflow keeps running
DAT-02 Medium The FDA precedent snapshots need a refresh before 21 December 2026 and go stale on 3 January 2027 See Dates that will break something npm test fails; the precedent view shows a stale notice Open Same workflow; review row counts, dates and checksums before merging
DAT-03 Medium Europe PMC, OpenAlex and the Anthropic API are contacted without a registry entry, licence id or read date (audit M2, Q-26) No match for api.openalex.org, api.anthropic.com or the Europe PMC REST host in content/; calls in src/lib/literature/ and src/app/api/literature/ The generated hosts and privacy pages cannot say that search text goes to EMBL-EBI and OpenAlex or that selected private Study text goes to Anthropic Accepted for now by the CEO on 10 October 2026; Q-26 open with the CTO Declare the literature workspace's hosts and sources in the registry (or a non-app registry), before the pre-live pass
DAT-04 Medium ChEMBL-derived names (CC BY-SA 3.0, ChEMBL 37, 16,784 entries) are served as a public file, with the attribution and share-alike notice in a separate sources.json rather than in the file public/data/search/compounds.e83eedfbcc1e.json; public/data/search/sources.json; docs/board/memos/2026-10-10-cto-search-catalogues-out-of-the-bundle.md. Q-26 still names src/lib/search/compounds-data.ts, which no longer exists Share-alike terms may attach to a publicly served derivative; the names reach the palette, object pages, reagent picker and literature strategy without the notice on those surfaces Held for the General Counsel (10 October 2026) Counsel to advise on attribution inside each file and on share-alike scope; update Q-26's file reference
DAT-05 Medium Whether a paid Molecule bundle may include ChEMBL share-alike data Q-03; flags.shareAlikeData: true on Molecule Constrains pricing of Molecule Held for the General Counsel
DAT-06 Medium ClinicalTrials.gov terms ask that static copies not be made; the app keeps dated snapshots and per-object facts Q-09; the held item on Pipeline's objects (src/apps/drug-pipeline-explorer/objects.ts, src/components/suite/objects/facts.ts) A history-dependent or synced feature could fall outside the terms Held for the General Counsel
DAT-07 Medium Third-party terms awaiting review: the WHO stem book (CC BY-NC-SA 3.0 IGO, downloaded weekly by verify_stems.py for a reference check), REBASE's conditions for Plasmid, the Drug Repurposing Hub's non-commercial term beside PRISM 19Q4 in the guided walk, FDA complete response letter PDFs that name individuals (H-01 to H-09), and public-claim wording in several memos "Held for the General Counsel" in docs/board/open-questions.md Any of these could require removing or rewording a feature before sale or launch Held for the General Counsel
DAT-08 Medium Dependency-licence allow-list additions and exceptions: Zlib (pako via 3dmol), Python-2.0 (argparse via molstar), caniuse-lite (CC BY 4.0), three @img/sharp-libvips binaries (LGPL-3.0-or-later, server side, no licence text shipped; the count corrected on 17 October 2026); MPL-2.0 and BlueOak development dependencies reported ALLOWED_ADDITIONS and EXCEPTIONS in scripts/licences.mjs; held list Exceptions to the "permissive licences only" rule Held for the General Counsel
DAT-09 Low The three web fonts are downloaded at build time from Google Fonts and are outside the licence check src/lib/fonts.ts:1 (next/font/google: Inter, Bricolage Grotesque, IBM Plex Mono); no font handling in scripts/licences.mjs or scripts/notices.mjs Font licences are not recorded in the repository or in public/third-party-notices.txt Fixed, 17 October 2026 (enterprise review housekeeping, F1): fonts.ts loads four families (Source Serif 4 since 13 October); all four are recorded as OFL-1.1 in FONT_LICENCES (scripts/lib/licence-texts.mjs), with each family's OFL text copied verbatim from its own repository (URLs and read date in that record and in Dependencies and licences) under scripts/licenses/, and written into the notices file's "Fonts" part; scripts/licences.test.mjs fails if fonts.ts imports a family without a recorded licence. The intended credit line (docs/design/prd-inside-a-cell.md) is still not in any content file Record the font licences and add their texts to the notices
DAT-10 Low Search catalogue provenance gaps public/data/search/sources.json records no UniProt release and no licence-read date; GSRS carries licence id cited-data (read 2026-10-08) Weaker provenance than the project rules ask for Confirmed, open Record the UniProt release and read dates; classify GSRS
DAT-11 High AlphaMissense licence: the Zenodo bulk file's header states CC BY-NC-SA 4.0, while the registry records CC BY 4.0 for the AlphaFold DB per-protein CSV the app reads, and the product page says the scores allow commercial use pipeline/protein-explorer/fixtures/alphamissense-source/2026-10-11/about.json; content/apps/protein-explorer.ts (sourceMeta.alphamissense, page); held item in docs/board/open-questions.md (11 October 2026) If the per-protein CSV carries the non-commercial terms, the per-residue means and the Wave 4 substitution check need a rewrite at the pre-live pass (permissive-licence rule) Held for the General Counsel and the CEO Read AlphaFold DB's terms for the per-protein file; decide before any paid tier shows AlphaMissense
DAT-12 Medium BLOSUM62 ships in the alignment worker generated from NCBI's file with no licence record; whether the copy may name EMBOSS Needle's convention (the licence scan forbids GPL tool names in src/ and content/) src/lib/protein/align/blosum62.ts; scripts/licences.mjs (SOURCE_PATTERNS); D-0055 Redistribution terms unknown; users cannot be pointed to the tool that reproduces the result Held for the General Counsel Record the matrix's terms; decide on a scan exemption
DAT-13 Medium ChEMBL share-alike on the walk's example series (28 CHEMBL1134804 rows shipped in content/walks/nearest.series.ts, saved into a person's browser and exported mixed with their rows) and on series exports that carry nearest-drug names and SMILES content/walks/nearest.series.ts; src/apps/molecule-workbench/views/bench/series.tsx (seriesCsv); CSO pre-rulings ruling 4 Share-alike terms may reach a person's export Held for the General Counsel (relates to Q-03)
DAT-14 Medium A frozen ClinicalTrials.gov search is kept as a test fixture, against the terms' "no static copies" wording; individual sponsors can be named in Pipeline's on-screen sponsor chart and Sponsors CSV (only the exported figure groups them) pipeline/drug-pipeline-explorer/fixtures/ctgov/cystic-fibrosis@2026-10-11/manifest.json; aggregate.ts (sponsors against figureSponsors) Terms and personal-data exposure Held for the General Counsel (relates to Q-09, DAT-06)
DAT-15 Medium The Stage I-0 capture's three FDA sources (Orange Book data files, Purple Book download, Paragraph IV list) have no licence classification or attribution line yet, and their URLs, file names, headers and refresh cadence were written without reading the sites pipeline/patent-exclusivity/capture.py (SOURCES); the parsers' expected headers and synonyms in src/lib/exclusivity/parse.ts and pipeline/patent-exclusivity/trace_reference.py, written the same way; fda.gov, purplebooksearch.fda.gov unreachable from the build environment on 13 October 2026 A wrong URL makes a source fail on every run (logged; the watchdog in scheduled.yml then fails); a Paragraph IV list served as a PDF is kept as a binary on change, which the CTO's rule allows only on change Partly fixed on 14 October 2026: the Orange Book zip and its three files' headers are confirmed (first run); the Paragraph IV list is found on "Patent Certifications and Suitability Petitions" (an XLSX, media/194880 on 14 October) and the Purple Book's newest monthly CSV on its downloads page (served from accessdata.fda.gov), both cut at their real header row, with the spreadsheet's day-number dates and the Purple Book's "License Type" read by both parsers (runs 2 and 3 on the branch). The 18 October pinned archive confirms all five member hashes/headers and 27 heartbeats over four days, with no raw-source hash change. General FDA policy reread 18 October; classification and attribution stay held for the General Counsel Classify the sources at the go-live review; record the real cadence after 30 days
DAT-17 Low Cellosaurus (E10) is served as a reduced snapshot under CC BY 4.0, read on its description page and its release file's header on 17 October 2026; the licence class and the attribution and changes-made wording (content/apps/services.ts, cellosaurus; snapshot.json's attribution) are not yet on the held list, which the F track holds while it runs docs/technical/data-sources.md ("Cellosaurus: the cell line records"); the CPO's and CTO's memos of 17 October 2026, "Held for the General Counsel" None in development (D-0014); a pre-live item Open; to be added to "Held for the General Counsel" in docs/board/open-questions.md The coordinator adds it to the held list when the F track's edit lands
DAT-16 Medium The Patent app ships a synthetic store: every row under public/data/patent-exclusivity/ is invented in the FDA file layouts (pipeline/patent-exclusivity/fixtures/synthetic/, built by build-store.py --synthetic), so no date the app shows is the FDA's until the first capture is built into a store src/lib/exclusivity/store-manifest.ts (STORE_KIND = "synthetic"); the notice on every screen, the chip's "Synthetic example" label and the capitals line in every export README; landing: false in the registry entry A reader who misses the notice reads invented dates; the examples and the browser tests name invented products Fixed in 18 October candidate: pinned real store, all source rows conserved, all catalogue dates checked, real examples and alpha listing restored. Merge checks pending; incomplete fixture/reviewer prerequisites remain SCI-124 After the first capture: build-store.py --data-dir on a checkout of data/exclusivity, the real fixtures F1 to F7 transcribed write-once, the examples in content/apps/patent-exclusivity.ts replaced by real products, landing restored

| DAT-18 | Medium | Historical Purple Book capture keys split CSV rows on raw commas | The independent 18 October source reference finds 994 semantic/capture-key mismatches at 2d0b7be9; CSO identity addendum | Historical diff keys cannot be assumed identical to parsed source row keys | Open; exact member/line/raw row and both key forms retained in the new fixture | Correct future capture diffing with an explicit key-format transition; preserve previous captures; do not count this as F8 |

Reliability

Id Severity Description Evidence Impact Status Suggested fix
Id Severity Description Evidence Impact Status Suggested fix
REL-01 Medium npm test depends on the calendar, although the staleness script's comment says a wall-clock assertion is deliberately kept out of npm test scripts/snapshot-staleness.mjs:8-14 ("deliberately not part of npm test ... The unit tests pin the rule itself with fixed clocks"); src/components/tools/drug-pipeline-explorer/precedent/snapshot-age.test.ts:33-46 compares the shipped snapshots with Date.now() Every branch and pull request turns red on 21 November 2026 with no code change; the CI-green release gate stops meaning "the code is right" Confirmed, open. Build, test and CI and Data pipeline already describe the actual behaviour Move the two date assertions to the scheduled job (or pass a fixed clock) and keep the comment true
REL-02 Medium Scheduled workflows depend on repository settings and activity .github/workflows/scheduled.yml:7-10: they run from the default branch only, are disabled after 60 days without activity in a public repository, and notify the person who last edited the file. snapshots.yml needs Actions to be allowed to create pull requests Snapshot refreshes and verify checks can stop silently after a change of owner Open (recorded) Check the settings on transfer; make a team member the last editor; monitor the step-summary heartbeats
REL-03 Medium The current CI and browser-test state was not established for this page Last records: every main run failed or was cancelled from 8 October to the audit at a1aac9f; repairs merged at 58cf841; the UX audit's integration tree had 70 desktop browser failures, 58 of them also on main at 1ff7ca6, with a re-run "in progress"; later commits repaired specs (09b311b, 12fff99, 57d6247) A buyer cannot assume a green tree Unverified Run ci.yml on the handed-over commit and record the result beside the review that names it
REL-04 Medium Request limits and caches are per server process, not per deployment reserveExtraction keeps its counters in a module-level Map (src/lib/literature/extraction-access.ts:21-33); the semantic-search burst slot and 5-minute cache are module variables (src/app/api/literature/route.ts:11-12,32-37); the Europe PMC burst guard is in memory (src/lib/literature/search/quota.ts:54). .env.example calls the AI cap "Per-process protective request cap, not a distributed billing limit" On a host that runs several instances the effective limits multiply, including the Anthropic call cap once hosted AI is enabled. Hosted OpenAlex search uses the shared Supabase counters only when LITERATURE_SEARCH_SHARED_QUOTA=1 Confirmed, open (documented behaviour) Use the shared quota store for AI calls too, or set spend limits with the provider
REL-05 Medium Bundle and load-time budgets are over their release targets D-0048: 14 budgets hold interim ceilings with releaseKB targets; UX audit: Bench still loads about 1.2 MB of gzipped JavaScript; scientific audit section 1: the Assay two-second gate failed at 4,095 ms on CI and the Assay workspace chunk measured 1,092 KB against 120 Slow first loads; the pre-live pass must meet the targets or re-rule them Open (recorded); current sizes not measured here Steps 5 to 11 of docs/board/memos/2026-10-10-cto-remaining-size-budgets.md; lazy catalogue loading
REL-06 Low The Bioreactor worker timing gate cannot give a conclusive result on two-core CI runners D-0047; docs/NEXT.md; the worker-gate job in scheduled.yml A release needs a passing quiet-host report from the last seven days, obtained by hand Open (recorded). 24 October 2026 (Stage H BR1.8, the CTO's memo of that day, §2): the last scheduled run (19 October, run 39240124433, 2 cores) was inconclusive on every set because the one-minute load before each set still carried the build, the warm-up and the previous set. The spec and the workflow now settle before measuring (poll every 15 s, up to 180 s, until load ≤ 0.75 × cores, wait recorded), and workflow_dispatch with only: worker-gate runs the gate alone. Next: one to three dispatches on main's head once this lands; a decisive first-change median over 2,000 ms is a performance defect that holds B2's merge; if three stay inconclusive, a 4-core session host runs npm run test:perf:worker and commits the report (§2(e)) Keep the weekly job; run the gate on a quiet machine before each release
REL-07 Low pipeline/education/verify.py is not in the scheduled.yml matrix, although the workflow's header comment and the README say every pipeline/*/verify* script runs weekly .github/workflows/scheduled.yml:1-2 and matrix at lines 63-93; README.md:75. The script checks local media files and needs Pillow and imageio_ffmpeg A regression in the Education media manifest or files is caught only if someone runs the script by hand Confirmed, open Add a matrix entry with those packages, or correct the comment and README
REL-08 Low A production build needs network access to Google Fonts src/lib/fonts.ts:1 Builds in a network-restricted environment depend on that host; the data-pipeline principle "nothing is fetched at build time" applies to data only Confirmed Self-host the font files with next/font/local if offline builds matter 17 October 2026, three times in one evening on GitHub's runners: the Room candidate's matrix shard 7 (run 39050176447) and the Gel candidate's shard 7 (run 39057563316) died at build before any test ran, Turbopack unable to resolve next/font/google (Source Serif 4), and main's own Fast chain on 0674e345 (run 39078713374, Gel's landing) failed at npm run build the same way although the identical commit had built green on the candidate branch minutes earlier (run 39077493630). So this is no longer only a restricted-environment concern: a Google Fonts fetch failure can turn main's record line red on a commit whose candidate run is green. The Stage C coordinator re-ran the failed job once (the one re-run the merge rules allow for a failure before any test body); attempt 2 was green at 23:55 UTC, so main's record line for 0674e345 is green and the failure was the fetch alone. The fix is the CTO's: self-host the three fonts (the licence texts are now vendored under scripts/licenses/, so the licence-check objection in DAT-09 is answerable) or make the build tolerate the fetch failure with the fallback stack
REL-09 Low The prebuild step rewrites a committed file with machine-dependent values scripts/prebuild/bioreactor-simulator-preset-runs.mjs writes public/data/bioreactor-simulator/preset-runs.json; the audits recorded closure residuals differing around 1e-14 between machines A build leaves the working tree modified; a careless commit churns the file Fixed 24 October 2026 (Stage H BR1.7, the CTO's memo of 24 October 2026, §5): buildPresetRuns rounds carbonClosure and electronClosure to an absolute 1e-9 before round6 (CLOSURE_STEP, roundClosure in preset-runs.ts), so the file's bytes no longer depend on the machine; the prebuild prints its SHA-256 (ac44732a… on the session host, 4 cores, Node 22.22.0) for comparison with a CI log; preset-runs.test.ts checks the grid. The preset pages say "closes within 10⁻ⁿ" (the CSO's ruling A6) Confirmed byte-stable 24 October 2026: the Fast chain build of 36929bb4 (run 40086036121, GitHub's ubuntu-24.04 runner) printed the same SHA-256, ac44732a4cf5399a925526c28eee6e03b14b4a9f433cb65498b9777ba06ce70b, at 10:43:28 UTC, as the session host (4 cores, Node 22.22.0) wrote on a95c5969. Closed
REL-10 Low The consultancy site's consumer of /landing.json may not understand export version 3 LANDING_EXPORT_VERSION = 3 (src/app/(marketing)/landing-data.ts:29); docs/NEXT.md, "Integration and pre-live decisions" mbio.tech/apps keeps its last compatible snapshot and stops reflecting changes Unverified Confirm with the consultancy repository's owner
REL-11 Low sequence-island-protein-mw-pi measured 42.3 KB against its 42 KB budget after the Wave 3 merge Reported by the integration run (not re-measured here; no build was run for this page). Attributed to Turbopack regrouping shared chunks that hold byte-identical modules, not to a change in the island; the budget is in scripts/size-budgets/sequence-toolkit.json The CI size check (npm run size-check) fails on it, beside the budgets already over; under the CTO's baseline rule a green budget turning red counts as a regression Budget widened from 42 to 44 KB by the CTO under D-0047 on 11 October 2026 (measured 42.4) Find which shared modules moved (compare --json records before and after the merge) and split or pin the chunk at the pre-live pass
REL-12 Low The protein-align timing gate can be inconclusive on a loaded two-core host e2e/perf/protein-align.spec.ts; docs/board/memos/2026-10-11-cto-rel12-protein-align-gate.md; D-0047 A release needs a quiet-host pass within seven days (as REL-06) 11 October 2026, CTO ruling under D-0047: moved from npm run test:perf to the scheduled.yml worker-gate matrix on its own runner; target and guard unchanged; release needs a quiet-host pass within seven days (as REL-06). Severity Low. Keep the weekly job and obtain the quiet-host release report
REL-13 Medium Browser failures carried as pre-existing through the Wave 4 merge: 17 failures across Pipeline exports.spec.ts, shell-focus.spec.ts, workspace.spec.ts and Molecule workspace.spec.ts (phone and desktop), also failing at the wave's base 83d1e09; Protein home, dossier and workbench phone failures and a flaky toggle.spec.ts at the base docs/progress/wave4-discovery.md ("Merge review conditions", CTO-1; steps 1 to 4) The e2e suite is not green; new failures are hard to see among old ones Open (recorded) Fix or quarantine them with named owners before the pre-live pass
REL-14 Medium A transition started inside a closed <details> never finished, so a page holding one never settled. Chromium does not advance animations in a closed disclosure's hidden content; on Sequence's Primer check task page the GenBank and provenance download keys (inside "Sequence and provenance") began their colour transitions when the example enabled them e2e/smoke/apps.spec.ts:56 timed out in settle() in CI (desktop, desktop-dark) and in 8 of 10 parallel local runs; a probe found only those keys' transitions unresolved, playState "finished" with the finished promise pending The smoke and layout checks could not run on the page; any disclosure holding a key could do the same Fixed on 11 October 2026: tokens.css turns transitions off inside a closed disclosure None
REL-15 Medium After a search that found nothing, Pipeline returned focus to its re-mounted field, focus opened the suggestion list, and the list covered the "No condition or trials match" line and its "Did you mean" key e2e/drug-pipeline-explorer/workspace.spec.ts:98 (DISC-6): the list heading intercepted the click in CI (desktop, desktop-dark), reproduced locally A person had to dismiss the list to read the message or take the suggestion Fixed on 11 October 2026: SuggestionInput takes openOnFocus, false in Pipeline while the message or an error stands, and closes the list when Enter submits the typed text None
REL-16 Medium The research rail does not fit a laptop window: its list of 14 destinations is 779 px tall, so at an 880 px window the Cell tile (740–790 px) sits under the rail's footer and at 768 px Plasmid, Bioreactor and Cell are hidden behind it; when Cell is the current app the Bench tile scrolls out of view instead UI design review UI-01: nav[aria-label="Research workspace"] scrollHeight 779 at 1408 × 880 and 1366 × 768; docs/reviews/2026-10-11-ui-design-review/bench-1366.jpg shows the rail ending at Assay; content/apps/workspace-navigation.ts (the list), src/components/suite/shell/research-navigation.tsx Three of the nine apps are not visible in the primary navigation on a 13-inch laptop; the fade is the only cue that the list scrolls Fixed on 11 October 2026 (5c694e7): 64 × 40 tiles, Studies and Objects as rows under a pinned Bench tile, the list scrolling on its own under it, and a one-row footer; at 1366 × 768 every destination and the footer are in view (research-workspace.spec.ts) None
REL-17 Medium Sequence's Complement and Reverse result panels clip their 60-character numbered lines at the panel edge, so the last block of each line is cut off on screen while the Reverse complement panel above them, at full width, is whole UI design review UI-20: docs/reviews/2026-10-11-ui-design-review/sequence.jpg (Transform tab, 333 bp circular DNA at 1408 × 880); src/components/tools/sequence-toolkit/panels/revcomp-panel.tsx A person reading the complement or reverse from the screen sees a truncated sequence; copying is unaffected Fixed on 11 October 2026 (5c694e7): SequenceBlock measures its box and writes whole ten-letter blocks that fit (lettersPerLine, 10 to 60 letters a line), so a half-width panel wraps at 20 or 30 letters None
REL-18 Low The compact rail could leave its sole roving tab stop on Bench outside the scrolling list, with every destination inside at tabIndex=-1; shorter available columns exposed scrollable-region-focusable. The earlier conditional container stop mitigated overflow but could add a second stop UI-04; research-navigation.tsx, rail-column.tsx; e2e/smoke/stage0-accessibility.spec.ts Keyboard users must reach every destination, with its focus ring clear of pinned content Fixed on 11 October 2026: the sticky Bench group is inside the scroller, every roving stop belongs to it, no extra container stop, and focused destinations are revealed below Bench and above the bottom fade. Focused checks pass across all three projects at 1366 × 600 Retain the one-stop, Home/End, wrapping, pinned-Bench and axe checks
REL-19 Medium The unregistered inspector-default and limits relocation change left Assay's C50 summary in Tm/Km modes, orphaned Protein footer copy, a dead Pipeline notice prop and two specs accepting either inspector default CPO inspector-and-limits memo of 11 October 2026; b9898b99 A method-specific limit could misdescribe the active analysis, and tests no longer protected the chosen default Fixed by the CEO-approved CPO amendment (D-0060): hidden shell default with conditional Calc/Sequence opt-ins, one above-work notice, dose-response-only summary, collateral removed and strict initial-state assertions Keep mode-specific summary and explicit inspector-choice coverage
REL-20 Medium UI-05 placed an interactive expansion button inside a command-palette listbox option command-palette.tsx; e2e/smoke/stage0-accessibility.spec.ts; CPO and CTO Stage 0 browser-repair memos Invalid nested interaction obscured the accessible command route Fixed on 11 October 2026: flat command options, a non-interactive pointer affordance, and an accessible description of expansion state and Right/Left keys; focused pointer, keyboard and axe checks pass in all three projects Retain focus in the combobox and keep both expansion routes covered
REL-21 Medium Two chunk budgets named the Wave 8 evidence writer's marker (drybench-export:bioreactor-evidence), which Turbopack emits in two copies, so both reported "unmatched" and size-check failed Found 12 October 2026: the writer is imported on intent from workspace-adapter.ts, measured-review.tsx and Assay's growth-panel.tsx; copies of 1.1 and 2.6 KB The size check could not pass on main whatever the code did Fixed 12 October 2026 as configuration on claude/main-green-fast-chain: one chunk-family budget, bioreactor-evidence-exports-family, 4.3 KB (3.7 measured), CTO addendum ruling 2 None
REL-271 Medium size-check's chunk kind looked for the marker's list only among lists written in the route's own first load; since the redesign's on-demand shell every workspace is loaded by a chunk itself loaded on demand (for most, the app's definition chunk), so 18 budgets reported "loaded by N different chunk lists" and measured nothing measureChunk in scripts/size-check.mjs (the one-level inRoute filter); measured on 000a4206, 17 October 2026: 18 unmatched of 144; Plasmid's workspace marker in one 37.2 KB chunk loaded by nine lists (154.1 to 205.0 KB), none of whose loaders was in /[app]/app's first load; the CTO's ruling of 17 October 2026, addendum A2 (REL-21 the precedent) The workspace ceilings could not be read: 18 rows red whatever the code did, and a figure such as "195.1 of 196" held for one import context, not provably for the one the route loads Fixed 17 October 2026 on claude/ci-heap-2026-10-17: the closure from the first load picks the reachable list, the largest named in the row's detail when more than one is reachable; on 000a4206 0 unmatched, each of the 18 resolving to one reachable list (docs/progress/stage-c-ci-heap.md). Six now read over their ceilings (Build, test and CI, "Size budgets"); owner the CTO The six over rows are size work for their apps' owners; no budget was changed with the fix Numbering, 17 October 2026: this row was filed as REL-207 by the CI heap track at 11:43 UTC, the next free number on origin/main then; the review branch had taken REL-207 at 08:30 for its ownership-test row and reached main later the same day, so main carried two rows under one id (found by the Room track at 16:22). Renumbered to REL-271 by the Stage C coordinator; the CTO's memos of 17 October and the CI heap record cite it as REL-207 and are not edited
REL-22 Medium sequence-island-primer-design measures 47.6 KB against its 40 KB budget on main (48.8 KB on 13 October 2026 after D-0083's shared glyphs and stat-card tile) size-check on the repaired head, 12 October 2026; the trim ruled on 11 October (35.1 KB on the Wave 6 branch) did not reach main; bisect dcd4cf0 and c7735b9; the static imports at src/components/tools/sequence-toolkit/islands/primer-design.tsx:17-18 The plain size check fails; the stage gates on --baseline (PRC-13) Fixed 12 October 2026 on claude/sequence-wave6-debt: the panel's walk binding (useRecordDraft, useWalkAction and the walk copy, the panel's static imports at lines 17-18) moved to primer-design-walk.tsx, which only the workbench wrapper passes in; the island measures 36.5 of 40 KB, the budget unchanged; the extinction island 41.7 of 42 KB, no trim needed —
REL-23 Medium plasmid-construct-admission-worker measures 30.7 KB against its 20 KB budget on main size-check, 12 October 2026: 4.9 KB runtime and bootstrap, 10.2 KB the worker's own code, 15.6 KB of shared modules loaded again into its scope; diagnosed 17 October (the CTO's memo docs/board/memos/2026-10-17-cto-worker-row-the-ranking-quantity-and-the-admission-fix.md, item 3) and re-measured 20 October by Stage C at 31.7: one equality check in the PCR product reader (canonicalJson from contracts.ts) pulled the object references, URL state, route map, maker and search catalogues into the worker, and the reader modules carried their writers (genbank-write.ts, data/csv.ts, form/format.ts). The gate on main's code before the fix (the Fast chain's size-measurements for bf5a8c5a): 32.3 KB of 20 The plain size check fails; the stage gates on --baseline (PRC-13) Fixed 21 October 2026 on claude/sequence-rel23-worker (the Sequence stage, owner of the fix under the CTO's ruling; Stage C keeps the row's verification): 13.3 KB of 20 at the gate The CTO's shape, done: canonicalJson, contentHash, assertJson and WorkspaceValidationError moved unchanged to the dependency-free leaf src/lib/workspace/canonical-json.ts, re-exported by contracts.ts; pcr-product.ts imports the leaf (the validating version, not content-hash.ts's lighter one: REL-266); the writers moved to pcr-product-writers.ts and primer-set-csv.ts. The worker's list is its own chunk (8.5 KB gzip, 14 modules: the PCR, primer-set and design readers, the methods, the leaf) and the runtime (4.3). src/apps/plasmid-map/construct-admission-worker-imports.test.ts walks the worker's static imports and fails if any of contracts.ts, refs.ts, url-state.ts, routes.ts, maker.ts, src/lib/search/, form/format.ts, data/csv.ts or genbank-write.ts comes back; on main's code before the fix it names all of them. The budget stays 20 KB
REL-24 Low readAssayData refuses an assay with an unreadable figure block without naming why, so a figure from a newer build and a corrupted figure are indistinguishable The architecture record of 12 October (docs/design/assay-stage/architecture.md §1) and the CTO's rulings on it (docs/board/memos/2026-10-12-cto-architecture-rulings.md, "The two section 1 findings"): src/components/tools/assay-analyser/model.ts:546-548 returns null for every refusal A project file written by a newer build is refused with no explanation; the strict refusal itself is the suite's rule and stands Fixed 12 October 2026 on claude/assay-foundation-1: readAssayDataStrict names every refusal (A-0 commit 1) and the project-file open shows the CPO's sentence for each, "Made with a newer version of {appName}; update the app to open it." for a newer record or figure (A-0 commit 2b) readAssayDataStrict with the codes figure-newer (refused with the "made with a newer version" sentence) and figure-malformed (refused, named), in the commit that completes record version 6
REL-25 Medium Plasmid's "Views" tablist has seven tabs where e2e/plasmid-map/navigation.spec.ts:23 expects six, so the navigation test fails in all three projects CI run 38234867635 on e7af614 (12 October 2026), the first browser run after the fast chain was repaired (PRC-12): "13 × locator resolved to 7 elements" A seventh view reached main under the 11 October merges without its test; the continuity checks behind the count (panel, map and working controls kept alive, URL settings restored) do not run until the count is corrected Fixed on claude/baseline-green (13 October 2026): the seventh view is Assembly, added by Wave 6 (c7735b92, VIEW_IDS in content/apps/plasmid-map.shell.ts) and meant to ship. The test now expects seven tabs with that commit cited, and End lands on Assembly. Its continuity assertions (panel, map and working controls kept, URL settings restored) run and pass on desktop, phone and desktop-dark; its baseline rows are removed Name the seventh view in the test with the commit that added it and re-check the continuity assertions, or remove the view if it was not meant to ship
REL-26 Medium e2e/bioreactor-simulator/measured-review.spec.ts:191 imports src/apps/bioreactor-simulator/evidence-export into the test runner with a dynamic import(), and the runner fails with "Cannot use import statement outside a module" in all three projects CI run 38234867635 on e7af614; the test arrived with the Wave 8 checkpoint 744f48e The guard it was written for (a delayed import cannot replace edits made after it started) is unverified in the browser Fixed on claude/baseline-green (13 October 2026): the spec imports growthReviewForExport statically, which Playwright transforms with the spec; a dynamic import() of a .ts file was left to Node, which read it as CommonJS. The test's assertions are unchanged and pass on desktop, phone and desktop-dark; its baseline rows are removed Build the expected review inside the page (page.evaluate) or from a fixture rather than importing app code into the runner, or make the module loadable under Playwright's transform
REL-27 High 31 Plasmid browser failures across assembly.spec.ts (:109, :299), cloning-walks.spec.ts (:47, :65, :87, :100, :123), sequence-handoff.spec.ts (:53, :75, :96, :130) and tasks.spec.ts:261 on desktop, phone and desktop-dark: 29 recorded from run 38234867635, and assembly.spec.ts:109 and cloning-walks.spec.ts:65 on desktop-dark added by the CTO's ruling of 12 October (docs/board/memos/2026-10-12-cto-growing-the-browser-baseline.md) after run 38256981079 failed them on both attempts where the recording run's retry had passed them; cloning-walks.spec.ts:47 on desktop-dark has passed only on a retry so far and is listed as flaky CI run 38234867635 on e7af614: the twelve PRC-12 recorded as remaining open, now seen in every project; the Wave 6 merges 0b3bc37 and c7735b9 (11 October) landed without a run. Two causes read from the log: the walk's Next control is disabled where the test clicks it (cloning-walks.spec.ts:30, from :72), and the CRISPR task page's Limits sentence ("no expression or reaction-efficiency prediction is made") contains the word tasks.spec.ts:279 forbids The cloning walks, assembly, the Sequence hand-off and the guide-site page are untested on main until they pass Partly fixed on claude/baseline-green (13 October 2026). sequence-handoff.spec.ts (:53, :75, :96, :130) passes on all three projects; its 12 rows are removed. Causes: (1) the spec's seed wrote object rows without the store's key and before the app had created its schema; (2) the GenBank writer could split a doubled quote at a hard cut, so the next line read as the feature's location, and hard-cut a record reference that the reader then rejoined with a space (genbank-write.ts, genbank.ts, with unit tests); (3) Plasmid's inspector did not find a feature whose key holds a colon, such as a hand-off primer's, because the selection keeps the key as selectionValue writes it; (4) the export dialog names its buttons with their descriptions, the export writes features in map order, and the phone Menu sheet stays open after an export, which the spec now follows. A JSON qualifier longer than a line still reads back with spaces at its cuts, as INSDC line breaks do. tasks.spec.ts:261 passes on all three projects since the Plasmid Limits sentence was reworded by the CSO's ruling of 13 October 2026 ("nothing here predicts expression or how well a reaction will work", content/tools/plasmid-map.ts), leaving the test's ban on the word unchanged; its 3 rows are removed. assembly.spec.ts (:111, :301) passes on all three projects; its 6 rows are removed. Its two expectations follow the product, cited: restoring a saved plasmid's address reopens it through a fresh arrival while the abandoned arrival never lands (the CPO's ruling of 13 October 2026: the address is the contract), and leaving the app for the Bench replaces the document (needsDocumentNavigation), so the pending admission goes with it. cloning-walks.spec.ts is still open and stays in the baseline: after its fixes (the walk runner now waits for the action registry to settle after each action, not a fixed 60 ms, since a resumed Sequence panel remounts when its template changes and the next action reached the old one; the link bar's start control is a link; a later-step link opens as a new document; the phone Menu sheet is closed after an export; and the CPO's amendment allowing three bar rows in the changed state, with the step text kept open), a repeated run under three workers still fails some step entries (the step's target missing, or the bar in its changed state at step 1), most on phone. Instrumented on 13 October 2026: the scope epoch never changes during these runs, and the primer panel's key does not change; the failing step entries are the primer design worker's run returning nothing, either because the worker's importScripts of its own chunk fails to load ("NetworkError: Failed to execute 'importScripts' on 'WorkerGlobalScope'") or because the panel unmounts and remounts with the same template while the step is set up. With the project's default workers the spec still failed 5 of 36 runs on three projects. Since then: the primer design worker is started once more when its code fails to load, and a second failure shows the error line rather than an empty result; the step-entry actions that set a step's inputs (sequence.design-set, plasmid.assembly-set) retry their checkpoint flush over a few frames while the checkpoint takes over from the action that made the draft record; and the walk bar says when it is in the changed state (data-walk-changed), which expectPhoneBar reads. With these, the spec passed 67 of 72 runs on three projects (four repeats). The primer walk's remaining cause was found by logging (13 October 2026): a step's sequence.design-set writes the Tm conditions to the address a moment after its sequence.design-run has started, the panel's run key includes those conditions, and the key change cancelled the run with nothing. A run whose inputs change while a caller awaits it is now run again with the new inputs for that caller, and a run that supersedes another hands it its result (primer-design-panel.tsx); leaving or an account change still cancels. (The panel unmounts seen earlier are the walk's own step 3 restoring the PCR view, as designed.) After this the spec passed 66 of 72 runs on three projects, the failures now mostly the assembly walk (a step's target or label not reached), which is next; owner the lost-work builder (REL-27) Measured on d547ebf0: 54 of 54 with one Playwright worker, 50 of 54 with two (CI's setting), 63 to 66 of 72 with four; the remaining failures are races in a step's setup under load. Design (the coordinator's choice (a), 13 October 2026): step setup waits on explicit ready signals rather than timing. The signal: useWalkBusy(owner, busy) (use-walk-action.ts) registers a busy flag in the walk action registry (actions.ts: setWalkBusy, whenWalkIdle), set as the render commits and cleared on unmount. Its emitters: the primer design panel and the assembly panel, busy while a run is in flight, while inputs the walk set are not yet the panel's committed inputs, and until their checkpoint has loaded; the Sequence workbench while saved work opens; and the Plasmid workspace while a construct's arrival or analysis is pending. The walk runner, after each step action, waits until no emitter is busy, in place of the fixed settle; after 20 s (WALK_IDLE_MS) the step fails with the existing line, "That step did not finish. Try Next again, or do the step yourself." (announce.failed). Measured on 804d7666: 89 of 90 with two workers, 52 of 54 with four. The remaining assembly-walk failure (step 4's Next ends unfinished) was traced with logging: the remounted assembly panel re-runs its restored design, and run(true) cleared the selection until the result landed, so the draft's orientation went 0, null, 0 under the save step 4's keep action had started; the checkpoint refused that save as stale and the step failed. A recompute of a restored design now keeps its authored orientation throughout (assembly-panel.tsx). Measured on f4c548e0 (this fix with main merged): 180 of 180 with two workers (two rounds of five repeats on three projects), 52 of 54 with four, where the two failures are "Go to the part" not moving focus within the test's 10 s because its view action waits for the panels to go idle on a saturated four-core machine (load, not a race); 54 of 54 with one on d547ebf0. The 12 cloning-walks.spec.ts failure rows are removed from the browser baseline; its five flaky rows stay until CI shows them clean. (rulings: docs/board/memos/2026-10-13-cpo-three-rulings-for-baseline-green.md) Reproduce each on main; fix in the product, or in the expectation with the product change cited, never loosened; the CRISPR Limits sentence and its test need one ruling on the word "efficiency" (the CSO's sentence) 17 October 2026, the Library track, on main's own head: the three Plasmid specs run one test at a time on an idle machine against a worktree build of 7c8479e5 and against claude/stage-c-library, identical on both: cloning-walks.spec.ts:92 and :131 red on desktop, phone and desktop-dark; assembly.spec.ts:129 (own-sequence assembly, three methods) red on desktop and desktop-dark and green on phone, where the Transfer track's CI dispatch on 590f7d04 had it red on phone only and the Gel track's desktop-dark run has had it both ways, so that title is intermittent on every project on main's head (the baseline lists it on phone only, from run 39031934015). None of the three is a Stage C branch's 17 October 2026, Stage C, matched by test title (line numbers have moved; REL-262): "edited primer bounds survive reload and Back; Restore is explicit and a later-step link does not run ahead" (cloning-walks.spec.ts:87 here, now :92) and "a draft edit during the actual checkpoint acknowledgement cancels pending Next" (:123 here, now :131) fail on desktop, phone and desktop-dark on every run: claude/stage-c-room at 43a0cc3f, eb4ac5b3 and 2d03f221, and a build of 000a4206 in a separate worktree, each timing out at step 1 waiting for Sequence's "Target start" field; the Gel and Transfer tracks report the same two titles on all three projects on their heads and on 000a4206 scratch builds. desktop-dark is added for the draft-edit title on that base-build evidence. "own-sequence assembly: three methods, oracle products, complete exports and a record reopened without recomputation" (assembly.spec.ts:109 here, now :129; its rows were removed on 13 October) flips between runs on both builds: on 000a4206 it failed on desktop and passed on desktop-dark; on the room branch it failed on desktop and desktop-dark, then on phone only, then on desktop-dark only ("Newer input" stays where restoring the saved hash should reopen "Designed assembly"); the Gel track reports it, and "primer walk computes the selected pair, carries its product in a record and exports both mapped strands" (now :52) on phone, flipping on its branch and a base build, while the Transfer track saw all of assembly.spec.ts pass. These are recorded as flipping, not as steady failures. No new row: every failing title is one of this row's.
REL-28 Low Assay's Copy link withholds the link with "Not in this link" only for dose-response readings src/apps/assay-analyser/definition.ts share.notInLink tests readAssay()?.label, which is set once data.source is; the standard-curve, qPCR, kinetics, inhibition, growth and thermal readings live in their own sub-records and do not set it (the CPO's Copy link memo of 12 October 2026, Q1, rules the line appears when and only when readings exist) In those six modes Copy link copies at once with the usual toast, whose line already says the readings stay in the browser; the share dialog's "Not in this link" lead and the session file are one click away instead of first Fixed 12 October 2026: the workspace publishes hasReadings (dose response's source or any other mode's readings) and notInLink tests it; e2e/assay-analyser/share.spec.ts covers the standard curve Publish hasReadings from the workspace for every mode and switch notInLink to it in the same commit
REL-29 High An automatic save silently overwrote a named task's saved inputs. 1.2 s after an edit, the timer in src/components/suite/workspace/work-capture-controls.tsx revised the task's object and manifest (src/lib/workspace/app-work.ts:73) and showed nothing, so "Save as new work" then left the original holding the new values, and the values it was saved with were gone. No versions row is written by the timer, so nothing in the product could recover them The simulated-users review of 8 October 2026 (profile 12, issue 1); reproduced on main at a087288 by docs/reviews/2026-10-12-bench-studies-diagnostic/lost-work-reproduction.mjs (on claude/bench-studies-diagnostic) and again at 851fa23 on 12 October 2026: "B. 1.7 s after editing c to 20, before Save as new work: 1 task(s): Vial 2 [work rev 2, object rev 2] c=20" and "C. after Save as new work: 2 task(s): Vial 3 [work rev 1, object rev 1] c=20 || Vial 2 [work rev 2, object rev 2] c=20"; the chain confirmed line by line in the CTO's memo of 12 October 2026 (docs/board/memos/2026-10-12-cto-bench-storage.md, ruling 1) A researcher who saves a vial, edits the inputs for the next vial and saves that as new work loses the first vial's saved inputs without being told; recorded results keep their own inputs Fixed on 12 October 2026 on claude/lost-work-draft (D-0068 rule 8, the CTO's ruling 1, the unit-of-work design §3.2 to §3.4): the timer and the barrier write only a draft in meta (work-draft.ts); Calc and Assay put a kept draft on screen when a task reopens and the control offers it (Save to this work, Save as new work, Discard with Undo). The reproduction re-run on the fix prints "status 1.7 s after the edit: Edits kept on this device.", "B. ... Vial 2 [work rev 1, object rev 1] c=10" and "C. ... Vial 3 [work rev 1, object rev 1] c=20 || Vial 2 [work rev 1, object rev 1] c=10"; e2e/objects/work-capture.spec.ts carries it as the acceptance test in all three projects Remaining, each with its owner: the 4 MiB draft cap is reached by an Assay task at about 0.27 MiB of pasted table (the CTO: raise the cap or slim the payload); Bioreactor, Plasmid, Sequence, Protein, Molecule and Pipeline do not yet read drafts, so their kept drafts are offered with Discard only; Calc's two continuations refuse while a draft exists (the CPO); two tabs editing one task share one draft, the last write kept
REL-30 Medium Protein's camera test (e2e/protein-explorer/camera.spec.ts:47, a camera made for another model version is dropped with a notice) fails both attempts on desktop-dark and passes only on retry on desktop: the cam= fragment outlives the test's 10 s poll after the notice is shown The notice is written at once (src/apps/protein-explorer/views/workspace.tsx:232-235) while the address write is a throttled replace, one per 2 s with a trailing timer (src/components/suite/store/use-url-state.ts:165-171), and a popstate cancels the pending write and re-reads history.state, which still holds the inbound cam (use-url-state.ts:110-123); nothing reads the colour scheme (the CTO's memo of 12 October 2026 on PR 19, docs/board/memos/2026-10-12-cto-pr-19-protein-baseline.md) The recorded browser baseline carries the title on desktop-dark (failures) and desktop (flaky), run 38263189319; the product keeps a corrected link's stale camera in the address for up to one throttle period Fixed on claude/baseline-green-2 (13 October 2026). The cause was not the address writer: logged history writes showed cam= cleared before the notice; the poll's page.evaluate could not run behind Mol*'s start-up, which compiles its shaders inside Viewer.create on the main thread under SwiftShader (3.3 to 3.6 s unloaded; single tasks of about 20 s, up to 30 s, with eight workers on four cores), and two Protein pages starting together made it worse. Deferring Mol* to idle time, multi-sampling off during load and blended transparency on software renderers were each measured under the same load and cut nothing meaningful, so none ships. The browser tests now start Mol* one at a time (viewerLock in e2e/support/test.ts, a cross-process lock; assertions, project names and sharding unchanged). At CI's two workers :47 and :65 passed 16 of 16 each; the rows are removed from the browser baseline. camera.spec.ts:24 (a Shift+arrow turn) had a product race, fixed in the same change (Mol* applies a camera on its next frame, so a second turn or the key-up report read the old camera); it still failed once in 48 runs at CI's load and was not caught with logging on in 32 more, so its flaky row stays and its cause is open None
REL-31 Low Protein's explicit map export test (e2e/protein-explorer/content-tabs.spec.ts:79) passes only on retry on desktop-dark: the Export figure dialog is not visible within 10 s after the menu item is chosen choose awaits prepareFigure (src/components/suite/data/export-menu.tsx:141), which waits two animation frames (workspace.tsx:715) while the dossier's Mol* island loads on the same thread; on a two-worker runner that can exceed 10 s (the CTO's memo of 12 October 2026 on PR 19) The recorded browser baseline carries the title on desktop-dark (flaky), run 38263189319; a person on a slow machine waits longer than usual for the dialog, nothing is lost Fixed on claude/baseline-green-2 (13 October 2026) with REL-30's change: the two animation frames waited behind Mol*'s start-up (another Protein page's, or the dossier's own), and with Mol* started one test at a time content-tabs.spec.ts:79 passed 16 of 16 at CI's two workers; the rows are removed from the browser baseline. Under a harsher eight workers on four cores it still failed once in 8, when the dossier's own viewer started as Export was pressed: no lock can stop a page's own start, so a slow machine can still wait for the dialog None
REL-32 Low Six apps do not yet read a named task's kept draft on their open paths: Bioreactor, Plasmid, Sequence, Protein, Molecule and Pipeline src/lib/workspace/work-draft-open.ts is read only by Calc's bench sheet and Assay's two open sites; Storage and state, "Limits"; the coordinator's note of 12 October 2026 relaying the CTO's ruling on the offer states A draft kept in those apps is offered as unshown, with Discard only, so its edits come back only through an explicit save made before leaving. One draft per task, replaced in place: two tabs editing the same task keep only the last write (a documented limit of the CTO's design, beside the rule that an explicit act removes only the draft its own tab wrote or showed) Fixed on claude/lost-work-rel32 (13 October 2026): all six apps read the draft on their open paths, with a browser spec each (e2e/objects/work-draft-<app>.spec.ts); what remains is REL-41 An app that takes drafts reads them on its open path with its strict reader and sets appliedDraft in the same state update as its data
REL-33 Medium The oracles' numbers depend on the CPU class of the machine that runs them, so the oracle image alone does not make a fixture reproducible Oracles runs of 12 October 2026 on the same image and environments: run 38263006728 (drift job) reproduced the SciPy fixtures byte for byte; run 38266906174 (drift job 114873941862) moved them at about 1e-9 relative (thermal-shift.json case 1 Tm 51.96969749375305 → 51.969697493221446) and inhibition_global.py failed its own metamorphic check (inhibition_global.py:210, 1e-9). Reproduced on an Intel AVX-512 builder: the default run gives the committed values; with NPY_DISABLE_CPU_FEATURES set to the AVX-512 features and OPENBLAS_CORETYPE=Haswell it gives run 38266906174's values exactly. NumPy's SIMD dispatch and OpenBLAS choose kernels by CPU at run time; hosted runners mix AVX-512 and AVX2-only machines. The committed fixtures were written on AVX-512 machines A weekly drift result, a re-recorded fixture and an "identical to 0.4.0" assertion all depend on which runner the job lands on; reference.R's polishing along a valley with no finite minimum (SCI-37) moves with it; build-time reproducibility only: no shipped number moves (CTO ruling of 12 October 2026) Ruled by the CTO, 12 October 2026 (docs/board/memos/2026-10-12-cto-oracle-cpu-class-pin.md): every oracle run is pinned to x86-64-v3 (AVX2 and FMA3, OpenBLAS Haswell, one thread), checked in-process by pipeline/oracle-env/cpu_check.py before each script, refused with exit 3 otherwise, and recorded per fixture (cpu, cpuClass, simd, openblasCore, threads). Built; on an Intel AVX-512 builder the pinned run reproduces the AVX2-only runner's values exactly. The committed fixtures were written unpinned, so the drift job stays red on them until they are re-recorded as new versions Re-record each lineage under the pin as a new version (the -v2 SciPy fixtures and the reference oracle's version 2 first, with the CSO's tolerance for their comparison with the old versions)
REL-34 Low A named task's draft is not written when its inputs exceed the draft cap (4 MiB canonical JSON) work-draft.ts on claude/lost-work-draft; the CTO's memo of 12 October 2026, ruling 3; measured 12 October: one timer write of a 3.94 MiB Assay draft, 2,686 to 3,062 ms at CPU 4x (median 2,993 ms, three runs); an Assay task's saved data is about 15 times its table text, so the cap is reached at about 0.27 MiB of pasted table Edits since the last save live only in the tab; a reload loses them; the person sees the draftTooLarge line under the cluster and in Work details; Save work, Record result and Download project file still take the full inputs Open; owner the lost-work builder Measure the write at the cap at CPU 4x; raise only within 100 ms (the measured write is far over it, so the cap stays); slim source in a later record version (Stage B)
REL-35 Medium One timer write of a named task's draft at the 4 MiB cap holds the main thread past ruling 13's 100 ms at CPU 4x e2e/support/draft-write-timing.mjs, a 3.94 MiB Assay draft, CPU 4x, 12 October 2026: 2,686 to 3,062 ms timer to commit (median 2,993 ms) as first built; after canonicalising once and storing the payload as its canonical text, the longest main-thread task is 81 to 168 ms over five runs (median 113 ms), timer to commit a median 121 ms. What remains is mainly IndexedDB's synchronous copy of the 4 MiB text (about 40 ms) and the byte count; the CTO's addendum of 12 October 2026 A pause while typing in a near-cap Assay task can stall input for about a tenth of a second on a slow machine Fixed on 12 October 2026 on claude/lost-work-draft: the control compares the canonical text and the name apart instead of one joined string, and the write runs in src/lib/workspace/work-draft.worker.ts; the same script, five runs at the cap, CPU 4x: no main-thread task over 50 ms during the write, timer to acknowledged write 72 to 108 ms (median 86 ms) None; rerun e2e/support/draft-write-timing.mjs when the draft path changes
REL-36 Low Stage 0's compact-rail accessibility test (e2e/smoke/stage0-accessibility.spec.ts:39, an overflowing compact rail has one keyboard stop and keeps Bench pinned) passes only on retry on phone (and, on 14 October 2026, failed on desktop too, on main's heads efd0be38 and 7f344a4f): expectRevealed times out (Expected: true, Received: false, the 10 s poll at :53, called from :60) Judgement, not profiled (the CTO's ruling of 12 October 2026, docs/board/memos/2026-10-12-cto-two-flaky-titles-and-the-micro-sign.md): useRovingRail (src/components/suite/shell/research-navigation.tsx:38-44) re-seats the tab stop whenever place (path plus hash) changes; if the hashchange from /o#objects renders after the End key, [tabindex="0"] is Bench while focus sits on the last item, so expectRevealed (:52-59) cannot pass The recorded browser baseline carries the title on phone (flaky), runs 38234867635 and 38256981079, first error line the same in both (shard 5); a person activating the Objects row on a phone meets the same reset of the tab stop, against :33-35 Fixed on claude/baseline-green-2 (13 October 2026): useRovingRail's layout effect keeps the tab stop on a focused rail item when the place changes (research-navigation.tsx). The mechanism was shown in the browser before the fix: with the last item focused by End, a hash change moved tabindex="0" to Bench and left focus on a tabindex="-1" item. The title did not fail locally in 30 runs under load before or after; e2e/smoke/stage0-accessibility.spec.ts gains a regression test for the hash change, and the title's flaky row is removed from the browser baseline None
REL-37 Low The Send to test for the drug card's molecule link (e2e/objects/send-to.spec.ts:124, with EGFR from the recorded responses, L1: the drug card's molecule link sends the drug, keyed on its ChEMBL id, to Molecule by name) passes only on retry on desktop-dark: the arrival strip reads "Came from Drybench Protein: CHEMBL553" without the expected "Erlotinib" (expectArrival, e2e/objects/helpers.ts:118, called from send-to.spec.ts:131) The cause cannot be read from the code (the CTO's ruling of 12 October 2026): 0616faac closed the label race for this link (verbs-impl.ts:88-112 awaits the upsert before navigating), and nothing on the path reads the colour scheme. The call log of run 38256981079 shows the strip without the id twice, then with the id nine times: the ChEMBL id arrives and the drug name never does The recorded browser baseline carries the title on desktop-dark (flaky), runs 38256981079 and 38263189319, first error line the same in both (shard 7); a person may see the molecule's id in place of its name on arrival Fixed on claude/baseline-green-2 (13 October 2026) by REL-44: the drug name was missing because the Protein tab's IndexedDB open answered after its 5 s timeout, so sendTo wrote the drug to memory and the page then navigated; reproduced locally under 8 workers (3 failures in 32 runs, each with a late open) and gone after the fix (80 of 80 with the camera specs as load). The title's flaky row is removed from the browser baseline None
REL-38 Low Assay's small-multiples figure export failed ("Export failed. Try again.") when the Fit view had not been opened on the page, for example after reopening a kept assay on the Plate map composeFigure composes the charts on screen, and the Fit view mounts only once visited, so the figure had no charts; reproduced on main at e64ffe19 by e2e/assay-analyser/views-on-demand.spec.ts during step 6 The figure could not be exported until the person opened Fit Fixed in step 6, 12 October 2026: the figure item's prepare loads the composer and mounts the Fit view hidden until its charts draw (src/apps/assay-analyser/views/assay-workspace.tsx, prepareFigure) The spec stands as the regression check
REL-39 Medium The lost-work fix's review (12 October 2026, on candidate 9a5010e7) confirmed 17 findings in Discard and Undo, the open paths and the Calc hand-offs, three of them high src/components/suite/workspace/work-capture-controls.tsx:445 (Undo's fixed 10 s timer does not pause with its toast), src/apps/assay-analyser/views/assay-workspace.tsx:656 (an assay opened from its address alone shows the kept draft with no offer), src/apps/lab-calculators/views/bench-sheet.tsx:1162 (Open in Assay, Pin, Add to Study, Keep and Open its page are not refused while a draft is kept) A discarded draft can be lost after Undo is offered; a kept draft can be written into a named task's saved record without an explicit act Fixed at 4074465b (claude/lost-work-fixes): all 17 findings, with an address-alone test in work-capture.spec.ts Tie the draft row's deletion to the toast's expiry; load the task on every open path that shows a draft; refuse the bench sheet's other send and keep actions as Open plan in Assay is refused
REL-40 Low Two browser specs were not updated for the new Assay start (UI-24): the compatible-picker walk still clicks a "Use a Bench input" button that is now a ⋯ menu item, and the unparsed-draft tabs test expects the Views tabs that the start hides e2e/objects/work-capture.spec.ts:292 (waits on the button at :307), e2e/smoke/bench-app-tabs.spec.ts:91 (tab count 0 at :99); run 38314852664 on batch 1, all three projects Six browser failures on main until fixed; the product behaviour is as UI-24 intends Fixed on claude/assay-depth-1, 12 October 2026: the picker walk opens ⋯ and chooses "Use a Bench input"; the tabs test opens the worked example and types the draft on Import; both specs pass on desktop, phone and dark; the six rows left docs/progress/e2e-baseline.json Open ⋯ and choose "Use a Bench input" in the picker walk; in the tabs test, open an assay or assert the start's own controls, citing UI-24
REL-41 Low Kept-draft open paths (REL-32): Molecule's library-retry reference, and Protein's and Pipeline's kept retrieval time held for the CSO (a) Plasmid's payload carries the day's date in annotatedText, so a draft written on an earlier day reopens as edited rather than shown; (b) the navigation barrier in work-capture-controls.tsx ignores disabled, so leaving a Plasmid task during its first analysis (up to 30 s) can keep a draft of the unsettled screen; (c) saving a Pipeline or Protein view before its search, data version or structure list has loaded leaves a kept draft just after the save, since the payload changes when the data lands (as before REL-32); (d) Molecule's reference follows the library release, so a library that loads only after a retry counts as an edit. Protein and Pipeline keep the opened view's retrieval time while the subject and data version are unchanged, so a re-saved unchanged view records the first retrieval time (a provenance choice held for the CSO). From the REL-32 builders' reports, 12 and 13 October 2026 A spurious draft or an edited offer where the person made no edit; Discard clears it, nothing saved is lost Partly fixed on claude/lost-work-rel32 (13 October 2026): (a) the opened record's or draft's written date is kept, on the COMMENT and the LOCUS line, while the plasmid is as opened (writtenOn, writtenDate, writeGenBank's date); (b) a new settling prop keeps the timer and the barrier off while Plasmid's saved construct waits for its analysis, and any change ends the wait; (c) Save waits for Protein's structure list and Pipeline's sources to settle. Open: (d), and the CSO's ruling on the kept retrieval time; owner the lost-work builder (d) baseline after the library loads; the CSO to rule on the kept retrieval time
REL-42 Low Bioreactor's workspace chunk is over its interim ceiling after A6: 136.2 of 136 KB, against 135.2 on main at d3dd9c94 node scripts/size-check.mjs on claude/assay-a6-qpcr-growth after merging main, 13 October 2026. The +1.0 KB is about 0.4 KB from the growth readers and copy, and 0.6 KB from Turbopack splitting one shared chunk (README_MIME to RunTable, 21.6 KB on main) into two once A6's lazy growth chunks share its modules. The Gompertz fit's reader is already out of Bioreactor: the review handoff reads v1 through src/lib/growth/data-v1.ts None while the interim budget is 137 KB; 0.8 KB of headroom left Mitigated 13 October 2026: the Assay coordinator raised the interim budget to 137 KB under D-0048 with this reason recorded beside it (scripts/size-budgets/bioreactor-simulator.json); open for the pre-live pass, owner the CTO. 17 October 2026, claude/rebuild-repeat-setup against 7c8479e: 137.0 → 137.1 of 137 KB. The chunk lists differ only in minifier identifiers and Turbopack's re-split (+123 bytes gzip in total), and hold none of the branch's modules. Accepted as noise by the CTO's ruling; budget unchanged; still open for the pre-live pass At the pre-live pass, find the split's trigger and restore releaseKB
REL-43 Low At 375 px a results card in Assay had no Open button, so a curve's detail (its estimates, residuals, model comparison and own constraints) could not be opened on a phone DataTable (src/components/suite/data/data-table/data-table.tsx) shows its Open button on a card only when no cardActions are passed, and Assay's results table always passes them (the compound's object actions); found 13 October 2026 while writing routine-week criterion 4 The curve inspector was unreachable on a phone Fixed 13 October 2026 in Assay (panels/results-table.tsx: the card's actions carry an Open button, named with the compound); the shared table's rule is unchanged Decide whether DataTable should show Open beside card actions for every app (a shared-contract question for the CPO)
REL-44 High A tab whose IndexedDB open answered after OPEN_TIMEOUT_MS (5 s) stayed in memory for its life: openSuiteDb closed the late connection, so every object, Study, task and project the tab saved was lost on the next page, though IndexedDB worked Measured 13 October 2026 (local, 8 Playwright workers on 4 cores, IDBFactory.prototype.open instrumented from an init script): in each REL-37 failure the Protein tab's open answered after 5.4, 8.4 and 10.1 s, and no IDBObjectStore.put ran while sendTo read its own write back from memory; in passing runs the open answered in 1 to 845 ms. The main thread was held by Mol*'s start-up under software WebGL (long tasks of 3.9 to 12.2 s) Data loss for a person on a slow or busy machine: saved work kept only in the tab, with the memory notice shown; REL-37's missing drug name was this Fixed on claude/baseline-green-2 (13 October 2026), to the CTO's ruling of 13 October (option C): openSuiteDbPatient keeps the late connection; createSharedDatabase reads from memory at the timeout, holds writes for the open up to WRITE_WAIT_MS (30 s; a draft-only write up to 8 s, and a leave that waits over a second says "Saving…"), and adopts the late connection in its write queue (memory rows copied in one transaction, IndexedDB kept on a shared key with the count reported, reads moved only after the copy, the other tabs told of copied objects); free app project stores open through their own instance and relabel projects made meanwhile. Unit tests on a delayed fake open (shared-db.test.ts, objects/store.test.ts, projects.test.ts); e2e/objects/send-to.spec.ts holds the Protein tab's open answer for 7 s and fails without the fix ("CHEMBL553" in place of "Erlotinib") Turning session-only mode off still opens with openSuiteDb (the person's retry); the draft worker's own open is unchanged
REL-45 Medium Plasmid's assembly save-gate test fails on batch 2 on all three projects: the test seam window.releaseAssemblySave is never defined, so the draft-survival and refusal-recovery steps after it are unchecked e2e/plasmid-map/assembly.spec.ts:239 (poll at :273); batch 2's local run, 13 October 2026 A Plasmid save path changed with batch 2 (the draft-write worker or the shared save control) may have dropped the hook the spec uses, or the save itself may no longer pass through it Fixed on claude/baseline-green (13 October 2026): batch 2's draft worker (REL-35, work-draft-writer.ts) writes a named task's draft in its own IndexedDB connection, which the spec's page-side IDBDatabase.prototype.transaction hold never saw. The gate now also holds the page's write request to the draft worker and counts the worker's reply as the acknowledgement, keeping the page-side hold for the page's own write; whichever comes first is held. The test's assertions are unchanged and pass on desktop, phone and desktop-dark; its 3 rows are removed Find which batch-2 change removed the hook; restore the seam or move the spec to the new save path, citing it
REL-46 Low The J3 walk's fit step expects the old controls sentence ("Controls: 32 positive and 16 negative wells on this plate."), which routine-week criterion 3 replaced with the wells named by range, so the walk stops at step 5 on desktop and desktop-dark and its later hops go unchecked e2e/objects/j3.spec.ts:376 (assertion at :435); batch 3's local browser run at c128f7b8 and a rerun, 13 October 2026; deterministic The walk's checks after the fit (the IC50 against drc, the Study and Bench hops, the removal) are not exercised on the two desktop projects until it is fixed Fixed 13 October 2026 by the A4 builder on claude/assay-across-assays-size: step 5 expects controlsNamed for each plate: the plate map's control wells that hold a reading on that plate in the example's grid, through formatWellRanges, checked against the reference's counts (X1 "A2–P2, A24–P24 (positive control, 32 wells) and A23–P23 (negative control, 16 wells)"; X2 lacks D23 and X3 lacks L24, so their ranges split), citing 4210e81e; the Z′ checks that follow are unchanged; the two baseline rows are removed None
REL-47 Low The DataGrid renders at most 500 rows, and its lazy chunk is over the 8 KB estimate in DS §6.34 RENDER_ROWS in src/components/suite/data/data-grid/data-grid.tsx (the CPO's ruling 6 of 13 October 2026); the Assay Table view's lazy chunk measured 11.9 KB gzip on 13 October 2026 (11.3 KB after the comma rule), including parsePlates and parseKinetic for the read-only plate check. The CSO has seen the cell-state words (addendum of 13 October 2026); the comma evidence rule is in the grid's reader Rows past 500 are read but edited only as text; the chunk loads only on the Table press Open, owner the data grid builder Window the rows (fixed 30 px rows); move the plate check out of the chunk or share the readers' chunk; the CTO to set the chunk's budget
REL-48 Low The .pzfx reader names analyses only from elements whose names end in Analysis with a title, and its test file is written by hand from the XML structure, not from a file the format's own program wrote, so a real file may hold analyses it does not name src/lib/grid/pzfx.ts (readPzfx, visit); pipeline/assay-analyser/pzfx/README.md; 13 October 2026 The panel may say "No analyses were found in the file" for a file that has some; nothing is run either way, and no table value depends on it Open, owner the import-layer builder Check the element names against a file made for the purpose by a licensed copy (its use held for the General Counsel) and widen visit if needed
REL-90 Low The relationships figure (and column statistics' Q-Q plots) draw their axis text at a fixed size in an SVG scaled to the width, so at 375 px the tick labels and axis titles read at about 5 px src/components/tools/assay-analyser/panels/relationships-panel.tsx (Figure, a 560-unit viewBox); docs/design/assay-stage/captures/relationships/linear-phone-*.png On a phone the figure's numbers are hard to read; every number is also in the results panel below it Relationships figure fixed on claude/assay-relationships, 13 October 2026: Figure measures its container (ResizeObserver) and draws at that width, so text keeps its pixel size; column statistics' Q-Q plots still open The same for the Q-Q plots (columns-panel.tsx, their builder's file)
REL-49 Low Molecule's series chunk reads 13.0 KB against its 12.4 KB budget after the comma rule (SCI-45) reached parseNumber node scripts/size-check.mjs on batch 5 (0b40e714), 13 October 2026 A size reading only (D-0074); behaviour unchanged Fixed on claude/assay-data-grid at 989e15ee (batch 6): the 0.6 KB is the rule itself (src/lib/grid/number.ts), and the budget is re-based to 13.1 KB with the reason recorded Re-base with the measured reason
REL-140 Low The figure editor's scene engine grows three chunks past their budgets: the IC50 task island 38.5 to 43.1 KB of 40, Fit's results view 24.7 to 28.8 KB of 28.5, the figure export core 11.1 to 15.7 KB of 13.7 (gzip, against claude/assay-batch-5 at 0b40e71) size-check.mjs --baseline on claude/assay-figure-editor, 13 October 2026. What remains after moving the annotations and second axis to layout-extras.ts, the record's reader to figure/read.ts, the axis facts out of the screen charts and the editor's words out of the workspace (which reads 248.3 of 250.8, +3.3) is the axis scale (src/lib/figure/axis.ts, about 1 KB) and the core layout's log y, breaks, frame, grid, letters and shared axes (about 2 KB) Slower first load of the IC50 task page by about 4.6 KB; reported under D-0074, not blocking Fixed, 13 October 2026, on claude/assay-foundation-1 (d992605d) with A-0's restructure in place, no budget raised: the IC50 island 39.3 to 38.6 KB of 40 (already under after A-0's per-island subsets); Fit's results view 29.0 to 25.7 KB of 28.5, the figure settings disclosure (panels/figure-controls.tsx) loading in its own chunk by a literal dynamic import, with a placeholder holding its closed box; the figure export core 15.7 to 10.4 KB of 13.7, PNG and TIFF loading the canvas and PNG writers on their format (figure/raster.ts). Behaviour unchanged; figure-settings, figure-export, pre-submission and chart-plate specs pass on desktop and phone Keep scene growth in lazy chunks
REL-141 Low The pre-submission check has no "hidden zero on a log axis" rule (roadmap A-4 item 1; the CSO's figure-axes memo, 1(f)), and its axis-range finding counts the points a hand-set range leaves out in its own loop rather than through axisFacts src/components/tools/assay-analyser/pre-submission.ts (axis); the figure editor's figure/axes.ts. A unit test (figure/v3.test.ts) checks that the caption's count equals the finding's on the MTT record With log y refused over values at or below zero nothing kept can be hidden; still unflagged: cut bar arms and curves on a log axis, excluded points at or below zero Fixed: the rule (axis-log-hidden) on claude/assay-presubmission-check (61c1f625), wired to the shared counts as SCI-71; the axis-range finding still counts in its own loop, and figure/v3.test.ts checks it equals the caption's Read axisFacts in the check: axis-range from facts.outside, a log-axis rule from facts.logCut and the zero-dose rows
REL-142 Low Bench's app-tabs smoke test expects Assay's four tabs; the Figure view (aa607efa) makes five, so the test stops on desktop, phone and desktop-dark e2e/smoke/bench-app-tabs.spec.ts:91; CI run 38422718560 (batch 6, 1f767550), 13 October 2026 The draft-preservation and focus checks after the tab count go unchecked on Assay until fixed Fixed in a47aa510 (the figure editor builder's f45fdcf3): the spec counts five views, Figure among them, and keeps every focus and link check; passed on desktop, phone and desktop-dark Expect the five views and their shortcuts, citing aa607efa; keep every focus and link check
REL-51 Low Fisher's exact test on a table larger than 2 × 2 enumerates up to ten million tables on the main thread when the person presses "Calculate the exact p" fisherRxC in src/lib/stats/contingency.ts, run from panels/counts-panel.tsx; about 0.8 s for 7.1 million tables measured locally on 13 October 2026; the CSO's counts memo asks for a worker The page does not respond for up to a few seconds on a slow device Open Move the enumeration into a worker (the CTO's ground)
REL-100 Low Time to event and counts (A-2 families 4 and 5) cannot yet be recorded to a Study; their results leave the app by the CSV exports and the project file only canRecordAssayWorkspaceResult in src/apps/assay-analyser/workspace-adapter.ts excludes the survival and counts modes and no capture exists for them (13 October 2026, claude/assay-survival-counts) A scientist cannot file a survival or counts result in a Study's history Open A capture per mode as columns-capture.ts does (schemas assay-analyser.survival-result and .counts-result, presentation rows, the method pins, the declarations as qualifications), after the fixtures pass
REL-50 Low Reproducibility note: the same fit engine version can store a refused curve with or without its response evidence, depending on whether it was fitted before or after 13 October 2026 (A-4 item 12), so the same readings can give a results CSV with or without a negative-result statement; nothing tells the person that a refit would add it analyseCurve refusedEvidence (src/lib/fit/analyse.ts); FIT_VERSION not raised; the CTO's storage review of d193a15b, findings 4 and 8 A missing statement makes no claim, so no number is wrong; two exports of one assay can differ by that column Accepted for now (13 October 2026, lean mode) Raise the engine version with the next change that needs a refit anyway, or offer a refit when a refused curve lacks evidence
REL-52 Low A plate sheet whose analysis plan's exclusion rule is pasted full of control characters can pass the sheet's 4,000-byte cap once JSON-escaped; the sheet then reads as null and Calc's plate-sheet panel disappears instead of refusing the keystroke plateSheetFromJson (PLATE_SHEET_MAX_BYTES, src/lib/handoff/payloads/plate-sheet.ts); plate-sheet-panel.tsx; the CTO's storage review of 22d52525, finding 1 (typed text tops out near 2,600 bytes) Only by pasting control characters; nothing is saved wrongly, but the sheet's inputs vanish from view Confirmed, open (13 October 2026) Refuse the edit that would pass the cap, or strip control characters from the rule
REL-53 Medium The assay record's blind field (A-4 item 9) was added under record version 6, which already existed, and the v6 reader's key list is strict, so a build from before 13 October 2026 refuses the whole assay, from storage or a project file (comparisons, experiments and curveFixes were added to v6 the same way) V6_KEYS in src/components/tools/assay-analyser/model.ts; the CTO's storage review of 3d934d40, finding 8 Stale tabs and mixed builds during a deploy; acceptable while in development Fixed, 13 October 2026 (the CTO's memo docs/board/memos/2026-10-13-cto-assay-record-v7.md): record version 7 holds the twelve top-level fields added since v6 reached main and the nested ones a main build refuses or drops (ASSAY_V7_KEYS, needsV7 in src/lib/assay/record-versions.ts); V6_KEYS is main's set again; both versions accept both lists; raiseOnWrite raises on write, never on open; migrateAssayShape no longer lowers a version; the figure reader takes a v3 figure without panels.heatmaps (a main-written figure was refused at HEAD). Builds at main still refuse the v6 records batch builds wrote: development only A new top-level or refused nested field from now needs v8
REL-54 Low A saved task's kept draft from before the names were hidden carries the real names and no blind; offered on reopening and saved, it quietly undoes the blind analysis readOpenWorkDraft on Assay's open paths (assay-workspace.tsx); the CTO's storage review of 3d934d40, finding 7 Only with a draft kept from before the hide; the paragraph then records no blind analysis, so nothing false is claimed Confirmed, open (13 October 2026) Discard or refuse a draft without blind once the saved record has it; an e2e test of draft-before-hide
REL-198 Medium At the desktop project's 1408 px with the research sidebar open, the bar's subject crumb ("EGFR · P00533") is squeezed to 0 px wide whenever the app shows its Export key: the shared layer's workspace search grows to fill the bar's centre (flex-[1_1_14rem] max-w-[28rem]) and the crumb is the item that gives way. Protein's Compare layout collapses the sidebar, so its crumb shows (105 px); the dossier keeps the sidebar, so its crumb vanishes src/components/suite/shell/shell-bar.tsx (searchField, changed in d1e71d62); measured on 14 October 2026 by a probe at 1408 × 880 on Protein's atlas-pass build: dossier crumb width 0, Compare 104.8 px; e2e/protein-explorer/dossier.spec.ts:26 fails at expectEgfrNamed (fixtures.ts:99) on desktop On a 1366 to 1440 px laptop with the sidebar open the bar no longer says which subject is open; the page's H1 still does Open; the shared-layer owner Give the crumb a floor (min-w-[8rem] or shrink-0 on the last crumb) or let the search shrink first (shrink with a smaller basis); the spec stays as it is
REL-199 Medium Three size budgets are over by under 1 KB on main after the redesign merge (efd0be38): calculators-island-antibody-dilution 40.8 KB of 40, sequence-island-six-frame 40.3 KB of 40 and home-route-js 225.9 KB of 225 size-check --baseline on the redesign branch at 56bf95a6 (14 October 2026), against a main baseline recorded before main's Assay and Patent work and the redesign merged: 38.8, 39.1 and 204.4 KB at that base. The shared redesign layer (D-0082 to D-0084) and main's own additions both landed in the interval, so the share of each is not yet measured. REL-180 (sequence-island-oligo-tm, now 40.7 KB) and sequence-island-primer-design (48.2 KB of 40, over at the base) are the same check. On main's head f01c7d8c (14 October 2026) the plain check reports 15 over: the three above, ten more Sequence islands (40.8 to 52.1 KB against 40 to 48), assay-view-report (9 of 8.7), plasmid-construct-admission-worker (31.1 of 20) and marketing-css (42.1 of 42). The sidebar push and workspace loader branch (7033fb54) measured against that build changes none of them and grows no budget by more than 0.4 KB The plain size check reports them Open; owner the CTO's seat to rule on budgets Measure the redesign's share against the pre-merge main, then trim the shared imports the islands pull in, or the CTO re-bases with the reason recorded
REL-160 Low No browser test covers the Study Evidence tab's A-4 sections ("Same readings in more than one assay", item 16; "Control runs over time", item 8) src/components/tools/assay-analyser/panels/divergence-panel.tsx, panels/drift-panel.tsx; their engines are unit- and oracle-tested (divergence.test.ts, drift.test.ts), and the workspace's divergence line has e2e/assay-analyser/divergence.spec.ts. No e2e helper seeds a Study with several fitted, saved runs A rendering defect on the Study page would not be caught before a person sees it Fixed on 13 October 2026: e2e/assay-analyser/study-evidence.spec.ts files three fitted runs into a Study through the UI (the reader loop, then Add to study on each assay's page) and checks both sections, desktop and phone None
REL-161 Low Recorded as a rename typed just before "Save work" not reaching the assay's record ("Untitled assay" on its object page and in the Study's Evidence sections). Not a product defect: the test read the wrong record Found 13 October 2026 writing study-evidence.spec.ts, which took the mine= ref before "Save work". The first named save makes its own record (work-capture-controls.tsx: a new mine:assay/<uuid> labelled with the work name, or the assay's name when that is empty) and moves the address to it; the unnamed draft it leaves keeps whatever the autosave last wrote. Read after the save, every record carried its name (3 of 3 runs, renamed and saved within a second) None on saved work; the unnamed draft is superseded and not listed Closed on 13 October 2026: the spec now renames, saves at once with the work name empty, reads the ref after the save, and checks the object page and both Study sections show the name, desktop and phone None
REL-162 Medium After "Use this import" with a saved plate map that assigns everything (A-4 item 15, which fits at once), keyboard focus ends on the page: the Fit heading takes focus, stops being rendered about a second later while the fit runs, and focus falls to the body e2e/assay-analyser/routine-week.spec.ts:121, the second import, failing both attempts on desktop and desktop-dark in CI 38464106708 on 244bf82f (13 October 2026) at headingFocusSettled; reproduced locally in 1 of 3 runs at 3 workers. A page sample every 25 ms showed #fit-heading focused at about 1.0 s, its checkVisibility() false at about 1.8 s with no display: none ancestor, focus on the body from then on, and the fit announced at about 2.2 s. The template-fit effect (templateFit in src/apps/assay-analyser/views/assay-workspace.tsx) calls setView("fit", { focus: true }) and then starts the fit. Two coordinator patches, waiting for the heading by the clock and restoring focus when the fit lands, did not fix it and were not kept A keyboard or screen-reader user loses their place after the reader-at-the-bench import (DS §9.1); the acceptance test for the routine week is red on main Fixed on 14 October 2026. Cause: the Fit panel's section was the size container for its settings (@container/assay-fit); the first results move it into the 24rem inspector column, past the settings' 26rem query, and Chromium then kept no layout box for the container's leading children that do not query it (computed display: flex, width auto, no client rects) until something restyled them: the header row with the heading, so it vanished from the screen and its focus fell to the page. A first fix (56ef3d1a) moved the container to a wrapper around the panel's body, and the lede and the plate-map note vanished instead, failing reader-loop.spec.ts and timing out routine-week 3, 4 and 9. Not reproduced in a minimal page. Fix (479d49a9): the container wraps the settings alone, its first child the grid that queries it (assay-workspace.tsx); focus stays on the Fit heading through the fit (DS §9.1). routine-week.spec.ts:121 10 of 10 at 3 workers repeated on desktop and desktop-dark, no retries; the Fit-view specs 70 of 70 on desktop and phone, no retries; the e2e-baseline.json entries removed Other size containers with leading children that do not query them (Panel's sheet, @container/panel) may meet the same engine behaviour; none has been seen to lose content
REL-195 Medium The summary across saved assays counts a re-read of the same plate as a separate experiment: a second read on the reader is a new file with new readings, so neither the shared-file nor the identical-readings test catches it, and n can still be too high partitionIdentical and sameIdentity in src/components/tools/assay-analyser/divergence.ts (the CSO's rule of 14 October 2026); the divergence section's own limits line says the same ("a re-read of the same plate on the reader is a new file and is not detected") A Study can still report technical repeats as independent experiments; the only guard is the person ticking "These assays are independent biological experiments", which carries this risk Open, owner the A-4 connections builder; accepted by the CSO's rule for Stage A exit Detecting re-reads needs a plate identity the reader export does not carry (a barcode, or near-identical readings within a stated tolerance); for the CSO to rule on before any heuristic
REL-163 Medium Outside dose response, the analyses' numbers carry no method chip beside them: binding, GR metrics, initial rates, inhibition, growth, thermal shift, qPCR, the standard curve, screening and the statistics families show each result with a Method section and a limits list, while brief §4.4 asks for a chip on every model-dependent number The closing walk of 14 October 2026, S13 (docs/progress/assay-closing-walk.md): every chooser entry read with its example at desktop and 375 px; panels/*-panel.tsx outside dose response draw no MethodChip A number copied from the screen does not point at its method in place; the method and its limits are one section below Open (14 October 2026), for after Stage A; owner: the CPO with the builders (the CPO's memo of 14 October 2026 on the closing walk) One chip per result group (DS §6.30: "cells never do"), from each mode's own method records (mode-methods.ts loads them with the mode); until then no Assay copy claims a method beside every number
REL-180 Medium sequence-island-oligo-tm measures 40.2 KB against its 40 KB budget on main size-check --baseline in CI 38495055906 on claude/assay-batch-9 (14 October 2026): 39.2 KB at the stage base, 40.2 at the head; over on main before batch 9 The plain size check reports it; once the stage base is re-recorded from main (the CTO's ruling of 14 October 2026) the baseline step flags it only if it grows Open; owner Stage B Trim under 40 KB without raising the budget
REL-181 Medium The unit of work's designed surfaces are not all built as designed: §3.8 (Open a file, the recent list), §3.1 (the destination select) and §3.6 (the newer empty Bench) The Stage A design check (docs/reviews/2026-10-14-stage-a-design-check/README.md), open differences for the coordinator; the CPO's ruling of 14 October 2026 (docs/board/memos/2026-10-14-cpo-design-check.md) carries them A person finds files and destinations by routes the design did not choose Open; owner the Assay coordinator, the CPO approving the shared save-panel and Bench changes (the Assay coordinator's until the Stage A hand-over of 14 October 2026; now the next Assay work's, under the merger the CEO names) Build §3.8, §3.1 and §3.6 as designed in the first Assay follow-on
REL-182 Low Three Assay layout differences the design check carried: the pre-submission check's finding count is missing from the Export menu; transformation history shows a raw ISO timestamp; the phone Report is about 208,000 px tall on the PRISM example The Stage A design check, coordinator rows; the CPO's ruling of 14 October 2026 Findings are found later than designed; one timestamp unformatted; a very long page on a phone Open; owner the Assay coordinator (the Assay coordinator's until the Stage A hand-over of 14 October 2026; now the next Assay work's, under the merger the CEO names) Show the count beside Export; formatDateTime in the history; collapse the Report's per-curve sections at 375 px
REL-183 Low Science wording the design check carried: the Wilson cells repeat "95 percent CI"; the divergence check counts examples as saved and has no C50 line across normalisations The Stage A design check, science rows; the CPO's ruling of 14 October 2026 Repetition; a check that counts synthetic examples among saved runs Open; owner the Assay coordinator with the CSO's wording (the Assay coordinator's until the Stage A hand-over of 14 October 2026; now the next Assay work's, under the merger the CEO names) The CSO rules the wording; the divergence check leaves examples out
REL-184 Low Design-system and design-record follow-ups from the Stage A design check: border-line has no --color-line token (77 uses); the compact start; "Add to study" in the shell's ⋯ menu; the Figure panel missing from the column-statistics and groups design docs (its placement ratified by the CPO on 14 October 2026); the outlier design capture is stale; the figure editor's selection name tag and per-panel axes The Stage A design check; the CPO's ruling of 14 October 2026 Visual drift between the design record and the built screens Open; owner the CPO (the capture with the design agent) Add the token or replace the class; update the two design docs and re-take the capture; decide the shell menu item and the editor details
REL-185 Low A Study recording of a calibration result names its methods at the wrong versions: standard-curve-interpolation and five-pl-calibration at CALIBRATION_VERSION (1.3.0) where the method records say 1.0.0 and 1.1.0, and the inverse-prediction method (2.0.0) is not named src/apps/assay-analyser/workspace-adapter.ts (captureCalibrationWorkspaceResult, the methods array); the CTO's note of 14 October 2026 on the CSO's sign-off requests A recording's method versions do not match the methods page; recorded evidence is hash-pinned, so old recordings keep what they say Fixed on main by PR #35 (713854d9a, Fast 40222540805). New captures use each existing constituent method version and include inverse prediction only for a retained computed/withheld interval object. Historical method lists and numerical output remain unchanged; see docs/progress/capture-provenance-2026-10-25.md. —
REL-190 Low Editing a DataGrid cell (F2 or Enter) at its fixed column width scrolls the cell's input to the caret, so a value wider than the column shows clipped at the left ("318.5" reads "18.5" in a 54 px cell); visual only: the input holds the whole value, Enter keeps 318.5, and End then "1" gives 318.51 in the cell and the text The Stage A design check's addendum (docs/reviews/2026-10-14-stage-a-design-check/, data-grid-grouped-desktop-dark.png); probed 14 October 2026 on the grouped grid (input 54 px wide for 67 px of text, scrollLeft 13) A person editing a long value sees its start hidden until they move the caret Open; owner the CPO Widen the editing cell to its content while editing, or show the value's start (DS §6.34 keeps column widths fixed while a cell is edited, §7.1 point 4, so it is the CPO's call)
REL-191 Low Design follow-ups from the Stage A design check's addendum: the grouped grid reads a merged header only when its second row is text, so numeric replicate headers ("1 2 3") read as a six-column wide table (src/lib/grid/paste.ts), and its statement says "Read with a merged header" where the prototype says "Read from the paste with a merged header"; on a phone the column select reads "10 mg/kg (mm³) · 2 of…" without the letter DS §6.34 gives, and Import shows no Exclude toggle where the prototype does; the read-only plate export keeps "copy and paste blocks" in its keys line with only ⌘C, and shows the plate's header row (1…12) as data row 1; the fit toast covers the foot of Explain this number's phone sheet; the residuals-by-step chart has no y-axis title and no key for its line styles; the Hill chart's one combined axis line, and Tab from the Rate model select reaching the fit key after "Assay conditions"; the reporter ratio's title is a mono paragraph, not a heading or legend, its two selects are not a fieldset, and its disabled background checkbox is faint on a phone; the shared import review's "1 rejected cells" The Stage A design check's addendum (docs/reviews/2026-10-14-stage-a-design-check/README.md); the CPO's final read of criterion 10, 14 October 2026 Visual and wording drift between the design record and the built screens Open; owner the CPO Decide each against DS §6.34 and the placing memos; none changes a stored value
REL-192 Medium On Assay's start the data grid sits in the narrow left column (about 375 px) beside the file drop and the chooser, not in a full-width panel, so a four-column table's columns C and D scroll inside it and the toolbar wraps ("Add row" beside Decimal comma, "Add column" and "Copy table" on the next line); the statement reads "Read as a wide table:" where the prototype says "…from the paste:" The Stage A design check's addendum; prototypes grid-columns-* of the 12 October design review The grid is cramped where most tables are first typed or pasted Open; owner the CPO Give the Table view the full width on the start (or open it in the Import panel), as the prototype places it
REL-193 Medium The .pzfx table picker blanks a value the file marks as excluded: the file's "9 numbers, 2 blank … 1 value excluded" becomes "8 numbers, 3 blank" after "Use this table", with no excluded cell and no reason, and the note says "1 value excluded in the file is left blank in the text, so it is not analysed." pzfx-tables.tsx's comment describes this; docs/design/assay-stage/architecture.md item 15 says struck values are "imported as excluded with the reason" The Stage A design check's addendum (pzfx-tables-*) An exclusion the person made in Prism arrives as a missing value, its reason lost; it is not analysed either way Open; owner the CSO (ruling awaited) The CSO rules which the import does; then the component or the architecture record follows
REL-194 Medium The kinetic endpoint's import review says "Value taken: Read 1:600, as the file gives it." while the kinetic line says "The fit takes the last read (8,100 s)": "Read 1:600" is the block's own label, so the two read as a contradiction The Stage A design check's addendum (kinetic-endpoint-*); docs/progress/assay-depth-1.md item 3 A person may doubt which read the fit used Open; owner the CPO Name the block as a label ("the block labelled Read 1:600") or say the endpoint chosen in the same line
REL-164 Low The initial-rates and thermal-shift examples show their synthetic readings at full float precision in the readings tables ("1.1377777777777778", "1029.8142382484868") The closing walk of 14 October 2026 (docs/progress/assay-closing-walk.md), S17; src/components/tools/assay-analyser/examples/ A reader sees 16 significant figures the data never had Open; owner: the kinetics and thermal builders Round the example data to the instrument's precision (write-once fixtures untouched)
REL-165 Low Screening campaign has no example to load; of the 31 chooser entries only screening and power have none, and power needs no data The closing walk of 14 October 2026 (docs/progress/assay-closing-walk.md), S18; panels/screening-panel.tsx The entry cannot be tried without a plate export at hand Open; owner: the screening builder A synthetic two-plate example with its controls, loaded declared as the S7 rule asks
REL-166 Low Result tiles repeat their label ("Kd" above "Kd = 2.008 nM"), most visibly at 375 px. The Stage A design check's addendum found the same on the Hill and two-substrate kinetics tiles, worst on the long labels ("S0.5 (substrate concentration at half Vmax)" twice) The closing walk of 14 October 2026 (docs/progress/assay-closing-walk.md), S22 Redundant text on every tile Open; owner: the CPO The label stays as the tile's heading and accessible name; the value line drops "Kd =" (the CPO's ruling)
REL-167 Low When standards carry unequal numbers of kept readings the interval is withheld as "unequal-replicates" without naming which standards are short The CPO's memo of 14 October 2026 on the closing walk, "unequal-replicates" The person must find the short standards themselves; the copy must never suggest excluding readings to restore the interval Built 25 October 2026 on claude/codex-calibration-count-explanation: one content-owned paragraph derives every retained level below the observed maximum from the already trusted v2 result, only for an actual unequal-replicates interval. Saved units, exact String concentration identities, counts and numerical order are retained; generic unknown refusals, stored evidence and exports are unchanged. Before-fix real-worker browser reproduction and focused native checks recorded; integrated browser/size/Fast acceptance pending Complete integrated desktop, phone and Dark checks and the existing final chain; REL-168 remains open
REL-168 Low No interval method for standards with unequal replicate counts The CPO's memo of 14 October 2026 on the closing walk, "unequal-replicates" The interval is withheld rather than computed for unequal replicates Open, the first Assay follow-on; owner: the CSO A method for unequal replicate counts, with its oracle
REL-169 Low The start's suggestion line does not recognise a small matrix of whole-number counts with row and column labels (design §4.2, row 416), so a counts table pasted on the start gets no suggestion. A table of columns with a text label column (before/after by Culture) gets no suggestion until row 416's rule separates it from a counts matrix The closing walk of 14 October 2026 (docs/progress/assay-closing-walk.md), addendum, own-data pastes (A1); src/components/tools/assay-analyser/chooser/shape.ts The person chooses Counts and proportions from the chooser themselves Rows 413, 414, 415 and 417 fixed on 14 October 2026 (the CPO's ruling on criterion 1: X and Y pairs, columns of values and time to event suggest their group, a column of p-values suggests False discovery rate; a two-column table is never a dose table). Row 416 open, carried; owner: the CPO with the chooser's builder A counts rule: a labelled matrix of whole numbers, read by the counts parser, suggesting Counts and proportions
REL-170 Low For the trend across ordered groups, the withheld sentence asks to "name the exposed row, the reference row and the event column"; the trend needs only the event column The closing walk of 14 October 2026 (docs/progress/assay-closing-walk.md), addendum re-read; src/lib/stats/counts.ts (trend gate, ROLES_UNDECLARED) The sentence asks for two choices the analysis does not use Open; owner: the CSO (a trend-only code needs the counts fixture to carry it; fixtures are write-once) A trend-only reason, "Withheld: name the event column.", with a new fixture case
REL-171 Low "95%" is written in 11 Assay copy files where the rest of the app writes "95 percent" The CSO's copy pass of 14 October 2026 on the closing walk Inconsistent style Open; owner: the CPO One style across the copy files
REL-172 Low The outlier-candidates example contains no candidate The closing walk of 14 October 2026 (docs/progress/assay-closing-walk.md), S20 (the CSO: a valid answer, carried) The example does not show a flag Open, carried; owner: the CSO with the columns builder An example with one planted candidate, or keep as a valid answer
REL-173 Low The curve-fit example's data comment does not say that declaring its replicates independent units implies a separate sample at each time point The CSO's copy pass of 14 October 2026 on the closing walk A reader may take the example's declaration as fitting a timecourse of one culture Fixed (14 October 2026): the example's data comment says so, as the CSO's memo of 14 October asks Say so in the example's data comment
REL-174 Medium In the Figure view's elements list, a burst of arrow keys (a held key, or keys arriving before React re-renders) moved the selection by one element instead of one per key CI 38503547856 on b102f4b4: figure-editor.spec.ts:36 failed twice on desktop (flaky on desktop-dark in batch 9); reproduced locally, four keydowns in one task moved one element; onListKey in src/apps/assay-analyser/views/figure-view.tsx stepped from the selection its render had seen A keyboard user loses steps when moving quickly through a figure's elements Fixed on 14 October 2026 by the figure editor builder (fb6f18a1): a functional state update steps from the selection as it stands; the spec sends the four-key burst in one task and waits for the Figure heading's focus before the list (896526a6); 60 of 60 at 3 workers, no retries None
REL-196 Medium The daily capture (capture-patent.yml) is a scheduled workflow with the risks REL-02 records (disabled after 60 days without activity in a public repository; a failed run notifies only the file's last editor), and a gap in the daily series cannot be repaired later because the FDA publishes current files only .github/workflows/capture-patent.yml; research 11.9; the CFO's memo of 13 October 2026 §2.1 A silent stop loses history for good Open (recorded); mitigated by the capture-watchdog job in scheduled.yml (fails within the week when a source's last success is older than its allowance) and by the heartbeat in log.ndjson Someone reads the Monday run; the CFO's checkpoint of 13 April 2027 reports days captured and gaps (D-0077)
REL-197 High A store built from the real Orange Book files alone is 1.01 MB gzipped (8.8 MB raw; 48,865 product, 22,438 patent and 2,421 exclusivity rows), above the 600 KB gzipped ceiling the architecture record sets for the one-file store, before the Purple Book and the Paragraph IV list are added build-store.py --data-dir on the first capture (14 October 2026); docs/design/patent-stage/architecture.md ("hard ceiling 600 KB, split per application above it") The first real store cannot ship as one file; every visit would download about 1 MB Fixed on 14 October 2026 on the CTO's ruling of that day: the store is served as a meta file, a names-and-dates index (ceiling 350 KB gzipped) and up to 100 shards by application number (ceiling 50 KB each), built by build-served.mts with the engine at build time; on the real capture with all three sources the index is 337 KB, shards median 33 KB and largest 44 KB; store.test.ts and the build refuse anything over its ceiling; served.test.ts checks the catalog and the shards against the whole-store engine None; the index has 13 KB of room, so the CPO's question (whether ANDAs need name search) is the lever if it grows
REL-200 Low e2e/smoke/research-workspace.spec.ts expects one [data-research-app] row per app (APP_INDEX.length, 10) in the sidebar, which draws nine: Cell sits under Learn e2e/smoke/research-workspace.spec.ts:29, the eleven per-app titles, failing on desktop on 54fe07c8 before the feedback round of 14 October 2026 and after it; failing the same way on main's heads efd0be38 and 7f344a4f, with :146 (the laptop-height check that every destination is in view names Cell, which is inside Learn) The per-app research-navigation test is red; the sidebar itself is as designed Fixed 14 October 2026 (claude/wonderful-volta-a9drdv): the widened column lists Learn's subjects, so Cell's row is drawn and the per-app count passes; the laptop-height check (:144) counts the apps that have tiles, Cell being under Learn Closed
REL-201 Low e2e/objects/workspace-study.spec.ts "legacy browser Studies transfer only through explicit signed-out export and paid restore" times out clicking the legacy Study's link after Recover browser work workspace-study.spec.ts, the legacy.name link click, failing on desktop on 54fe07c8 and after the feedback round of 14 October 2026, against a dev server The signed-out legacy recovery path is unverified by its test Open Check where the recovered Study's link renders on the Bench since D-0084 and point the test at it
REL-202 Low At the desktop project's width (1408 px) the Protein dossier's breadcrumb crumb "EGFR · P00533" is squeezed to nothing between the bar's tools, so expectEgfrNamed fails in e2e/protein-explorer/dossier.spec.ts ("the hero, the map, the evidence cards…": getByText('EGFR · P00533') resolves but is hidden) Fails on claude/wonderful-volta-a9drdv at 4f55975e before the polish pass of 14 October 2026 and after it (run against the dev server on 14 October 2026); the before screenshot of the pass shows the crumb missing at 1440 px The page still names the protein in its H1; the bar's subject is lost at laptop widths Open (recorded on the base branch); owner the CPO Give the crumb a minimum width ahead of the bar's search field, or let the search field shrink first
REL-203 Low e2e/smoke/settings.spec.ts:21 ("workspace settings persist across reloads and tools") sometimes aborts its page.goto(appHref("lab-calculators")) from the Bench after the reload (net::ERR_ABORTED; maybe frame was detached?) On main's head 7f344a4f (14 October 2026): failed in the desktop project's full run, then once in two runs on its own against the same build; its other assertions passed each time. On phone (a3056126, the notepad's chain run) the same test once timed out at :61, where the Menu key pressed straight after the move to Calc took focus without opening the sheet; three repeats then passed 9 of 9. On a50a0131 (the workspace loader's chain run, four workers) it timed out at :14, the Menu key pressed on arrival opening no sheet, and e2e/smoke/stage0-accessibility.spec.ts:12 did the same on phone with the bar's search key (no palette; :17 waited for its combobox); the two, three repeats each on two workers against the same build, passed 6 of 6. The common shape is a key pressed on a busy machine before its page has hydrated The Settings persistence test is intermittent on desktop; the settings themselves persist as specified Open Find what navigates the Bench page as the test leaves it (a hash or history write after the reload) and wait for it, or make it not navigate
REL-204 Low Two e2e/search/catalogs.spec.ts titles ("protein seeds survive unavailable APIs…", "a locally suggested protein loads its complete sequence…") fill getByRole("combobox").first() on /protein/app, which is now the Layout <select> (pe-layout) above the search field on Protein's start, so fill throws Desktop run on a production build of claude/feedback-fixes on 14 October 2026; the branch does not change Protein's start (it differs from main there only in views/workspace.tsx's saved-tab rule), so the cause is the start's layout on main The catalogue specs for Protein are red; the search itself works Closed 14 October 2026: the Layout select was removed (the layouts are tabs), so the first combobox is the search field again Point the two titles at the search field by its name (pe-search) if a combobox is added above it again
REL-205 Low e2e/smoke/polish.spec.ts "Copy FASTA confirms on the button once the clipboard accepts, and keeps its name" (desktop) is intermittent: the key reads data-copy-state="copied" while the word on show is still "Copy FASTA", or stays copied past the 4 s wait for idle On main's head a13d6da2 (14 October 2026), eight repeats on one worker against its own production build: 2 failed at the shown-word check. The sidebar push and workspace loader branch (a19607af) failed it once in the desktop project's run (the idle wait) and once in four repeats (the shown-word check). The test's toPass loop presses again when the first press is not heard within 1 s, so a second press can land while the key is already copied The copy key itself confirms and resets as specified on the passing runs Fixed on claude/fixup-e2e-assay, 17 October 2026. Cause: the test pressed while the dossier's Mol* viewer was starting. In the test browser it renders in software WebGL (SwiftShader) and holds the main thread in frames of 2 to 9 s for about 35 s after load (long-animation-frame entries in molstar.js). A press was heard up to 15 s late, and the key's 1.5 s timer fired up to 4.8 s late. The test's separate reads of the state and of the word could straddle the end of "Copied", and the idle wait ran out. The key behaves as specified: every recorded run showed idle, pending, copied with "Copied", then idle with "Copy FASTA", at one width. Test fix: it waits for mainThreadQuiet (e2e/support/layout.ts) before the press. It records every state with its word and width in the page and checks them, rather than polling the word, and every expectation is kept. Before the fix, 6 of 20 failed; after it, 20 of 20 passed (desktop and desktop-dark, 10 repeats each) Mol* in software WebGL holds the dossier's main thread for about half a minute on CI. Other dossier tests that time a short-lived state may need the same wait
REL-206 Low e2e/smoke/discovery-layout.spec.ts:14 ("all discovery starts put their search first in the same compact frame, with the same parts") fails on desktop and phone: card.evaluate on [data-discovery-start] at :54 times out after the workflow guide is opened and closed On main's head 6badabbb (15 October 2026), its own production build: 4 of 4 failed (two repeats on each project). First seen after the views-on-the-tabs round (D-0088, 6bdd8acc), which reached main with its browser run skipped on the CEO's word; the slimmer sidebar branch (ee73341e) fails it the same way The discovery starts are not measured by this test until it passes Fixed (17 October 2026, claude/fixup-e2e-shell): the start was sound; the test helper hung. The guide's body fades in over 160 ms (ui-disclose on each child of an open <details>, instrument.css, the motion pass 906ea784); the test closes the guide within that time, and Chromium neither restyles nor advances animations in a closed disclosure's content, so the fade stays running until the guide opens again and settle() (e2e/support/layout.ts, which awaited every animation's finished with no limit) never returned, the next call timing out. settle() now leaves out animations inside a closed disclosure (not its summary): nothing there is drawn. Nothing on screen was wrong, so the product is unchanged. Moving the fade to ::details-content (the CPO's approved item 2) was tried and dropped: this Chromium computes the animation there but never runs it, so the fade was lost. A new test in the same spec checks the fade, a settle after a quick close and the reduced-motion collapse None
REL-235 Low e2e/education/structural.spec.ts:54 ("new subject groups retain every destination and support column navigation across short rows") and e2e/education/workspace.spec.ts:8 ("education subjects group independent tools and open the current subject") timed out on desktop and desktop-dark clicking the rail's Learn tile REL-218; reproduced on a production build of 4d22f79d (17 October 2026). The desktop projects are 1408 px wide, xl, where the rail is widened by default and lists Learn's subjects itself; the Learn tile is drawn only while the rail is collapsed (in-data-[rail=expanded]:hidden), as the CEO asked on 14 October 2026 (c19808cd: the sidebar pushes the page, the widened column lists the subjects, the tiles keep the Learn tile) The two tests did not check the Learn list Fixed: openLearnNavigation (e2e/support/shell.ts) presses the Learn key only when the shell root's data-rail is collapsed, then expects the widened column with the subject groups; the expectation follows c19808cd. workspace.spec.ts:8 then met REL-236 None
REL-236 Low e2e/education/quantitative.spec.ts:12, :38 and :59 (the dose response, serial transfers and buffer controls tests) and, past REL-235, e2e/education/workspace.spec.ts:8 failed axe colour contrast on desktop: a rail label (#b8c9cc) against the page paper (#f3f0e8), 1.5:1 REL-218; reproduced on a production build at 1408 × 880, light. The widened rail scrolls the current education row into view, which puts upper rows beneath the opaque sticky Bench group. With the scroller's bottom-fade mask-image on, axe treats the scroller as a stacking context and reads those covered rows as text on the paper; with the mask off, axe reports nothing at any scroll position. The rows are hidden on screen: a false reading Recorded per D-0080; no visible defect Fixed: the research rail draws its bottom fade as RailFade (shell/rail-column.tsx), a zero-height sticky anchor with a 24 px gradient into the rail's surface, pointer-events: none, aria-hidden, hidden in forced colours, instead of masking the scroller (useRailScroller(list, { fade: "overlay" })). research-workspace.spec.ts's two mask assertions now check the overlay's absence and presence. CPO memo of 17 October 2026 Bring the Menu sheet's and preview rail's mask to the same overlay after v1 (docs/NEXT.md)
REL-237 Low e2e/smoke/stage0-accessibility.spec.ts:39 ("an overflowing compact rail has one keyboard stop and keeps Bench pinned") failed on all projects: after /o#objects, Home did not focus Bench REL-218 (also on 9fa37e0); reproduced on a production build. The second route, /o#objects, is a same-document hash change; the library module loads on demand (2bd4034e) and, about 300 ms later, its mount moved focus to its heading (focusOnShow), taking it from the rail while the test was moving through it with the arrow keys A person moving focus while a Bench view loads lost their place Fixed in the product: the Bench tracks focusin after its own focus move and passes the library a guard, so the library takes focus only if it has not moved since the view was asked for or has fallen to the page (objects/object-list.tsx, object-library.tsx). New test "a Bench view's library takes focus to its heading only while focus has not moved (REL-237)" holds the module to cover both cases. CPO memo of 17 October 2026 None
REL-238 Low e2e/fragment-search.spec.ts:9 ("saved DNA search explains strand, origin, unresolved bases and bounded coverage") failed on all projects: no "Find DNA fragment" disclosure on /o REL-218; reproduced on a production build. Since 9f54f09c (D-0084: hash views in place of the tab row) the Objects library and the search in its tools are the Bench's #objects view, not the overview. No Sequence, Plasmid or held file is involved The search's behaviour was not checked Fixed in the expectation: the test opens /o#objects after seeding, citing D-0084 and 9f54f09c None
REL-239 Low e2e/education/nucleic.spec.ts:83 ("all nucleic workspaces honour reduced motion and keep manual steps usable on a phone") flaked once on desktop CI run 39031934015's log: a strict-mode violation, [data-education-experiment] resolved to two elements, the shown experiment and React's hidden streamed copy (<div hidden id="S:0">) awaiting its reveal. 20 of 20 local repeats pass Intermittent CI failure Fixed in the expectation: the test reads [data-education-experiment]:visible, the experiment that is shown; the assertions on it are unchanged None
REL-250 Low Plasmid draws at most 40 enzymes on the map (MAX_SHOWN, src/components/tools/plasmid-map/address.ts) and says nothing when a 41st is chosen: the enzyme is scanned and listed but silently absent from the map Read on main at 000a4206, 17 October 2026, by the Stage C planning lead; the Sequence stage recorded the same defect as its provisional REL-200, a number main uses for another row A person who adds an enzyme to the map and sees no site may read that as "no site" Fixed on claude/stage-c-room (17 October 2026), with REL-267: up to 100 enzymes may be chosen (MAX_CHOSEN, all in the link) and the map draws the first 40; a 41st tick is accepted and "Show the unique cutters" chooses every unique cutter. While more than 40 are chosen the enzyme panel shows the shared cap line (chooserWords.capReached, "chosen enzymes", "the map", six names then "and {m} more") followed by enzymes.notDrawnNote, and marks each undrawn chosen row "not on the map" (the CTO's A1 and Part A 4·4; the CPO's cap-line slot, words, left-off line and noun memos). Every enzyme is still scanned and the lists are never shortened. e2e/plasmid-map/enzyme-cap.spec.ts, content/apps/enzyme-chooser.test.ts, src/components/tools/plasmid-map/address.test.ts A sequence with more than 100 unique cutters would have "Show the unique cutters" choose its first 100 with nothing said (none shipped comes near it; with the CPO)
REL-253 Medium A CDS shortened at its 5' end by an edit keeps the record's /codon_start, so the exported GenBank file states the wrong reading frame and the translation check then refuses a span that does translate genbank-export.ts:207 keeps every record qualifier not in IDENTIFIER_QUALIFIERS or RECOMPUTED, and RECOMPUTED (line 52) omits codon_start; line 214 passes the stale value to checkTranslation. Verified by the CTO seat on 17 October 2026 by a scratch run of plasmidGenBank on a 13 bp record with CDS 1..13 /codon_start=2: the edit to 2..13 exports /codon_start=2 and "No translation: the span is not a whole number of codons (11 bases)", where the correct frame is 1 and the span translates. A shortening by a multiple of three is handled correctly. Not checked: a feature on the complement strand, where the moved coordinate is the end A kept file states a frame that is not the feature's, and the file's own note says the CDS does not translate when it does Open; owner Stage C (the feature-transfer and cloning track), after claude/sequence-wave6-debt, whose hunks share the file Add codon_start to RECOMPUTED and compute it with the pure helper codonStartAfterTrim(codonStart, trimmed5) = ((codonStart - 1 - trimmed5) mod 3) + 1, counting trimmed bases in the feature's reading direction; rerun the genbank-samples fixture through reference.py genbank so the existing Biopython agreement test is the check (the CTO's memo of 17 October, B2)
REL-254 Medium Four of the ten feature types the map uses are written to exported GenBank files as feature keys that INSDC replaced in 2014, and one is not an INSDC key at all genbank-export.ts:187 writes key: f.type for a library call and f.type is the library entry's own type (model.ts:205); of the ten FEATURE_TYPES (features/model.ts:13), promoter, enhancer, terminator and polyA_signal were replaced on 15 December 2014 by regulatory with /regulatory_class, and recombination_site is not in the key list the CTO seat read, which has misc_recomb (INSDC Feature Table Definition version 11.4, April 2026, read 17 October 2026, first 100,000 characters). Biopython reads unknown keys without complaint, which is why the export oracle passes. Unverified: the absence of recombination_site from the rest of the page A file a person keeps and opens in another tool carries superseded or unknown keys, and the same route makes a mistyped library entry a wrong key rather than only a wrong label Open; owner Stage C; behind claude/sequence-wave6-debt (same files). An export-format change, so the CPO is consulted and the CSO confirms the table Keep type as the map's category and map it to the current INSDC key with /regulatory_class in a pure table at write time, for library, added and edited features alike; record and file features keep the keys they came with. Read the full key list and record the date (the CTO's memo of 17 October, B3)
REL-255 Low Four tests are red on claude/stage-c-library by design while the v2 feature library is unpublished: three in specificity-v2.test.ts because the fixture is written for 90 parts and the shipped library is v1's 50, and one in plasmid-data.test.ts because the fixture manifest lists the new fixtures while the published 0.12.0 copy does not Reported by the Library builder on 17 October 2026 (3e3ce9f4, then b00c304); the order is the CSO's: the fixture is written before the engine and before the manifest bump (stage ruling 8) and the expectation is taken from the fixture as built, so a 90-part fixture cannot pass against a 50-part library. Write-once refusing to see unpublished fixtures is the gate working. Updated 17 October 2026, 14:20 UTC: with the full specificity fixture written the count is nine red tests, all in specificity-v2.test.ts and all reading the shipped library 1 against the 90-row fixture, listed by title in the track record; the fourth, the published-files check, has been green since REL-268 and the draft manifest. Corrected 17 October 2026, evening, by the Library track: once library 2 was built (ee6ab000), four of the nine stayed red, so they were never only this sequencing: they were defects in the track's own test code that this entry hid, attributed here without their failure messages being read. The display cases read the fixture's inside in an old shape; the bucket test said an identity pair takes no marking; the display-step test's two calls overlapped 40 percent rather than 60; and the real-sequence parameter test passed settings to an indexLibrary argument nothing read. All four are fixed in cb19444, with no fixture value changed. A fifth, the family cross-check, was the oracle's family output ignoring markings, fixed in the oracle on the CSO's ruling. Building library 2 also turned five library-1 tests red (the 0.12.0 annotation cases, the 50-entry load check, the GenBank writer samples and the two goldens), which read whichever library was current; they now name library 1 (1ea91cf) The Library branch cannot show a fully green unit run until its verification version publishes Closed 17 October 2026 by verification 0.14.0: its fixtures and manifest published together in one commit, after Gel's 0.13.0, and library 2 frozen in a commit of its own on the same branch (the build command was refused by the Library session's permission check, so the freeze is run where the CEO approves it); both land together through the day's merge queue (D-0101); with it npm test is green on the branch with no fixture value edited (the four test defects and the five library-1 pins named above were fixed in the test code, and the family output in the oracle on the CSO's ruling) Publish the manifest and the fixture together so main never carries a 90-part fixture against a 50-part library for more than that commit, and clear the nine with no expected value edited. Any expectation that must change cites the ruling that changed it and is reported to the CSO. None is deleted, skipped, marked expected-fail or made to pass against either library (the CSO's memo of 17 October on buckets against markings, ruling 5)
REL-256 Low The exported GenBank file does not state the product's own sequence SHA-256, so a figure caption or a methods paragraph citing a product hash cannot be matched to the file it describes genbank-export.ts:256 writes the assembly statement, one parent line per input with each parent's SHA-256, and the qualifications, but never the productSha256 the record already holds (src/apps/plasmid-map/assembly-record.ts:28). Read by the CSO seat on 17 October 2026 Lineage in the file is one-sided: a reader can identify what a product was made from but not the product itself, and read-support text outside the file cannot be tied back to it Open; owner Stage C. It is the CSO's standing condition for accepting that read support stays out of the file Emit the product's own sequence SHA-256 as a COMMENT line, which is a property of the sequence the file carries and asserts nothing about reads (the CSO's memo of 17 October answering the CPO, point 4)
REL-257 Medium The digest publishes two lossy scalars where it should publish a census, so a lane cannot name why it was not cut, one cause is invisible, and one count is already wrong: the blocked count sums two opposite causes Read by the CSO seat and confirmed line by line by the CTO seat on 17 October 2026 in src/lib/seq/digest.ts (the uncut flag at 161 and 176, which is set only for a known digest of a circle with no surviving cut and so conflates no-site with all-blocked; the off-end skip at 157, after src/lib/seq/enzymes.ts:187 sets the flag, which hides a linear lane with sites present, none blocked, none uncertain and no cuts; the blocked count at 149 to 151), and src/lib/seq/methylation.ts:145-146, where a site that needs methylation and has not got it returns the same false as a blocked site, although the dependency is the reverse and that outcome carries no methylase list. Five causes in all. The same reading resolves an earlier open risk: an uncertain site cannot reach the flag, because the flag requires the digest to be known Live and user-reachable, not latent. The CSO seat confirmed on 17 October 2026 that the enzyme driving the needs-methylation case is in the shipped table (pipeline/plasmid-map/enzymes.csv:117, its flag derived in build-enzymes.mts:71-77 from the transcribed not-cut row), so with the host set to unmethylated, which is what a PCR product is and what this stage's Gibson and Golden Gate inserts are, every site reports as blocked by nothing: 15 such sites on pUC19 and 22 on pBR322, counts taken from the published digest fixture. No band pattern is wrong, since the no-cutter call is correct; what is wrong is the explanation beside it. The blocked count is already wrong today, before any new copy, wherever it is shown. Nothing can name a lane's cause truthfully, and the off-end case is most reachable with Type IIS enzymes near the end of a PCR product, which is the traffic this stage is adding Open; owner Stage C (the Gel track), closed by the engine commit, which must close before the copy row REL-264 One change in the digest loop that already visits every site: publish a census (sites, cutting, blocked narrowed to actually blocked, needs-methylation-not-met, off-end, uncertain) with a test asserting they sum to the site count, so a sixth outcome cannot later fall into no bucket; add the required methylase to the needs-methylation outcome so a true sentence is writable; audit every current reader of the blocked count in the same commit; derive the cause in one pure exported function returning a list rather than a tag, since a lane can carry two causes at once; keep the uncut flag only as the drawing decision with its comment corrected. Fixtures under gel rules 2.0.0: circular no-site, circular all-blocked, circular needs-methylation, linear no-site, linear off-end, and a mixed lane. About half a day (the CTO's memo of 17 October, B1, and its addendum section 3)
REL-264 Medium The digest lane's copy cannot state its cause until the engine publishes one, and two shipped or drafted strings say "no site" where sites exist Dependent on REL-257. The shipped single-digest string and the circular string drafted in the design screen both assert no site where the cause may be methylation; the CPO has removed the first and replaced the second with five composed cause sentences, four drawing sentences and a selection table (its memos of 17 October), and the CSO has confirmed the scientific distinction, that a known-blocked lane may be drawn as one full-length band while an uncertain one may not Until it ships, a lane either says nothing about why it was not cut or says something untrue. Two of the five sentences are unreachable until the engine row closes Open; owner Stage C, the CPO's words with the CSO's confirmation, closed when the sentences ship Compose the lane statement, one cause sentence per cause present, then exactly one drawing sentence, selected by topology and the hundred-base floor; ship the labelled route to the sites alongside every cause that asserts sites exist, and never on a lane whose construct has no reachable site list; take the hidden-fragment slot and the band from the one floor constant. Two or more uncertain sites draw no bands and say so (the CPO's memo of 17 October on the fourth cause)
REL-265 Medium The digest classifies a site's methylation before its geometry, so a site whose cut cannot fall inside the molecule is still counted under a methylation outcome: an uncertain one takes the whole lane to "the bands are not known" when the bands are known, and a blocked one is reported as a methylation cause that changing the host would not fix Found by the CSO seat on 17 October 2026 reading src/lib/seq/digest.ts:149-157, where the blocked test, then the uncertain test, then the off-end skip run in that order. For an uncertain off-end site both branches of the uncertainty give the same fragments, because a cut outside the molecule makes no end either way, yet the site sets the digest not-known, which nulls the fragments for the whole lane. Most reachable with Type IIS enzymes near the end of a linear product, the traffic this stage is adding. A grep-level check of the published fixtures found no expectation that moves, since the digest cases are circular plasmids where the off-end flag is false by construction, but that is not a test run The app withholds a determinate answer, and separately states a cause whose remedy would change nothing. Two secondary effects of the fix are improvements: a lane with one ordinary and one off-end uncertain site gets the labelled variant pair instead of nothing, and the diagnostic picker stops excluding enzymes whose only uncertainty is consequential nowhere Open; owner Stage C (the Gel track), with REL-257, whose census it also settles Test the off-end case first, so such a site contributes nothing to the cut set, nothing to the blocked or needs-methylation counts and nothing to the uncertainty, while its own methylation outcome still appears in the site table, which is a fact about the site. Document the precedence beside the census invariant, which without a stated order can be satisfied by a wrong assignment. Run the full chain on the change and report any moved expectation to the CSO rather than editing it (the CSO's memo of 17 October on the five causes, section 2.1)
REL-266 Low Two implementations of canonical JSON exist side by side and are not equivalent: the strict pair validates first and throws on anything not losslessly representable, while the lighter pair runs no validation and silently drops keys whose value is undefined Read by the CTO seat on 17 October 2026 while ruling on REL-23: canonicalJson and contentHash, then in src/lib/workspace/contracts.ts and since REL-23's fix in the dependency-free leaf src/lib/workspace/canonical-json.ts (which contracts.ts re-exports), against canonicalJsonLight and contentHashLight in src/lib/workspace/content-hash.ts, which was created on 10 October precisely so a task-page island would not carry the search catalogues through the contracts module, and which about twenty call sites now use The two are not interchangeable, so a later reader meeting the dependency problem a third time may substitute one for the other and loosen a validator without noticing. That substitution was proposed and refused today Open; owner the CTO, for the pre-live pass Confirmed 21 October 2026 with REL-23's fix: a key holding undefined survives postMessage (as structuredClone), canonicalJsonLight calls such a record equal to one without the key, and the strict canonicalJson throws WorkspaceValidationError (pcr-product.test.ts, "the PCR product reader compares with validating canonical JSON", holds the reader to the strict one); content-hash.ts's header now names the leaf. Converge or remove one of the two. Not in the REL-23 fix commit, where it would be a behaviour change at about twenty call sites inside a size fix; the lighter module gains one line pointing at the new leaf, and this row records how they differ so the third person to meet the problem does not write a fourth copy
REL-267 Medium The enzyme chooser narrows the person's own choice to fit the map's drawing limit, silently: the unique-cutters key writes only the first forty into the chosen set, and a tick above the limit returns without doing anything or saying anything Read by the CPO seat on 17 October 2026 in src/components/tools/plasmid-map/panels/enzyme-panel.tsx: the unique-cutters key at line 129 passes the unique-cutter rows through slice(0, maxShown), and toggle at line 68 returns silently once the shown list has reached the cap, with MAX_SHOWN 40 in src/components/tools/plasmid-map/address.ts:37. On a sequence with 42 unique cutters the chosen set after that key press is exactly 40, so nothing is left off and the cap sentence has nothing to say, while the choice has been reduced from 42 to 40 with no word said. The Room track's branch may already have changed one or both; it is asked to answer from the code. Confirmed by the Room track from the code at e5362be0, unchanged since f5683e03: the tick handler at enzyme-panel.tsx:69 sets a left-off state and returns without writing the name into the link's enzyme key; the unique-cutters key at :84 passes its names through slice(0, maxShown); and the search or count pick in plasmid-workspace.tsx:2115 adds to that key only while the shown list is below the cap. So the sentence the track had written, and the test asserting it, describe a refusal rather than a chosen-but-undrawn state, and the count in that sentence is the unique total rather than the chosen count. The track agrees with this row and both the sentence and the test go Two consequences. The person's chosen set is not what they chose, which is the silent truncation the design rules forbid outright. And the cap line, the left-off count, the undrawn-row mark and the route to the names all describe a state the code cannot currently reach, so REL-250's copy has nothing to attach to on that route Fixed 17 October 2026 on claude/stage-c-room at cc251fc8: the link key keeps up to a hundred chosen with the map drawing the first forty, the unique-cutters key writes the whole set, a tick above the drawing cap is accepted, left off is computed as chosen minus drawn and feeds the sentence, the names, the row mark and the pronoun, the link limit disables its control with the CPO's stated reason rendered once and referenced by every disabled row, and the test expectations changed with the product citing the memos. Closes when that branch merges. Owner Stage C (the Room and chooser track), with the CPO's rulings of 17 October The draw cap governs drawing only and never choosing: the unique-cutters key writes the whole unique-cutter set into the chosen set and into the link, a tick above the cap is accepted and yields a chosen-but-undrawn state, and the chooser row of an undrawn chosen enzyme carries its mark. The count the shared cap line receives then becomes the chosen set's size on every route, which is what makes one noun true everywhere and keeps the sentence's arithmetic in step with the row marks. The browser expectation changes with the product change cited. The separate hundred-name limit on the link is a different limit and is never blended into this sentence
REL-268 Medium The feature oracle rewrites the published fixture manifest's header on every run, so any run of it turns the byte-identity check red and asserts that the published fixtures were regenerated when they were not Found by the Library track on 17 October 2026 while clearing REL-255: the oracle writes the manifest's header fields, today's date, the script's hash and the running Python version, each time it runs, and src/lib/seq/plasmid-data.test.ts compares the fixtures manifest byte for byte against the published copy for the registry's current version. So the check went red for a reason unrelated to any fixture's content, and the header's own values claimed a regeneration that had not happened. Fixed on claude/stage-c-library by writing the manifest only when its own entries change, after which the fixtures manifest is byte-identical to the published copy and stays so across a run A reviewer reading the red check would look for a changed fixture and find none, and the header asserted provenance for work that was not done. Together with the draft manifest it accounted for one of REL-255's four failures, cleared with no expected value edited Fixed 17 October 2026 on claude/stage-c-library; closes when that branch merges. Owner Stage C Write the manifest only when its entries change, so the header's date, script hash and interpreter version record a real regeneration rather than the last time anyone ran the script
REL-269 Medium The Plasmid analysis worker pulled the URL state, the hand-off parameters and a GenBank reader into its bundle through a single re-exported constant, a chain that predates the Stage C branches Found by the Stage C room track on 17 October 2026 while publishing the worker's file list for the CTO's condition. None of the four modules the CTO named was present, but protocol.ts re-exported a sequence cap from eutils.ts, and that one import carried src/components/suite/store/url-state.ts, src/lib/handoff/params.ts and the GenBank reader with it. The same disease as REL-23 in a second worker, reached by a different route 5.8 KB of a worker's bundle, and a budget row set 6.6 KB higher than it needed to be. Neither worker needs any of those modules Fixed 17 October 2026 on claude/stage-c-room: the constant moved to its own leaf module with both former homes re-exporting it, the worker measured down from 31.9 to 26.1 KB and its row from 36.7 to 30.1, and worker-closure.test.ts walks the worker's static imports against ten forbidden modules and fails if the re-export is pointed back. Closes when that branch merges The closure test is the part that matters beyond the bytes, and it is what the CTO asked for on REL-23: a measurement passes once, a test holds. REL-23's own fix belongs to the Sequence stage and should land with the same kind of test
REL-270 Low On a push, the Fast chain's write-once job compares against the branch's own previous push rather than against main, so removing a file that an earlier push placed under a protected path turns that one run red on the exact head a merge needs green Found by the Stage C transfer track on 17 October 2026: its push moving a draft manifest out of the protected fixtures directory went red in the write-once job with "published file deleted", because check.yml:41 sets the base to the previous push of the same branch, which still carried the file. Against main the same check passes ("943 published files preserved against 7c8479e5; no drafts"), and on a workflow dispatch the base is empty and the job fetches main. The run self-heals on the next push, which compares against a head without the file A false red on the exact SHA the merge procedure requires green, for a change that is correct against main. The two obvious ways to clear it, an empty commit to kick CI and a record-only commit, are forbidden and paths-ignored respectively Open; owner the CTO Either compare the push-triggered write-once job against origin/main as the dispatch path already does, or document in the merge procedure that a green dispatched run of the same chain against main satisfies "checks on the exact head" when the push run is red for this reason, with the red run and its cause stated in the merge record. The Stage C tracks are landing on the second reading meanwhile Interim reading, 17 October 2026 (the coordinator, confirmed from check.yml lines 40 to 47): a branch's first push has the zero SHA as github.event.before, so its base is main; a track whose branch has gone red against its own previous push lands by pushing the exact final SHA to a fresh branch (the Gel track: claude/stage-c-gel-land) and taking the green run on that SHA as the D-0092 gate, naming both branches and the run in the merge record. Same commit, no rewrite, no empty commit. The fix remains the CTO's
REL-272 Low e2e/improvements/batch-statistics-actions.spec.ts:14 fails intermittently on main's own head Measured by the Room track on 17 October 2026 on worktree builds, one test repeated: 1 of 6 runs fails on 7c8479e5, 2 of 6 on the Room candidate 784c9bcf (which carries f2618a0c); seen first in the Room candidate's ci.yml dispatch 39040661197 on cc251fc8. Not in REL-217, REL-218 or REL-219; the Room diff touches no Assay or batch surface One intermittent title that any browser dispatch may show red; it is not a Stage C branch's Open; owner the Sequence batch-recovery maintainers (the title exercises the Sequence adapter; the earlier Assay-stage allocation was historical). On 22 October, isolated main 24981a227 yields one first-probe pass; five passes / one line-38 failure in a fixed six-case run; seventeen passes / three line-37/39 failures in a fixed twenty-case, two-worker, zero-retry run. Evidence: docs/progress/bench-matrix-2026-10-22/batch-main-*. These different symptoms do not establish inheritance for the matrix’s line-35 recovery-message failure; the bounded Linux diagnostic and its actual attribution outcome are recorded separately in the dated evidence Run the test twenty times on main's build to find the race, then fix it in the product or the test's wait, never by a retry; until then every merge record that shows it names this row
REL-311 High GitHub Actions refuses every new job on the repository: the account's Actions spending limit is exhausted, so no check chain or browser matrix can run and no merge gate under D-0092 can be met Found by the Stage C coordinator on 17 October 2026 at 23:58 UTC: Fast chain run 39080999419 on e8f50cf7 failed in two seconds at the lookup job with zero steps and no runner, both attempts, each job annotated "The job was not started because an Actions budget is preventing further use" (the claude/rebuild-sdm-primers run at 23:44, first read as the same, ran its jobs and failed on its own account); the next push's run 39081228104 at 00:01 UTC on 18 October failed the same way. The day's spend: seven twelve-shard browser matrices of up to 60 minutes a shard (D-0098's weekly cadence was run several times over by the Stage C and fix-round candidates), plus about fifty Fast chain runs of ten runner-minutes, on a private repository where minutes are billed (REL-214; the CFO's 8,000 minute ceiling for fast.yml in D-0069) Every landing is blocked: Library's 0.14.0 and Transfer's 0.15.0 publications, the Stage C records, the SDM rebuild, and any other candidate. A push still triggers a run that fails at once, so pushes are harmless but prove nothing Lifted 18 October 2026 at about 07:10 UTC: the CEO raised the allowance ("Github allowance increased") and the coordinator's re-run of 39081283509 started all three jobs; every run from 00:01 to 02:28 UTC had failed the same way at the lookup job with zero steps, and the first jobs with real steps are from 07:14 (the Transfer track's reading, run 39107299065 with 3, 8 and 19 steps), so nothing ran between midnight and 07:14; the refused runs are re-run by their owners. Open for the cadence question; owners the CFO (the ceiling) and the CTO (one matrix per landing) Second exhaustion 25 October 2026 at 01:26 UTC, found by the coordinator at 01:40: every job since fails in three seconds with no runner and the same annotation; the CFO's memo of 25 October (docs/board/memos/2026-10-25-cfo-github-actions-budget.md) recommends a $300 monthly budget with stop-usage kept on. Raise or remove the Actions budget, then re-run the failed gates once; before the next stage, the CFO and the CTO rule on the matrix cadence per candidate (one matrix per landing, re-dispatched only for a rendered change) and on a self-hosted or larger runner pool if the free minutes cannot carry it; the coordinator records the day's runner minutes from the account's usage report
REL-273 Low The Sequence two-second test (e2e/perf/two-second.spec.ts:60) can exceed 2,000 ms on a two-core CI runner with no change to the page ci.yml run 39057563316 on the Gel candidate 90155a0e (17 October 2026): the "Two-second test" job failed at 2,057.7 ms against 2,000 (warm, CPU 4×, slow 4G). The Sequence translate island (40.4 KB) and the task page (24.0 KB) have the same sizes on main and on the candidate, and no Sequence code imports a module that branch changed; the same test on the same build passed locally at 1,329 ms, and passed on main's run 39050176447. REL-12 records the same two-core variance for the protein-align gate; REL-05 covers only the Assay gate A red timing job on a branch that does not touch the measured page; read alone it suggests a regression that is not there Open; owner the CTO Decide how the gate treats runner variance (repeat the warm measurement and take the median, or report the runner's cores as the Assay step does); until then a merge record that shows it names this row with the page's size on both builds
REL-332 Low /pricing's per-app links (productHref(slug, "pricing") in src/app/(marketing)/pricing/page.tsx) point at a #pricing section the product page no longer has: the CPO's ruling 2 of 17 October 2026 dropped the per-app pricing block, and the link lands on the product page's top Found by the E4 public-pages track (claude/ea-public-pages, 17 October 2026) while cutting the product page to five sections The link's words promise an app's pricing the page does not show; the per-app indicative pricing (app.pricing) is now shown only in the dev kit Fixed 17 October 2026 on claude/ea-public-pages (the commit that closes this row), at the coordinator's instruction: the per-app link list is dropped from pricing/page.tsx, since no app page carries pricing now; the section keeps its heading and body ("Every individual app stays free"), and pricingPage.perApp.link is left unused in content/apps/suite.ts for the CMO to remove with the copy None
REL-333 Low No product page meets the CPO's estimate of under 1,000 words of main text (ruling 2 of 17 October 2026): after the cut to five sections the pages read 1,003 (Cell) to 3,060 (Assay) words, of which Limits and Sources are 565 to 1,728 and the reference directory up to 936 (Molecule) e2e/marketing/product-pages.spec.ts, "the product page's main text is under 1000 words", fails on all ten apps on the E4 head (claude/ea-public-pages, 17 October 2026); per-section counts in docs/progress/enterprise-actions/public-pages.md The pages are 40 to 62% shorter than before (2,648 to 5,337), but still long; the structural edits alone cannot reach the target without dropping limits or sources, which are scientific and licence content Fixed 17 October 2026 on claude/ea-public-pages by the CPO's follow-up ruling (docs/board/memos/2026-10-17-cpo-public-pages-followup.md, on claude/enterprise-review), which changed what the test counts, not how strict it is: the words in hero, preview, features and open total at most 700, every limit and source is shown in sources-limits (visible, no details, Limits first), and the reference cards are title links only (now so). With today's ledes the self-description reads 347 (Molecule) to 575 (Assay) words, so no page is over 700 If a page goes over 700 after the CMO's ledes land, the CMO tightens that page's feature copy (the follow-up ruling); the threshold changes only through the CPO
REL-334 Low A condition search that found no trials showed the empty landscape, with Save to Bench on it, while the condition catalogue was still loading, and for good when the catalogue could not load: conditionNotFound decided nothing until the catalogue was in, so the workspace treated the search as a subject. A condition from another app (Protein's indication links and Evidence disease rows) reached that page on a fresh load Found by the usability track on 17 October 2026 reading src/apps/drug-pipeline-explorer/not-found.ts and views/workspace.tsx against the CPO's E5 ruling ("never a page of zero results with Save enabled") Words that name no condition could be saved as a subject with no trials, until the catalogue arrived Fixed on claude/ea-usability: searchOutcome returns pending while the catalogue loads (the start shows, nothing is announced) and not-found unchecked when it fails; not-found.test.ts, e2e/drug-pipeline-explorer/protein-handoff.spec.ts None
REL-258 High A Golden Gate destination whose two Type IIS sites are arranged the other way round releases the dropout's core as the backbone, and no refusal names the cause: the engine cannot tell the two arrangements apart Read by the CTO seat on 17 October 2026 in src/lib/seq/golden-gate.ts (released, goldenGate) and src/lib/seq/restriction-cloning.ts:225. A circle cut twice yields two fragments in either arrangement, one carrying both recognition sequences and one scarless, and the filter finds exactly one scarless fragment either way, so it returns the wrong fragment as the backbone. What usually fires next is the no-assembly refusal, because the overhangs the reversed cuts expose are arbitrary interior sequence, but that is incidental rather than a check: where those overhangs happen to be compatible the engine returns a product that discards the origin and the marker without any refusal. Not reproduced by a run; the builder constructs the case and records which refusal, if any, fires. Confirmed by runs on 17 October 2026, and worse in one case than the reading supposed. With two different enzymes the reversed arrangement does not anneal at all, so a refusal does come, but on the bases rather than on any orientation check. With one enzyme on both sides every end carries the same overhang, so the ring closes on the dropout as readily as on the body: the engine returns the shorter circle with the vector's body discarded, with no refusal, no qualification and material conserved. That is why no existing check catches it. Recorded as an outcome in src/lib/seq/religation.test.ts, never as an assertion that the behaviour is wanted A person can be handed a product that is the dropout's core rather than their backbone, carrying none of the features they chose it for, with nothing on screen saying so. The engine cannot tell the two arrangements apart, because which fragment is the backbone is a question of identity and the cloning engine takes a bare molecule with no annotation Open; owner Stage C. The CSO decides whether the orientation requirement stays in the destination definition as a true statement about what a destination is while the refusal list stays silent about it The string states only the clauses with a check behind them. Instead of a heuristic refusal, which would pick a backbone silently and sometimes wrongly with a refusal's authority, the released backbone is named with its length and the features the map calls on it, so a person can tell a 412 bp fragment carrying no features from a 4,361 bp one carrying an origin and a marker at the moment of the design (the CTO's memo of 17 October, B5)
REL-259 Low plasmid-definition-chunk has no room for the Stage C registry text: the Gel track's gel and ladder copy puts it over, and the Transfer track's two method records would too, so they are deliberately left unregistered Measured by the two tracks and read by the CTO seat on 17 October 2026. The Gel branch goes 23.4 at the base to 23.7, then 24.1, then 23.8 after its cut, its residue being the gel and ladder copy in the registry entry. The Transfer branch reads 23.4 of 23.4, equal to its base, because it did not register its two method records: registering them put the row over (first read as 0.4 KB; the A/B below gives 0.70), and the reason is written into content/apps/plasmid-map.methods.ts so a later builder does not read the omission as an oversight. Its 1,316 measured bytes in src/lib/seq/methods-plasmid.ts are therefore present in the file but not reached by that row. Both figures may have been taken with a size-check.mjs from before the closure fix reached main at 641ed1b8, so both are re-measured on merged builds. Measured on a merged head with main's script on 17 October 2026 by the Transfer track: plasmid-definition-chunk 23.4 of 23.4, ok; plasmid-workspace-chunk 195.2 of 196, ok and matched, which withdraws that track's earlier unmatched report as an artefact of the pre-fix script. Its own 4,287 bytes in src/lib/seq/methods-plasmid.ts do not reach the row, because its two new method records are not registered in the content. Its row's chunk list is nine files and contains no engine module, panel or component, which was the CTO's condition. The Gel track's figure on a merged build is the one outstanding. Gel's merged figure, 17 October 2026: on 7a53142c, carrying 7c8479e5, against a clean build of 7c8479e5 in a separate worktree with main's script, the row reads 23.4 at the base, 23.9 at the head and 23.3 with Gel's registry hunks reverted; the measured list is two files, the marker chunk at 4.84 KB unchanged and the registry-content chunk at 19.04 against 18.52, so the whole delta is registry content (the ladder limit and source, the gel set, the hand-worked oracle, the trio-v2 counts). The CTO's second ruling of 17 October accepts the attribution as complete and content, and refuses a cheaper home The row is over on the Gel branch now, and will go over again when the Transfer track's method records are registered in the commit that wires their panel. Neither track may cite the other's figure Open; owner Stage C (the coordinator). It holds neither track's gate: the growth is CSO-ruled and CPO-ruled registry text that no workspace code reads, the category is governed by the Assay precedent of 14 October, and the correct figure cannot be measured on either branch alone Each track proves its own delta first: the row at the base, at its head, and at its head with its own hunks reverted in a scratch tree, on one script and build method, with the row's file list showing no engine module, panel or component, the file its bytes are in named, and the remainder reported as not its own. Then the coordinator re-bases the row once, on the merged state that carries both tracks' text including the registered method records, at the measured figure plus 10 percent with releaseKB 23.4 untouched and a comment naming both files, both memos and the pre-live item. No track edits the row (the CTO's memo of 17 October, A2). Ruled on 17 October 2026 (the CTO's second ruling on the Gel rows): the ceiling moves once in Stage C, to maxKB 26.3 with releaseKB 23.4, the Assay precedent of 14 October applied (measured 23.9 plus 10 percent, rounded up to 0.1), in one commit on the Gel branch before Gel's merge, by the coordinator or by Gel on the coordinator's written instruction, with a $comment naming the measurement, the three content files, the revert figure, this row, both memos, the pre-live item (registry text out of the definition chunks for all ten apps, enforced by --release at 23.4) and the instruction that the 0.14.0 and 0.15.0 publication commits report the row before and after and do not re-base again; a later crossing of 26.3 is examined as a defect first. Two tracks have stated opposite facts about whether content/apps/plasmid-map.methods.ts is in the row's chunk list (Transfer: registering its two records cost 0.4 KB; Gel: the methods strings are not in the chunk); the coordinator resolves that from the --json file list on the merged measurement, not from either prose. Settled on the Gel side, 17 October 2026 (c6622265): the definition row's list on 882c2e4a is two files holding 23 modules, none carrying FORMULAE, ASSEMBLY_METHODS, DS_FRAGMENT_METHOD or the McClelland citation, so content/apps/plasmid-map.methods.ts is not in the definition chunk; it is in the workspace row's list (1,267 B). Registering method records costs the workspace row on that head, not this one. The ceiling was re-based to 26.3 on the Gel branch (ff8b44bf, the row's only edit). Settled by measurement on the Transfer side, 17 October 2026, which corrects both earlier readings: an A/B build on 590f7d04, same machine and script, registration applied, measured and reverted: plasmid-definition-chunk 23.4 → 24.1 (+0.70 KB, over 23.4), plasmid-workspace-chunk 195.2 → 196.5 (+1.30 KB, over 196), object-page-js 197.7 → 197.8. plasmid-map.methods.ts is in 17 built chunk files and in none of the marker-carrying files of either row; a chunk row measures its whole chunk list less the route's first load, so a module absent from the marker files still costs the row. Transfer's earlier "the entry's chunk list carries that module" was an inference and is withdrawn; Gel's "not in the definition chunk" was taken on the full list (both files, 24,446 B gzipped, the row's 23.9, as measureChunk measures) and is right for Gel's head, where nothing in the registry imports the module; registering Transfer's records is what makes the registry import it and join the list, so the two measurements agree. Consequence: registering the records fits under the re-based 26.3 on the definition row but puts the workspace row over by 0.5 KB, and that ceiling is not widened for code (the CTO, A·1), so the wiring commit that registers them, after Room's room-making is on main, makes room on the workspace row first, most cheaply by keeping the long citations out of what the workspace reaches. The CTO's third ruling, 17 October 2026: the one re-base commit moves to the Room branch (same 26.3 / 23.4, Gel's $comment with one sentence on Room's bytes added) because Room merges before Gel; Gel's ff8b44bf resolves to main's row on its merge. In bytes the row read 23,354 at 7c8479e5, 23,421 at f2618a0c (Transfer's registry text; past 23,400 and reading 23.4 only because the script rounds at 100 B) and 23,507 on Room's merged head (23.5; the 86 B is address.ts importing and re-exporting MAX_CHOSEN and MAX_SHOWN from the shared leaf, code in its right place and not cut). The figure is Gel's measurement, not recomputed. The row's remaining open item is the Transfer wiring commit's workspace-row room-making. Corrected 17 October 2026, 23:25 UTC (the Transfer track, reading the budget file on 0674e345): the A/B figures above were read against 23.4 as the ceiling; with the row re-based to 26.3 (release target 23.4) and the workspace row at 190.6 of 196 after Room's room-making and Gel's landing, the same deltas (+0.70 and +1.30 KB) land near 24.7 of 26.3 and 191.9 of 196, inside both, so the wiring commit registers the two method records with the panels and measures both rows before and after on its own head (the deltas were taken on Transfer's earlier base, so they are indicative). The distance above the 23.4 release target is the CTO's question at the pre-live pass, not a merge gate
REL-260 Low The feature library's published pair table will not fit the data gate at library 3: reported pairs grow roughly with the square of the entry count Estimated by the CTO seat on 17 October 2026 from the Library branch's measurements: 66 reported pairs at 90 entries implies about 200 at the brief's 160-entry target, which at the same per-row cost is about 40 KB raw of pairs on top of an estimated 190 KB raw and 60 KB gzipped library, so over the 64 KB gzipped gate. For 0.14.0 the pairs add about 13 KB raw and the file reads about 122 KB raw and 37 to 38 KB gzipped, inside both limits. Linear and quadratic estimates, with no v2 build measured anywhere yet Nothing now; the bump after next would fail its own gate without a change that is better decided before it than at it Open; owner Stage C, carried to the pre-live pass. Filed now so it is not rediscovered at the bump The per-pair justification is provenance and the display never reads it, so it moves to the verification set and the pipeline input while the runtime file carries only the pair, its relationship and its shared span. Whether the published cross-check output satisfies the CSO's requirement that the justification lives "in the data" is the CSO's question and needs answering before library 3. For 0.14.0 the gate test is extended to print, not assert, the pair table's own raw and gzipped share of the file, so the next bump argues from a measurement (the CTO's memo of 17 October, B7)
REL-261 Low Twenty-five enzymes whose recognition site can carry a methylated base have no row in the transcribed methylation table, and their absence from the source's Table I has not been checked: the table exists only as page images and this environment is refused them Reported by the Library track on 17 October 2026 with pipeline/plasmid-map/methylation-absences.csv (25 rows, generated from enzymes.csv and methylation.csv so it cannot drift from them, the date column empty and the header stating in capitals that an empty date is never a checked absence). The fetch attempts that day: a captcha from one host and 403 from two others. The file is read by nothing; the build still classifies a missing row as sensitivity not recorded None on what a scientist reads, which is why the library may publish without the dates: an enzyme with no row is classified as not recorded, which makes the digest refuse to present a clean result, the same answer a checked absence would give, since a checked "no entry" is also not recorded. What is missing is the record that anybody looked Open; owner the next data pass. The CEO decided on 17 October 2026 (D-0097) to publish with the absences unverified and the conservative answer standing; the page images are read when a session can obtain them Fill the dates once the pages can be read. Meanwhile the preamble states why the file sits outside the write-once fixtures directory, so nobody tidies it there and makes filling a date a violation, and tests enforce the two claims the preamble makes rather than leaving them as comments: the enzyme list equal to the generated set, a row carrying a note but no date an error, and no file under src/ referencing the path. The CSO confirms or rejects the narrowing from the 81 enzymes it asked for to these 25 (the CTO's memo of 17 October, B9)
REL-262 Low The Plasmid browser baseline lists its failures by line number, so it cannot survive edits to the specs it watches Read by the CTO seat on 17 October 2026: REL-27 records cloning-walks.spec.ts at :47, :65, :87, :100 and :123 and assembly.spec.ts at :109 and :299, while the Gel and Transfer tracks report failures at :52, :92, :131 and :129 on the same files, and whether these are the same tests cannot be told from the numbers A baseline row can be cited for a failure it does not cover, or a genuinely new failure can be absorbed into it, in either direction without anyone noticing Closed for the baseline (17 October 2026, the CTO's ruling 1(b) step 5): docs/progress/e2e-baseline.json carries the rule "matches": "entries are matched by file, test title and project; line is informational (REL-262)", and scripts/e2e-baseline.mjs matches that way, so a moved line no longer detaches an entry. Open for REL-27's own text, which is Stage C's to re-key; owner the CTO Re-key REL-27 to test() titles. Until then no baseline row is cited for a failure matched only by line number: this round the Room track matches each failure by title and files a new row only for a title the baseline does not carry (the CTO's memo of 17 October, A6)
REL-263 Medium The primer-pair walk's first step never renders its "Target start" control, so the walk cannot be driven: e2e/.../"edited primer bounds survive reload and Back; Restore is explicit and a later-step link does not run ahead" waits four minutes for a spinbutton that never appears Proven inherited by the Stage C feature-transfer track on 17 October 2026: it failed on all three browser projects on claude/stage-c-transfer at 2e928f0, and the track then built b00a845b, the branch's base, on the same machine and ran that one test alone against it, where it failed identically for the same reason. No row in the baseline covers it. The control belongs to the Sequence app's primer design, and every module the Transfer track added is imported by no surface at all A recorded workflow for editing primer bounds is unverified by its test, and the failure was until now indistinguishable from one introduced by Stage C Fixed 21 October 2026 in the spec, not the product (owner: the Sequence stage; diagnosed by the aligner builder, session_01A4ehgQdWQwSiXWjDNgAyCN). Cause: the control renders, but as a textbox. The D-0085 polish pass (0d66d44c, 14 October 2026) made the primer-design fields text inputs with a decimal keyboard (inputMode="decimal", so a wheel never changes a value), whose role is textbox; cloning-walks.spec.ts, written on 12 October for the earlier type="number" inputs, looked for a spinbutton at :93 and again at :151 ("a draft edit during the actual checkpoint acknowledgement cancels pending Next", the same cause). Both locators now ask for a textbox (9208ed0f). On a local production build of c115df18, both titles pass on desktop, phone and desktop-dark (six of six). Their six failures rows in docs/progress/e2e-baseline.json (filed under REL-27) stay until the baseline's shrink rule lets them leave: expected in two consecutive full runs Find why the first step renders no "Target start" spinbutton on a production build, then fix the step or correct the test's expectation with the product change cited. Not a Stage C fix: the Stage C tracks touch none of that surface
REL-378 Medium On the phone, a failed export from the Menu sheet cannot be retried from its toast: the sheet is a modal dialog, so the toast's "Try again" behind it takes no pointer or keyboard input, and closing the sheet unmounts the ExportMenu that owns the retry (Drawer renders its content only while open, src/components/suite/overlay/drawer.tsx) Found 12 October 2026 on claude/sequence-wave6-debt while adding the CPO's Menu sheet tests (e2e/smoke/menu-sheet-export.spec.ts); the same on main, where the sheet never closed after an export A failed phone export can only be retried by choosing it again Fixed 21 October 2026 on claude/sequence-rel378-retry, by the CPO's ruling 2 of 12 October 2026 (docs/board/memos/2026-10-12-cpo-walk-bar-and-retry.md): in the sheet the failure shows under the Export row in a role="alert" ErrorBox with Try again, which reruns the export and closes the sheet when it finishes; closing the sheet first hands the failure to the danger toast, quiet so it is not read twice, whose Try again reaches a menu still mounted (the TopBar's), because retries and the held failure live at module scope in data/export-retry.ts, scoped to the app (the CTO's memo of 21 October 2026), not in the sheet e2e/smoke/menu-sheet-export.spec.ts asserts both paths (the retry in the sheet with focus back on Menu; the toast after Esc, not an alert, with a working Try again); topbar-export-retry.spec.ts the desktop TopBar's alert toast and its retry, both toast retries asserting exactly one download; export-retry.test.ts the routing; toast-store.test.ts the quiet rule.
REL-379 Medium A GenBank qualifier value with a token longer than a line is split mid-token by the writer (qualifierLines, src/lib/seq/features/genbank-write.ts), and every reader, this one and Biopython's alike, joins continuation lines with a space, so the value read back carries a space: the hand-off's /source_record="mine:construct/<uuid>" (51 characters after a 16-character key) returns with a space inside the ref, and the /prediction receipt JSON with spaces inside it e2e/plasmid-map/sequence-handoff.spec.ts (the PCR hand-off export test) on 12 October 2026, after its seed, pick and quote-pair failures were fixed; the quote-pair split itself is fixed (a wrapped qualifier never splits an escaped "" pair, genbank-write.test.ts) A re-imported hand-off export does not name its source record exactly; the browser test stays in the baseline Fixed 14 October 2026 on claude/sequence-wave6-debt, on the CTO's ruling of 12 October: qualifierLines wraps a value only at spaces and writes a longer word whole on one over-length line (the first word stays on the key's line, since a break after the opening quote reads back with a leading space in Biopython 1.88); /translation unchanged. genbank-write.test.ts reads a reference, a long receipt and quoted prose back exactly at 70 offsets; Biopython 1.88 read the same over-length case back exactly offline (recorded in docs/progress/sequence-wave6-debt.md). The batch 1 review (14 October 2026) found three more ways a value could break a reader, fixed on the same branch: a line break, carriage return or tab is written as a space (a raw one ended the feature table: the reverse primer lost, Biopython refusing the record); a non-final line never ends in " and no continuation line starts with / (Biopython ended the value early, read a false qualifier or refused the record); a bare opening quote is never left alone on a line (readGenBank dropped a leading space). An offline Biopython round trip of 1,200 seeded values now holds the writer (genbank-roundtrip-corpus.ts, pipeline/plasmid-map/genbank_roundtrip.py, src/lib/seq/features/fixtures/genbank-roundtrip-v2.json (write-once; genbank-roundtrip.json keeps the first fixed writer's reading)), which the previous writer failed: Biopython refused the corpus. The delta review of the same day narrowed and widened it: U+2028, U+2029, U+0085, \v, \f and U+001C to U+001F are written as spaces too (readGenBank dropped a line holding U+2028; Biopython strips the others), and only the bare opening quote and a line starting with / are joined, so quoted prose wraps at 79 columns again; the corpus command compares its own URL with pathToFileURL (a path with a space wrote nothing) and genbank_roundtrip.py refuses an empty corpus rather than recording a refusal. Biopython refused 0 of the review's 3,000 property records. Over-length lines may fail strict submission validators; these files are never submissions —
REL-380 Low Qualifiers passed through from a record are written to GenBank exports as they are, not made ASCII asciiNote (src/lib/seq/features/genbank-ascii.ts) cleans only the fields the exporters build (labels, the app's notes, DEFINITION, COMMENT); a primer set's label and notes, its /tm_qualifications ("Na⁺"), /source_label and an imported file's qualifiers reach writeGenBank raw (genbank-export.ts, qualifiers: r.qualifiers); batch 1 review of 14 October 2026, finding 8 INSDC flat files are 7-bit ASCII; a reader that insists on ASCII fails (Python opening the file as ascii). Both the suite's reader and Biopython 1.88 read the UTF-8 back exactly Open; recorded rather than fixed: cleaning passed-through values would change receipts (/tm_qualifications, the set's own words) that the hand-off reads back as provenance Decide per qualifier whether it is display text (clean it) or a receipt (keep it exact and say so in the COMMENT), with the CTO; then a test that every byte of a Plasmid export is ASCII or listed
REL-381 Low On the phone, closing Calc's "Print a stock label" dialog opened from the Menu sheet could leave focus on the page body Batch 1 review of 14 October 2026, finding 10: the candidate counted an export item that delivers no file (the label item opens its own dialog) as finished and closed the sheet under the dialog, so the dialog's invoker unmounted (export-menu.tsx, menu-sheet.tsx, dialog.tsx) Focus lost after the dialog closes; no data lost The cause removed on claude/sequence-wave6-debt the same day: only a delivered file (or a cancelled save) closes the sheet, as on main before, and a run ending after the sheet closed never closes a reopened one. Under D-0080 a focus matter: owner the accessibility pass, to confirm on the phone The pass's focus check on the label dialog from the Menu sheet

Maintainability

Id Severity Description Evidence Impact Status Suggested fix
MNT-01 Low Some app/provider requests bypass the shared network layer and its guards src/components/suite/net/fetch.ts:1-4; Protein's own src/components/tools/protein-explorer/fetch.ts; Pipeline's plain fetch in src/components/tools/drug-pipeline-explorer/fetchers.ts; Molecule's PubChem name lookup with plain fetch at src/components/tools/molecule-workbench/use-workbench.tsx:706 The host guard, limiter, consent gate and request log do not cover these calls (the CSP still bounds them). See also SEC-02 Partly addressed 25 October 2026: the falsely universal header now states the implemented scope and technical documentation names the remaining callers. Provider migrations, direct PubChem consent and contracts §8.1 conformance remain open; no fetch behaviour changed. Route them through fetchWithTimeout or correct the header comment and contracts §8.1
MNT-02 Low Stale /apps/<slug>/app and /apps/... addresses in code comments content/csp.ts:8-10 ("next.config.ts maps appHeaderRules() onto /apps/<slug>/app"; "the /apps landing page"); content/apps/pages.ts:3-4 ("/apps/<slug>, /apps/docs/<slug>, /apps/changelog"). The routes have been /<segment>/app and root pages since D-0008 Misleads readers about where headers apply Fixed 25 October 2026 on claude/codex-copy-register-repairs: both comments now describe the actual root route helpers, including the stable Calc workspace and separate account policy. No route or header behaviour changed. Update both comments
MNT-03 Low User-facing copy hard-coded outside content/ src/lib/search/compound-payload.ts:22,24,28; error strings in src/app/api/literature/route.ts and src/app/api/search/compound/route.ts; audit section 4 names recipe-panel.tsx refusal copy Breaks the project rule that copy lives in content files; harder to review claims and wording Partly addressed 25 October 2026: the three compound-payload refusals and the 15 distinct static messages in the named compound/literature routes live in content-owned modules; dynamic validation/quota messages are preserved. The cited recipe panel already uses content problems/refusals. Broader copy debt (for example the separate literature search route) remains open; no global copy audit is claimed. Move the strings into content/
MNT-04 Low Environment documentation gaps ALLOW_DRAFT_DATA (read in src/lib/hosts/golden.test.ts:40, src/lib/hosts/presets.test.ts:51, src/lib/seq/plasmid-data.test.ts:39) is not on Deployment and environment A new engineer may not find the switch that lets draft data pass Fixed 25 October 2026: deployment-and-environment.md documents exact 1, default unset and all three test readers under Tests and tooling; handover.md links the resolved entry. CSO and CTO confirm hash/numerical and independent write-once gates remain, with the flag forbidden for final CI by policy. Add it
MNT-05 Low Repository size grows with write-once versioning and review screenshots docs/ holds about 70.9 MB of images; public/verification/plasmid-map/ is 25.5 MB, with seven byte-identical 3.2 MB copies of trio.json (versions 0.1.0 to 0.7.0) beside pipeline/plasmid-map/fixtures/trio.json Slower clones; every Plasmid version adds another copy Confirmed Consider Git LFS or content-addressed storage for verification files, and moving screenshots out of the main tree, without breaking the write-once guarantees
MNT-06 Low Very large view modules src/apps/assay-analyser/views/assay-workspace.tsx (93 KB), src/apps/plasmid-map/views/plasmid-workspace.tsx (73 KB), src/apps/lab-calculators/views/bench-sheet.tsx (72 KB) and several more over 50 KB Harder review and change Confirmed Split along existing panel boundaries when next changed
MNT-07 Low The test runner's strip-only TypeScript mode is a recurring trap Audit section 1: one parameter property in src/lib/workspace/study-lifecycle.ts stopped 23 test files loading; eslint.config.mjs now makes enums, namespaces and parameter properties errors Mitigated by lint; a rule skipped locally can still hide test files Fixed in code; risk remains Keep the lint rule; have CI fail when a test file does not load
MNT-08 Low Status documents quote figures for builds other than the current tree docs/HANDOVER.md section 8 quotes results at 7d66f93; Q-26 cites a removed file (DAT-04) Readers can mistake historical results for current ones Open Date-stamp figures with their commit, as the records mostly do, and correct stale references
MNT-09 Low Older mbio-suite storage and export identifiers remain docs/NEXT.md, "Integration and pre-live decisions" Renaming without a migration would orphan saved browser work Open (recorded) Keep them unless a migration is decided
MNT-10 Low Assay's stored record gained enzyme, growth, inhibition, thermal and plannedSheet inside version 5 without a new version readAssayData in src/components/tools/assay-analyser/model.ts; docs/progress/wave1-assay.md item 6 and wave1b-assay.md ("the v6 question again") A v5 reader from before these fields refuses a record in one of the new modes and would read a dose-response record without its plannedSheet, losing it on the next save Open (recorded); with the CTO Introduce v6 for the new fields, or confirm that no older reader can meet these records
MNT-11 Low Method record and copy inconsistencies found while documenting Waves 1 and 3 The cells, centrifuge and percent method records name the input modules (src/lib/preparation/kinds/{cells,centrifuge,percent}.ts) as implementation, while the arithmetic is in kinds/*-calculate.ts (the antibody and OD600 records name the calculation modules); fixture-hashes.json's top-level version still reads 0.1.0 while it lists three versions; proposeSheetPlacement (src/lib/table/sheet-placement.ts) reports a well named by two sheet control types as control-overlaps-dose, where Calc's planPlateSheet says control-overlap; the kinetics and growth panels used both their own role="status" line and the workspace's announcer (fixed 12 October 2026: the line is a status only on the task pages) Misleading provenance or messages; two polite regions in two Assay modes Confirmed, open Point the records at the calculation modules; align the problem code; keep one live region per page
MNT-12 Low Stale decision number in the aligner's generated code and oracles: blosum62.ts, blosum62.py, align_reference.py, the BLOSUM62 check file and the alignment fixtures cite D-0049, which on main is the Assay two-second decision; the aligner's decision is D-0055 src/lib/protein/align/blosum62.ts:6; pipeline/protein-explorer/blosum62.py, align_reference.py; pipeline/protein-explorer/fixtures/{alignment,blosum62}/ (write-once) Citations point at the wrong record Confirmed, open Correct the scripts and regenerate blosum62.ts (the header only; the test checks entries and hash); leave the write-once fixtures and note the mapping
MNT-13 Low Wave 4 nits: sameKey in align-protocol.ts compares a request's key with one built from the same request (the panel's job key is the real guard); the substitution CSV types the product name in its column names (drybench_mean_alphamissense); the alignment Differences header is derived in the component; "phase recorded" in Pipeline's coverage counts NA as not recorded; Molecule's "nearest on the map" excludes only the identical row, not every same-compound form; a redrawn form is exported as same-compound-parent The files named; CTO and CPO Wave 4 merge reviews Minor provenance or wording drift Confirmed, open Fix when the files are next changed
MNT-14 Low The lg overlay's full list repeats the working Study selector that the header chip already shows ResearchNavigation renders StudyContext whenever it is not compact (src/components/suite/shell/research-navigation.tsx), and the header shows the chip whenever the rail is not expanded, which in the research workspaces is always (shell/top-bar.tsx, objects/suite-frame.tsx). Found on 11 October 2026 while aligning the browser tests with D-0050 Two controls for one choice on one screen while the overlay is open, against the clutter budget's "no duplicate routes on one screen" (instrument design system §2) Confirmed, open Decide whether the full list (the overlay and the Menu sheet, which sits beside the header chip too) keeps the selector
MNT-15 Low The walk-draft hydration recompute in assembly-panel.tsx and primer-design-panel.tsx runs from an effect under a scoped react-hooks/set-state-in-effect exception CTO memo docs/board/memos/2026-10-12-cto-assay-stage.md; PRC-12 An extra render after a reload; the lint rule is bypassed at two sites Fixed 12 October 2026 on claude/sequence-wave6-debt: useRecordDraft takes an onHydrated(draft, step) callback, called once the restored controls have rendered; both panels call run(inputs) there with the restored draft's inputs (the request key built from those inputs), the effects and both scoped exceptions are gone; the cloning-walk and assembly browser specs fail no case that does not fail on main (docs/progress/sequence-wave6-debt.md). Since 20 October 2026 (merging main's Gibson primers, 765c39db) the assembly's settings, its result key and the settings a restored draft designs with live in panels/assembly-settings.ts, with Gibson's primer mode and fields among them, so a restored primer-design (v2) draft designs as v2 (assembly-settings.test.ts) —
MNT-16 Low scripts/check-boundary.mjs walked .claude/, so a checkout holding subagent worktrees under .claude/worktrees/ (each a whole second checkout with its own scratch scripts) failed the unit test "nothing in this project reaches outside its folder" with absolute paths that are not this project's 3,354 of 3,355 locally in the Assay coordinator's checkout on 12 October 2026, 3,355 in CI; the worktrees' probe scripts named /home/user/drybench/... A false failure in the local chain that every merger runs before a pull request Fixed on 12 October 2026: .claude joins SKIPPED_DIRS None
MNT-160 Low One oracle image tag names three different images: concurrent Oracles runs on 13 October 2026 each built and pushed oracle-env:d6cd987911c17af3, and each recorded a different digest Assay 0.11.0 and 0.12.0 fixtures' environment.image: units-molecule.json sha256:9bea798f7e47… (run 38453480445), ligand-efficiency.json sha256:7de883d32053…, assay-drift.json and layout-suggestion.json sha256:52c2da8b4a62… (run 38458144391); the other runs that day were 38453485906, 38453490561 and 38457748128 A tag no longer identifies one environment; the fixtures stay reproducible only through the digest each records, and a rerun by tag may get a different image Open, for the CTO Build once per tag (skip the push when the tag exists, or serialise the workflow with a concurrency group), and pin runs by digest
MNT-161 Low Protein's Evidence disease links carried hover text typed in the component and naming the app ("Explore … in Pipeline"), against the rules that copy lives in content and product names only in content/app-names.ts src/apps/protein-explorer/views/dossier/evidence-cards.tsx:352 on main at 678604ef The text escaped the content tests Fixed on claude/ea-usability: the link reads drugs.trialsFor ("Trials for … in the pipeline app"), the drugs panel's own words None
MNT-17 Low Two Sequence oracle scripts do not run from their own requirements file and manifest as written pipeline/sequence-toolkit/peptides.py:25 imports RDKit (pinned by EXPECTED_RDKIT = "2026.03.6"), which pipeline/sequence-toolkit/requirements.txt does not list; pipeline/sequence-toolkit/reference.py rewrites fixtures/manifest.json without the entries the other Sequence scripts own (rerun under CPython 3.11.15 on 12 October 2026, with every fixture otherwise reproducing except recordedOn) A rerun from the requirements file fails on peptides.py; a rerun of reference.py alone drops other scripts' manifest entries, so an automated drift check would report them Partly fixed on claude/sequence-wave6-debt (12 October 2026): rdkit==2026.03.6 is in the Sequence requirements file and installs. The manifest merge in reference.py is held on the Sequence coordinator's ruling (the script's hash is a provenance claim in the manifest and its eight fixtures); the verified patch is in docs/progress/sequence-wave6-debt.md item 3 and rides the next real reference.py fixture version. Earlier: the oracle image runs peptides.py in its calc environment When the Sequence stage adds its manifest to the drift check: the CTO to confirm the edit of the existing requirements file (a departure from 2026-10-12-cto-assay-stage.md's "never by editing an existing one", recorded in pipeline/oracle-env/README.md; the rebuilt image's python-packages.txt then lists RDKit under [sequence]), and reference.py merging into the manifest rather than replacing it, or the check running every Sequence script in order
MNT-22 Low Protein's atlas pass (D-0084) leaves three deviations from the frames and one from the shared block's rule, each chosen for a reason: the Compare layout's PDB entry picker and Entry details stay in the settings strip with About this protein rather than under the experimental stage (frame 005); the Variants and AlphaMissense toggles frame 006 draws do not exist, the explicit loads with their sizes stand; the start's Layout select sits on the subject row, not in a row of its own (frame 001); and the Further analysis rows mount their bodies on first open, each an on-demand chunk, so Find on this page does not reach a closed check or alignment, against the DisclosureList rule that content stays mounted docs/technical/app-protein.md ("The redesign atlas pass"); src/apps/protein-explorer/views/workbench/workbench.tsx, section-disclosure.tsx, views/dossier/welcome.tsx Composition only; every control, value, chip and source line of the 13 October pass is on the page; a closed row's body is found by opening it Open; the CPO to confirm the three compositions at the next review, the CTO to say whether the two chunks may mount closed Keep unless the CPO asks for the frame's placement; mounting the chunks closed would load them on every Sequence visit
MNT-21 Low Plasmid's "Inspect sequence" key on the feature inspector card (the UI redesign of 13 October 2026) goes to the Sequence view but does not scroll to the feature's bases src/apps/plasmid-map/views/feature-inspector.tsx; docs/technical/app-plasmid.md ("Known gaps") The person finds the range by hand Open Give the Sequence view a range to reveal and focus when it opens from the card
MNT-20 Low The UI redesign of 13 October 2026 (D-0082) leaves four items open: the serif initial in the sidebar's brand block is drawn as the mock-ups show it, and the CMO's view on it as a lettermark and on the landing page's family resemblance is held with D-0058's deferred row; Source Serif 4 is a fourth font family whose cost the size step reports and whose budget the CTO has not yet set; the public pages (landing, product, docs) keep Bricolage and the light header until a later round; theme/theme-toggle.tsx still exports the unused ThemeToggle button beside changeTheme, which the More menu uses src/components/suite/shell/rail-column.tsx (RailBrand), src/lib/fonts.ts, src/components/suite/theme/theme-toggle.tsx, docs/board/decisions/D-0082-the-ui-redesign-concept-of-13-october-is-applied.md Brand and budget questions held for the seats; one dead export Open Ask the CMO and CTO at the pre-live pass; remove ThemeToggle once the Menu sheet's theme group is confirmed as the only other place
MNT-23 Low The Study notes editor escapes literal Markdown markers when it re-serialises the notes (D-0084) serializeNoteBlocks and escapeNoteText in src/components/suite/workspace/study-notes-markdown.ts Notes first written as plain text elsewhere (the Bench note, an import) gain a backslash before an unpaired *, a backtick, a […]( pair or a leading #, - or 1. once they are edited on the Study page, and the Bench note and exports show that backslash; nothing is lost and the Study page reads it back as typed Open Escape only a marker that would otherwise parse as markup, or let the Bench note render the same Markdown
MNT-18 Low Two Grubbs implementations: src/lib/fit/outliers.ts (grubbs, A5's control-group candidates) and src/lib/stats/outliers.ts (grubbs, A-2 family 7's per-column candidates). The family 7 header says A5's engine imports grubbs from it "rather than keeping a second copy"; it does not src/lib/fit/outliers.ts:74; src/lib/stats/outliers.ts:13-15 and :57; found at the batch 7 merge, 13 October 2026 The same statistic is computed twice; a fix to one (the p-value form, the minimum n, the withholding codes) can leave the other behind, and the header misleads a reader Open; owner the merger, for after Stage A (now the next Assay work's, under the merger the CEO names; Stage A hand-over, 14 October 2026) Keep one implementation in src/lib/stats/outliers.ts, have src/lib/fit/outliers.ts import it, and check both oracle fixtures (A5's outlier candidates and family 7's) still pass; or correct the header if the two must differ
MNT-19 Low Only Plasmid gives its limits ids (limitMeta), so only Plasmid's methods and checks groups show the limits that apply to them; the other apps' dialogs show the app's standing statements, its strongest limit and "Read all N limits" above every group content/apps/plasmid-map.ts limitMeta; SheetGroup.limits in content/apps/methods-sheet.ts; the CSO's review of 14 October 2026, finding 7 (D-0085) A calculator's own assumptions and valid ranges sit in the full limits list rather than beside its methods Open (accepted by the CSO as may-follow, since the app's limits lead the dialog). 24 October 2026: Bioreactor gives its limits ids too (LIMIT_META in content/tools/bioreactor-simulator.limits.ts), and its rescue, measured-review and measured-comparison groups name theirs (Stage H BR1.2) Give each app's limits ids and scopes, then name them in its sheet's groups
MNT-24 Low protParamMethod in src/apps/protein-explorer/provenance.ts has no callers, so Protein's sequence properties (molecular weight, pI, ε280) carry no method record on screen or in its methods and checks dialog src/apps/protein-explorer/provenance.ts:83-94; found while grouping the app's methods for D-0085 The ProtParam numbers are covered by the docs page's test entries, not by a method record with a level Open Wire it into the sequence-properties panel and the dialog's Compare group, for the CSO's review of its level, or remove it
MNT-25 Medium e2e/smoke/apps.spec.ts:15 ("workspace … renders with its security headers") fails for all ten apps in every project: it expects the first h1 to contain the app's name, but since D-0084 the app's name is the bar's app-title paragraph and the page's one H1 is the subject in the body (Protein's welcome reads "Find a protein") Reproduced on main's head efd0be38 (desktop, 10 of 10) and on claude/gallant-bardeen-aazfrq after merging it (desktop, phone, desktop-dark: 30 of 30), 14 October 2026; the redesign merged before its browser checks on the CEO's instruction (docs/progress/roadmap-run.md) The smoke check stops at the heading, so the workspaces' data-app and horizontal-scroll checks after it do not run; the headers it checks first still pass Open; owner the redesign's builder or the merger Point the check at the main region's accessible name (labelled by app-title, which carries the full name) instead of the first h1, citing D-0084
MNT-26 Medium The type program next build checks sits at the heap limit: CI's build ran out of Node's default 2 GB heap on GitHub's runner from db40fe80 (17 October 2026), and CI now sets NODE_OPTIONS: --max-old-space-size=4096 as an interim The CTO's ruling of 17 October 2026 (docs/board/memos/2026-10-17-cto-main-build-and-stage-c-rulings.md), measured: 4,380 files, 413,131 lines of TypeScript and 103,252 of JSON on 000a4206, 2.24 GB end-of-run heap; the SEO commits added 1.4 percent of types (1,000,962 on 41e90925 to 1,014,974), after 6.5 percent growth between 15 October (9fa37e06) and that green head; the seven largest JSON imports alone cost 183 MB and 129,504 types. Reproduced by this row's builder on 72cd689 (docs/progress/stage-c-ci-heap.md); Build, test and CI, "Linting and type checking" Without the flag main does not build on CI; with it, the program keeps growing with no pressure to stop until it reaches the new ceiling Open, owner the CTO. The interim's recorded ceiling: end-of-run "Memory used" (tsc --extendedDiagnostics) under 3,000,000 K and the flag at 4096; either moving is a note to the CTO before the merge. Closed when the type-surface fix lands. Since 24 October 2026 (the CTO's rule C2, D-0126) tsconfig.json excludes docs/progress and docs/reviews, and scripts/type-program.test.mjs refuses any new JSON import over 100 KB in non-test src/ and content/ files; its allowlist held the eleven import sites of seven files found that day, eight once Stage H moved Bioreactor's three to src/lib/fixtures/read.ts, and only shrinks The type-surface fix (the ruling's item 3): fixture JSON leaves the type program, read through fs and a typed readFixture<T>(path) in tests and at build time in the three marketing tables that import it (src/apps/bioreactor-simulator/verification-table.marketing.tsx, src/apps/assay-analyser/verification-table.marketing.tsx, content/apps/assay-analyser.ts), each app's piece by the stage that owns its files; the Bioreactor scenarios fixture, the largest, is not Stage C's. 24 October 2026 (Stage H BR1.7): src/lib/fixtures/read.ts exists (server only); Bioreactor's verification-table.marketing.tsx and tasks.marketing.tsx read scenarios.json and preset-runs.json through it. tsc --noEmit --incremental false --extendedDiagnostics with the 4096 flag on the session host: before 4,981 files, 108,402 lines of JSON, 1,108,221 types, Memory used 2,513,921 K and 2,494,871 K (two runs); after 4,983 files, 48,889 lines of JSON, 1,007,884 types, Memory used 2,564,861 K and 2,454,436 K. The type count falls 9.1 percent; end-of-run memory varies by about 100 MB between identical runs, so it shows no reliable change. Both routes stay static on the Fast chain build of 36929bb4 (run 40086036121): /docs/[app] prerendered by generateStaticParams, /[app]/[task] with fallback false. The other apps' imports remain
MNT-27 Low Molecule results saved before 20 October 2026 record each method's version as the RDKit release, 2026.03.6; since then the records carry semver method versions (1.0.0), so a comparison of method versions treats the old entries as not comparable and never marks them as made under an earlier method content/apps/molecule-workbench.methods.ts METHOD_VERSION; the CTO's ruling 11 of 20 October 2026 (docs/board/memos/2026-10-20-cto-salt-wording-v3-orf-stop-origin-property-time-wraps.md) A saved Molecule result made before the change is shown without an earlier-method mark even if a method's definition later changes; its values are unchanged Open (accepted by the CTO) If a Molecule method's definition changes, treat a recorded 2026.03.6 as earlier than 1.0.0 for that method in the earlier-method index, or accept the gap
MNT-200 Medium The exact fragment search over saved records never searched a saved Sequence task: its reader accepted only data.v === 1 for an app-tagged record (src/lib/workspace/fragment-search.ts:31), while every Sequence save writes SequenceWorkspaceData v2 Found by the Stage B architecture agent, 12 October 2026 (docs/design/sequence-stage/architecture.md) "Find in my saved records" silently omitted the person's saved Sequence work, counted as unsupported Fixed 12 October 2026 on claude/sequence-wave6-debt (the CPO's ruling of 12 October, docs/board/memos/2026-10-12-cpo-sequence-architecture.md point 8): searchableDna accepts Sequence payload versions 1 and 2 (Plasmid's construct data stays at 1); fragment-search.test.ts searches a v1 and a v2 record and refuses a v3. The copy is unchanged; the scope-line wording moves with UI-14 Carried records (a hand-off's, stored but not saved, D-0045) are no longer searched, Sequence's or Plasmid's: the batch 1 review found each unsaved Open in Plasmid listed as a saved hit (fragment-search.test.ts). —
MNT-201 High Stage E committed 1.57 GB of raw browser evidence to main git ls-tree -r -l origin/main docs/progress/molecule-stage-checks-2026-10-23: 1,565,810,101 bytes in 2,466 files, including 195 Playwright trace.zip (1,360,531,978 bytes), 640 files under raw results/ trees and 138 files over 5 MB; 2,037 unique blobs, 808 MB compressed, now reachable from main's history. docs/progress/pipeline-molecule-merge-checks-2026-10-24/browser-test-results.tar.gz adds 14 MB. The CTO's rule of 24 October allows at most 10 MB and 150 files of evidence per branch and no traces, raw results or files over 5 MB Every clone, CI checkout and deployment carries the weight (the CTO measured Fast checkouts of 54–66 s against 10–19 s before); history cannot shrink without a rewrite of main Partly addressed on main; 25 October 2026 tree check at 53eca0225: 145 files, 4,078,169 bytes including the removal manifest, zero trace ZIPs and zero files over 5 MB in the named folder. The forward cleanup and committed-growth guard are on main; the current Fast write-once/growth job passes. History retains the original blobs; no rewrite is proposed. The previously approved six-branch deletion remains an unverified administrative follow-up. One record-only commit removing the raw trees listed in the CTO memo (≤10 MB / ≤150 files may stay, with a hash manifest); move the raw material to a release asset if it must be kept; land the hygiene rule on main and enforce it in CI
MNT-202 Low Molecule's technical page no longer matches the code in two places docs/technical/app-molecule.md:173 describes a local JSX fragment shared by two header branches, which 836907fc removed (actions now pass to ViewTabs as pageActions); app-molecule.md:279 lists the gsrs origin as "(UNII, definition id)", omitting its chemblId and retrievedAt, which the reader requires (workspace-inputs.ts:35-36) A team taking over reads a wrong description of the header and of the saved receipt Fixed on claude/stage-e-finish: the header paragraph describes pageActions in the tab row, and the origin list names every origin and its fields as workspace-inputs.ts reads them Rewrite both paragraphs from the current code
MNT-203 Low The E2 comparison prototype misattributes a made-up series to a ChEMBL release and copies font files without their licences docs/design/molecule-stage-e-comparison-prototype/proposal-board-E.csv column 45 reference_release is ChEMBL_37 on all three rows, but pipeline/molecule-workbench/fixtures/series-example.json is "a made-up series for the tests" whose ChEMBL_37 is the neighbour library's release; fonts/ holds three .woff2 files (Inter, Source Serif 4, IBM Plex Mono, all OFL) and no licence text, which exists at scripts/licenses/*-OFL.txt; colours are hand-copied from the base's tokens.css, since changed (CDO memo docs/board/memos/2026-10-24-cdo-molecule-codex-review.md) A builder taking the prototype as a specification would export a false source attribution and superseded colours; the fonts are redistributed in the repository without their notices Partly fixed on claude/stage-e-finish: Board E's release blanked (hash recorded), OFL texts beside the fonts. Open: E2 to be re-rendered from real components at current tokens before production work Blank or rename the series reference_release; add the OFL texts beside the fonts or remove them; re-render E2 from real components before production work
MNT-210 Medium Molecule and Cell's tour parse the live address and write history outside the host's url and useUrlState, because the host's url.read() is unchecked CTO memo docs/board/memos/2026-10-24-cto-molecule-address-read.md: Molecule parses window.location in five places (workspace.tsx:98; use-workbench.tsx:201, :249-250, :454, :955) and writes history directly in two (replaceCanonicalAddress :84-86; the HISTORY_KEY tag :462-466); Cell's tour does the same (tour.tsx:96-111). host.url.read() merges raw query keys (host.tsx:96-99), so using it would reopen refused ?mine=. Possible latent effect, inferred from source and not verified: use-saved-work.ts:227 may copy an unknown query key into the fragment A grammar or acceptInbound change must be repeated at every site, and a builder may copy the pattern into another app Recorded debt, not built on claude/stage-e-finish by the CTO's ruling (route at 165.0 of 165 KB, REL-530 just fixed on the same paths) Build the additive contract in the CTO memo §5 (HostUrl.inbound, canonicalise, write with tag) before the first of: another app or new Molecule/Cell code adds its own window.location parse or history.*State call; any #s= grammar or acceptInbound change; Molecule E2–E6 touching arrival, writeAddress or popstate; a new caller relying on host.url.read() for a checked key
MNT-211 Low molecule-series-chunk is over its 13.1 KB ceiling CTO memo docs/board/memos/2026-10-24-cto-molecule-e3-e5-contract.md (§0): 13.4 KB on main since at least 22 October (docs/progress/bench-size-2026-10-22/README.md:106; official artifacts of runs 40083284243 and 40099362390). E3 and E4 moved the walk's example series and the row detail into their own chunks: 13.3 KB on claude/stage-e-finish, 24 October 2026 (local build) The series section carries 0.2 KB more than its budget; any growth there is unmetered against the ceiling Closed, 24 October 2026 (claude/stage-e-series-review 913650ad, the CTO's ruling docs/board/memos/2026-10-24-cto-molecule-e5-miss-handback.md): the review form, "Check the columns", moved into its own on-demand chunk (views/bench/series-review.tsx); the official Fast artifact 12565542221 (run 40107037045) reads molecule-series-chunk 12.6 KB of 13.1 against E4's 13.3 (artifact 12563908444), the new review chunk 1.6 of 1.9, route and workspace unchanged —
MNT-209 Medium Shared workflow presentation defects seen on Molecule after the unified Save CDO memo docs/board/memos/2026-10-24-cdo-molecule-on-main-and-shape-loading.md: S2 the Save key is icon-only (work-capture-controls.tsx:690-691) and a loaded view has two filled accent keys (Save and Analyse); S3 the Save popover's title is inset about 12 px beyond its body and its end (Research context, Close) is hidden below min(60vh, 420 px) with no cue (popover.tsx:13); S4 the Save key shows its open state only in Dark; S5 phone arrival notices squeezed into the toolbar row; S6 two search buttons at 375 px; S7 "Inspector" repeated as kicker and segment, with the kicker placed differently on phone; S8 product-page secondary links not underlined in Light Inconsistent, partly hidden or ambiguous controls across the suite Open; shared, not Molecule's; owners to be assigned by the CTO, wording by the CPO, links with the CMO Per item in the CDO memo

Process and governance

Id Severity Description Evidence Impact Status Suggested fix
PRC-01 High The legal entity that owns the code, the GitHub organisation and the Vercel account is undecided, and the operator in the terms of use is unnamed Q-20; operator is undefined in content/apps/operator.ts; the maker's personal address is the contact (content/apps/maker.ts:81) Blocks representing the asset to a buyer and completing the terms of use Open (recorded) Decide Q-20, assign IP if entities differ, fill operator
PRC-02 High The name "Drybench" is not cleared as a trade mark; drybench.com is held unused until the searches are read Q-08; D-0006; R-10 A forced rename after launch would cost links, placements and saved-work migration Held for the General Counsel Run and read the register searches before any public use
PRC-12 High main's fast check chain was red after the 11 October immediate merges (Wave 6 0b3bc37, c7735b9; Wave 8 checkpoint 744f48e): five type errors that also failed npm run build, two react-hooks/set-state-in-effect lint errors and one stale unit-test count Found 12 October 2026 on a087288: e2e/plasmid-map/cloning-walks.spec.ts read residues where GenBankRecord has sequence; readRunData in src/apps/bioreactor-simulator/objects.ts widened compare to string; the Plasmid walk upsert passed an optional label where ObjectInput requires one; walk-drafts.test.ts upserted without a label; retained in primer-design-fixtures.test.ts was untyped; the hydration recompute effects in assembly-panel.tsx and primer-design-panel.tsx; pipeline/sequence-toolkit/fixtures.test.ts expected 14 manifest entries where Wave 6 published 17 No build, so no browser test could run against main Fixed 12 October 2026 on claude/main-green-fast-chain (this commit). The two effects carry a scoped lint exception (MNT-15). Twelve browser failures in the Plasmid assembly, cloning-walk and guide-site specs (desktop and phone) remain open and are outside this fix Move the hydration recompute into useRecordDraft; reproduce the browser failures on main
PRC-13 Medium The size step gates temporarily on --baseline against docs/progress/assay-stage-size-base.json, with the plain check as a report only CTO addendum of 12 October 2026 (docs/board/memos/2026-10-12-cto-size-step-addendum.md), amending D-0065 condition 1(i); Build, test and CI A budget already over may grow by up to 0.5 KB across the stage without failing CI Expired with Stage A's exit (14 October 2026); the step has been report-only since batch 10 (the CTO's ruling of 14 October 2026). Retiring it is the CTO's, carried in the Stage A hand-over. It read: Open until expiry: the merge that makes the plain check pass on main (REL-22 and REL-23 fixed or re-ruled) or the stage's exit, whichever is first Revert to plain npm run size-check and delete the base file at expiry
PRC-03 Medium Hosting tier undecided; the record states the Vercel Hobby tier excludes commercial use Q-15 A commercial deployment on the wrong tier breaches the host's terms Open (recorded) Decide the plan before any commercial use
PRC-04 Medium Account, payment and data-protection policies are undecided and the providers were never exercised live docs/workspace-setup.md ("No provider project, live subscription or migration was created"; grace, retention, refunds, disputes, account deletion and tax "remain launch decisions"); Q-21; the held item on D-0017 (UK GDPR, PECR, privacy notice, sub-processors) Account mode cannot be switched on responsibly yet Open; privacy items held for the General Counsel Follow docs/workspace-setup.md in test projects; decide the policies; draft the notices
PRC-05 Medium Compliance checks are advisory during development, and a long list of items waits for the pre-live pass D-0014; "Held for the General Counsel" (about 25 items plus H-01 to H-09); the recommended FORBIDDEN_PHRASES additions were not made (content/apps/regulatory.ts) The suite is not in a releasable compliance state by design; the pre-live pass is substantial Open by decision Schedule the pre-live pass with counsel; run every --release check
PRC-06 Medium Features added without decision records, and verification claims made on trees or flags CI does not use docs/roadmap.md Stage 0 (literature tools, canonical search, shared settings, PCR products); audit section 7 Scope and evidence are harder to trust without rerunning checks Open (recorded) Record or park the features; rerun verification on the handed-over commit
PRC-07 Medium Findings from 5 to 7 October builds have not been rechecked docs/NEXT.md, "Earlier technical findings to recheck": Cell tour tokens and shortcuts, Pipeline drawer overlap, FDA precedent draft fixtures and sign-off, Objects MeSH identity, guided-walk entry, Sequence short-loop bonuses and oligo ε260, Assay construct hand-offs, consent-dialog focus Some may be live defects Unverified Reproduce each on the current tree and close or schedule it
PRC-08 Medium One founder carries most operational knowledge; development has been done largely through AI agent sessions R-07; .claude/agents/; see Handover guide Loss of context on transfer Open Work through the handover guide's bus-factor list with the founder
PRC-09 Low UI/UX audit items not done docs/reviews/2026-10-10-ux-audit/README.md, "Not done in this round": catalogue loading, Education design language, command-palette ranking, product pages, Literature's start, new hand-off routes, remaining Assay items (BT2-6, BT2-7, BT2-9) and the Bioreactor table (BT2-15) Usability debt, not correctness Open (recorded) Batch 3 of the audit's suggested order
PRC-10 Low Decision register numbering is irregular Two files numbered D-0028; no D-0031 (docs/board/decisions/README.md); commit 2aeae64 ("Defer size work ... (D-0046)") refers to the decision filed as D-0048 after renumbering Citations can point at the wrong record Open (recorded in the register's notes) Assign an unambiguous reference to one D-0028 and record why D-0031 is absent
PRC-11 Low GitHub Actions are pinned to major tags, and the snapshot workflow runs a third-party action with write permission uses: actions/checkout@v4 and others; peter-evans/create-pull-request@v7 in snapshots.yml with contents: write and pull-requests: write A moved tag changes what runs in CI Confirmed Pin actions to commit SHAs
PRC-20 Medium The Fast chain treats docs/board, docs/progress, docs/reviews and docs/design as record folders: a push changing only them runs nothing, and a later push whose tree equals a green run outside them reuses that run (.github/workflows/fast.yml). But npm test reads those folders: scripts/check-boundary.test.mjs ("nothing in this project reaches outside its folder") scans every file, so a record-only commit there can turn the unit suite red without the chain seeing it Stage D, 21 October 2026: the CDO's capture scripts in docs/reviews/2026-10-21-calc-stage-design/ imported playwright (not a dependency; the project has @playwright/test) and named /opt/pw-browsers/..., failing the boundary test on 5334302c; found by Stage D builder B (session_015s4Hyg5mLv39xdrsicDzhS) A record-only push can land a red unit test on main behind a green-looking chain, and every branch cut from it inherits the failure Scripts fixed 21 October 2026 (import from @playwright/test, browser path from PW_CHROMIUM); the gap in the gate is open The CTO: either exclude the record folders from the boundary scan for non-code files, or count .mjs, .mts, .js and .ts files under the record folders as code in the Fast chain's tested diff and paths-ignore
PRC-21 High Stage E landed on main with its checks incomplete, its size failing and its records contradicting each other Landed by fast-forward 0cb931f80 → 92020aa1d on the CEO's "Just merge to main skip tests" (docs/progress/roadmap-run.md, entries of 24 October): the push preceded the green Fast on its tree (40077058912, 08:31 UTC) and main's own Fast on 92020aa1d (40078114614) was cancelled; no ci.yml matrix ran; the D-0101 queue was bypassed. docs/progress/molecule-stage.md:5 says E1 is on main while :30 and :236 say it has not reached main; REL-513 to REL-518 still read "Fixed in source" or "acceptance pending". The CDO's V13 acceptance describes 22d40f5f, not main after 836907fc Main carries a visible change no matrix has checked, and the records overstate or contradict what is accepted Open; original premature landing remains historical fact. Reconciled 25 October 2026: molecule-stage.md now labels contradictory old statements historical, and main includes the lazy shape-viewer repair. Current-main Molecule browser/size/CDO acceptance and the matrix attribution remain to be reconciled with the existing Stage E owner; this repair line does not claim Stage E acceptance. Run the Molecule projects and one daily matrix on main's head; reconcile molecule-stage.md, REL-513 to REL-518 and REL-528 with what is on main; take fresh CDO frames of main
PRC-29 Medium The evidence rule's growth guard (D-0126) ran only when the Fast chain ran: a push that changes only the record folders runs nothing (paths-ignore), and a push whose tree outside them equals a green run reuses that run, so check-write-once and its growth step were skipped .github/workflows/fast.yml (paths-ignore, the tested job) and .github/workflows/check.yml; evidence is usually committed after the code's green run A branch whose evidence arrived after its last chain run, typically a records-only commit fast-forwarded to main, could land traces, logs or oversize images unchecked Closed 24 October 2026 on claude/workflow-finish-guard by .github/workflows/growth.yml (the CTO's ruling after the rollout run): the guard alone runs on every push whose changes include the record folders, its paths the same list as fast.yml's paths-ignore (checked by scripts/workflows.test.mjs); on main it judges github.event.before..after, and a red there is recorded under D-0074 and pruned forward —
PRC-25 Medium The desktop root size moved from 110% to 100% and the muted colour changed without a recorded decision CDO memos docs/board/memos/2026-10-24-cdo-molecule-codex-review.md and docs/board/memos/2026-10-24-cdo-molecule-on-main-and-shape-loading.md: b92578a2 (workflow branch, on main through 836907fc) changed tokens.css; D-0016 ("110 per cent on desktop") is still Decided in docs/board/decisions/README.md, and instrument-design-system.md still names the old muted colour Every screen's scale and contrast changed without the CEO's decision or both-theme evidence Closed, 24 October 2026: the CEO ratified the change in D-0127 (docs/board/decisions/D-0127-the-suite-renders-at-the-browsers-normal-size-with-darker-muted-ink.md), which supersedes D-0016's desktop scale and D-0119 item 1 A CEO decision superseding D-0016 or a revert, with desktop and 375 px evidence in both themes

Reviewer reports checked

Eleven reports were supplied for checking against the code. All eleven were confirmed.

Report Result Register row
(a) The Europe PMC branch sends the OpenAlex key to www.ebi.ac.uk Confirmed at src/app/api/literature/route.ts:53-56 SEC-01
(b) usePubchemSuggestions sends typed text to PubChem without consent while PubChem is declared consent: "always" in one record and "none" in Molecule's registry entry Confirmed; the "always" record is src/components/suite/net/limiter.ts:57, and Calc's entry also says "none" SEC-02
(c) /literature has the object-page CSP but a public boundary Confirmed at content/apps/routes.ts:160 and src/components/suite/navigation/document-policy.ts:8-15 SEC-03
(d) /api/search/compound returns error.message in a 422 Confirmed at src/app/api/search/compound/route.ts:22-24 SEC-08
(e) The billing webhook does not check WORKSPACE_ACCESS_MODE Confirmed at src/app/api/workspace/billing/webhook/route.ts:8-16 SEC-07
(f) /workspace has no CSP rule Confirmed; no header rule matches it SEC-04
(g) Literature POST routes accept requests with no Origin Confirmed for /api/literature, /search, /discover and /fulltext; the AI routes are strict SEC-05
(h) Stale /apps/<slug>/app comments in content/csp.ts and content/apps/pages.ts Confirmed at content/csp.ts:8-10 and content/apps/pages.ts:3-4 MNT-02
(i) npm test depends on the calendar despite a comment saying otherwise Confirmed REL-01
(j) pipeline/education/verify.py is missing from the scheduled matrix Confirmed REL-07
(k) /technical uses one shared Basic-auth credential with no rate limiting Confirmed; fixed 13 October 2026 (D-0081) SEC-06

Wave 6 assembly correction (11 October 2026)

The origin-straddling cut defect documented in the Plasmid technical page is closed by signed strand-cut separation, independent Biopython boundary fixtures and exact product tests. Distinct coincident top cuts and overlapping staggered cleavage intervals explicitly refuse. The own-sequence Assembly view keeps the scientific limits and does not infer experimental success.

Bench dashboard ownership labelling (11 October 2026 candidate)

The Bench library previously derived “Without a Study” only from record membership, so a saved task could name an owning Study in Recent work and deny that relationship in the library. The dashboard candidate uses a separate read-only owner/member projection, preserving all live manifests per reference, archived/unresolved owners and scoped read status. This fixes presentation without moving work or adding Study members. Pure regression tests and browser checks cover owner/member distinctions and failed-read recovery; final verification is recorded in docs/progress/roadmap-run.md. This is not a claim to repair the independently scoped copy-before-edit/lost-work issue.

Saved-record preview limits (11 October 2026 candidate)

Rich-card previews intentionally reflect stored data. Protein records currently contain no saved ribbon image. Molecule depictions require explicit activation and can fail for malformed saved SMILES, with Retry kept visible. Assay previews show the first supported saved dose-response plate layout, including its index, roles and exclusions; other analysis modes and malformed payloads do not receive a plate thumbnail. This is an input overview, not measured responses or a result. Runtime and visual verification status is tracked in the roadmap run record; source-review acceptance alone is not final visual acceptance.

Bench unequal columns and disclosure drafts (11 October 2026 correction)

The dashboard at 1e8d2257 paired a short Study panel and short Study collection with much taller right-hand work/record sections. The CEO's populated screenshot established large empty columns throughout the page; earlier section-only captures did not establish whole-page layout acceptance. The correction stacks full-width sections, makes Study/work rows compact and initially shows two pins. Its new regression check captures the populated page with the real shell and asserts full-width flow at 1440, 1280 and 375 pixels. Note editors also gain disclosure reveal/focus and barriers before filters or library collapse; edited rows remain mounted during live recency changes. Verification is recorded in docs/progress/roadmap-run.md; source completion alone is not a passing gate.

Protein's atlas pass (14 October 2026, D-0084)

Frames 001 to 015 were checked control by control against the components at d1e71d62 before the pass, and the page says where they differ (the "redesign atlas pass" section of docs/technical/app-protein.md). The deviations are MNT-22 above. Two earlier rows of this register's Protein defects are touched: the About panel's dashes for a value the sources have not given became the word "Not available" (the truthiness test on a zero mean pLDDT stands), and the drugs tile no longer shows "0" for a protein Open Targets could not match to a target, which was a missing value shown as zero; the tile is left out and the Evidence tab's Drugs panel and Source details say why. The Diseases panel's indefinite loading state for a human entry without an Ensembl gene id (the first Protein defect on that page) is unchanged by this pass; the new Source details panel shows that source as "Not asked: no Open Targets target" beside it. Verification is in the pass's report; the browser specs were amended to the new composition, none removed.

Calc redesign atlas pass (14 October 2026)

The Calc pass of D-0084 applied the atlas's composition (frames 040 to 064) to the bench sheet and the task islands: the Calculator select and the page's keys in the view toolbar, the calculator's panel and the compound at the left, the answer as tinted tiles and the method at the right (docs/technical/app-calc.md, "The bench sheet"). Checked against each frame's control list, every control, option, validation message and qualification of the current components stays; the discrepancies between the frames and the product are recorded on the Calc page under "Atlas composition": the frame's inline compound search (the picker dialog is the search), the intermediate planner's place (C1V1 and the antibody kind, not the serial plan), the recipe's editable rows against the frame's table, and the preparation kinds' headline tiles. Three defects found while applying the never-empty rule were fixed in the pass: the A280 answer region stood empty before a reading (and the A260 estimate before its reading), the qualified line that stands where an answer cannot drew a dash before its sentence, and two recipe refusal sentences lived in the component rather than the copy. Browser specs were amended for the toolbar and the tiles' names (frames 045, 049 and 054) citing the decision; none was removed.

Bench covers and the structure worker (14 October 2026, D-0084)

A Study card's cover draws its first compound member's 2D depiction through the Bench's shared RDKit lease as soon as the card mounts (D-0084 item 4), so a Bench that shows such a Study (the example Study among them) starts the structure worker on open, where the library's cards start it only on "Show structure". One worker serves the whole page and the generated figure stands until the drawing arrives, so nothing is blank, but the download is no longer opt-in on that page; the CTO's view on the cost is held (D-0084). The record page's header cover and the pinned table carry no worker of their own: the header draws only where the preview model has a depiction, and the table has no preview column. ObjectActions's row variant keeps its Pin key beside the ⋯ (the screenshot draws the ⋯ alone): folding Pin into the menu is a shared change (object-actions.tsx) not made in the Bench pass.

Live-site usability repair (16 October 2026, candidate branch)

The improvements branch addresses Calc numeric field collapse, repeated homepage intro playback, later-step mobile walk density, Bioreactor’s automatic example run, Assay example alignment, the missing Literature app route/footer link, plural Molecule palette copy, education legend casing and Calc/Pipeline colour similarity. Verification is recorded in docs/progress/improvements-2026-10-16.md; these are not deployment claims.

  • 16 October candidate, Calc recipe round trip: multi-component recipe payloads previously dropped liquid-stock concentrations, so reopening could turn a liquid addition into powder. Optional concentration/unit retention now preserves the source type; invalid new fields refuse the payload. Existing stored records are not rewritten. This cannot recover details already omitted by old saves.

Gibson primer-design boundary (16 October 2026)

The missing connection from raw fragments to overlap-bearing primers is addressed by the fixed-length Gibson mode documented in Plasmid. The mode supports linear raw templates only and refuses repeated/ambiguous exact PCR or homology, fully consumed fragments, and unintended overlap trimming. It retains qualified annealing-region Tm or its refusal. Primer secondary-structure, genome-specificity and experimental performance assessment remain outside this mode; it does not recommend optimal lengths or a PCR annealing temperature.

Explicit stock drafts and browser history (16 October 2026)

Stock edits require explicit Save or Discard. Same-policy imperative navigation, including palette commands, now uses the same draft barrier as links and tabs. History tracking preserves Forward entries, native null state and Next router state during refused traversals, and releases routing after an explicit save or discard. Five history regression tests and two registry checks cover these cases. Production browser acceptance remains in the improvements progress record.

On a browser without Navigation API entry indices, an unknown writer can erase an older entry's tracking marker. The fallback retains the editor and suppresses routing but cannot safely infer the distance needed to restore the URL. It never guesses a traversal or reloads with go(0); an explicit save/discard releases the barrier at the actual current entry. This compatibility limit remains recorded.

Public reference workflow limits (16 October 2026, D-0089)

The 30 populated static entry routes reuse existing scientific methods; their keywords do not establish new capabilities. In particular CNS MPO/BBB prediction, PROTAC subunit attribution, Cas12a TTTV/off-target search, mammalian growth models, patent claim analysis and multi-insert Gibson optimisation are not implemented. The route articles state these boundaries. Calibration retains CSV/HTML exports; it has no native SVG/PNG/PDF publication-figure writer. These are confirmed scope limits, not hidden calculated results. See Public reference workflows.

Cold-loading workspaces can still produce small layout shifts. Reference-only reservations address measured result/header insertions, and browser reports retain observations at desktop and 375 × 667 px, but zero CLS on all devices is not established. No measured local response time establishes deployed TTFB, LCP or INP. Static generation does not guarantee search ranking, rich results or zero hosting cost. Final observations are in the dated reference-workflow run record.

The two new ClinicalTrials.gov captures are selected six-study examples retrieved 16 October 2026, with the existing 60-day expiry. They need refreshing through the recorded capture/parser procedure; they are not exhaustive current landscapes. The incretin FDA subset preserves its dated source rows and has no fabricated change history. Source/licence review remains held for General Counsel under D-0010. The baseline build also has 24 pre-existing bundle overruns (23 remain in the candidate); the candidate passes the unchanged baseline comparison, not every absolute release budget.

Visual QA also found reference Assay SVG captions clipped when opened without the app's Inter webfont. Fixed for reference SVGs by using an identical portable sans stack for measurement and output, with standalone single-/multi-curve browser bounds checks. Ordinary exports retain their prior typography; general font substitution across arbitrary recipient software is not eliminated.

Product feature integration size report (16 October 2026)

On combined application head 67cf465e against an independently rebuilt main 7dc31c54, calculators-island-dilution grows from 49.0 to 49.1 KB against its unchanged 49 KB interim ceiling. The baseline comparison exits 1 for this single regression; the other 23 inherited over-budget/unmatched entries do not regress. New plate-print and Methods budgets pass. The production build passes. Under D-0074 this remains a reported performance issue for follow-up rather than a merge hold. Owner: product-expansion integration / CTO performance pass. Trim the emitted chunk without raising its ceiling; no test or budget has been loosened to conceal the reading. Measurements are in the product-expansion run record and /tmp/drybench-merge-product-size-measurements.json.

Live-site improvements integration size report (16 October 2026)

The combined improvement and product-feature build passes, but comparison with the Product Strategist's merged-main baseline reports four bundle regressions: Calc serial dilution and A280 each measure 49.1 KB against 49 KB, Sequence protein MW/pI measures 46.1 KB against 46 KB, and the new Study report-document family measures 54.6 KB against its provisional 40 KB ceiling. The comparison also retains inherited overruns. No ceiling or test was changed to mask these measurements. Under D-0074 this is a recorded performance follow-up, not a merge hold; the report is /tmp/drybench-improvements-merge-size.log.

Assay batch comparison browser failure (16 October 2026)

Resolved 16 October 2026: prepareAssayBatch admitted only ["source", "review", "layout", "declared", "kinetic"] on props.draft, rejecting the ok: true key returned by readImport and staging. Admitted "ok" on the draft shape in src/apps/assay-analyser/batch.ts. Verified in e2e/improvements/batch-statistics-actions.spec.ts across desktop, phone and desktop-dark projects with zero failures. Removed from docs/progress/e2e-baseline.json.

Review of the 16 and 17 October 2026 commits (17 October 2026)

Rows SCI-129 to SCI-140, SEC-10, REL-207 to REL-209 and PRC-14 to PRC-16 were added on 17 October 2026, and SCI-141 to SCI-145, REL-210 to REL-213, PRC-17 and PRC-18 later the same day with the fix round's statuses (SCI-146 and SCI-147 with SCI-145's ruling, both closed the same day, with SCI-148 from the CSO's review of the A260 fixture, closed the same day, and SCI-149 from its ruling, closed the same day); all were first added from the review record docs/reviews/2026-10-17-recent-work-review/README.md, checked against the code on main at 000a420. That record names the independent evidence for each row. It has more findings than these rows: Medium and Low items are listed there, not here. Every row comes from the Gemini commits 4c59707..000a420, except SCI-140, which is in the Codex reference pages of 16 October.

Id Severity Description Evidence Impact Status Suggested fix
SCI-129 High The protocol assistant's Apply step multiplies mass concentrations below 1 g/L by 1000. The parser reads mg/L as g/L and 1 ng/µL as 1 g/L, and reads unknown names as chemical formulae. src/components/tools/lab-calculators/panels/protocol-ai-assistant.tsx:79,95; src/lib/ai/protocol-parser.ts:183,185. Example: "10 mL of 2 µg/mL from 10 mg/mL" gives 2.000 mL of stock; the correct amount is 2 µL. A reachable Calc control gives volumes 1000× wrong Fixed 17 October 2026: the assistant and parser removed (9d0865d) Remove the assistant, or carry units unchanged and refuse anything it cannot map
SCI-130 High The liquid-handler exports write wrong files. Normalisation maps sample index 0 and index 1 both to A1. The plate sheet writes litre volumes labelled µL and tube names as source wells. The Tecan GWL puts the volume in the TubeID field. Downloads go ahead even when the exporter reports errors. normalization-panel.tsx:103–119 (0-based index passed to the 1-based indexToWell); plate-sheet-panel.tsx:145–176; src/lib/export/liquid-handlers/tecan.ts:114 A robot run from these files dispenses wrong volumes into wrong wells Fixed 17 October 2026 (e4ebdfb, 84d035e): Tecan GWL per the published layout with numeric positions, µL from the plate sheet, no Echo pick list for tube sources, each sample in its own well, no file when the exporter refuses; fixture liquid-handler-formats-v1.json Block the downloads; fix the index, units and GWL layout against the vendor format with a fixture
SCI-131 High The new plate parsers shift readings into the wrong wells. They also read metadata as wells, crop 384-well plates silently, and pool distinct samples into six unknowns. src/lib/assay/plate-matrix.ts:36–38,59–63; src/lib/assay/plate-qc-vendor.ts:231–234,376,424; plate-matrix-paste-grid.tsx:63,148–150 Wrong values reach the calibration engine Fixed 17 October 2026: both parsers and the paste grid removed; import uses parsePlates (6794192) Remove both parsers and use parsePlates with ImportReview
SCI-132 High The Standard-curve diagnostic badges are wrong in several ways. CV is shown 100× too high. n = 1 data is called high precision. Hook detection is inverted. The tested range is labelled LLOQ/ULOQ. Banned verdict words are used. src/lib/ai/assay-diagnostics.ts:210,219,263; assay-diagnostics-badges.tsx:137–161,210–218; calibration.ts:22 reports CV in percent Every Standard-curve result, including the public ELISA page, shows false alarms or false reassurance Fixed 17 October 2026: badges and evaluator removed (6794192) Remove the badges
SCI-133 High The variant bridge reports ligand distances, contacting residues and pLDDT classes from invented coordinates for "EGFR L858R" and "KRAS G12D". It also reports a growth rate, an O₂ multiplier and a feed rate from uncited constants. src/components/suite/protein/variant-bridge-panel.tsx:43–70; src/lib/seq/variant-bridge.ts:835–910 Fabricated structural and bioprocess numbers on the Protein dossier Fixed 17 October 2026: the variant bridge removed (c37314d); a fixture-backed Grantham classifier is a possible later rebuild Remove (Grantham can be kept)
SCI-134 High The Bioreactor titer and overflow panel contradicts the engine's cited overflow flags. Its titers come from uncited α/β values outside the substrate budget (CSO M3). Its chemostat space-time yield is about 6× low. src/lib/hosts/product-titer.ts:43,54,165,171,211; the engine's Vemuri 2006 flags and flag-codes.ts:61 Wrong overflow verdicts and feed advice on the default runs Fixed 17 October 2026: panel and engine removed, with the unrendered measured overlay (cb631e1) Remove; expose the engine's own α/β with M3's wording if titer is wanted
SCI-135 High The methods generator gets three things wrong. Its Rule-of-5 count includes Veber failures. Its Assay legend describes "mean ± SD" error bars that the chart does not draw. Its Calc text says volumes "were prepared", although the result is a plan. scorecard.tsx:178; src/lib/methods/generator.ts:56,117–118 Copied methods text misreports the work Fixed 17 October 2026: the generator removed from Assay, Molecule and Calc (ba2fc0d); recorded methods remain Remove in favour of the recorded-methods generators (contract 03)
SCI-136 High The 60 reference pages added on 17 October include wrong data and wrong identities. The GLP-1, PD-1, bispecific and CRL pages render the HER2 ADC snapshot. Five protein pages describe PDB 4UV7 as the EGFR kinase domain. The salt-volume equation has purity inverted. Both oligo masses are wrong. Some pages say features exist or do not exist when the opposite is true. src/components/suite/seo/reference-data.server.ts:11; content/seo/presets/expansion-batch1.ts:774; content/seo/presets/expansion-batch2.ts:465,880–1167 Public, indexable pages (D-0089) state false science Fixed 17 October 2026 in three passes (claude/gemini-fix-seo, merged d22f2f6 and 5138cae): 20 of the 60 pages removed; the 40 kept seed the analysis they describe; numbers, DOIs, the XbaI/Dam statement, the Gibson Tm advice and the BCA blank wording corrected after the CSO's review; every molecule number on the pages is checked against pipeline/molecule-workbench/fixtures/seo-evidence-v1.json; registry tests check seeded values, refuse duplicate workspace states and check DOI syntax Remove 8 pages and fix 41 (per-page list in the review record)
SCI-137 Medium The ionic buffer formulator's realised pH misses its target by 0.07–0.21 units across five buffers. Its PIPES conjugate pair is wrong. Its pKa values are apparent values, with Davies applied on top. The Davies denominator is wrong. Phosphate masses name no hydrate. A temperature of 0 °C becomes 25 °C. src/lib/dilution/ionic-buffer-builder.ts:247; src/components/suite/calculators/ionic-buffer-panel.tsx; contradicts buffer.ts and app-calc.md:394 Buffer recipes off target, still needing a pH meter Fixed 17 October 2026: the formulator removed (9d0865d); the Goldberg buffer engine and its ruling are unchanged Remove, or rebuild on the Goldberg engine with a fixture
SCI-138 Medium The command palette's Tm uses the Wallace or basic formula: 72.3 °C against the suite's 85.3 °C for a 20-mer GC repeat. The codon/SDM designer's Tm runs 2.1 °C low. Pipetting thresholds now differ between modules (0.5, 1 and 2 µL). src/lib/omnibox/scientific-sniffer.ts:292–301; src/lib/seq/codon-sdm.ts:535; src/lib/dilution/guardrails.ts:13 Inconsistent numbers for the same quantity across the suite Fixed 17 October 2026: the palette uses oligoMelting (d16022e); codon/SDM removed (3fcdcb9); the sub-µL guardrail removed so the 2 µL convention stands (9d0865d) Call oligoMelting; use the 2 µL convention (CSO, 6 October)
SCI-139 Medium The synergy panel computes on whichever direction is entered, without declaring it. The preset entered as viability reverses the verdict (Bliss −60.3 against +10.6). The engine clamps near 0/100, guesses the scale and ignores the vehicle. src/lib/fit/synergy/bliss.ts:206–226; src/components/suite/assay/synergy-panel.tsx Synergy calls can be inverted Fixed 17 October 2026: panel and engine removed (6794192); HSA/Bliss to be rebuilt under contract 13, fixtures first. Rebuilt under contract 13 as combination responses (D-0096 rebuild 5; fixtures 0.14.0 and 0.15.0 first) and corrected on 20 October 2026 (SCI-176 to SCI-179, REL-392 to REL-395): direction and scale are declared, never guessed; no clamping; the vehicle is measured, disclosed and never re-zeroed. The CSO has not yet reviewed the rebuilt engine (the CSO's memos of 17 and 20 October 2026), so the rebuild is not signed off and the row stays open until that review Rebuild to contract 13. 20 October 2026: CSO review of the rebuilt combination engine and surface against fixtures 0.14.0 and 0.15.0; the reviewer or merging session closes the row
SCI-140 Medium The EGFR reference page (Codex, 16 October) pairs T790M with PDB 4UV7. 4UV7 covers UniProt 25–645, so residue 790 is not in it. content/seo/presets/discovery.ts:90; the same example in src/apps/protein-explorer/url-schema.ts:4 The page's exemplar residue is absent from its structure Fixed 17 October 2026 (d22f2f6): the base page keeps 4UV7, whose offline browser fixtures are recorded, and now describes it as the ectodomain–Fab complex (UniProt 25–645) without residue 790, pointing to 3IKA for the kinase domain Use a kinase-domain T790M entry (for example 2JIT, 3W2O or 5Y9T)
SEC-10 Medium The "zero-knowledge" share promises "100% zero-knowledge data privacy" for unencrypted deflate+base64url fragments. No code decodes its links. Decompression has no output cap. src/components/suite/share/share-state-dialog.tsx:80–81,148; src/lib/share/hashCodec.ts:57–105 (decodeStateFromHash has no caller) A false privacy claim; recipients get a blank tool Fixed 17 October 2026: codec, dialog, banner and buttons removed (ba2fc0d); the ShareLinkDialog is unchanged Remove; keep the ShareLinkDialog (contracts §3.5)
REL-207 High An ownership test was inverted, so a Study chosen with no owner known is now remembered under the browser key. The study page's !canWrite and scope checks were removed. No decision covers either change. 6466b30: src/components/suite/objects/research-context.test.ts:141–155, research-context.ts:23,93,196, study-page.tsx:273–276; D-0046 Weakens the per-owner rule for the working Study Fixed 17 October 2026: research-context.ts and its test restored to 26f6d7c, the Study page guards restored (ba2fc0d) Revert both files and restore the assertions
REL-208 High Repeat study (clone and swap) saves nothing. It shows a success toast and navigates to a Study that does not exist. The engine also breaks contract 06: whole-Study copy, string swaps and a derived ID. src/components/suite/objects/study-page.tsx:708–717; src/lib/workspace/repeat-study.ts:388,440–560 A visible feature that loses the user's intent Fixed 17 October 2026: menu item, dialog and engine removed (ba2fc0d); contract 06 to be built separately Remove the menu item; build contract 06
REL-209 Medium "Verify & export RO-Crate" checks the Study against a receipt computed from the same Study, so it always passes. The crate fails the RO-Crate 1.1 validator. Its digests cover input IDs, not contents. src/components/suite/workspace/ro-crate-export-dialog.tsx:50–55; src/lib/workspace/ro-crate.ts:288–292,364,419–430 A "Verified" badge that cannot fail Fixed 17 October 2026 (24cd872): digests over contents via contentHash, comparison with an earlier digests file, flattened JSON-LD passing rocrate-validator 0.12.2 (ro-crate-1.1, required), no licence unless the person chooses one Remove Verify unless an earlier receipt can be loaded; flatten the JSON-LD; drop "W3C" and "tamper-evident"
PRC-14 High The commits 4c59707..000a420 (+37,659 lines) were pushed to main by a session that is not the merger. They carry no decision, memo, run-record entry, fixture or model attribution. git log --author="Mat Beale" --since=2026-10-16T15:00 origin/main; CLAUDE.md "Working in parallel sessions"; D-0056, D-0063, D-0090 Unreviewed engines and public pages on main Partly addressed 17 October 2026: the fix round on claude/gallant-dirac-mly5c9 removes or repairs the commits' defects; D-0092 now lets any session merge after the check chain The CEO decides between a revert through the merger and fixing forward (review record, Recommendation)
PRC-15 High /regulatory now offers a "Self-qualification pack" receipt for an "internal qualification binder". The same page says "no IQ/OQ package". Its checks are hand-written and partly circular. 5 of its 16 links return 404. src/app/(marketing)/regulatory/page.tsx:79–86; content/apps/regulatory.ts:115,135; src/lib/qualification/verification-runner.ts:359,483,536 A public qualification claim the suite cannot support Fixed 17 October 2026: section, runner and component removed; the page restored (2bc96d9) Remove the section
PRC-16 Medium Checks were loosened without a product change. settle() is capped at 2 s, with 143 calls across 70 specs. A batch spec gets 60 s timeouts. drybench.vercel.app was added to LINK_ONLY for hard-coded origins. The product-name literal is obfuscated, and "DryBench" passes the case-sensitive scan. e2e/support/layout.ts:36–43; e2e/improvements/batch-statistics-actions.spec.ts:22,37; content/services.test.ts:98; src/lib/workspace/repeat-study.test.ts:246; src/lib/methods/generator.ts:22–28 The suite's own guards no longer catch these cases Fixed 17 October 2026: settle() and the batch timeouts restored (9fa6092), the product-name scan catches case variants (4cb0fdd), the hard-coded origins removed with their features (68a1ff1, ba2fc0d) Revert the loosening; use SUITE_ORIGIN; make the name scan case-insensitive
SCI-141 Medium The education "At the bench" bridge offered named presets no app defines, linked to /reference/workflows/* routes that do not exist, embedded an LMS iframe that frame-ancestors 'none' blocks, and promised absent features e187e27 (review of the Gemini commits) Dead links and false promises on all 14 education tools Fixed 17 October 2026: bridge and embed removed (e187e27); the existing At the bench card remains, with a link-resolution test in content/education.test.ts —
SCI-142 Medium The local MCP server's dose-response tool reported an IC50 the Assay rules withhold (4.06 µM beyond a 2.19 µM top concentration); its dilution tool planned with hidden 1 mL / 1 mL / 2 mL constraints; its receipt hashed only the arguments src/lib/mcp/tools/dose-response.ts, dilution.ts, receipt.ts before 65df2f8 An agent could read numbers the app refuses to show Fixed 17 October 2026 (65df2f8): fitted only when rules.relative.shown, otherwise withheld with the rule; every intermediate constraint required; receipt hashes input and output with real method versions. Q-17 stays open —
SCI-143 Low Features removed in the 17 October fix round that the CEO's feature list still wants, each to be rebuilt to its contract with fixtures first: HSA/Bliss combination analysis (contract 13), raw counting and viral dose (10), repeat setup (06), run comparison (07), stock autofill and depletion (05), measured-run overlay (11A), SDM primer design and Golden Gate domestication. Codon optimisation waits on the codon-usage table's licence (held for the General Counsel) docs/reviews/2026-10-17-recent-work-review/README.md The capabilities are absent until rebuilt Open; queued under D-0090 in D-0096's order. Repeat setup landed as REL-300, the stock rebuild as REL-305, and SDM primer design on 17 October 2026 as the mutagenesis-primers operation (src/lib/seq/sdm-primers.ts, fixture sdm-primers-v1.json, SCI-160 to SCI-164 and REL-310 to REL-314, of which REL-310 to REL-312 are now REL-455, REL-458 and REL-459); Golden Gate domestication, the other half of that third item, is Stage C's and is not built. Run comparison (contract 07A) was rebuilt on 18 and 19 October 2026 (oracle and fixture 3ecb2fd, engine and reader 816307b by Codex; Study surface 1b140ea) and corrected on 20 October (d6dbd48b: REL-404); 7B (Series v3 candidates) is not built. The measured-run overlay (contract 11A) was rebuilt on 19 and 20 October (fixture ed93425, engine c3f8679, surface ab89a08) and corrected on 20 October (4c63b29c, c534e765: SCI-184, SCI-185, REL-400 to REL-403, REL-405); 11B and 11C are not built. For both, the CSO, CPO and CTO reviews D-0096 requires of the built feature are still due (SCI-186; the memos of 19 October are the builders' own notes). Combination analysis landed 18 to 20 October 2026 as combination responses (contract 13) and was corrected on 20 October (SCI-176 to SCI-179); it stays in this row until the CSO's review. Raw counting and viral dose (contract 10) landed on 19 October 2026 (e1a52a43, merged outside the rules: audit 2026-10-20 counting-dose M6). On 20 October 2026 branch worktree-agent-ab4a9a83844c98bb0 made the audit's fixes under the CSO's, CPO's and CTO's memos of 20 October 2026: SCI-180 to SCI-183 and REL-396 to REL-399. The CSO ruled that the methods' "verified" status stands for the arithmetic. SCI-143 stays open until the CSO has reviewed the rebuilt engines with these fixes (the CSO's memo of 20 October 2026, risks) Build one at a time: repeat setup, stock autofill, SDM/Golden Gate, run comparison, combination analysis, counting and viral dose, measured overlay. 20 October 2026: Golden Gate domestication remains to be built; review 07A and 11A as built (SCI-186); the CSO reviews the rebuilt combination engine (SCI-139) and the counting and viral dose engines with their 20 October fixes before the row closes
SCI-160 Low The overlapping scheme's central rule (the flanks within 3 bases of each other) binds the rejection counts, and reaches a returned candidate only where the template's ends leave one window. The CSO's counter-example of 17 October 2026: on a 25-base linear template with a substitution at base 12 the only permitted window gives flanks of 11 and 13, inside the tolerance, and that candidate is returned with the reverse primer's flanks the other way round. A search over 400 long random templates found no such candidate, because a long template always offers a balanced window src/lib/seq/sdm-primers.ts (the scheme A ranking); fixture case substitution-short-linear-unequal-flanks; the CSO's build review, docs/board/memos/2026-10-17-cso-sdm-primers-build-review.md finding 2 On a long template the tolerance shows only in the counts, so a reader could take it for a rule that never applies Closed 17 October 2026: the CSO confirmed the rule and the ranking unchanged, the row's earlier claim that a balanced window always wins is corrected here, and the counter-example is now a fixture case that also pins the reverse primer's flank swap —
SCI-161 Low The back-to-back scheme's ranking order (the pair ΔTm, then the mean GC distance from 40 to 60, then the two lengths from the midpoint of 18 to 30, then the coordinates) is the builder's, published with the method and in the fixture's conventions. The CSO's rule 9 rules the ranking for the overlapping scheme only src/lib/seq/sdm-primers.ts, pipeline/sequence-toolkit/sdm_primers.py (the conventions block) A published order the CSO has not ruled on Confirmed by the CSO on 17 October 2026 (build review, finding 3): ΔTm first is right, and ranking the forward primer by its matched total rather than its full length is right. Its reservation stays open: at a 1e-6 °C comparison ΔTm decides almost every pair, so the GC and length terms are reachable only on repeat templates, and a 0.1 °C band would let them bite while staying deterministic. Not ordered for v1 CSO
SCI-162 Low GC was a hard rule in the overlapping scheme only; the CSO's rule 11 omitted it for the back-to-back scheme, which it calls its own omission on the ground that GC is a property of the oligo that is synthesised, not of the scheme, and that the nearest-neighbour model's fit is poorest at composition extremes src/lib/seq/sdm-primers.ts (backToBack), methods-sdm.ts; the CSO's build review finding 4 A primer of extreme GC could be returned in the back-to-back scheme Fixed 17 October 2026: the CSO extended the rule and the extension was taken before merge, so both schemes require 30 to 70 per cent on each primer as ordered and prefer 40 to 60 for the ranking. The oracle was re-run and the fixture republished, which the CSO's memo prices as the cheaper of the two options; its forward red line stands, that the rule could not be added to sdm-primers-v1 after publication. The reading taken is that a fixture pushed to a branch is not published; if the CEO or the CSO reads it otherwise, this belongs in a v2 —
SCI-163 Low The CSO's methods-entry text cites Zheng, Baumann and Reymond 2004 and Liu and Naismith 2008 from memory and records both as unread, and its red line says the entry does not ship with them unread. The shipped method record therefore states the scheme rules without citing either paper, so no citation shipped unread; the citation itself is held src/lib/seq/methods-sdm.ts (the reference citation), docs/board/memos/2026-10-17-cso-sdm-primers-contract.md The schemes carry no literature citation, which the CSO's entry text intends them to have Open (recorded): the citation is added when the papers are read CSO
SCI-164 Low Three of the design's counts cannot be non-zero, and two were misdescribed. matched3PrimeShort is structurally zero because the back-to-back enumeration starts at the published minimum of 15; the overlapping scheme never counts length, because a window outside 25 to 45 bases is not enumerated at all, though the conventions and the visible label advertised it as that scheme's rejection reason; and abutment was never incremented, because the case it names (the two primers longer than the molecule) was counted under boundary src/lib/seq/sdm-primers.ts, pipeline/sequence-toolkit/sdm_primers.py, content/apps/sequence-toolkit/mutagenesis.ts; the CSO's build review finding 6 A count that is always zero, or one described as a rule it does not record, reads as a rule that never bites Fixed 17 October 2026: abutment now counts the pair that will not fit and boundary only a span off the mutant, in the oracle and the engine together; the conventions say which scheme each count belongs to; and the panel shows only the chosen scheme's reasons (SDM_REASONS), so no rule appears at zero that could not have fired. matched3PrimeShort stays structurally zero and is kept as the shape of the rule, which the CSO confirmed, with the enumeration left at the published minimum —
REL-210 Medium The 16 October shell changes preloaded all ten workspace chunks at idle, swapped the workspace entry from its dynamic wrapper to the raw module (a remount and possible server/client difference), animated the rail on hydration, kept scroll position across pages, made the loading skeleton interactive and reduced the expanded footer to icons e60bed8, 6466b30 Wasted bandwidth on every page; layout motion on load Fixed 17 October 2026 (b93fbc3, 4e85160, 160e9ec) —
REL-211 Low No hand-off carried Assay's interpolated sample concentrations into Calc's sample normalisation. The 16 October button wrote an undeclared session key nothing read and opened a route that does not exist; it was removed ba2fc0d Concentrations were copied by hand Fixed 17–19 October 2026: "Normalise samples in Calc" on the standard-curve result sends a normalisation recipe by hand-off record under the assay's ref, declared in the registry; Calc opens it as task=dilution&norm=1&ns=… (deep-checked by DEEP_CHECKS.ns). Only interpolated samples of a Bradford or BCA curve in a mass unit travel, at their original concentration, one row per label and dilution, together with any calibration fit qualifications; out-of-range, unavailable and below-LOD samples are withheld and counted, below-LOQ ones flagged (docs/board/memos/2026-10-17-cso-cpo-assay-calc-normalisation.md, docs/board/memos/2026-10-19-board-workflow-refinements.md; src/lib/fit/calibration-normalisation.test.ts, e2e/assay-analyser/calibration-normalisation.spec.ts) —
REL-212 Low Since 6466b30 the Molecule workbench no longer opens the imatinib example when told no molecule, and no longer saves example molecules as objects src/components/tools/molecule-workbench/use-workbench.tsx, src/apps/molecule-workbench/views/use-molecule-workbench.tsx The default /molecule/app view changed without a recorded decision Open; for the CPO to confirm (it reads as D-0039's "no seeding") Confirm and record, or restore
PRC-17 Medium The collapsed research rail is icon-only (e60bed8), which departs from D-0082's 76 px tiles (an icon over a short name) src/components/suite/shell/rail-column.tsx; D-0082 A shell contract changed without a decision Closed 17 October 2026: D-0093 keeps the icon-only collapsed rail (the CPO dissented) Record a decision, or restore the labelled tiles
PRC-19 Medium The CTO's ruling 4(c) holds the Cellosaurus snapshot to "at most 8 MB" without saying raw or gzipped. Every record with the CSO's inclusion fields is about 22 MB raw in any encoding tried (names, synonyms and accessions alone are 5.4 MB of text), and 6.34 MB gzipped. E10 enforces 8 MB gzipped (the transfer figure, as the shards' second limit is) and 24 MB raw, both by src/lib/cells/snapshot.test.ts docs/progress/enterprise-actions/cell-line.md; pipeline/cellosaurus/README.md ("Size") If 8 MB was meant raw, the inclusion rule would have to narrow (a CSO question), or the snapshot exceed the ruling Open; for the CTO to confirm, and the CSO if the rule must narrow Confirm the gzip reading, or rule a raw ceiling with the CSO's narrowed inclusion rule
PRC-18 Medium D-0089 authorised 30 static reference pages; the Gemini commits added 60 more without a decision. The fix round removed 20 and repaired 40 (SCI-136), so 70 pages are live, 40 of them without a decision content/seo/registry.ts; D-0089 Public pages beyond the decided scope Closed 17 October 2026: D-0094 keeps all 70 pages Decide the extra pages and record it
SCI-144 Medium The kept Molecule ligand-efficiency panel accepted any potency, including EC₅₀ and cell-based values the CSO's 13 October ruling refuses; it showed cLogD from a defaulted pKa, offered a zwitterion option against its "monoprotic" label, returned LELP 0 instead of withholding, and called Pfizer 3/75 a "pass". The kept construct cropper said "both termini are well-ordered" when no residue window reached pLDDT 50, offered a "soluble core", and placed a C-terminal protease site beyond the His6; the PAE legend did not match the canvas; nucleic-acid records offered a 650 Da/bp weight CSO memo docs/board/memos/2026-10-17-cso-gemini-fix-round.md, red lines 1–6; CPO memo, conditions 4–6 Numbers outside their method's scope Fixed 17 October 2026 (claude/gemini-fix-molbio ab46d43..3243357, merged 618ad17): biochemical IC₅₀/Kᵢ/K_d only, Assay's heavy-atom, element and charge rules mirrored and tested equal, cLogD only from an entered pKa, LELP withheld, flags as observations with Crippen logP stated; cropper refuses the false statements and C-terminal protease tags, hand-offs refused above 1,800 residues; one fixed 0–31.75 Å PAE scale for canvas and legend (src/lib/protein/pae-scale.ts); no nucleic-acid weight except exact double-stranded DNA —
REL-213 Low src/components/suite/store/shared-db.test.ts ("the write waited for the open") asserted a 30 ms wall-clock ordering and failed once in a full npm test run under load. The bound runs from the open's start, so time spent before the write shortened the wait the test measured The reference-page builder's full run, 17 October 2026 An intermittent unit failure on a loaded machine Fixed 17 October 2026 (3582aec): the bound is counted on an injected clock and its timer runs on node:test's mocked setTimeout; the test asserts the write is still pending after 59 ms and lands in memory at 60 ms. Checked by mutation: skipping the wait, or shortening it by 10 ms, fails it —
SCI-145 Low The single-stranded DNA A260 factor of 33 µg/mL per unit was marked "to be checked" (src/lib/seq/absorbance.ts); a vendor page gives 37 content/seo/presets/expansion-batch1.ts (A260 page) A conversion factor without a confirmed primary source Closed 17 October 2026: the CSO's ruling (docs/board/memos/2026-10-17-cso-ssdna-a260-factor.md) keeps 33, the NanoDrop convention (Thermo Fisher NanoDrop One FAQ and technical note MCS-TN1315-EN, IDT, read 17 October 2026), from ε260 10 mM⁻¹ cm⁻¹ per nucleotide (Cavaluzzi and Borer 2004, "Method 1"; they measured 38 for non-repetitive ssDNA). The source line, the method citation, the A260 card and the reference page name the sources; the oligonucleotide and ratio sentences are added. No fixture pins the factor, so none is versioned; the unit test's source assertion changes with this ruling —
SCI-146 Low The A260 chip's constants table a260-rules is mapped to the Pace 1995 source in src/apps/lab-calculators/provenance.ts, so the chip cites a protein paper for the nucleic-acid factors The CSO's ruling of 17 October 2026 on SCI-145, ruling 6; docs/technical/app-calc.md A wrong source on a provenance chip Closed 17 October 2026: the registry source a260-conventions (Thermo Fisher NanoDrop One FAQ, technical note MCS-TN1315-EN and the conversions page; IDT; Cavaluzzi and Borer 2004, Method 1; cited-data, read 17 October 2026) is in content/tools/lab-calculators.ts and content/apps/lab-calculators.ts after pace-1995, a260-rules maps to it in provenance.ts, and the bench-sheet export lists it; the app's updated moved to 17 October for the read date. The CTO placed it (docs/board/memos/2026-10-17-cto-a260-source.md) and the CSO worded it (docs/board/memos/2026-10-17-cso-a260-fixture.md) —
SCI-147 Low A260 has no oracle fixture, and docs/design/brief-lab-calculators.md still says oligonucleotides "default to nearest-neighbour ε260", which is not built (an excluded source) The CSO's ruling of 17 October 2026 on SCI-145, rulings 3 and 5 The specification and the product disagree; A260 rests on unit tests only Closed 17 October 2026: pipeline/lab-calculators/a260_reference.py (exact Python fractions, factors transcribed a second time) wrote src/lib/seq/fixtures/a260.json, 14 cases (50/40/33 at 1 cm, dilution and path length, two refusals), committed before any test read it and published as Calc verification 0.4.0; src/lib/seq/a260-fixtures.test.ts and the 1 cm assertions in protein-mass.test.ts read it, and the method is "verified". The CSO confirmed every value (docs/board/memos/2026-10-17-cso-a260-fixture.md); the CPO's wording corrects the brief's row, its chip list and adds a dated note (docs/board/memos/2026-10-17-cpo-a260-brief.md). Two cases the CSO asks for next are SCI-148 —
SCI-148 Low The A260 fixture has no case for a non-finite reading (the engine returns null) or a negative reading (the engine returns a negative concentration) The CSO's review of the A260 fixture, 17 October 2026, ruling 4 (docs/board/memos/2026-10-17-cso-a260-fixture.md) Two engine behaviours rest on no fixture; a negative concentration is shown without comment Closed 17 October 2026: the CSO ruled (docs/board/memos/2026-10-17-cso-a260-refusals.md) that the engine refuses a reading at or below zero (zero means not detected) or not finite, with a reason. a260Problem in src/lib/seq/absorbance.ts names it, nucleicAcidConcentrationFromA260 returns null (method 1.1.0), and the panel shows the reason. pipeline/lab-calculators/a260_reference_2.py wrote src/lib/seq/fixtures/a260-2.json (19 cases, committed before the engine changed), published as Calc verification 0.5.0; it supersedes 0.4.0's zero-reading, and a260.json is unedited. The CTO confirmed the supersession (docs/board/memos/2026-10-17-cto-a260-supersession.md). A280 and the ratio are SCI-149 —
SCI-149 Low proteinConcentrationFromA280 (src/lib/seq/absorbance.ts) returns a negative concentration for a negative A280 and 0 for zero, and absorbanceRatio returns a ratio for an A260 at or below zero, where A260 itself is now refused (SCI-148) The CSO's ruling of 17 October 2026 on SCI-148, ruling 5 (docs/board/memos/2026-10-17-cso-a260-refusals.md) The engines do not refuse what the fields and the address check stop; a negative mg/mL is possible from a direct call (the only caller today is Calc's model/a280.ts) Closed 17 October 2026: the CSO ruled (docs/board/memos/2026-10-17-cso-a280-ratio-refusals.md) that both refuse with a reason. a280Problem and ratioProblem in src/lib/seq/absorbance.ts name it, in the ruling's order; proteinConcentrationFromA280 (a280-beer-lambert 1.1.0, which also refuses an infinite ε, mass or path) and absorbanceRatio (its own method, a260-a280-ratio 1.0.0) return null; the panel shows the reason. pipeline/lab-calculators/a280_reference.py wrote absorbance-a280.json (14) and absorbance-ratio.json (10), committed before the engine changed and published as Calc verification 0.6.0; 0.5.0 is untouched. The bench-sheet export now reads the A280 method version instead of a typed 1.0.0 —

Repeat setup, contract 06 (17 October 2026)

ID Severity Issue Evidence Impact Status Next step
REL-300 Medium Contract 06, Repeat setup, rebuilt under D-0090 in D-0096's order: one saved Calc serial dilution → Assay dose-response pair becomes one planned Experiment (schema 2, immutable receipt) and two new tasks in one replay-safe transaction, with recovery of the receipt's local links. Follows REL-208 and SCI-143's first item src/lib/workspace/repeat-setup.ts, src/apps/lab-calculators/repeat-setup.ts, src/apps/assay-analyser/repeat-setup.ts, src/components/suite/workspace/repeat-setup-dialog.tsx; fixture src/lib/workspace/fixtures/repeat-setup-1.json; memos docs/board/memos/2026-10-17-cso-repeat-setup-build.md, 2026-10-17-cpo-repeat-setup-build.md The feature exists on claude/rebuild-repeat-setup Built on the branch; not on main until the merging session's checks Merge with the check chain; then rebuild D-0096 item 2
SCI-150 Low Only a Calc plan whose one component names a saved compound by ref is eligible; a plan with a typed compound name, a master mix, several compounds, a 1.x serial pin or an Assay before record version 6 is listed with its reason and cannot be repeated readRepeatCalcSource, readRepeatAssaySource Many older saved tasks are ineligible Accepted limit of the first adapter (contract 06; CTO and CPO memos of 16 October) Add adapters deliberately, each with its own fixture
SCI-151 Low Calc's Serial tab does not itself state the carrier assumption (named carrier from the stock, diluent contributes none, volumes additive); Repeat setup states it in its review and in the Experiment's receipt CSO memo of 17 October 2026, change 7 A repeated plan opened in Calc shows the carrier fraction without the assumption beside it Fixed 17 October 2026: the Serial tab states the sentence under its inputs (serial-panel.tsx, data-carrier-assumption) None
SCI-152 Low The stated stock basis (scb) is new: it is shown by the input preview and the Recorded results view, but the Serial tab has no field for it, so a person editing a repeated plan in Calc cannot change it there src/components/tools/lab-calculators/address.ts (scb) The basis is fixed at what Repeat setup recorded until a field exists Fixed 17 October 2026: an optional "Stock concentration basis" field on the Serial tab (serial-panel.tsx) writes scb; since rebuild 2 (stock autofill, merged the same day), a hand edit of sc or scu clears scb, so a typed concentration is never saved with a basis written for another value None
REL-301 Low Pending edits are detected only in this tab (hasNamedWorkspaceEditor); an unsaved draft in another tab is not seen. The command's revision and canonical-body guards are the persisted boundary repeat-setup-dialog.tsx; CTO memo of 16 October §1 A draft elsewhere is not offered for saving first Accepted (contract 06) None
REL-371 Low Assay's saved-plan effect depends on the whole task data, so every edit re-resolves the saved plan and builds a new capture envelope with a new capturedAt. Only Apply stores an envelope, so nothing wrong is saved; the cost is repeated hashing on every change src/apps/assay-analyser/views/assay-workspace.tsx:764; the enterprise-actions repeat-setup comparison of 17 October 2026 (docs/progress/enterprise-actions/repeat-setup.md on claude/ea-repeat-setup, minor point 1) Wasted work while editing a task that carries a saved plan; no incorrect record Open Depend on data.plan and data.workspace only
REL-372 Low When the task's address carries a recipe that is not the task's own saved plan, neither the arrival recipe nor the saved plan is offered, and no choice between them is shown; the person must reopen the task without the arrival fragment to reach the saved plan assay-workspace.tsx:765, :2412; the same comparison, minor point 2; the CTO's contract 06 ruling asks for an explicit choice between conflicting sources, not a fallback A conservative refusal with no way forward from the page Open Offer the explicit choice the CTO's ruling describes, or a one-line route back to the task without the arrival
REL-373 Low assay-island-thermal-shift-apparent-tm measures 40.2 KB against its 40 KB ceiling on the 2026-10-18 merge-queue head 12540f87 and the landed head 78d11242, while each queued branch's own Fast chain artifact reads 40.0: the usability and cell-line branches each add a little to the shared chunks the island imports, and only the combination crosses the line Size artifacts 12130754843 (main c1d11e08, 40.0), 12130973410 (12540f87, 40.2), 12132243299 (78d11242, 40.2); the merge record of 18 October 2026 in docs/progress/roadmap-run.md; 40.2 at 232feefe (artifact 12268451157, the CTO's ruling of 20 October 2026, item 4 (c)) and 40.5 at 40e5a3b4 (artifact 12312475855) 0.2 KB over on one Assay island; no ceiling was raised Open, a failure that remains on main's head (D-0074) The size track (B8) brings the Assay islands down under the CTO's ruling 3; the row is closed by measurement, never by a raised ceiling
REL-374 Medium Protein reused the requested primary scene identity after a successful fallback, and live experimental PNG provenance always named PDBe even when RCSB supplied the bytes Feature 9 source audit; independent source/scene fixtures evidence-v2.json; offline RCSB and AlphaFold mmCIF fallback journeys in e2e/protein-explorer/evidence.spec.ts A saved image could otherwise claim a source/scene different from the loaded resource Fixed in Feature 9 Retain the successful Blob, URL and response receipt; hash those bytes; distinguish requested and loaded scenes; hold live-export controller/provider/generation across screenshot
REL-375 Medium Equivalent selected-residue request objects caused Protein to reselect and refocus on unrelated parent renders; screenshot sampling jitter also emitted camera events without changing its native snapshot CTO focus-stability and camera-generation memos of 18 October; independent upstream camera-event fixture; selected-residue fallback browser journeys Capture preparation could reject an unchanged view or repeatedly trigger expensive native rendering Fixed in Feature 9 Memoise focus by range and explicit nonce; compare complete native camera snapshots for sampling events while preserving real state/interaction/settings invalidations; settle only the currently owned renderer before capture
REL-376 Medium Evidence review began native screenshot preparation in a mount microtask; software WebGL could block presentation long enough for the review visibility check to time out Full matrix 39139495963: three selected fallback failures and one touched-spec retry flake; failure snapshots contain completed frozen previews after the timeout; CTO and CPO matrix-repair memos of 18 October Opening review could start expensive work before the researcher could inspect its controls Implemented on Feature 9; validation and all attempts recorded in docs/progress/protein-evidence-matrix-2026-10-18.md Explicit idle review, immediate saved-owner refusal, Prepare image action, paint opportunity before native work and idle-session owner/access guards; preserve screenshot/generation limits and recording retry identities
REL-377 Low The visual theme smoke test's Mol* stub did not expose the native camera, draw, settings, selection and focus observables now consumed by the pinned evidence adapter Matrix 39139495963: Protein theme smoke fails on desktop, phone and desktop-dark; stub inspection against Mol* 5.11 and CTO matrix-repair memo Incomplete test double throws during the observation effect and removes the viewer; theme assertions cannot run Implemented on Feature 9; validation recorded in docs/progress/protein-evidence-matrix-2026-10-18.md Model Subject/BehaviourSubject subscription and mutation events in the stub, retaining every existing theme assertion and timeout
REL-496 Medium Patent phone search suggestions cover the Open button The input wraps above Open at 375 px while the popup used the input-only anchor; first real-store browser pass failed the phone name-search walk Cannot submit a typed product while suggestions remain open Fixed in candidate using the existing whole-controls popup anchor, per 18 October CPO memo; 45 browser cases pass on 18 October; explicit-theme pass follows Verify populated welcome and header search at 375 px
REL-497 Medium Date-window exports lost inherited pediatric base-row receipts; the initial hydration candidate also mixed pinned-reference hits with the current store Compact index omits full inherited row refs; CPO and CTO final reviews on 18 October CSV could imply flags were on the pediatric row or combine different captures Fixed in candidate: re-trace full rows through a workspace-scoped reader, preserve inherited qualification and base refs, refuse missing/mismatched rows, and retain review status in CSV/provenance; unit parity and normal/pinned browser exports pass on 18 October Final checks recorded in docs/progress/patent-stage.md
REL-498 Low OS dark preference alone does not exercise dark app rendering after the suite default became light Patent screenshot review showed light screens in the desktop-dark project; theme/preference.ts defaults to light Project name can overstate dark coverage when a spec does not select System or Dark Patent spec fixed locally to select System and assert resolved theme; broader suite coverage audit remains open CI/browser owner should audit theme setup in the other specs without changing the product default
REL-499 Low Initial Bench-session source capture refuses formula/reagent-derived serial plans and reference-data constants bench-execution-plan.ts; CSO source-consistency addendum of 20 October 2026; independent source fixture covers typed/material and recorded-stock specimens These saved plans remain usable in Calc but cannot yet start a Bench session Open; explicit refusal, no substitution or recomputation on resume Add independent source/pin fixtures and reviewed admission before expanding the supported subset
REL-385 High The DNA aligner's listing held semiglobal-read's free end gaps as columns and applied its 2,000,000-column bound only after enumerating every alignment up to listUpTo, so listing memory grew with the reference's length, and the bound cut a listing short on long references where the science needed none src/lib/seq/align/report.ts (the listing in strandResult) and gotoh.ts (enumerate), branch claude/sequence-dna-aligner, not merged; the CTO's ruling of 14 October 2026 on the listing bound: at the defaults, 20 bases placed 100 times on 450 kb took 18.5 s and 3,954 MB and listed 4; 89 bases with 36 placements on 100 kb listed 20 of 36 and withheld variation (the CSO's final reading, ruling 2 (1)) Reachable once a surface runs the worker: about 39 GB at 1,000 placements (the CTO's estimate), a dead worker Fixed on 20 October 2026, before any surface: the bound counts an alignment's columns less its free end gaps (the CTO's unit), enumeration holds free end gaps as two lengths and stops at the bound; the 450 kb case lists all 100 in 3.5 s at 248 MB, and the CSO's case lists whole (listing-memory.test.ts); the prefix check covers circles A case at the bound joins the worker matrix with the first surface (the CTO)
REL-446 High The DNA aligner's folded commonness on a circle (foldedCommon) computes forward and backward path counts in BigInt held in a Map per marked node, against the CTO's architecture ruling B.8 (linear, no counts, no BigInt) src/lib/seq/align/gotoh.ts (foldedCommon), branch claude/sequence-dna-aligner; the CTO's ruling of 20 October 2026 on the D pass, 2.3: on A×5,000 circular with CCC + A×997 (7,007,000 cells, 5,017,988 marked nodes) the plus strand spent 26.8 s in the fold, and the two-strand call took 35.9 to 44.6 s at about 1.7 GB peak Over the worker's 30 s timeout on a desktop core; reachable only once a surface runs the worker Open; before any surface (no surface runs the worker until it lands) The CTO's count-free rule (one pass over the cells, typed arrays), with D4 first and the twin joins in groups in an Int32Array; the BigInt fold kept as its test reference; ships only with the CSO's acceptance
REL-447 High Only the table's allocation is inside the band-limited catch: mark, groups, the fold and traceback allocate after it (one byte a cell, JS arrays, a Map entry per marked pair or node, and semiglobal-read's free end gaps written out as column tuples in the shown alignment), so running out there is reported as "failed", or aborts the isolate, never band-limited place.ts (the catch), gotoh.ts (mark, groups, foldedCommon, traceback), dna-align-handler.ts, branch claude/sequence-dna-aligner; the CTO's ruling of 20 October 2026 on the D pass, 2.4: an 8-base read on 1 Mb holds 1,000,000 tuples and 82 MB of heap in the shown alignment A dead worker or a "failed" state where band-limited (memory) is the true answer; reachable only once a surface runs the worker Open; before any surface The CTO's 2.4: nothing per node or per cell on the JS heap in the strand path; every structure after the table sized from the layout (engines.md to state 3 to 4 bytes a cell); the passes after the table inside the same catch, reported as band-limited for a new reason, memory; the shown alignment's free end gaps held as lengths; a test hook that fails an allocation after the table
REL-384 Medium The DNA aligner's ways forward can fail their own reason: the narrow-region hint floor(L / m) gives a region whose table is over L (10,000 bases for m = 1,000 needs 10,011,001 cells), and raise-budget is offered at the maximum limit and after a failed allocation, where no higher limit helps place.ts and report.ts (narrowRegionBases, wayForward), branch claude/sequence-dna-aligner; the CTO's ruling of 20 October 2026 on the D pass, 2.5 A way forward that returns the same band-limited result Open; before any surface Offer a way forward only when following it gets past its reason: raise-budget only below MAX_CELL_LIMIT where the cells fit and never for memory; narrow-region at floor(L / (m + 1)) − 1 bases; tests that follow each offered way on its own case

Stock autofill, contract 05 part 5b (17 October 2026)

ID Severity Issue Evidence Impact Status Next step
REL-305 Medium Contract 05's 5b, "Use a recorded stock" in Calc, rebuilt under D-0090 as D-0096's second item: one live stock's Available container fills C1V1's or Serial's stock fields exactly as entered, after a review, through a drybench.stock-input v1 binding that pins the stock's revision and never writes the stock docs/board/memos/2026-10-17-cso-stock-autofill.md, 2026-10-17-cpo-stock-autofill.md; src/lib/workspace/fixtures/stock-input-1.json (97 cases, written before the engine) Calc can plan from a recorded stock without retyping it Built on claude/rebuild-stock-autofill Merge with the check chain
SCI-155 Low D-0096 names the rebuild "Stock autofill and depletion", but contract 05 and the CSO forbid any arithmetic on a reported amount: no decrement, remaining balance, reservation or sufficiency claim. A planned draw is not a dispensed volume, and containers may report net mass. Depletion is the explicit, revision-checked 5a edit (status Used up, or a re-entered reported amount); Calc says so beside the stock to draw Contract 05 lines 30, 39, 324–325, 348; CSO memo of 17 October 2026, item 7; CPO memo, item 5 A "subtract the planned draw" action is not built Closed by D-0100 (17 October 2026): depletion is the explicit, revision-checked 5a edit; no planned draw is subtracted Record in the decision register that depletion means the guarded 5a edit; any use ledger waits for Feature 14's contract, an oracle and CSO review
SCI-156 Low Without a selected stock, Calc's Serial tab still fills a blank stock solvent percentage with 100 and a blank solvent with DMSO (DEFAULTS.dmso, DEFAULTS.sol), on screen and in a saved draft. Only a stock selected without its carrier holds the plan back (cru) src/components/tools/lab-calculators/model/serial.ts, model/common.ts, src/apps/lab-calculators/serial-recipe.ts (pickInputs) A plan typed without a carrier is planned and saved as neat DMSO Open Its own change, with the CSO: an explicit carrier on the Serial tab (with SCI-151)
SCI-157 Low Recorded results show the material mismatch line only when the plan's compound came in as a bound input (a compound picked through "Use a Bench input", or Repeat setup's material binding). A compound that arrived through the cpd hand-off or was typed has no input snapshot, so a mismatch the person accepted in the review is not kept with the result src/lib/workspace/result-projection-core.ts (stockMaterialChecks) The review shows the mismatch; the recorded result may not Open Record the sheet compound's ref as context with the stock input, with the CSO, if wanted
SCI-158 Low Serial names the stock's carrier differently as it is entered: "Carrier in the stock, % v/v (not recorded in the selected stock)" while unresolved, then "Solvent in the stock (DMSO, %)" once a digit is typed; the field's existing name is "solvent" CPO build review of 17 October 2026, finding 8 One field, two names Open Consistent carrier naming on the Serial tab, with SCI-151 and SCI-156 and the CSO
REL-306 Low The stock binding is held in the tab until the task is saved to Bench. A reload before saving keeps the copied values and the cru/c1s markers (they travel in the fragment) but drops the binding, so the origin line goes and a result recorded afterwards has no stock input src/apps/lab-calculators/views/bench-sheet.tsx (stockPick) Provenance is lost for unsaved work after a reload; the values are not Open Keep an unsaved selection in the work draft, if wanted
REL-307 Low The CSO flagged that scb (the stated basis) and sol (the carrier label) travel in the #s= fragment as Calc inputs, so a share link from a stock-filled sheet carries the stock's basis text and carrier name (never its ref, labels, lot or locations) CSO memo of 17 October 2026, red lines Free text typed on a stock reaches whoever gets the link Open, for the CTO and CPO Decide whether stock-filled text keys should stay out of shared links
REL-308 Low e2e/improvements/stock-inventory.spec.ts "Back, Forward and multi-entry traversal…" and "default browser stock workflow…" matched the editor's blocked-navigation line by exact text, which the StatusBar repeats in its live region (#suite-status), so the locator could resolve to two elements: 4 of 6 phone runs failed on this branch and 1 of 6 on a build of 70d7f1c Local repeat runs, 17 October 2026 Intermittent failing titles; no product defect Fixed in the test: the locator excludes #suite-status None
REL-455 Low The mutagenesis task's two size budgets, and what the shared data table costs on a task page. The budgets are now measured and ruled: sequence-island-mutagenesis-primers 42.3 KB measured, maxKB 44; sequence-mutagenesis-results 55.3 KB measured, maxKB 58 with releaseKB 30. Of that 55.3, about 8.3 KB is the module with the table's body and about 47 KB is what the shared data table reaches on a task page where nothing else has loaded it (the column menu's Menu and Dialog with Floating UI 7.3, the shell and overlay chrome 14.2, the suite copy barrels 12.0, the table's parts 13.5); the same module costs 11.6 KB where a table is already loaded. The CTO's fix is to load the column menu and the provenance details inside the shared table on demand, which pays in every app rather than forking the table here, and that restores the 30 KB target scripts/size-budgets/sequence-toolkit.json; the CTO memo of 17 October 2026, docs/board/memos/2026-10-17-cto-mutagenesis-results-budget.md A table's chrome is the larger part of an on-demand chunk on every task page that shows one Budgets fixed 17 October 2026 as the CTO ruled, and the import is gated on there being candidates so a run that passes nothing fetches nothing. The shared table's chrome is open, owner the pre-live pass; the CTO asked for it as REL-315 and it is recorded here because this rebuild's id allocation ends at REL-314 Pre-live pass
REL-458 Low The mutagenesis task offers no hand-off to the primer check, by the CPO's ruling 6 of 17 October 2026: the overlapping scheme's two primers are complementary by design, so the cross-dimer would report a full-length dimer as a defect, and the binding search is exact, so it would find no site for a primer carrying a mismatch docs/board/memos/2026-10-17-cpo-mutagenesis-primers-placement.md (ruling 6) A design cannot be carried into the primer check Open by design: it returns when the primer check can take the mutant as its template, which needs the CSO CPO
REL-459 Low The workbench's CSV recomputes the design from the address (sdmOf in model-sdm.ts), as the Tm and GC rows do, so an export can carry a design the person never pressed the button for, as long as the change is in the address src/apps/sequence-toolkit/views/workbench.tsx, src/apps/sequence-toolkit/rows.ts The CSV can hold a design the page did not show Open (recorded): consistent with the other recomputed rows Stage B
REL-313 Low The mutagenesis operation offers no Save to Bench and no recorded result, by the CPO's ruling 8; primer design has the same gap, and both have their own exports instead docs/board/memos/2026-10-17-cpo-mutagenesis-primers-placement.md (ruling 8) A design cannot be kept as scientific saved work Open by design: the next brief may add it CPO
REL-314 Low The mutagenesis task's browser coverage is one spec (e2e/sequence-toolkit/mutagenesis.spec.ts) over the two schemes on desktop, phone and desktop-dark; the workbench operation is covered by the unit tests and the shared task-island sweep, not by its own browser spec e2e/sequence-toolkit/mutagenesis.spec.ts The workbench path is not exercised in a browser Open (recorded). Also open from the CSO's build review and the CPO's copy memo of 17 October 2026, neither blocking: no fixture case makes the central tolerance the sole reason a design fails; the oracle and the engine no longer refuse in a different order, but no case covers a linear back-to-back request that also carries a bad change; the CSO has not yet confirmed the CPO's placement of flankShort as the overlapping scheme's only reason or gc's place in the back-to-back order; and the CSO's limits-line wording of 12 October is superseded by its note of this evening rather than edited Stage B
REL-309 Low The Study page reaches the synchronous projection join (result-projection.ts, every app part and the stock part) through reports.ts, so those parts are in its eager chunks as well as the lazy lists; the CTO memo of 16 October 2026 (item 4) asked for that chain to go The CTO stock-autofill size memo of 17 October 2026, addendum (six lists carry the stock part's code: 60.6, 48.7, 42.3, 38.5, 36 and 1.9 KB) Eager bytes on /study/[id] beyond what one record needs Open Load reports.ts through the loader on the Study page; separate work
REL-456 Low reference.py's about() stamps every fixture header with "oracle": "Biopython <version>", whichever check wrote it, so a fixture whose oracle is not Biopython misnames it Found by the CSO on 17 October 2026 reviewing the 0.14.0 copy: methylation-absence-rule.json's check (absence_rule_check) calls no Biopython, yet its header named Biopython 1.88 A reader of a fixture header, or a registry set copied from it, takes the wrong oracle for that check Partly fixed: the absence-rule fixture passes its own oracle through about()'s override (Independent second implementation (reference.py can_carry), MIT), and its registry set and oracle entry say so; the other headers reference.py writes are not yet audited Make about() take the oracle as a required argument from each check (the CSO asked the CTO, 17 October 2026), and audit the published headers, each correction being a new fixture version under write-once

Browser matrix on the fix round's head (17 October 2026)

The merging session's ci.yml dispatch on fee99c4 (run 39025869923) and the local reruns on the branch build. All eight shards stopped at the 45-minute job limit about 70% through, so failing titles were read from the shard logs and the failures were rerun locally on the branch build and on main's 000a420.

ID Severity Issue Found Effect Status Next step
REL-214 Medium The browser matrix no longer fits its shards: with 3,004 tests, all eight 45-minute shards stopped about 70% through on the fix round's head (run 39025869923), and two of eight did on main's 9fa37e0 (run 38874079154). Failing tests that run their 2- to 4-minute timeouts twice (once more on CI's retry) take most of the extra time. Evidence, 17 October 2026, the CTO's measurement (docs/board/memos/2026-10-17-cto-enterprise-actions.md, §2; the twelve shard reports of the complete run 39031934015, 3,004 tests), which corrects the sentence before it: the failing tests are 14 percent of matrix time, not most of it. A run is 798 worker-minutes of test time; results that did not pass cleanly take 115 of them; plasmid-map/cloning-walks.spec.ts:92 and :131 take 48 (six results, each run twice at 240 s); improvements/stock-inventory.spec.ts:172 and :49 take 16. Every long failure is "Test timeout … exceeded": in each, one action waited with no bound of its own until the test's timeout. Shards 3 and 11 carry 102 and 98 worker-minutes, which is the 57-minute job. Even with the action bounds of B1, eight shards of 45 minutes cannot complete (the CTO's estimate: about 46 minutes of test time a shard, plus the build) The merging session, 17 October 2026; the CTO's ruling the same day No run produces a complete e2e-report.json to compare with docs/progress/e2e-baseline.json Fixed: every full matrix run uses twelve shards of 60 minutes, and the scheduled run is weekly (D-0098); run 39031934015 on 05641f2 completed all 3,004 tests (its slowest shard's job took 57 minutes, close to the limit) Fix the long-timeout failures in REL-218, which is the real cure
REL-215 Low Six browser tests still expected the behaviour Codex's c0fc9d03 (16 October) changed on purpose: Literature's workspace at /literature/app (e2e/objects/bench.spec.ts:72); later walk steps collapsed below 768 px (plate-walk.spec.ts:165, nearest-walk.spec.ts:124); Bioreactor opening a preset picker (bench-app-tabs.spec.ts:137); the MTT example renamed "IC50 — synthetic MTT example" (explicit-saves.spec.ts:91 and the H23 test at assay-analyser/workspace.spec.ts:401, each running a 3-minute timeout twice) The fix round's matrix and local reruns, 17 October 2026 Failing tests that measured nothing Fixed (the expectations cite c0fc9d03); each passes locally on desktop and phone None
REL-216 Low The Dossier's construct cropper and PAE viewer (Gemini, 10cb608) rendered their whole panels inside closed disclosures, so the cropper's tables repeated the summary's pI and MW in the DOM; e2e/protein-explorer/dossier.spec.ts:26 failed on a strict-mode duplicate of "6.26" The same A failing Protein test, and the panels' chunks loaded on every Dossier Fixed: MountOnOpen in dossier.tsx mounts each body on first open; the test passes on desktop and phone None
REL-217 Medium The reference page /pipeline/fda-complete-response-letter-crl-approval-precedent (one of the 40 kept by D-0094) says it opens the FDA precedent view, but with no condition Pipeline shows its search start, a second h1; with a condition pinned, reference mode makes approvals unsearchable and the precedent view's live CRL count calls api.fda.gov e2e/reference-routes.spec.ts:22 on that page, desktop and phone, 17 October 2026 The page does not show what it describes Fixed (17 October 2026, claude/fixup-crl-page) The page pins content/seo/data/rheumatoid-arthritis-2026-10-05.json (a byte copy of the preset snapshot, provenance in pipeline/seo-reference/rheumatoid-arthritis-2026-10-05.meta.json) with condition: rheumatoid arthritis; reference mode takes its approvals as ready and pinned (referenceApprovals in use-pipeline.ts); the precedent view and its inspector skip useLetterCheck when pinned and say the shipped CRL export is in use; copy rewritten per the CSO's memo docs/board/memos/2026-10-17-cso-crl-reference-page.md, every quoted number asserted by pipeline/seo-reference/precedent-reference.test.ts
REL-220 Medium The label wording check kept SYPRINE (trientine, NDA019194) as a rheumatoid arthritis indication, though its label says "not recommended in cystinuria or rheumatoid arthritis" and "was reported not to be effective" in RA; the same gap kept the fenofibrate labels TRICOR, LIPOFEN and ANTARA ("was not shown to reduce", "did not reduce … in patients with type 2 diabetes") as type 2 diabetes indications. On the reference page SYPRINE sat in the precedent median (304 days, n = 17) The pinned capture and the shipped preset snapshots; openFDA labels read 17 October 2026 Products a label rules out were counted in the list and the figures, on the CRL reference page and in live searches Fixed (17 October 2026, claude/fixup-crl-page) Wording rule 2 (WORDING_RULE, openfda.ts) with a patient-qualifier guard, ruled by the CSO's memo docs/board/memos/2026-10-17-cso-label-negation-rule.md; on the 421 preset labels it changes exactly those four applications. Live lookups re-read the labels a rule-1 snapshot may have judged differently (reusableVerdicts). The reference page applies dated, hashed overrides built from the untouched capture (build-wording.mts): 71 products, 16 joined, median 290.5 days. The public preset snapshots keep rule-1 verdicts until the monthly refresh, which stamps rule 2; their fallback caveat says so
REL-221 Low A label that names the condition only as the patient group of another use counted as an indication: ATORVALIQ, LIPITOR and CADUET ("reduce the risk of MI and stroke in adults with type 2 diabetes mellitus with multiple risk factors"), BRILINTA ("efficacy … established in a population with T2DM"), INPEFA and KERENDIA among type 2 diabetes products The CSO's memo of 17 October 2026 (2026-10-17-cso-label-negation-rule.md, section A); the 17 October scan The type 2 diabetes list and its precedent figures included products not used to treat it Fixed (17 October 2026, claude/fixup-crl-page) Wording rule 3: a third verdict, population (the CSO's memo 2026-10-17-cso-population-verdict.md, the CPO's 2026-10-17-cpo-population-verdict-and-note-cap.md, the CTO's 2026-10-17-cto-population-wording-budget.md). The cardiovascular form applies to type 2 diabetes only. The seven preset snapshots were regenerated under rule 3, and exactly those six type 2 diabetes applications became population. A new dated examples fixture (examples-2026-10-17.json) records them, and the CRL reference page's overrides were rebuilt under rule 3, with no change. The header's and the inspector's "US products" count indicated products only (the CSO's memo 2026-10-17-cso-header-product-count.md). Follow-ups, done the same day (the CPO's memo 2026-10-17-cpo-export-verdict-and-lane-label.md): the US products CSV carries a label_use column (the last data column) with a README line, and the Board's approved lane counts "US labels", split into marketed, discontinued and not indicated
REL-222 Low The note recipe (src/components/suite/recipes.ts) had no measure cap, so the precedent view's notes (stale, alias, and the reference page's capture and re-check notes) ran past 60 to 80 characters a line at desktop width The CPO's memo docs/board/memos/2026-10-17-cpo-crl-reference-notes.md, section E Long lines are harder to read Fixed (17 October 2026, claude/fixup-crl-page) max-w-3xl on the recipe (the CPO's and CTO's memos of 17 October 2026). The CTO's census of about 30 uses found no conflicting width class; one row in Molecule's query bar (query-bar.tsx) now puts its suggestion button after the capped text, which the CTO accepted
REL-223 Low The patient-group check (rule 3) is narrow on purpose. It does not recognise reversed order ("In adults with T2D and established CVD, to reduce the risk of …"), "lower the risk", "risk for", "reduce the incidence", renal-only outcome lists, or a list item that openFDA split from its "reduce the risk of" lead-in ("MI and stroke in adults with type 2 diabetes mellitus …" as a sentence of its own). The cardiovascular form is applied only to the conditions in POPULATION_CV_SCOPE (type 2 diabetes); obesity and hyperlipidaemia are candidates for review. Generic (ANDA) applications are counted ("{n} generic applications also match"), never judged: of the 248 matching type 2 diabetes, 76 hold the population words, and the rule reads 28 of those as patient-group only (16 ticagrelor, 12 atorvastatin-containing). Seventeen atorvastatin-containing generics stay indicated through the forms above, and losartan's diabetic nephropathy is a genuine (renal) indication The CSO's memo 2026-10-17-cso-population-verdict.md (sections Q1 and 3); the generics scan of 17 October 2026, which also found that the cardiovascular form missed a capitalised "Reduce the risk of" (fixed the same day; no shipped verdict changed: all 63 type 2 diabetes applications re-checked with the pipeline's own lookup) A label that names the condition only as the patient group in other wording is still listed as an indication (the visible error), and the generics count includes patient-group labels Open (recorded) Each scope addition needs its own scan and the CSO's review; never heart failure, chronic kidney disease, atrial fibrillation, coronary disease or stroke. Judging generics would need their labels read (76 for type 2 diabetes), over the live budget
REL-224 Low Live wording reads are all or none: when a search's labels to read exceed wordingBudget (12), none are read. The result counts them (wording.unchecked, and since REL-221 wording.populationUnread) but does not say which rows were left unread The CTO's memo 2026-10-17-cto-population-wording-budget.md (option b, deferred); the CSO's memo 2026-10-17-cso-population-verdict.md (Q4: partial reads are acceptable) A free-text search over budget shows every candidate as indicated, with only a count to say so Open (deferred) Partial reads with the list of unread applications in the result and a per-row mark; the CSO decides how the rows are marked
REL-218 Low (The five Assay titles are closed by REL-230 to REL-234. Work capture, both stock-inventory titles, serial preparation and the explicit-saves flake are closed by REL-240 to REL-243, 17 October 2026.) Browser failures on main's head that the fix round did not cause, each also failing on a local build of 000a420: e2e/objects/work-capture.spec.ts:619 (desktop and phone; the Bench link from Calc does not navigate after Work details closes), e2e/improvements/stock-inventory.spec.ts:172 (desktop and phone; no "Add to Study" button on the stock page) and :49 (phone; no "Command palette" button); with them, from earlier rows or records, outliers-power.spec.ts:112 (the Study notes editor of 14 October), qpcr-efficiency.spec.ts:21, routine-week.spec.ts:121 (REL-162; passes locally), education/structural.spec.ts:54 and education/workspace.spec.ts:8 (the Learn button), education/quantitative.spec.ts:12 and :38 (axe contrast behind the sticky Bench group), fragment-search.spec.ts:9, smoke/discovery-layout.spec.ts:14 (REL-206) lab-calculators/serial-preparation.spec.ts:55 on phone (page.screenshot "Unable to capture screenshot" on a 4,108 px page; passes locally once the screenshot is skipped), education/quantitative.spec.ts:59, smoke/stage0-accessibility.spec.ts:39 (the overflowing compact rail; failed on 9fa37e0 too), the two 4-minute plasmid-map/cloning-walks.spec.ts:92 and :131 tests (failed on 9fa37e0 on phone too), and, intermittently on CI only, assay-analyser/screening.spec.ts:37 and :64 (a strict-mode race between the subject h1 and the campaign's h2, both named "Screening campaign"; 4 of 4 pass locally). The complete run 39031934015 on 05641f2 (3,004 tests: 2,817 expected, 141 skipped, 6 flaky, 40 failing both attempts across 22 titles) has no failure outside this row and REL-217 The matrix and local reruns, 17 October 2026 Recorded per D-0074; accessibility failures hold no merge (D-0080) Open. On 17 October 2026 claude/fixup-e2e-shell closed education/structural.spec.ts:54 and education/workspace.spec.ts:8 (REL-235), education/quantitative.spec.ts:12, :38 and :59 (REL-236), smoke/stage0-accessibility.spec.ts:39 (REL-237), fragment-search.spec.ts:9 (REL-238) and smoke/discovery-layout.spec.ts:14 (REL-206); the rest stay open. On that branch's local runs (four workers on four cores), smoke/suite-theme.spec.ts:65 and education/workspace.spec.ts:8 failed intermittently on phone only, on main's own build too. Both pass on CI: in the first, axe read the workspace loader mid-fade; in the second, the Menu sheet did not open from a key pressed straight after a client navigation. smoke/notepad.spec.ts:66 timed out once, then passed 6 of 6 Each owner's next round; the complete 12-shard run on the merge candidate lists the full set
REL-225 Medium The intermediate-dilution reference page (/calc/intermediate-working-stock-submicroliter-planner) promised a two-step plan, but its seed (the preparation fixture's antibody-intermediate-source) left the carrier name blank, which the planner refuses, and with a carrier named still had no plan: the final step adds about 9,998 µL of diluent, above its 1,000 µL maximum single transfer The expansion result assertions, 17 October 2026, in the browser and with the Python grid oracle (pipeline/lab-calculators/intermediate_reference.py, search) The page showed a refusal in place of the result it describes Fixed 17 October 2026 (claude/fixup-ref-assertions): the seed declares the carrier as none and a 10 mL maximum single transfer; the engine and the oracle both give 2 µL stock + 398 µL diluent (5 µg/mL), then 2 µL into 9,998 µL; copy reworded and the CSO's confirmation of the same day Add the case and its expected plan to the next preparation fixture version, then the dataset may say "verified" again
REL-226 Low The Gibson reference page (/plasmid/gibson-assembly-overlap-primer-tm-designer) said the three pUC19 arcs are reassembled into the circular plasmid, but the assembly panel opens with product topology Linear and shows a 2,711 bp linear product; a reference seed cannot set the topology (assembly-panel.tsx starts at "linear" unless a saved assembly says otherwise) The same The page's described result was not what it showed Fixed in the copy (the CSO confirmed it): the dataset now gives both, 2,711 bp linear as opened and 2,686 bp circular on choosing Circular; the spec asserts the opened state Plasmid's owners may let the reference runtime carry topology: "circular" (src/components/suite/seo/reference-data.server.ts, ReferenceRuntime.assembly), then the page and its assertion move to 2,686 bp circular
REL-227 Low The Dam/Dcm reference page opened the digest view with no enzymes, so none of the per-site outcome its copy describes was shown The same The page showed an empty digest Fixed: the seed adds dig: 'MboI,XbaI'; under dam+/dcm+ the tool shows one 2,686 bp fragment, XbaI to XbaI (every MboI site uncut; pUC19 has 15 GATC and one TCTAGA at 423 with no overlapping GATC); the CSO confirmed it The CMO may drop "CpG" from the page's primary keyword, since CpG is not modelled
REL-228 Low Five Assay expansion reference pages (Morrison, Michaelis–Menten, qPCR fold change, thermal shift, growth window) opened their seeded readings but showed no result until the page's own run button was pressed; the dose-response, calibration and plate references show theirs on arrival The expansion result assertions, 17 October 2026 A visitor saw data, not the result the page names, until one click Fixed 17 October 2026 (claude/fixup-ref-assertions) under the CPO's ruling (option a) with the CSO's, CTO's and CMO's memos (docs/board/memos/2026-10-17-cso-rel-228-reference-runs.md, -cto-rel-228-and-recapture.md, -cmo-rel-228-copy.md): in reference mode only, each page runs its worked example once on arrival with the example's own model or window (competitive for Morrison; no Morrison or Gompertz fit on arrival), and a line from content/apps/assay-analyser.reference-runs.ts says so beside that result only; an edit clears it with no second run; a #s= link, saved work, a named task, a preview and the ordinary workspace never run on arrival; nothing is saved. Main-thread cost: thermal about 11 ms and Michaelis–Menten about 3 ms on a cold first run in Node, about 44 ms and 11 ms at 4× None: the CSO ruled the app's "ΔTm, derivative extremum" label accurate and narrowed its red line to a bare "ΔTm" without its method (docs/board/memos/2026-10-17-cso-derivative-delta-tm.md); an optional resolution clause is in docs/NEXT.md
REL-229 Medium Patent's Paragraph IV table showed a raw Excel date serial under "180-day status" and left "Last qualifying patent expiry" empty (NDA209637: 48751 and 48245, 21 June 2033 and 1 February 2032). Cause: the capture's XLSX converter (pipeline/patent-exclusivity/capture.py, xlsx_to_text) ignored each cell's column reference, and an XLSX leaves empty cells out, so every cell after a gap slid left: 793 of the 1,650 rows of "9-28-2026 Paragraph IV List (Public).xlsx" (sha256 594a7003…47654) The expansion result assertions, 17 October 2026; the spreadsheet re-read with its cell references (row 1381: E 44536, F 7, K 48751); the Orange Book patents 10335462 (21 Jun 2033) and 9132239 (1 Feb 2032) on NDA209637 agree Dates in the wrong column and a missing expiry, on every gapped row of the list Fixed 17 October 2026 (claude/fixup-ref-assertions): the converter places cells by reference and marks its text (textFrom); the parser places only the drug name of a short row from an unmarked XLSX capture and joins it nowhere (the CSO's ruling of the same day); the column reads "Last qualifying patent expiry (as listed by FDA)" and a note says a blank is FDA's; the reference subset's Paragraph IV text re-derived from the same file (pipeline/seo-reference/regenerate-piv-text.py); unit tests in parse.test.ts, dates.test.ts, index.test.ts and pipeline/seo-reference/patent-reference.test.ts, the browser assertion in e2e/reference-routes.spec.ts The capture branch data/exclusivity still holds the old text until its next capture, which the fixed converter rewrites (the CTO to schedule it); a store built from it before then shows the short rows unplaced
REL-230 Medium routine-week "1. A table without a unit asks for one; a reader export takes a saved layout in the review; each pasted reaches its first curve within ten seconds, with no column renamed" failed both attempts on desktop in CI (paste to first curve 10,124 ms and 10,852 ms against the ten-second criterion) and passed locally. Two causes. The test's clock ran until Playwright saw the fit's announcement, and its waits polled on expect.poll's back-off (100, 250, 500, then 1000 ms): under load the heading-focus settle was seen 1.2 to 1.5 s after the scroll ended and the announcement 0.6 to 1.2 s after it was made. And the product loaded the results view and the panels under it (Compare, agonist and antagonist, figure settings, potency) in two rounds of chunk requests only after the first fit landed, about 1.8 s under load CI 39031934015 on 05641f2 (desktop, both attempts); reproduced locally in 5 of 8 runs at 4 workers on a production build (10,320 to 11,547 ms); a timeline of each step, the page's focus and scroll events and the chunk requests showed the two causes The acceptance criterion for the routine week read red on main; a person's first fit waited on a second network round for its results Fixed on claude/fixup-e2e-assay, 17 October 2026. Product: once there are dose-response curves to fit, the workspace starts loading fit-results.tsx, its panels (preloadResultPanels) and the potency panel (assay-workspace.tsx), each still in its own chunk; chunk requests after the Fit press fell from about 16 to 0 or 1. Test: the time is taken in the page, from the paste to the moment the announcement is made (a MutationObserver on the live region), and headingFocusSettled and scrollAtRest poll every 50 ms (e2e/support/layout.ts). The ten-second budget and every step are unchanged. 24 of 24 at 4 workers (3,073 to 9,356 ms) The margin under four-way load is under a second at the slowest; if CI fails it again, profile the time from Use this import to the Fit heading's focus, which was 0.8 to 2.5 s under load
REL-231 Low routine-week "2. A dose of 0 is a control, not log(0); the header's unit is read and shown back; a unit change is said and changes no number" failed once on desktop-dark in CI: after Fit was pressed the live region stayed empty for 90 s, so no fit ran. The test pressed Fit straight after Use this import, without waiting for the import's own focus move to the Fit heading, which arrives 0.5 to 2.5 s later under load; a key pressed in that window can land on the heading. Test 1 already waits for it CI 39031934015 (desktop-dark, attempt 1; the retry passed in 20.1 s). Not reproduced locally: 20 of 20 at 4 workers before the change. The cause is inferred from the call log and the measured focus delay One flaky title in the baseline Fixed on claude/fixup-e2e-assay, 17 October 2026: test 2 and the spec's ownTable helper wait with headingFocusSettled after Use this import, as test 1 does. A wait on the right signal, not a longer timeout If it recurs, record the focused element at the Fit press
REL-232 Low The Study's drift charts (panels/drift-panel.tsx, DriftChart) were first drawn at a default width of 560 and took the container's width only in a ResizeObserver callback, which comes after the first paint. On a 375 px phone the chart is about 309 px wide, so until that callback the SVG was scaled by about 0.55 and its 11-unit text drew at about 6 px (UI-22 sets 11 px) study-evidence "eight runs whose blank moves: trial limits drawn and labelled, the chart text at least 11 px" failed once on phone in CI 39031934015, at 6.069 px (11 × 0.552); the retry passed Under load, a phone reader saw the chart text at about 6 px until the observer reported Fixed on claude/fixup-e2e-assay, 17 October 2026: the width is read with getBoundingClientRect in a layout effect before the first paint, and the observer keeps it current The relationships figure had the same pattern; fixed as REL-245
REL-233 Low routine-week "4. Fix Hill for one curve and Bottom for all, two actions each; the constraint in the table, the method block, the Prism CSV and the R snippet" can stall in settle (e2e/support/layout.ts) until the 180 s test timeout: the wait for every running animation's finished never returns Locally at 4 workers on a production build, 17 October 2026: once on desktop-dark before this branch's changes and once on phone after them; 8 instrumented runs found every animation finished. Flaky on desktop in CI 38495055906 (already in e2e-baseline.json); passed on all three projects in CI 39031934015 A rare local and CI flake of the routine week's test 4 Fixed by REL-206's change to settle, merged here on 17 October 2026 (1b803c0d). Diagnosis: settle was instrumented to report, after 30 s, the animations whose finished had not come, and the closed-disclosure filter was removed for the trial. Test 4 then stalled in 4 of 36 runs at 4 workers, each time on one animation: the copy key's 150 ms fade-in on "Copy the note", inside a closed <details> in the inspector (aside#inspector). Its play state reads finished when asked, but Chromium does not advance animations inside a closed disclosure, so its finished promise never resolves. This is REL-206's mechanism, and its filter leaves that animation out: 24 of 24 runs with the filter, no stall. The two local stalls recorded on 17 October predate the merge. settle now fails after 30 s and names any animation still waited on, rather than hanging until the test's timeout None
REL-234 Low Four Assay browser tests no longer matched the product. Two expected behaviour that had changed on purpose. outliers-power "the planning note is added to the Study's notes, verbatim, and nothing else is changed (the CPO's ruling)" read the Study notes with toHaveValue, but since 0eb05ebe (D-0084, item 4, 14 October 2026) the notes are a rich editor, a contenteditable textbox. qpcr-efficiency "efficiency from a dilution series: fitted on level means, carried only by the person's action" pasted series for the assays Reference and Target, but since 1a65fcd7 (16 October 2026, live-site request item 13, docs/progress/improvements-2026-10-16.md) the start's qPCR example is qpcr-fold-change@1, whose assays are ACTB and IL6. The fit then said "not in the qPCR table", so the carry button never appeared. Two raced: screening "a two-plate set: Z′ beside each plate, …" and "robust z is withheld on a plate with fewer than 16 sample wells, …" waited for any heading named "Screening campaign". Until a campaign is named, the subject h1 carries the mode's name (UI-24), and the campaign's h2 loads after it. The query matched one heading or both, depending on how far the panel had loaded CI 39031934015: the first two on every project, and the screening pair on desktop and desktop-dark. The first two were reproduced on a production build. A page sample every 50 ms showed the h1 alone for about 250 ms and then both headings The four titles read red on main Fixed on claude/fixup-e2e-assay, 17 October 2026. The changes are to expectations only, with each product change cited in the spec. The Study notes are read whole with toHaveText, an exact match. The series use the example's assay names. The screening start waits for the campaign's own h2 (level: 2, exact name). Nothing the tests check was removed None
REL-245 Low The relationships figure (panels/relationships-panel.tsx, Figure) took its container's width only from a ResizeObserver callback, whose state update renders after the first paint. Its first frame was the 560-unit default scaled to the container, so on a 375 px phone the 10- and 11-unit text drew at about 5 to 6 px until the observer reported. REL-90 had sized the figure to its container, but only from the second frame. The drift charts had the same pattern (REL-232) A check added to relationships "linear regression: the line first, intervals and pointwise bands only once declared, lack of fit with replicates" reads the figure's on-screen scale in the first animation frame after it is inserted. Against the old code it read 0.552 on phone, and 1.257 on desktop, where the desktop scale is 1.1 (D-0016) On a phone, the figure's first frame drew its axis numbers at about 5 px Fixed on claude/fixup-e2e-assay, 17 October 2026, as in REL-232: the width is read with getBoundingClientRect in a layout effect before the first paint, and the observer keeps it current. The new check requires a scale of at least 1 in the first frame; the spec passes 9 of 9 on desktop, desktop-dark and phone None
REL-246 Low routine-week "6. Exclude a point and refit in one action; the exclusion listed in the chart, the method block and the paragraph; Undo restores it" expects the live region to say "Exclusion of well A9 undone; refitting." after Undo. The announcer (src/components/suite/a11y/announce.ts, DS §9.2) holds a message for 400 ms and lets a newer one replace it, and a progress message replaces a pending status. When the refit starts within that window, its "Fitting 0 of 3 curves" replaces the undo's message before it is written, so a screen-reader user hears that curves are refitting but never that the exclusion was undone Locally at 4 workers, 17 October 2026: 1 of 18 runs, and once in an earlier run. A recorder of every message the region carried saw only "Fitting 0 of 3 curves" and then "3 curves fitted: 2 IC50s shown, 1 withheld." Not seen on CI 39031934015 The undo's confirmation is sometimes never announced; the test is intermittent under load Fixed 17 October 2026 (claude/gallant-dirac-mly5c9), on the CPO's ruling (docs/board/memos/2026-10-17-cpo-rel-246-announcer.md, the CEO's delegation): in createAnnouncer, a progress message that arrives while a status waits queues the status at once, ahead of it; a status still replaces a waiting count. DS §9.2 states the rule; two unit tests in announce.test.ts. The same order now holds for the exclude path (assay-workspace.tsx, chartDone then the refit's count) and the shared progress strip's milestones None
REL-247 Low The REL-240 navigation fix (samePage in src/components/suite/navigation/document-policy.ts) imported isStateFragment from url-state.ts, which put the whole URL-state codec (its schema, compression and urlTexts) into the navigation chunk every page loads: about 3.1 KB gzip more on every public route, with changelog-js, docs-page-js, product-page-js and task-page-js newly over their ceilings Found at the merge to main, 17 October 2026: the size-measurements artifact of Fast chain run 39055419770 on main at 678604ef against size-check --json on the merged head 75d33fed; the changelog's navigation chunk measured 6,428 B gzip on a worktree build of 678604ef and 9,548 B on the merged head, and the added strings were the codec's (COMPRESSED_PREFIX, LINK_MAX_LENGTH, UNIPROT_ACCESSION) Every public page paid for code it never runs Fixed (17 October 2026, claude/gallant-dirac-mly5c9): FRAGMENT_PREFIX and isStateFragment moved to src/components/suite/store/state-fragment.ts, which imports nothing; url-state.ts re-exports both, so no caller changes —
REL-240 Medium "kept edits are put on screen on reopen and offered until saved to the work or discarded, with Undo" (e2e/objects/work-capture.spec.ts), every project: clicking the sidebar's Bench link from Calc did nothing. navigateWithDocumentPolicy (policy-navigation.ts) runs the save barriers, then dropped the leave if location.href had changed meanwhile, taken as a competing navigation. One barrier is the workspace's own URL-state writer, whose flush rewrites the page's #s= fragment with replaceState, so any leave with a fragment write pending was cancelled silently. In place since the import (b786b4b) Reproduced on a production build with the barriers instrumented, 17 October 2026 A cross-area link or palette command from a workspace with a pending fragment write did nothing, with no message Fixed: the check leaves out only a #s= state fragment (samePage in document-policy.ts, unit-tested), so a change of path, query or section hash still cancels the leave (the CPO's refinement, 17 October 2026); the soft-navigation branch uses the same check None
REL-241 Low "viewing EGFR in Protein records nothing; Save to Bench lists the saved view as Protein work, and Pin lists the target" (e2e/objects/explicit-saves.spec.ts), flaky on desktop and desktop-dark in CI run 39031934015: the Pin press landed as Mol* started (molstar.js fetched 2 s before), which holds the main thread for seconds on CI's software-GL runners; the trace shows the click performed and no further page activity for 18 s, past the check's 10 s. The product behaviour is right; the test pressed during a known busy period The CI trace of the failed attempt, 17 October 2026 One flaky title on CI Fixed in the test: it waits for each viewer to offer Reset view before pinning, the readiness signal e2e/protein-explorer/motion.spec.ts already uses for the same cause None
REL-242 Low "first-tube review isolates dirty named work and saves a separate ordinary dilution" (e2e/lab-calculators/serial-preparation.spec.ts), phone: page.screenshot({ fullPage: true }) threw "Unable to capture screenshot". The review opens in a new tab in front of the source page, and Chromium cannot capture a full page of a background tab under the phone project's emulation (touch, scale 2); a viewport capture of the same tab, and a full-page capture once it is in front, both succeed. The page's height (4,108 px) is not the cause Local reproduction, 17 October 2026 One failing phone title; the screenshot is an evidence attachment only Fixed in the test: bringToFront() before the full-page evidence capture None
REL-243 Low Two titles in e2e/improvements/stock-inventory.spec.ts, added with Codex's 5e34701 (16 October), expected controls under names or at widths the product never had. "a linked stock's complete recovery capture is reviewed before download and remains frozen" (every project) looked for /^Add .*to [Ss]tudy/, which cannot match the key's name "Add Plasmid freezer stock to a study" (objectsText.verbs.addToStudyLabel, unchanged since b786b4b). "default browser stock workflow retains container assertions, searches locations and blocks dirty tab changes" (phone) opened the palette from the StatusBar's "Command palette" key, which the StatusBar hides below 640 px (DS §6.5) Local reproduction and git log -S, 17 October 2026 Two failing titles; no product defect Fixed in the tests: the exact key name, and the bar's "Search or run a command" key, which opens the same palette at every width, still by keyboard. Past the key, the recovery test had two races of its own: it left for /o#studies before the picker's Study was written (it now waits for the announced receipt, as e2e/lab-calculators/workspace.spec.ts does), and it opened Study management before the Study's address loaded (it now waits for /study/) None
REL-244 Low "populated Bench uses the full width throughout and closed note drafts remain protected" (e2e/objects/bench-dashboard.spec.ts), phone, intermittent: after Resume is refused for a dirty next-step note, the note's field is sometimes not focused (toBeFocused sees "inactive"); the refusal itself and its message hold. 3 of 6 failed on a local production build of the base f3c9aa6 without this branch's product change, and 2 of 4 with it, so it predates REL-240. Not in docs/progress/e2e-baseline.json Local runs while checking REL-240 to REL-243, 17 October 2026 One intermittent phone title; focus after a refused leave is unreliable under touch emulation Fixed by REL-237 (72cff8a, merged from claude/fixup-e2e-shell). On /o#objects the on-demand library (object-library.tsx) moved focus to its own heading when it mounted, even after focus had moved on, and on the phone project it mounted late enough to take focus from the note the refused Resume had just focused. REL-237's guard (focusUnmoved in object-list.tsx) keeps focus where it has moved. Checked on this branch's merge of 004f640: 10 of 10 repeats pass on phone; with only the guard disabled, 3 of 10 fail at the same toBeFocused None

Browser matrix on Stage C's transfer candidate (17 October 2026)

The twelve-shard ci.yml dispatch on claude/stage-c-transfer at 590f7d04 (run 39040052993: 2,810 passed, 141 skipped, 45 failures across 23 titles and 8 flaky results across 7 titles). Eighteen of the 23 failing titles are REL-218's or REL-217's. The five that are not were each run on worktree builds of main at 7c8479e5 and of the candidate itself, rather than argued from the diff.

Id Severity Description Evidence Impact Status Suggested fix
REL-219 Low Browser titles outside REL-217 and REL-218 on the Stage C transfer candidate. Two fail on main's own head as well: e2e/plasmid-map/assembly.spec.ts:129 (a 30 s wait for [data-plasmid-name] to read "Designed assembly"), which the Stage C coordinator relays as intermittent on every project on main's own head and records under REL-27: it failed on phone and passed on desktop and desktop-dark in the run here, failed on desktop and desktop-dark and passed on phone in the Library track's one-at-a-time runs against both its branch and a worktree build of 7c8479e5, and both passed and failed on desktop-dark in the Gel track's; and e2e/sequence-toolkit/workspace.spec.ts:134 on desktop, phone and desktop-dark. Three pass on a local build of both 7c8479e5 and 590f7d04 and failed on CI only: e2e/assay-analyser/routine-week.spec.ts:236 on desktop (the 180 s test timeout inside settle, e2e/support/layout.ts:31, on both attempts; 35 s locally), e2e/education/nucleic.spec.ts:83 on desktop and desktop-dark (strict-mode violation: [data-education-experiment] resolves to two elements, the second under [id="S:0"]) and e2e/objects/explicit-saves.spec.ts:151 on desktop (the "Unpin EGFR · Epidermal growth factor receptor" button not found within 10 s) Run 39040052993, and a local run of each title on worktree builds of 7c8479e5 and 590f7d04, 17 October 2026 Two failures that main already carries and three that make the matrix harder to read; none is caused by the transfer candidate, whose diff touches src/lib/seq, the Plasmid content files, the pipeline oracles and the documentation only Open Each owner's next round: the assembly phone wait is Stage C's and the Sequence paste rules the Sequence track's; the education duplicate and the Unpin wait belong to Education and to Objects; the routine-week timeout is the shard-time question of REL-214
REL-248 Low src/components/suite/store/shared-db.test.ts:111 ("no read sees a half-copied database: until the swap reads come from memory, after it every copied row is there") fails intermittently under load with "reads ran while the copy was pending": the test needs its reads to land while the copy is still pending, which a loaded machine does not guarantee. A sibling of REL-213, which covers the same file's :77 only The enterprise-actions reliability track (claude/ea-reliability), 17 October 2026: one failure in a full npm test run (5,307 of 5,308 passed) and 1 of 3 runs of the file alone, in a session container at a one-minute load of 28 to 33 shared with other builders; it passes on the Fast chain's runner. No file of the track touches the store A unit test that can fail on a busy machine without a defect, so a local npm test can read red for no reason Open; owner the session that fixed REL-213 (the shared store's tests), placed by the enterprise-actions coordinator Make the test's pending window explicit (hold the copy until the reads have run, as REL-213's fix did for the write ordering) rather than relying on timing; never loosen the assertion
REL-310 Low e2e/objects/work-draft-protein.spec.ts:92 ("a resumed Protein view shows its kept edits; Discard returns the saved view and Undo the edits") fails intermittently on phone, and once on desktop: the click on the toast's Undo finds the button "not stable" and then "detached from the DOM", and retries until its bound ci.yml runs on claude/ea-reliability, 17 October 2026: 39065473300 on e33524be (no action bound), phone flaky, its first attempt timing out at the 45 s test timeout on that click; 39076929838 on 5dc69c2f (the B1 bounds), phone failing both attempts at the 20 s action bound on the same click (:116), desktop flaky. The bound moves the failure earlier; it does not cause it, since without the bound the same attempt ran out the whole test A Discard and Undo path for kept edits that the matrix can show red without a product change Open; owner the work-drafts builder (Objects, kept edits) Find why the Undo toast re-renders (or lapses) after Discard on a phone, then fix the toast or wait in the test for the Undo the person would press; never a larger bound or a retry
REL-457 Low e2e/assay-analyser/planned-analysis.spec.ts:30 ("Calc: the analysis is settled with the plan by keyboard, dated today") failed on every project between 23:00 and 24:00 UTC: the test took "today" from Node's clock, in the runner's time zone (UTC), while the browser runs in Europe/London, which in British Summer Time is already on the next day ci.yml run 39076929838 on 5dc69c2f, 17 October 2026, after 23:00 UTC: "Settled on 2026-10-18" read, 2026-10-17 expected, on desktop, phone and desktop-dark; the same title passed in 39065473300 earlier that evening. The product dates the plan in the person's own time zone, which is right An Assay title (a failure under e2e/assay-analyser/ fails any candidate) red for an hour a day in summer time, and for no defect Fixed 17 October 2026 (claude/ea-reliability): the test reads the date in the page, the clock the product uses. The product is unchanged None
REL-312 Low e2e/marketing/suite-pages.spec.ts:112 ("every public page can change the shared theme and retains the choice across navigation and reload") clicked the banner's Light mode key while the landing intro (#showreel, a modal dialog over the page for its 15 s, src/components/showreel/) was playing, and its canvas took the pointer. Without an action bound the click waited the intro out; under B1's 20 s bound it failed ci.yml run 39076929838 on 5dc69c2f (the B1 bounds), 17 October 2026: phone failing both attempts, desktop-dark flaky, each with "showreel-canvas … intercepts pointer events"; it passed on every project in 39065473300, without the bounds. The intro's covering the page is by design (it ends at 15 s, by 18 s at the latest, or on Skip, a key or a pointer) A title the action bound turned red; nothing on the page was wrong Fixed 17 October 2026 (claude/ea-reliability) under the CTO's ruling 1(a): an explicit, named wait for the intro to stop playing (#showreel not data-state="play", 30 s, under the old 45 s bound) before the click; no bound is raised. Locally at load 34, 5 of 6 runs passed on three projects, the sixth at the 45 s test timeout None
REL-249 Low Folded into REL-273 (the Sequence two-second test's CI variance), which main filed first; this row is kept only because commits on claude/ea-reliability cite its number Its evidence (runs 39057123949 and 39076929838) is in REL-273 As REL-273 Duplicate; see REL-273 None here

Save, Pin and Study review — 18 October 2026

WF-1 to WF-6 are addressed on the implementation branch (verification and merge status in docs/reviews/2026-10-18-workflow/README.md). The three-material preview is replaced by searchable Study contents and exact-member receipt navigation. StudyPicker now exposes failed reads and Retry. Save work has an explicit destination and visible repeat action; Pin is secondary; reference attachment leaves the default unchanged. Molecule identity readiness gates saving, and work/membership commit atomically. The exact user incident was not reproduced against their production account.

Compatibility limit: older Protein work with a subjectRef but absent material membership stays absent on repeat save to preserve possible deliberate removal. Add to Study is the explicit inclusion path. Full-size Study rendering performance has not been benchmarked in this change.

  • WF-7 (18 October, workflow-review branch): Work details previously unmounted unfinished next-step notes on close. Opt-in retained panel content preserves them, and blocked navigation reopens the draft. Desktop/phone close/reopen and explicit work-save regression coverage added. Resizing across the responsive Popover/Sheet breakpoint can still remount the editor; that pre-existing limitation is not resolved by this change.

Protein workspace build integration — 18 October 2026

The combined Protein/unified Save merge retained two next/dynamic imports in src/apps/protein-explorer/views/workspace.tsx, binding dynamic twice and preventing production compilation (including the Literature route through shared app preloading). The repair removes the duplicate import; both existing lazy components retain their original behaviour. Production build verification is recorded in docs/progress/landing-sales-refresh.md.

Audit fixes of 20 October 2026

Rows SCI-173 to SCI-204 and REL-378 to REL-438 (REL-378 to REL-381 now REL-480 to REL-483) were added on 20 October 2026 from the fixes to the audit of the Codex and Gemini work of 18 to 20 October 2026 (docs/reviews/2026-10-20-gemini-codex-audit/README.md). Builders B1 to B6, B8 and B9 made the fixes on their own branches under the CSO's, CPO's and CTO's audit-fix memos of 20 October 2026 (docs/board/memos/2026-10-20-cso-audit-fixes.md, 2026-10-20-cpo-audit-fixes.md, 2026-10-20-cto-audit-fixes.md), and each branch was merged into claude/funny-newton-g829ba (696c9b16 to fa1a58b0). Each row is its builder's, except that a clause naming a later step of the coordinator's, or a builder's scratch report, now states what was done. REL-426 is the coordinator's walk fix (b968fb7f), and REL-433 to REL-438 record the CTO's size rulings on the integrated build (docs/board/memos/2026-10-20-cto-size-rulings.md). REL-384, REL-385, REL-413 to REL-420 and REL-423 to REL-425 are unused; REL-427 to REL-432 are reserved for the walk rebuild (D-0105). REL-408 to REL-410 turn the limits recorded in prose under "Save, Pin and Study review — 18 October 2026" into rows (audit reports/codex-save.md m3); that prose is kept. SCI-139 and SCI-143 were amended the same day and stay open until the CSO's review.

Scientific correctness, 20 October 2026

Id Severity Description Evidence Impact Status Suggested fix
SCI-173 High The refusal guidance added on 19 October (Gemini, 9daaa6b) named rules that had not fired. Assay mapped every fitter refusal (withheldBy: "weighting": weighting-nonpositive, all-fixed, invalid-data, numerically-flat, unidentifiable, not-converged) to rule (i)'s "assign at least four positive sample concentrations"; an Absolute C50 on a raw scale and one with no 50 percent crossing fell through to "add intermediate concentrations across the transition step". Calc told a buffer outside Goldberg et al. 2002's 274–350 K range to pick a buffer "within ±1 pH unit", a rule the starter does not apply, and gave every intermediate-dilution problem (including invalid-source and insufficient-stock) one remedy. Sequence's Tm refusal said "at least 8 nt" (the floor is 2 nt) and "SantaLucia (1998) and Owczarzy (2004) domain", and the outsideFit text invented an "8–60 nt" length condition and omitted the 2008 note Audit of 20 October 2026, reports/gemini-workflows.md M1; content/apps/refusal-guidance.ts:55,90,118,151,168,176 at 38b6278c; src/lib/fit/analyse.ts:112-123, src/lib/fit/rules.ts:214,220, src/lib/dilution/buffer.ts:122, src/lib/seq/tm.ts:268,301,304 A scientist reading a withheld or refused result was told a remedy for a different problem, presented as the rule that applied Fixed 20 October 2026 on the B2-workflows branch (7d97c149), closes when it merges: each app's guidance is an exhaustive map keyed by the engine's codes (content/apps/assay-analyser.refusal-guidance.ts, lab-calculators.refusal-guidance.ts, sequence-toolkit/refusal-guidance.ts) with the CSO's statements of 20 October (§7); bounds read from MIN_CONCENTRATIONS, VALID_RANGE_K, TM_MIN_LENGTH_NT, dmso.ts and the outsideFit note; codes with no defensible remedy show no block. src/lib/methods/refusal-guidance.test.ts (19 tests) holds each map to the engine's union and drives each engine to each code The CSO reviews the statements the builder drafted for codes the ruling did not word (rules ii to v, noFiniteMinimum, the C1V1 and serial refusals and flags, three intermediate problems); in Calc: stock-weaker-than-final, the direct-transfer flag, insufficient-stock, solvent-limit, no-single-intermediate, stock-weaker-than-top and both serial flags
SCI-176 High The Assay registry's verification sets named 22 verified methods by no set (relative potency, reporter ratio, percent of vehicle background, plate diagnostics, leave-one-out influence, design narrowing, two-phase dose response, negative result, molar from mass, ligand efficiency, assay drift, layout suggestion, blank limits, qPCR efficiency and geNorm M, Hill, bisubstrate, Morrison, both slow-binding models, binding and its Ki), though each fixture is published; the combination set named combination-hsa-observed/combination-bliss-observed, ids no MethodRef carries, was dated 2026-10-17 before its fixture was recorded, and said "cross-checked against synergy 1.0.0" when both fixtures record crossCheck.ran: false and the script does not call the package's models Audit of 20 October 2026, reports/gemini-wp.md M2 and reports/combination.md C-1; content/apps/assay-analyser.ts verification sets A "verified" badge pointed at nothing the docs page lists; a public false verification claim on /docs/assay-analyser Fixed 20 October 2026 (6ef93a78): 19 sets added for the published fixtures under 0.11.0 and 0.12.0 (tolerances from each fixture's about block), a Python decimal oracle row; the combination row carries combination-hsa, combination-bliss, 2026-10-18 and the CSO's sentence "The planned cross-check against synergy 1.0.0 was not run (each fixture's crossCheck block records why)"; the synergy oracle row says planned and not run; new test in content/apps.test.ts: every verified Assay MethodRef is named by a set and every set's method id is a MethodRef. No fixture touched The same invariant for the other publishing apps (not checked here); a real synergy cross-check needs a script that calls the package's models, or the limitation stays recorded
SCI-177 High Combination responses' second input path, raw readings with two endpoint controls (contract 13 line 42), was unreachable: the panel had no raw option and no control assignment, so the engine's seven raw refusals and fixture cases 14, 15 and 23 to 28 could not be reached by a user Audit reports/combination.md M-2; src/lib/assay/combination/base.ts:21; combination-panel.tsx:542-545 at 232feefe Raw plate readings could not be analysed; a third scale option was promised in copy and missing Fixed 20 October 2026 (6583651d): the third scale option sets raw-with-controls (no scale); a required row role column; one role select per distinct value (dose-pair observation, no-effect control, full-effect control, not used), nothing pre-assigned or inferred; control rows feed controls; the engine's codes refuse; endpoint means, n and the equation shown after Apply; browser case on fixture cases 14 and 24. The engine refuses undeclared-scale only on the normalised path (the oracle reads the scale only there) CSO review of the wired path; see SCI-179 for the control IDs
SCI-180 High The dose plan's reference linked a DOI that does not exist. content/apps/lab-calculators.preparation.dose-plan.notes.ts:31 cited https://doi.org/10.1089/hgtb.2010.131 as "Lock et al. 2010: characterization of viral vector preparations". The kind's references panel showed it Audit 2026-10-20, reports/counting-dose.md C1. Crossref, 20 October 2026: the cited DOI returns 404; 10.1089/hum.2009.223 is Lock, McGorray, Auricchio, Ayuso et al., Human Gene Therapy 2010;21(10):1273-1285, "Characterization of a Recombinant Adeno-Associated Virus Type 2 Reference Standard Material" A fabricated citation in shipped copy Fixed 20 October 2026 (d83dfe59): the link is 10.1089/hum.2009.223, labelled "Lock et al. 2010: characterization of a recombinant AAV2 reference standard material" (the CSO's memo of 20 October 2026, section 3). It supports keeping the bases distinct; it is not a source for the arithmetic (K2) —
SCI-182 High Contract 10's retained records said more, or other, than they hold. (1) The counting receipt admitted mL, µL, nL and cells/mL, which the engine never writes. It re-checked only the viability identity, so a doubled viable density, an arbitrary total density and non-canonical units read as valid (CSO K3). (2) The dose receipt checked each row's unit against its list alone, so a PFU quantity beside a TU per viable cell dose read as valid. The published "swapped basis" case 08a sets an invalid unit string, not a swap of two valid bases (CSO dose case 8). (3) Every Calc capture was stamped manual-assertion / raw / planned with the calculation-plan qualification ("Calculated plan …"), and Bench and Study added "planned" facts and reasons, so a counted observation was recorded as a plan (contract 10 lines 26 and 105) Audit 2026-10-20, reports/counting-dose.md M1, M2, M3 and gemini-wp.md m4: cell-counting-receipt.ts:11,16-17,59-69; dose-plan-receipt.ts:29-54; workspace-adapter.ts:115,122; calc-projection.ts:28,35,42,106. Reproduced on 20 October 2026: against receipt-integrity-v1.json (0.9.0) the reader before the fix agreed on 26 of 49 cases, reading all 23 that must read as null Bench, Study and exports could hold a density that is not the count's, a dose in one basis beside a quantity in another, and a count labelled a plan Fixed 20 October 2026 under the CSO's memo of 20 October 2026, section 3. Fixture first: receipt_integrity_reference.py and receipt-integrity-v1.json (49 complete receipts mutated from the published v3 receipts, 26 that must read and 23 that must read as null), published at 0.9.0 (42a42359). Then the readers (b68c8571): canonical L and cells/L, both density identities with close, and basis agreement between requiredQuantity and enteredDose; every 0.9.0 case passes through the reader in receipt-integrity-oracle.test.ts, 50/50. The evidence (041a8792): an observed count is observation / raw / recorded; the worked example is simulation / raw / recorded with synthetic dataset lineage (cell-counting-worked-example@1, edited once it differs from the example); the lead qualification is count-observation with the CSO's sentence; Bench and Study give a count "Count origin: observation" or "synthetic example" and the certification sentence; the capture provenance says preparation: "observation". The dose plan stays a plan; old records keep what they captured The dose receipt's titre is REL-397. An edited example edited back to the example's exact values reads as unedited, because the counting input has no edited flag of its own (CSO to confirm this is acceptable)
SCI-187 High Z′ accepted identical decimal controls: three readings of 0.1 average to 0.10000000000000002 and two to 0.1, so separation > 0 passed on a 1.4 × 10⁻¹⁷ rounding difference and Z′ = −2.67 was reported; the same for [0.1, 0.2, 0.3] against [0.3, 0.2, 0.1] src/lib/fit/zprime.ts:35-36 (as read on 2bb0f02e); audit docs/reviews/2026-10-20-gemini-codex-audit/reports/gemini-wp.md C2; degenerate-v1.json (Assay 0.16.0) cases 1a to 1c A Z′ from rounding shown as a plate's quality Fixed (20 October 2026, ee0adc1e): noSeparation (src/lib/stats/degenerate.ts, the CSO's audit-fix memo of 20 October 2026, item 1); the oracle degenerate_reference.py committed first (9c9c04d3); src/lib/stats/degenerate-oracle.test.ts None
SCI-188 High The normalisers divided by rounding: percent and percent inhibition with identical decimal controls gave 7.2 × 10¹⁷ percent at y = 0.2; percent of control accepted positives 0.1, 0.2, −0.3 (mean exactly 0, double 1.9 × 10⁻¹⁷); vehicle over blank accepted vehicle 0.1 × 3 over blank 0.1 × 2 src/lib/fit/normalise.ts:48, 54, 60-62 (as read on 2bb0f02e); audit C2; cases 2-* Percent viability or inhibition from rounding Fixed (20 October 2026, ee0adc1e): noSeparation for percent and percent inhibition; notAbove(|μpos|) for percent of control (no-separation); notAbove(μpos − μblank) (vehicle-not-above-blank) None
SCI-189 High A screening plate with identical decimal controls reported −7.2 × 10¹⁶ percent inhibition and made calls; the robust z was withheld only when MAD was exactly 0 src/lib/screening/screening.ts:107-115 (as read on 2bb0f02e); audit C2; cases 3a to 3d, 11-screening, 12-screening False calls at or above a threshold on rounding Fixed (20 October 2026, ee0adc1e): the plate is withheld through the normaliser's noSeparation; the robust z is withheld (no-spread) when the finite percents do not spread (noSpread) or MAD is 0 None
SCI-191 High Growth window, Gompertz and GR accepted a reading equal to its blank: six blanks of 0.05 average to 0.049999999999999996, so a sample of 0.05 passed y − blank > 0 by 6.9 × 10⁻¹⁸ and the window reported μ = 0 with intercept −39.5 (seven blanks of 0.1 likewise) src/lib/growth/window.ts:33, gompertz.ts:88, gr.ts:156 (as read on 2bb0f02e); audit C8; cases 5-, 13- A rate fitted to rounding dust where the memo requires nonpositive Fixed (20 October 2026, ee0adc1e): notAbove(y − blank, n_blank + 1, max(|y|, max|blank|)), rows or wells named; a sample 10⁻⁶ above its blank still calculates (case 13) None
SCI-192 High The qPCR Welch interval withheld no-scatter only when both variances were exactly 0: treated −20.1 × 3 against calibrators −22.1 × 3 gave a "calculated" interval 10⁻¹⁴ wide (se 2.5 × 10⁻¹⁵); derived quantities equal in decimal (25.3 − 5.2, 25.4 − 5.3, 25.5 − 5.4) likewise src/lib/assay/qpcr/interval.ts:42-45 (as read on 2bb0f02e); audit M5; cases 6a, 6b, 14 A fold-change interval of rounding width Fixed (20 October 2026, ee0adc1e): noSpread per group with the largest log₂ quantity each normalised quantity came from as the scale (quantity.ts passes it); both groups withheld, one group's variance set to exactly 0 (its SD reads 0) None
SCI-193 High Two-way ANOVA and the mixed model reported rounding as results: cells of identical decimals gave F = 1.56 × 10³² and an "interaction" p = 0.037 from SS 4.8 × 10⁻³³ (every cell 0.1: F = 1.00, p = 0.347); the mixed model gave F = NaN under status: "value" (all 0.1: F = 4.0, p = 0.062 from σ² 8 × 10⁻³⁵); simple effects inherited the two-way fit src/lib/stats/models.ts:76, 119, 176 (as read on 2bb0f02e); audit C4; cases 7-, 15- Significance claimed on rounding; NaN under a value Fixed (20 October 2026, ee0adc1e): ZERO_VARIANCE_GROUP when no cell spreads (noSpread, two-way and simple effects; one constant cell among varied ones still calculates) and when the mixed model's q ≤ 1e−20·Σy² (zeroResidual) None
SCI-194 High Survival: when every subject at risk dies at one time the log-rank variance is 0 and χ², p and the hazard ratio were NaN under status: "value" src/lib/stats/survival.ts:198, 296 (as read on 2bb0f02e); audit C3; cases 8 and 16 NaN under a value status Fixed (20 October 2026, ee0adc1e): new code ZERO_VARIANCE ("No subject remained at risk after an event time, so the groups cannot be compared.", the CSO's sentence) when the used groups' covariance is not positive definite, decided exactly on the counts (riskSetsJoin); disjoint risk sets still give χ² = 5 None
SCI-195 High Slow binding refused falling kobs only at p < 0.05, so a gently falling line (p = 0.471) was "estimated" with kon,app = −4.4 × 10⁻⁵ and Ki,app = −2,257 (p = 0.063: −9.4 × 10⁻⁴ and −95.8), in both models src/lib/kinetics/slow-binding.ts:69-84 (as read on 2bb0f02e); audit C5; cases 9a to 9c A negative on-rate and a negative Ki shown as estimates Fixed (20 October 2026, ee0adc1e): new refusal not-rising for any other slope at or below 0, both models, with the CSO's sentence; falling unchanged when p < 0.05 (case 9c) None
SCI-197 High Survival: when one group has no subject at risk at any event time (for example, all its subjects censored before the first event), the log-rank test is a value with df 0 and p NaN; the used set is empty, so the memo's positive-definite test (vacuously true) does not fire. The hazard ratio is already withheld (NO_EVENTS_GROUP) src/lib/stats/survival.ts weightedLogRank (used.length ? … : 0, chiSquaredUpper(0, 0) is NaN); probe: group A events at 5, 6, 7, group B censored at 1, 2, 3 → {status: "value", statistic: 0, df: 0, p: NaN} NaN under a value status (the memo's red line) Fixed on claude/codex-issue-repairs (25 October 2026): zero comparison degrees of freedom withholds both test choices as NO_COMPARABLE_RISK, preserving descriptive curves/counts and the separate hazard-ratio refusal. Independent supplemental verification 0.17.0 precedes the engine change; survival-tests method 1.0.1. The CSO to name the code and sentence (a new code, or ZERO_VARIANCE with its sentence widened); then a case in the next fixture version and the gate in analyseSurvival
SCI-198 High Slow binding with kobs that do not spread (every value equal) is "estimated" whenever rounding makes the OLS slope positive: [I] 0.5 to 32, kobs 0.1 × 7 gives kon,app 1.2 × 10⁻³⁴ and a reported Ki,app = koff/kon,app of about 8 × 10³²; the memo's test is the slope's sign only src/lib/kinetics/slow-binding.ts direction and fitSlowOneStep (after ee0adc1e); probe over four [I] designs and eight constant values: 4 of 32 estimated An absurd Ki,app shown as an estimate Fixed on claude/codex-issue-repairs (25 October 2026): the shared direction gate uses the existing CSO-approved noSpread(kobs) policy before OLS, refusing both models as not-rising while preserving validation precedence and genuinely rising small-scale controls. Independent supplemental verification 0.17.0 precedes implementation; both methods 1.0.1. The CSO to rule, e.g. noSpread(kobs) (or a rise over the [I] range not above tau) refused as not-rising, whose sentence is true here
SCI-200 High The construct cropper treated AviTag-His6 as protease-cleavable because its BirA note filled cleavageSiteNote, so it reported a "cleaved" species whose mass equalled the whole construct (ubiquitin: 11,255.73 Da for both) Audit of 20 October 2026, docs/reviews/2026-10-20-gemini-codex-audit/reports/gemini-wp.md C6 (src/lib/seq/construct-cropper.ts:95-117, 289-309 as it then was); CSO ruling docs/board/memos/2026-10-20-cso-audit-fixes.md section 2 item 2 and red line "A 'cleaved' mass for a tag without a protease" A mass in front of a scientist for a species that does not exist Fixed 20 October 2026 (branch worktree-agent-ab9704578bdd58177, f0b37c83): each AffinityTagSpec carries an explicit protease (TEV, thrombin, HRV 3C or null) and cleavableTag reads that field, so AviTag-His6, His6, Strep-II and FLAG have no cleaved sequence, no cleaved properties and no cleaved column. Reference construct-cropper-v2.json, published as /verification/protein-explorer/0.4.0/, cases ubq_avihis6_nterm and ubq_avihis6_cterm —
SCI-201 High A protease tag asked for at the C-terminus was moved silently to the N-terminus and the N-terminal construct was reported, label and masses included, as though the request had been met The same report, C6 (evaluateProteinConstruct returned terminus: "n-term" for a c-term request); CSO ruling section 2 item 2 ("It is never moved silently to the N-terminus") A construct and masses that are not the construct asked for Fixed 20 October 2026 (f0b37c83, panel b3bd5735): the engine returns a ConstructRefusal with the code c-terminal-cleavage-not-modelled, carrying the placement asked for and no numbers, and the panel shows that code's sentence and withholds the table, the FASTA and both hand-off links. Reference case ubq_his6tev_cterm_refused —
SCI-174 Medium Sequence's guidance showed on states that are not refusals: hasValidDnaTemplate was false for Primer check whenever its optional template was empty and for Primer design and Site-directed mutagenesis on an empty workbench, so "paste an unambiguous A/C/G/T DNA … template" appeared under a working primer check and before anything had been refused; docs/technical/app-sequence.md said it showed on refusal Audit of 20 October 2026, reports/gemini-workflows.md M2; src/apps/sequence-toolkit/views/workbench.tsx:964-968 and :811 at 38b6278c; content/apps/sequence-toolkit/primer.ts:16 ("Template (optional)") Guidance implying a refusal that did not happen Fixed 20 October 2026 (7d97c149), closes when it merges: the workbench passes only the current operation's own result (sequenceRefusalGuidance({ op, tm })), which renders only for Oligo Tm's refusal or outsideFit note (CPO memo of 20 October 2026, §6); Primer check, Primer design and mutagenesis show their refusals in their own panels None. If guidance is wanted for the primer operations, it needs their refusal codes lifted to the workbench and statements from the CSO
SCI-175 Medium Three statements of science or provenance were wrong. The serial-dilution guidance advised "an intermediate working stock in assay buffer to reduce DMSO carry-over", but the carrier at a point is the stock's fraction × C/C_stock (solventFraction, dmso.ts), which an intermediate in carrier-free buffer does not lower at the same concentration (the intermediate planner's own copy says so). The omnibox described the task=buffer entry as preparing buffers "with Henderson–Hasselbalch"; the task is the pKa at the working temperature (Goldberg et al. 2002) and no Henderson–Hasselbalch step exists in the dilution engines. The Molecule descriptors cited Wildman–Crippen 1999 as 10.1021/ci990282o, which does not resolve content/apps/refusal-guidance.ts:144 and content/apps/omnibox.ts:74-77 at 38b6278c (audit gemini-workflows.md M8); src/lib/chem/descriptors.ts:94 (audit gemini-wp.md C7; four other files use 10.1021/ci990307l) A wrong remedy for a carrier flag; a description claiming a method the app does not run; a citation a reader cannot follow Fixed 20 October 2026 (7d97c149, 09389aad, 308a421c), closes when they merge: the carrier flag's statement says to use a more concentrated stock or a lower carrier fraction and that an intermediate in buffer does not lower it; the omnibox entry is "Buffer pKa at temperature"; the DOI is 10.1021/ci990307l The CSO confirms the carrier statement (a builder's draft, derived from solventFraction)
SCI-178 Medium Combination responses' declarations and disclosures: the worked example pre-ticked the endpoint affirmation; neither CSV carried the scale, direction, affirmation or Bliss declaration; the colour key coloured its end labels with status colours and did not state the sign in words; the out-of-range disclosure was one count; the Cell table showed raw status tokens and recorded summaries wrote raw reason codes (HSA withheld: missing-margin-a); a refused analysis recorded through the ordinary Record result key Audit reports/combination.md M-4, M-5, Mi-3, Mi-5; CSO C2 (17 October 2026); CPO 4.5 to 4.7 Declarations made by the person were not in the files that leave the app; a refused result could be recorded as an ordinary result Fixed 20 October 2026 (6583651d): declarations on every row of both CSVs; the example ticks nothing; key "−n pp, below the HSA reference" / "+n pp, above …" in neutral text; counts below 0 and above 1; status words; content sentences in the record (assay-analyser.combination-record.ts); a result with no calculated dose pair records only through "Record with reasons" (dialog listing the refusal or each withheld reason with its count; reporting.status: "refused", output.refused with code, sentence and counts). The vehicle qualification sentence stays in evaluate.ts (vehicleQualification) because both published fixtures pin it Move the vehicle sentence to content with the next fixture version
SCI-179 Medium Contract 13 gaps left open after the 20 October fixes: (a) control readings are kept as values only (EndpointControls), so a control row's observation ID, source row and exclusion are not retained (contract line 42) and an excluded control row is refused at import; (b) a refused analysis shows no observed-response table (the CSO's C3 requires the observed responses to stay visible; the engine returns no cells on refusal); (c) no figure export (contract line 81; CPO 4.5); (d) the unit list adds pM to the contract's nM, µM, mM and M (line 29); (e) the CPO's ex=combination-anchor@1 example route is not registered; (f) no "Observed responses" heading (CPO 4.2); (g) the chooser keywords include "synergy", "antagonism" and "Loewe" (search terms only) Audit reports/combination.md Mi-5, M-6; the CPO's memo of 20 October 2026, "Risks" (control IDs may need a new fixture version) Provenance of control readings is thinner than the contract asks; some contract surfaces are absent Open CTO ruling on control IDs in the record (and whether a new fixture version is needed); CPO on (b), (c), (e), (f); one change at a time
SCI-181 Medium Contract 10's public verification counts matched no fixture. The method notes said 27 and 31 cases, with 21 dose refusals; the registry said 27 and 31; static-methods.ts repeated them; oracles-and-verification.md said 28 (16 refusals) and 35 (26 refusals) for v3, and 15 and 16 refusals for v2. The fixtures hold v3 28/15 and 35/23 (plus 6 and 7 receipt-integrity cases) and v2 25/14 and 24/13. A test also hard-coded 27/31. The notes named no Python version; the fixtures record 3.9.6. The "verified" status had been raised by the builder (96c5eb3) with no CSO review Audit 2026-10-20, reports/counting-dose.md M5 and M4; counted from src/lib/preparation/fixtures/*-v{2,3}.json (count, cases, expected.expect, receiptIntegrityCases) A scientist reading the verification page saw counts the files do not hold Fixed 20 October 2026 (7025c241, b68c8571). The counts are corrected in all five places. src/apps/lab-calculators/calculators.test.ts now reads every verification set's published file and asserts its count. It also asserts each note's case, refusal and receipt-integrity counts, and the 0.9.0 receipt counts per kind, against the named file. The CSO ruled on 20 October 2026 (section 3 (d)) that "verified" stands for the arithmetic, on the audit's independent recomputation of every v2 and v3 case. The notes name Python 3.9.6 and, since the 0.9.0 set landed with the reader change, the receipt set —
SCI-184 Medium Contract 11A: a recorded simulation reference that failed its strict reader or its hash verification refused the whole measured-run comparison, although the contract says missing or unsupported reference evidence does not prevent comparing the two measured sources. On reopen the view refused the saved record and cleared it Audit of 20 October 2026, reports/measured-overlay.md M3: measured-comparison.ts:703-716 returned ok: false with simulation-reference-hash-mismatch; views/measured-comparison.tsx:504-510 cleared mine Two valid measured sources could not be compared, and a saved comparison could not be reopened, because of the optional third panel Fixed 20 October 2026 under the CSO's ruling of that day (section 5): the oracle and Bioreactor verification 0.4.0 first (4c63b29c: reference-measured-comparison-2.py, 3 cases with their inputs: hash, output reader, schema), then the engine (c534e765). The reference is dropped; the pair verifies; the record keeps the reference; the projection draws nothing from it and leaves it out of the elapsed-time union; qualification simulation-reference-unavailable (warning) with the CSO's sentence; the receipt and settings keep only the code and claimed hashes; its input is not recorded. measured-comparison.test.ts drives all 3 cases Closed 24 October 2026: the CSO confirmed the boundary as built (the CSO's memo of 24 October 2026, ruling 6): envelope failures (snapshots that are not objects, a malformed alignment object) refuse the record as malformed; content failures (schema, hash, trajectory) make the reference unavailable without refusing the pair
SCI-185 Medium Contract 11A step 2's source summary omitted the captured date, the reading and exclusion counts and the historical method pin (growth.result.version), in the view, the projection, the receipt and the CSV; non-overlapping coverage carried no label Audit M4: views/measured-comparison.tsx:900-924, measured-comparison.ts:851-874; the copy (capturedAt, readingsCount, historicalReceipt, historicalSlope, coverageNote, anchorMarker) unused A scientist could not see from the comparison how many readings, blanks and exclusions each source held, or which method version produced its retained window receipt Fixed 20 October 2026 (c534e765) under the CPO's ruling of that day (section 4): the card shows captured date, saved revision or draft (sourceRevision), counts, receipt status, historical slope and the method pin (new key methodPin); sourceSummary computes them once; the projection carries readingCounts, historicalMethod, capturedAt (so the receipt does); the CSV adds ten columns (36); aligned panels carry coverageNote and anchorMarker. Unit test and e2e assertions added Closed 24 October 2026: the CSO approved the wording "Source method: growth-window-rate@1.0.0, as recorded; not rerun here." (the CSO's memo of 24 October 2026, ruling 6), and methodPin now writes it (Stage H BR1.6)
SCI-190 Medium Plate diagnostics shared the defect: the signal window and Z refused only an exactly zero separation, the vehicle spread and SSMD only exactly zero SDs src/lib/fit/plate-diagnostics.ts:101-116 (as read on 2bb0f02e); not driven by the audit (gemini-wp §7), reproduced here: cases 4a to 4c A signal window or Z from rounding Fixed (20 October 2026, ee0adc1e): noSeparation for the signal window (through Z′) and Z; noSpread per control for no-vehicle-spread and SSMD's no-spread None
SCI-196 Medium The thermal residual diagnostic reported r1 = 0.72 against a 0.26 reference on a noiseless melt: the lag-1 correlation of rounding error, while tmProfile on the same fit said zero-residual src/lib/thermal/tm-intervals.ts:105-106 (as read on 2bb0f02e); audit M6; case 10 A strong-autocorrelation reading where there is no residual Fixed (20 October 2026, ee0adc1e): r1 null at zeroResidual with tmProfile's normalisation, shown with the existing "not defined: the readings lie on the fitted sigmoid" sentence (the stored shape keeps its three keys) None
SCI-199 Medium Plate diagnostics' edge-against-interior Welch test (and so the pattern view) has the qPCR M5 defect: it withholds no-spread only when both variances are exactly 0, so edge wells of 0.3 against 15 interior wells of 0.1 (identical decimals) give t = 5.4 × 10¹⁶, p = 10⁻²²⁷ src/lib/fit/plate-diagnostics.ts:44 (welch), outside the memo's lines 101-116; a probe by the builder on 20 October 2026 with the inputs in the description An extreme "edge effect" p from rounding, shown as an observation Fixed on main by PR #36 (802f34462, Fast 40227125033). Plate diagnostics 1.0.1 uses the approved per-side relative-spread policy, withholds both-flat comparisons and zeroes only a flat side when the other varies. Independent reference 0.18.0 precedes implementation; all earlier bytes are preserved. Full evidence: docs/progress/plate-edge-spread-repair-2026-10-25.md. —
SCI-202 Medium The AviTag note named the wrong lysine ("BirA biotinylation site at K12"). BirA acts on K10 of the 15-residue AviTag GLNDIFEAQKIEWHE, which is residue 11 of MGLNDIFEAQKIEWHEGHHHHHH as the engine stores it The same report, C6; CSO ruling section 2 item 2 ("The current 'K12' is wrong"); the stored tag's residue 11 is its only K, and residue 12 is I A named modification site a scientist would design a mutation around, off by one Fixed 20 October 2026 (f0b37c83): the note moved to a structured modification field (enzyme, motif, residue in the motif, residue in the tag, adduct formula), rendered from content/apps/protein-explorer.biophysics.ts. The oracle derives the position independently by locating the motif in the stored tag; the test asserts residue 11 and refuses "K12" —
SCI-203 Medium An untagged internal crop reported a mass for a protein that would not be expressed as shown: residues 10–70 of ubiquitin began with G and carried no initiator Met (6,849.71 Da for GKTIT…) The same report, m5 (a design question the reviewer did not rule on); CSO ruling section 2 item 2 ("Initiator Met: yes") A mass for a sequence that cannot be translated as given Fixed 20 October 2026 (f0b37c83, panel b3bd5735): with no N-terminal tag and a core that does not start with M, the engine prepends one and sets initiatorMetAdded; the panel says "Initiator Met added" with "The host may remove the initiator Met; this is not predicted." One mass is reported, for the sequence shown: 6,980.82 Da, as the reference case ubq_untagged_10_70_initiator_met has it —
SCI-183 Low Contract 10 deviations the audit found and this fix round left. (m1) counting-non-positive-volume also fires for a unit outside the volume dimension (cell-counting-calculate.ts:113; fixture case 10d), a code name that misstates the condition. (m2) The titre denominator is scaled with literal factors (dose-plan-calculate.ts:98) rather than quantity.ts toBase, as K2 and the CTO ruled; the reader accepts any text up to 24 characters as titreUnit, and the engine then refuses it (dose-titre-unit). (m3) Row and literal names differ from K3 without a recorded reason (available for paired; no countMode or regions row; not-assessed for quantity-only). (m8) Capture checks only the envelope's method pin (workspace-adapter.ts:89), not the kind's own method record, which K1 asked to be "checked at capture" Audit 2026-10-20, reports/counting-dose.md m1, m2, m3, m8 No wrong number: each fails closed or is a naming difference. The capture gap means a recipe with a stale kind pin can record Open; the brief for this round did not include them. Renaming a code or a row changes the published v3 fixtures' contract, so it is a new fixture version CSO: whether m1 and m3 warrant a v4 fixture and engine change. CTO: the toBase change (m2) and the kind-pin check at capture (m8), which would refuse a reopened recipe whose kind pin is older than the engine
SCI-186 Low Contract 11A's verification and review gaps. The 0.3.0 fixture's 12 refusal entries carry no inputs, so the TypeScript test constructs each fault and the oracle cannot catch a wrong construction; the optional reference's alignment is outside the oracle. The CSO, CPO and CTO reviews D-0096 requires were not done: the six memos of 19 October in the seats' voices are the builder's own notes Audit M1, m4, M6. docs/technical/app-bioreactor.md called the memos "board rulings"; oracles-and-verification.md and the registry did not declare the oracle or the 0.3.0 set The published verification overstated what the oracle covers, and a seat review was recorded that had not happened Partly addressed 20 October 2026: 4c63b29c registers the 0.3.0 set (8 cases, the refusal entries named as carrying no inputs) and the 0.4.0 set (3 cases with inputs) in content/apps/bioreactor-simulator.ts with their Python oracles, and documents both in oracles-and-verification.md; c534e765 corrects app-bioreactor.md (the memos are the builder's notes). 24 October 2026 (Stage H, BR3.3): Bioreactor verification 0.5.0 published oracle first (78e6d965: reference-measured-comparison-3.py, Python 3.12.14, fractions and hashlib), 25 cases each carrying the complete stored comparison: all 12 refusal codes from their own inputs, three further reference-unavailable rules, and seven reference-alignment cases; measured-comparison-completion.test.ts drives every case through the engine as stored, constructing nothing. The CSO's and CTO's reviews of 11A as built are in their memos of 24 October 2026 (docs/board/memos/2026-10-24-cso-bioreactor-stage.md section 6, 2026-10-24-cto-bioreactor-stage.md §7). The ?? 0 fallback at measured-comparison.ts:972 (the CSO's condition) was fixed on 24 October 2026 (Stage H BR1.6, SCI-240), and the 0.5.0 set is in the registry (measured-comparison-completion). Open: the review of the view (the CDO and CPO, BR4) SCI-143's 11A item closes when both reach main (the CSO: when both land)
SCI-204 Low Whether the host removes the initiator Met is not predicted, and no biotinylated mass is given for AviTag-His6: biotinylation adds C10H14N2O2S, but its extent is not predicted this release CSO ruling section 2 item 2 and its "Risks and unknowns" ("Whether the host removes the initiator Met is not predicted"; "The AviTag lysine position rests on secondary sources read today; I did not read Beckett et al. 1999") Two stated limits of the construct numbers, both disclosed in the panel Open (recorded) by design, 20 October 2026: both limits are said in the panel's notes. The lysine position rests on the CSO's secondary sources plus the oracle's derivation from the published motif, not on Beckett et al. 1999 If the CSO wants the primary reference, read Beckett et al. 1999 and cite it beside the note; a predicted biotinylated mass would need a new decision and a new fixture version

Reliability, 20 October 2026

Id Severity Description Evidence Impact Status Suggested fix
REL-480 High The landing page's guided example gave the missing PRISM well as "PREP016_CS5_X2 well C3 (0.00244 µM)"; the fixture row PREP016_CS5_X2:C03::HTS002 is the 10 µM well (dose_uM: 10, mfi: null). The scene's other figures (429.90, 393.44, 8.5 %, 4.299 mg, 2.15 mg/mL, 610 pM, 0.2 % DMSO, 0.4 µL, 2 µL, 1 mL, 23 readings, 3 plates) were typed in content/apps/landing-workflow.ts, content/apps/landing.ts (exported through /landing.json) and the TSX, unguarded, against the CSO's public-walk memo of 6 October 2026 (item 3); landingWorkflowCopy.attribution carried a dead DOI (10.1038/s43018-019-0019-4) Audit docs/reviews/2026-10-20-gemini-codex-audit/reports/gemini-walk.md C1, M5, m1, m2; codex-landing.md C1, m7; introduced by 57462cf and 71ca5be A wrong number on the public page; every other figure right only by hand Fixed 20 October 2026 (90cc1840): the scene's words are templates (content/apps/landing-workflow.ts) filled by src/components/suite/marketing/landing-workflow-data.ts from j3Slots(), formula-mass.json, dilution.json and the PRISM fixture; the missing well's sentence is built from its row ("PREP016_CS5_X2 well C3 (10 µM): no reading in the source; shown as missing."); landing.ts reads J3_VALUES/J3_SERIES; the 0.4 µL transfer is quoted with its 200 µL top tube; the dead field is deleted. landing-workflow-data.test.ts (6 tests) ties the sentence, the counts and the public steps to the fixtures and j3Slots() Superseded on the page 20 October 2026 (3f71d3cb, REL-440): the example's words are now only the figures' labels in content/apps/landing-workflow.ts, filled the same way; the missing well's sentence, the 23 readings and the source line keep their checks in landing-workflow-data.test.ts (8 tests) and e2e/marketing/landing-workflow.spec.ts. The 0.4 µL transfer and its top tube are no longer on the page. Ran 20 October 2026 on the B11-landing build at c0876792: 5 of 5 on desktop, phone and desktop-dark
REL-386 High Since 19 October (Gemini, f7614d3) readXlsx clamped every sheet to 5,000 rows and 256 columns (Math.min at src/lib/table/xlsx.ts:248-250) and returned it as read, with no issue, refusal or count; a 300-column, 5,200-row workbook came back as 256 × 5,000 with nothing said, and docs/technical/app-assay.md:370 stated that such a sheet was refused with too-many-cells. Long-format kinetic exports above 5,000 rows, which read in full before 19 October, lost their later rows Audit of 20 October 2026, reports/gemini-workflows.md C2 and evidence/gemini-workflows/probe-xlsx.mjs.txt; the CTO's ruling, docs/board/memos/2026-10-20-cto-audit-fixes.md, item 5 Data beyond row 5,000 or column IV vanished from an import silently, the truncation the design rules forbid (compare REL-267) Fixed 20 October 2026 on the B2-workflows branch (f8ac6330), closes when it merges: the clamp is gone; after a sheet's cells are read and before its grid is built, an extent past XLSX_MAX_ROWS or XLSX_MAX_COLS refuses the workbook with too-many-cells and an XlsxExtent detail (sheet, last used row and column, caps), worded by assayXlsxText.refused.tooManyRowsOrColumns. Tests in src/lib/table/xlsx-oracle.test.ts: 5,000 × 256 reads; 5,001 rows, 257 columns and the audit's 300 × 5,200 refuse; a single value at A5001, and at XFD1048576, refuses without allocating a grid. app-assay.md:370 is now true. Note: long-format kinetic exports above 5,000 rows now refuse rather than read in full as before 19 October (REL-387) None for the defect; the bounds are REL-387
REL-392 High Combination responses had no stale-result guard: evaluate.ts:44 stored inputHash: "", verifyCombinationResult had no caller, and display, export and recording used combination.result as stored; the only invalidation was in-memory. The dead cm link key was accepted and ignored Audit reports/combination.md M-3, Mi-2; the CTO's ruling of 20 October 2026, 6 A saved record whose result no longer matched its inputs could be shown, exported and recorded as current Fixed 20 October 2026 (6583651d): inputHash required, the hash of combinationInput of the exact sub-record stored; every evaluation in the one-job worker, an input change cancels and ignores a late answer; display (matches), the panel's and the menu's exports (readingsForExport with verifyCombinationResult) and recording (modeWords.combination.stale) check it; cm removed from assaySchema.params and SHARE_KEYS. Results stored with an empty hash between 18 and 20 October 2026 still read, fail verification and ask for a rerun; Study snapshots recorded in that window stay as history CSO: whether results recorded in that window need a visible qualification (the CTO's question)
REL-393 High The combination table import wrote an exclusionReason key on an excluded row, which the strict reader refuses, so a saved record with any imported exclusion could not be read back; a repeated observation ID had the same effect; a blank dose or response cell read as 0; a row with too few cells was skipped silently; problems were English sentences in src/lib src/lib/assay/combination/import.ts:149,159-167,188 at 232feefe; record.ts:126,129 Lost or unreadable saved work; a blank read as a measured zero Fixed 20 October 2026 (6583651d): excluded only; repeated ID, blank cell and short row refuse the table with a row-numbered code (IMPORT_PROBLEMS), sentences in content with a parity test; import.test.ts round-trips an imported exclusion through the strict reader —
REL-394 High The combination panel's chunk row assay-view-combination (19.8 KB, measured 19.6 on 232feefe, its comment's "17.2 KB plus 15 percent" stale) has about 0.2 KB of headroom, and the ruled 20 October work (raw path, guard, import codes and their sentences) adds an estimated 1.5 KB gzip (transpile, terser and gzip of the panel, its content, import and format modules: 8.8 to 10.3 KB); assay-combination-csv-family (1.1 KB, 0.9 measured) grows an estimated 0.2 KB to about 1.07. Not measured on a build (builders may not build) scripts/size-budgets/assay-analyser.json; CI size artifact of run 39428988408; the builder's estimates of 20 October 2026, made without a build The panel row likely turns red on the integrated build Open Measured on the integrated build of 20 October 2026 and ruled the same day: REL-434 and REL-435 (the CTO's size ruling of 20 October 2026); CTO ruling on the panel row (re-measure at the ruled scope, or split the design-and-data form and the results into two chunks with rows born green); the main-thread engine chunk on Apply no longer exists (evaluation is in the worker), which closes that half of the CTO's item 4(b)
REL-426 High Guided walks: Next could stay on "Working on step n…" for good. next() in walk-bar.tsx returned without clearing its busy state when the run stopped being current mid-step (another tab's run, a change of workspace scope), and a hand-off that never left the page had no bound. The CEO reported the J3 walk hanging on step 1 on production on 20 October 2026; it did not reproduce in a fresh signed-out Chromium (desktop, phone, second start, second tab), so the trigger in the CEO's session is not yet known. Fix commit b968fb7f A person following a guided walk could be left with no way forward Fixed on claude/funny-newton-g829ba: every non-leaving path clears busy; a 45 s watchdog stops the step, makes its closures stale, logs the stage it waited on and shows the failed line. The trigger stays open until the console line from an affected session names it. Name the trigger from the console line of an affected session; D-0105's rebuild keeps the requirement that the walk never stays on "Working on step n…". Owner: the coordinator, 20 October 2026
REL-439 High On a Vercel preview behind its login (Deployment Protection), every catalogue, the reagent table, the cell-line snapshot and Patent's data files were refused: their loaders fetched the site's own /data/ files with credentials: "omit", which drops the login cookie Vercel requires on every request. Without the compound catalogue, Molecule shows "The molecule identity could not be prepared. Retry before saving.", never offers "send to Calc", and the J3 walk's step 1 waited for that action (the CEO's report of 20 October 2026, on the branch preview, in two browsers) src/lib/search/catalog-client.ts fetchFile; src/components/tools/lab-calculators/reagents.ts loadReagents; src/lib/cells/snapshot-source.ts; src/apps/patent-exclusivity/data.ts fetchJsonFile; production (no login) and local builds were unaffected, which is why the walk passed there Previews could not be reviewed: Molecule identities, Calc reagents, cell lines and Patent data failed, and the walk hung on step 1 Fixed on claude/funny-newton-g829ba: the four loaders fetch with credentials: "same-origin", which sends cookies only to the site itself The walk rebuild (D-0105) should also hold Next until the step's own action is registered and show the page's error instead of waiting
REL-481 Medium The landing guided example auto-advanced every 2.8 s and wrapped round without end (landing-workflow-motion.marketing.tsx (activeStage + 1) % stages.length under a timer; Prev and Next also wrapped), and its status dot pulsed for ever (animate-pulse, not motion-safe:), against DS §7.1 rule 3 and §9.5 and D-0103's finite motion; the Replay key showed from first paint; shared-shell.md described Codex's finite controller Audit gemini-walk.md M1, M2, m7, M10; codex-landing.md M5; 6b8612f, 6b2467b, 57462cf Content that loops and auto-advances on the public page Fixed 20 October 2026 (90cc1840), to the CPO's ruling of 20 October 2026 (§2): one pass 1A to 3C on first visibility, 4 s a sub-step, stopping on 3C with "Walkthrough complete"; never under reduced motion, Save-Data, a hidden tab or the intro reel; any click, rail key or focus entering the scene stops it for good; one key reads Pause, Resume, then Replay; Previous and Next are aria-disabled at the ends and never wrap; the dot is static. Four browser tests on Playwright's clock replace Codex's replay test Superseded 20 October 2026 (3f71d3cb, REL-440): the scene has no player, timer, controls or motion at all; the four clock tests are replaced by one that runs a minute of the browser clock and finds no animation in the section. None; the rail and its arrow keys are gone.
REL-482 Medium "Verified" and a tick on the public page and in /landing.json: "Verified Formula Weight", "Formula Weight Verification", "✓ Weighed", "verified compound data", "Carry the verified salt mass", "Carried forward: Verified salt formula weight", with "HCl adduct", "free base", "fit limits" (stage 3 shows no fit) and a DMSO line not scoped to the plan; and a hand-drawn, chemically wrong erlotinib (an eight-vertex fused ring) presented as the 2D structure Audit gemini-walk.md M7, M8; codex-landing.md C2; the CSO's ruling of 20 October 2026 (docs/board/memos/2026-10-20-cso-audit-fixes.md §6) Claims beyond what the tools do, and a wrong structure, on the public page Fixed 20 October 2026 (88db2b9a, 90cc1840): the CSO's replacement wording throughout; a committed RDKit 2026.09.1 depiction of J3_VALUES.smiles, both fragments (pipeline/walks/j3/landing-depiction.py → erlotinib-hydrochloride-2d.svg, metadata checked by structure-source.test.ts), captioned "2D depiction generated with RDKit from the SMILES shown." beside the SMILES; stage 3 meets the CSO's seven sign-off conditions (source line; "The Broad made these plates; this example did not."). landing-workflow-data.test.ts refuses a typed digit, "verified", "verification" or a tick in the scene's words The RDKit depiction was removed 20 October 2026 (3f71d3cb, REL-440) with structure-source.ts, its test, pipeline/walks/j3/landing-depiction.py and the SVG, as the CSO's ruling allows; no structure is drawn on the landing page. The CMO uses the replacements as written or brings them back to the CSO (the CSO's Needs); "aligns your plan with published assay evidence" in the lede was left as it was; Keep the CMO item; add "the lede's 'aligns your plan' is REL-441".
REL-483 Medium The J3 walk's floating card (6f4ffe2, 232feef) hard-coded its z-indices off the DS ladder (card 58, scrim 50 at the skip links' level, tag 45 above the TopBar), kept its CSS transitions under OS reduced motion, ringed the target with a 1.5 px accent outline that reads as focus (DS §9.1), could sit over the focused element, the sticky sub-navigation or the docked Inspector (the sticky top no longer grows with it), dimmed the controls a person works with, typed "Evidence", "✓" and the CSS "Step " in the bar and the CSS, and its tests accepted a 4 px overlap without citing the change Audit gemini-walk.md M3, M6, M9, m3, m4; the CPO's memo of 20 October 2026 (docs/board/memos/2026-10-20-cpo-audit-fixes.md §1) Visible focus can be lost under the card (D-0080 keeps visible focus as built); motion under reduced motion; copy outside content Partly addressed 20 October 2026 (61ca1054): the CPO's eight interim fixes (z ladder as ruled; transition: none under both reduced-motion selectors; placement clear of focus, sub-navigation and Inspector, edge dock, bottom dock below 640 px with scroll padding; no accent ring; the scrim lifts on work outside the target; rail and tag words in content/walks via data-walk-step-label; the 4 px allowance removed and a focus-after-Tab check added to expectWalkTargetClear and its two copies; comments and shared-shell.md). The placement itself (the CPO recommends restoring her §2.5 sticky-top bar) is the CEO's decision. Not run in a browser The CEO decides the placement; the CTO replaces the 120 ms poll; run the walk specs (e2e/objects/j3.spec.ts, e2e/assay-analyser/plate-walk.spec.ts, e2e/molecule-workbench/nearest-walk.spec.ts, e2e/plasmid-map/cloning-walks.spec.ts) on desktop and phone; shell-bar.tsx:80 still calls the slot "under the bar in the sticky top" (read-only for this fix)
REL-382 Medium The walk card's interim fixes (REL-483) add an estimated 0.4 KB gzip to the walk bar's chunk, which measured 9.9 of 10 KB at 232feef (walk-chunk and walk-chunk-object-page, scripts/size-budgets/suite.json) A minify-and-gzip estimate of walk-bar.tsx (5,360 → 5,772 bytes) and content/walks/j3.ts (2,624 → 2,657 bytes) with Next's SWC, base and head; no build was run The size step will likely fail on the integrated head (about 10.2 to 10.4 KB of 10) Confirmed open (estimated) The CTO: measure on the integrated build; the budget is not raised (its comment sends an overage to the CTO). Restoring the CPO's sticky-top placement would remove most of the placement code
REL-387 Medium The .xlsx extent bounds (XLSX_MAX_ROWS = 5,000, XLSX_MAX_COLS = 256) were chosen by the builder on 19 October and nobody has reviewed them; with REL-386's fix they refuse rather than truncate, so a long-format kinetic export over 5,000 rows, which read in full before 19 October, is now refused, and the refusal applies to the whole workbook rather than the one sheet src/lib/table/xlsx.ts:28-29; the CTO's memo of 20 October 2026, item 5 ("the bounds themselves are the builder's and nobody has reviewed them; they are a follow-up") and its needs from the CPO and CSO A legitimate long kinetic export cannot be imported until the bounds are settled Open; owners the CTO (bounds against dense-grid allocation), the CSO (whether 5,000 rows refuses legitimate long-format data) and the CPO (wording, per-sheet or per-workbook) Rule on the bounds and the scope; a per-sheet refusal would let the other sheets of a workbook read
REL-389 Medium The notebook's methods control was relabelled "Copy methods and reference checks" on 19 October (Gemini, 9daaa6b) while it still copied recordedMethodsText(...), which holds no reference check, verification set or fixture line; two e2e specs and a unit test were changed to assert the new label Audit of 20 October 2026, reports/gemini-workflows.md M4; content/apps/workspace-recorded-methods.ts:2, src/components/suite/workspace/notebook-copy-control.tsx:72 A label that claims more than its action does (CPO red line 6) Fixed 20 October 2026 (09389aad), closes when it merges: the label is "Copy methods text" again (CPO memo of 20 October 2026, §6); the expectations in e2e/recorded-methods.spec.ts, e2e/improvements/stock-autofill.spec.ts and src/lib/methods/markdown.test.ts return with it, citing the memo. The methods dialog's "Copy methods and reference checks" is accurate and unchanged None
REL-395 Medium The combination import reads a decimal comma by replacing the first comma with a point, so in a tab-delimited table "1,000" reads as 1 and "1,234,5" as 1.234; contract 13 line 98 asks for a decimal-comma ambiguity fixture family, which neither published fixture has src/lib/assay/combination/import.ts (number: cell.replace(",", ".")) A thousands separator silently reads as a decimal Open The shared decimal-comma decision of src/lib/table/delimited.ts (contract 13 line 17), with a fixture case, CSO first
REL-396 Medium Contract 10's two size rows measure the forms' JSX only. calculators-cell-counting-chunk (1.8 KB) and calculators-dose-plan-chunk (1.5 KB) are keyed on the forms' markers. preparation/all.ts:10-11 imports both kind definitions statically, and through them the engines, readers, receipts and four content modules land in the bench-sheet chunk, which had no marker and no budget row Audit 2026-10-20, reports/counting-dose.md M7; the CTO's memo of 20 October 2026, item 3 ("M7 holds") Bytes moved where nothing measures them; the 17 October ruling ("kind definitions load on demand") is not met Partly addressed 20 October 2026 (e44815dd): BenchSheet.displayName = "drybench-island:calc-bench-sheet"; the two rows' $comments say "Form JSX only". The calculators-bench-sheet-chunk row was added at its first measurement on the integrated build of 20 October 2026 (2e35e3bf): 217,779 bytes gzip, maxKB 239.6, measured plus 10 percent rather than 15 by the CTO's size ruling of 20 October 2026, its $comment naming contract 10's definitions, and no releaseKB until the lazy-definition fix is measured Load the kind definitions on demand, about one developer day (CTO). The synchronous consumers of PREPARATION_KIND_DEFS must become awaited: bench-sheet.tsx (the counting bridge's calculate, line 1422; the CSV's kind definition in sheetRows, line 1806, at b68c8571) and src/components/tools/lab-calculators/model/preparation.ts:11,15 (preparationRecipe, preparationExample). In that commit, lower the bench-sheet ceiling to the new measured size plus 15 percent and add the import assertion to scripts/calc-chunk-imports.test.mjs
REL-398 Medium The Calc sheet CSV (calculators.csv, sheetRows) stamped the wrong method versions and listed other calculators' rows. Every row without an explicit version defaulted to "1.0.0", so the serial plan's rows said serial-dilution 1.0.0 beside the 2.0.0 engine, and the recipe table's rows said recipe-table 1.0.0 beside 2.0.0. calculatorInputRows listed every calculator's defaults whatever the task, and the answer sections did the same: a molarity sheet carried the default Tris pK at 4 °C Audit 2026-10-20, reports/gemini-wp.md M4 (bench-sheet.tsx:1776-1896, src/lib/dilution/serial.ts:110-115) and m1 (input-rows.ts:13-21); the answer-section leak and recipe-table were found while fixing them An export's method record named a superseded version, and a sheet carried rows of calculations not performed Fixed 20 October 2026 (2f0fdaf2). add() defaults to sheetMethodVersion(method), the method record's own version (blank for a row without a method); no version literal remains in sheetRows. Inputs and answers are scoped by sheetSectionApplies and TASK_KEYS, with the compound's rows on molarity, dilution and serial. input-rows.test.ts 5/5 (two existing tests now name the calculator each field belongs to; three new) —
REL-400 Medium Contract 11A: when two loaded sources failed validation or hash verification, the view dropped the refusal and showed the empty-slot prompt ("No growth-review dataset imported in this slot…") beneath two loaded slot cards Audit M2: views/measured-comparison.tsx:616 (readMeasuredComparison discards the code), :1330-1336; reachable by the aggregate cap with a large reference, a control character in a context field, or a stored snapshot failing its hashes A false empty state; the person was not told why the comparison was missing Fixed 20 October 2026 (c534e765) under the CPO's ruling (section 4): a warning banner "Comparison not shown" with the refusal sentence and "Both sources are kept as imported.", announced once, with "Remove simulation reference" when one is attached; "Checking both sources…" after 300 ms; emptyNotice with no source, oneSlotNotice with one. E2e case added (a control character in a context field) Run e2e/bioreactor-simulator/measured-comparison.spec.ts on the integrated build
REL-401 Medium Contract 11A's captured settings snapshot was written under the editable work's schema id and version with a different payload shape, and source-impact.ts accepted it by sniffing slotId and inputHash Audit M5: measured-comparison-capture.ts:140-149; src/lib/workspace/source-impact.ts:76-82 Two shapes under one schema id; a near-miss payload would have been read as scientific input Fixed 20 October 2026 under the CTO's ruling (item 7): a frozen engine-written legacy fixture first (9b90b2e9), then (c534e765) the settings id bioreactor-simulator.measured-comparison-settings v1 (kind measured-comparison-settings) with a closed reader in measured-comparison-settings.ts, readLegacyMeasuredComparisonSettings for snapshots saved before, the sniff deleted, a branch in result-projection-core.ts; result schema unchanged. Tests: writer emits the new id; legacy results verify, project and are found by source impact; a work payload under the settings id and a near-legacy shape under the work id are refused None
REL-402 Medium bioreactor-workspace-chunk is over its 137 KB interim ceiling on main's head. To get under it the 11A build had made PumpView and ResearchContextEditor lazy without markers, rows or loading fallbacks CTO memo of 20 October 2026, item 2: CI size artifacts read 137.2 (base), 137.1, 137.5, 137.3 KB, and a fifth reading of 137.5 KB on the integrated build of fa1a58b0+d48113e5 (the CTO's size ruling of 20 October 2026); audit M7: views/bioreactor-workspace.tsx:92-93 Failing on main's head (D-0074); the two lazy views rendered nothing while loading, and their bytes were unmeasured Partly addressed 20 October 2026 (c534e765): both views keep their extraction with markers (drybench-island:bioreactor-pump-view, drybench-island:bioreactor-research-context), retrying loaders with ControlLoading (the editor's fallback is its closed frame) and rows in scripts/size-budgets/bioreactor-simulator.json. Their maxKB values (1.3 and 1.4 KB) are PROVISIONAL: no build was allowed on the fix branch, so they are each module's own code minified by Next's SWC binding and gzipped (0.94 and 1.15 KB) plus 15 %. The 137 KB ceiling is unchanged and the workspace row remains over it. 24 October 2026: the CW-03/CW-04 storage branch's lever (snapshots.ts no longer imports work.ts) measures 138.4 → 130.9 of 137 on the CTO's local build; the Fast artifact confirms or corrects the reading Both maxKB values were replaced at their first measurement on the integrated build of 20 October 2026 (2e35e3bf; the CTO's size ruling of 20 October 2026, row 4): bioreactor-research-context-chunk 3.1 KB (2,686 bytes gzip: the editor and the suite Textarea, which the estimate left out) and bioreactor-pump-view-chunk lowered to 1.2 KB (1,025 bytes); the workspace row's fix waits for the pre-live pass (D-0048)
REL-403 Medium work-note-editor-chunk went from 3.0 KB to 4.3 KB against its 3.4 KB ceiling: views/measured-comparison.tsx, itself a next/dynamic chunk, imported WorkCaptureControls, giving the note editor's import() a second loading context Audit run-comparison F3 and measured-overlay M7; CTO memo of 20 October 2026, item 1; CI size artifacts on e1a52a4 and 232feefe Over budget on main's head, unrecorded Fixed in code 20 October 2026 (c534e765): the workspace passes its own WorkCaptureControls (and its lazy research-context editor) to the island as props; the island imports both as types only; scripts/bioreactor-chunk-imports.test.mjs asserts no value import and no reach to the controls or the note editor (2/2). Not measured (no build) The integrated build of 20 October 2026 read the row at 4.3 KB, not regressed: the measured list is the Bioreactor group's copy, which holds the suite Textarea (REL-438); bioreactor-measured-comparison-chunk grew from 31.4 to 33.4 KB, green under 36, from the settings reader and the 11A edits, which the CTO accepted (the CTO's size ruling of 20 October 2026); run the measured-comparison spec
REL-406 Medium e2e/protein-explorer/workbench.spec.ts:120 ("AlphaMissense: one row naming another residue withholds the whole entry and says why") failed both attempts on desktop and on desktop-dark in matrix 39149933087 (441b6cbc, the repaired Feature 9 head). Both failed on locator.click: Timeout 20000ms at the Sequence tracks tab (workbench.spec.ts:100, addMissense). Desktop-dark is listed in the baseline only under flaky (run 39113555422, no issue id). Desktop is in neither list. The Feature 9 records called the desktop-dark failure "outside the accepted baseline", omitted the desktop failure, and did not mention the run's five retry-passes, none of which has been appended to the baseline Job logs 117741344209 (shard 4, desktop) and 117741344123 (shard 12, desktop-dark), read through the GitHub API on 20 October 2026; docs/progress/e2e-baseline.json:508-514; audit reports/codex-protein.md finding 3; dated correction appended to docs/progress/protein-evidence-matrix-2026-10-18.md and 2026-10-18-protein-evidence.md (commit 397b8724) A Protein title is red on two projects and its cause is unassigned. Feature 9 inserted EvidenceAction into the same workbench pane (src/apps/protein-explorer/views/workbench/workbench.tsx:304), and unstable layout there has not been ruled out. The retry #1 call log says "element is not stable" Open (record corrected 20 October 2026) Today's matrix attributes it under the CTO's diff-touch rule (docs/board/memos/2026-10-20-cto-audit-fixes.md, item 10). If it also fails on 232feefe, add it to failures under this id with the run id, for desktop and desktop-dark. If it fails only with Feature 9's pane, Protein owns the fix. The next baseline update from a full run appends the five retry-passes of 39149933087: batch-statistics-actions.spec.ts:14 on desktop, phone and desktop-dark; stock-inventory.spec.ts:162 on desktop-dark; popup-close.spec.ts:72 on desktop. Owners: Protein (Feature 9) for the cause, the day's integrator for the baseline
REL-407 Medium Retained Protein evidence hashed a text-enriched PNG, not the screenshot. src/apps/protein-explorer/evidence-capture.tsx:48 ran insertPngText (title, capture time, source URL, provenance JSON) before prepareProteinEvidence, so the stored image.sha256 identified those bytes. This went against contract 09 (docs/design/product-expansion/09-protein-evidence.md:221-224) and the CTO's memo of 16 October (line 86) Audit reports/codex-protein.md finding 4; the CTO's audit-fix ruling 8 (docs/board/memos/2026-10-20-cto-audit-fixes.md) The stored image identity was not the captured screenshot's. There was no hash cycle, download was byte-exact and app-protein.md disclosed the behaviour, so integrity held but the ruling did not Fixed 20 October 2026 (B6, commit 53170957). Capture procedure 2.0.0 retains and hashes capture.png exactly as captured. The reader accepts 1.0.0 and 2.0.0 and refuses any other version as input.schema. 1.0.0 records (18 to 20 October) keep their bytes and hash, with no rehash or migration. They still verify and download byte-exact, and their history view adds one qualification from content (proteinEvidenceText.embeddedText), never stored. Unit test in evidence-record.test.ts Optional and not scheduled: a separately named annotated PNG export built from the stored bytes and captured facts, disclosing its own digest. The CPO to confirm the 1.0.0 qualification wording, which the CTO asked of the CPO and the CPO memo does not give
REL-412 Medium The 0.16.0 degenerate-v1.json set was recorded outside the oracle image, without R: the memo names R survival for the survival cases (as the 0.11.0 set) and R for the two-way case; they are exact-fraction log-rank and NumPy least squares (asserted against exact-fraction normal equations) instead, and the fixture's about.crossCheck says so pipeline/assay-analyser/oracles/degenerate_reference.py; which Rscript returned nothing on 20 October 2026; numpy 2.5.4, scipy 1.18.1, Python 3.13.16, no CPU-class pin The R cross-check the memo names did not run (the χ² = 5 case is exact either way) Open (20 October 2026): for the CSO The CSO to decide whether an R run in the oracle image is required; if so, a cross-check recorded in a later version (0.16.0 stays write-once)
REL-433 Medium assay-definition-chunk 37.5 KB of 36.2 (base 33.8) and protein-definition-chunk 20.1 KB of 19.9 (base 19.9): the verification sets and oracle rows added by B3 (6ef93a78, about 2.7 KB), B8 (96b63808, about 1.0 KB) and B9 (dc8dfa01/e91083c4) travel in each app's workspace entry though only the marketing pages read verificationSets The CTO's size ruling of 20 October 2026 (docs/board/memos/2026-10-20-cto-size-rulings.md, rows 1 and 5): 37,516 and 20,135 bytes gzip on the integrated build of fa1a58b0+d48113e5, against artifact 12268451157 (232feefe); the Assay sets verified in the build's registry-entry file Two rows red on the size step. Each new published set adds about 0.1 to 0.2 KB to the Assay row, so it stays red until the fix; the sets are audit M2's provenance fix and are not cut for bytes Open, a failure that remains on main's head once landed (D-0074); no maxKB raised The workspace's entry (assay-analyser.entry.ts used by entry.tsx, and the same for every app) stops carrying page-only fields; about one developer day; pre-live pass (D-0048)
REL-437 Medium walk-chunk and walk-chunk-object-page 10.5 KB of 10 (base 9.9): B1's interim walk fixes plus the REL-426 watchdog (b968fb7f, about +0.2 KB, unmeasured) The CTO's size ruling of 20 October 2026 (docs/board/memos/2026-10-20-cto-size-rulings.md, rows 7 and 8): 10,545 bytes gzip on the integrated build, which does not hold b968fb7f; REL-382's estimate. On the landed head 40e5a3b4 both rows read 10.9 KB (artifact 12312475855, run 39520902459): REL-444's toast clearance and REL-445's clearOfDockedCard (f972d63b, a9305999) landed after the ruling's measurement and add about 0.4 KB Two rows red on the size step; REL-426 fixes a production hang the CEO reported, so it lands Open, a failure that remains on main's head once landed (D-0074); no maxKB raised The D-0105 rebuild must land with both rows at or under 10 KB, as D-0105 requires; owner the D-0105 rebuild session, on its queue day
REL-440 Medium The landing guided example was overcomplicated and did not match the rest of the landing page: Gemini's stage rail and tabs, sub-steps, two-pane "app screen" panel, spotlight emphasis, playback key, one-pass timer and progress lines (754 + 416 component lines, 163 copy lines), after B1's fixes of 20 October 2026 (88db2b9a, 90cc1840) The CEO's request of 20 October 2026 ("the small example ... looks a bit overcomplicated, it was done by gemini and doesnt really fit with the rest of the landing page site"); before captures in the B11-landing scratch folder (before/guided-example-*.png) A busy, app-like scene on the public page, unlike the sections around it Fixed 20 October 2026 (3f71d3cb, c0876792): three static steps in the trust section's column style (rule, app mark and name, heading, sentences) above one card of key figures each, in a row on desktop with a subgrid aligning the cards, stacked at 375 px. Molecule shows both formula weights and the shortfall if the parent's weight were used (the walk's slot, the CSO's wording of 17 October 2026); Calc, labelled "Illustrative preparation plan · not measured results", shows the mass to weigh, the dilution series with its eight planned concentrations and the "In your plan" solvent line; Assay shows a small static plot of the 23 finite raw readings, the missing well from its row, the CSO's source line, "The Broad made these plates; this example did not." and the closed native table. No controls, timer, motion or client code; the motion controller, the RDKit depiction and its reader are deleted. /landing.json unchanged (version 4). Unit: landing-workflow-data.test.ts 8 of 8; browser on the c0876792 build: landing-workflow.spec.ts 5, motion.spec.ts 6 and suite-pages.spec.ts 68 (desktop, desktop-dark, 2 skipped each) and 70 (phone) passed, 0 failed The CPO and CMO review the captures (after/); the CPO records the CEO's request in docs/design/landing-page.md (a design-contract file this builder did not edit)
REL-444 Medium At 375 px a toast covered the docked walk card's controls: Calc's "kept as a recipe" toast at J3 step 3 sat over Next, so the walk could not go on (e2e/objects/j3.spec.ts:653, phone, failed in matrix 39506157213 shard 7 and in the reproduction on f7a33f87; it passes on 232feefe, where the bar was at the top). The toast stack (src/components/suite/overlay/toast.tsx) sits at the bottom, where B1's interim fix docks the card below 640 px The failure screenshot of the reproduction; the CEO's instruction to fix the matrix's failures A phone user could not press Next while the toast showed Fixed on claude/funny-newton-g829ba: under html[data-walk-spot][data-walk-dir="phone"] the toast stack rises by --walk-clear (the card's height plus 0.5 rem) The D-0105 rebuild keeps the same clearance for its bottom sheet
REL-445 Medium At 375 px the docked walk card covered the focused element and the step's target: after Tab (e2e/assay-analyser/plate-walk.spec.ts:180, "the focused element is clear of the card after Tab at step 1") and after "Go to the number" at J3 step 4 (e2e/objects/j3.spec.ts:653). scroll-padding-bottom does not move an element the browser already counts as in view, and "Go to the number" placed the target 88 px from the top regardless of the card Matrix 39506157213 (shards 5 and 7) and the rerun on the fixed head f972d63b (phone: these two failed, every other spec of the set passed); both pass on 232feefe, where the bar sat at the top Keyboard and "Go to the number" left the thing in question hidden on a phone Previously reported fixed on claude/funny-newton-g829ba by clearOfDockedCard. Reproduced again in matrix 39860397612 on 4e6b73094 and isolated main 24981a227 / build lsHD-TTUauFfrJjgKSsxZ: phone, focused element obscured after Tab at step 1, exact unchanged 10-second predicate at support/walk.ts:48. Owner the accessibility pass (D-0080), implementation repair the D-0105 walk rebuild. The test-only follow-up keeps the assertion failing, now soft and boxed at the same page state, so later refit/report/removal assertions can run; the focused follow-up reports this same soft focus failure at plate-walk.spec.ts:97 and a separate hard step-4 target-clear failure at :90; both reproduce on main with the identical harness. See REL-503; the later product checks remain unassessed On claude/core-workflow-finishing-oct24 (24 October), a bounded diagnostic identifies the actual focused First imported readings region: 377 px high, overlapping the phone dock by 32.672 px. The existing region receives a phone-walk-only measured-band height limit, retaining every preview row through internal scrolling and keeping the complete outer target. Final production evidence is recorded in docs/reviews/2026-10-24-core-workflows/README.md. The D-0105 rebuild keeps the same rule for its bottom sheet
REL-449 Medium e2e/reference-exports.spec.ts:8 fails at 375 px (project phone) on /assay/4pl-ic50-curve-fitter and /assay/ec50-hill-slope-agonist-fitter: after a figure download it taps Export on a Menu sheet that is closing The integrator's run of 20 October 2026 on 8564ff5e plus Wave 6, and the matrix that night; reproduced on 002ef831 both attempts The phone figure export is tested only up to its first format; the product is as ruled: a finished export closes the Menu sheet (the CPO's ruling of 12 October 2026, Menu sheet export close, landed with Wave 6 at 2bee5ca6), and the spec was written when the sheet stayed open Fixed 21 October 2026 on claude/sequence-wave6-export-fix: the spec waits, after each download, for the figure dialog and on the phone the sheet to close; e2e/smoke/menu-sheet-export.spec.ts:58 waits for the worked example before opening the Menu. No product change —
REL-383 Low Patent's place in the landing catalogue was typed twice: content/apps/patent-exclusivity.ts sets landing: false, while landing-catalogue.marketing.tsx appended getApp("patent-exclusivity") and e2e/marketing/suite-pages.spec.ts exempted the slug; and the landing page's MCP setup link was a literal ("/technical/mcp-server") beside a proxy comment saying the area is never linked from a public page Audit codex-landing.md M3, M2, m1, m2 A fact about an app outside the registry; a stale security comment Fixed 20 October 2026 (a4db556d, fbadae34): AppLandingPlacement with landingCatalogue?: true (only with landing: false; a @ts-expect-error test holds it), catalogueApps exported from content/apps.ts, both special cases removed, the spec filters on the field; technicalDocsHref("mcp-server"); the proxy comment names D-0103's one link. /landing.json keeps version 4; apps.items is now in registry order (Patent after Pipeline) The register notes that D-0103 amends D-0052 and D-0081 (codex-landing M2) were added to docs/board/decisions/README.md on 20 October 2026 (the CTO's memo of 20 October 2026, item 9)
REL-388 Low Copy named things that do not exist: the refusal guidance's Education links were labelled "Dose-Response Studio", "PCR Simulator" and "Mutation Explorer" (the tools are "Dose–Response", "PCR Lab" and "Mutation Lab", content/education-tools.ts), with a unit test asserting the invented names; the Assay guidance said "see negative result below" while the negative result renders above it; the share dialog listed "chromatograms" among inputs needing a portable file, a feature that does not exist on main Audit of 20 October 2026, reports/gemini-workflows.md M3 and m2; content/apps/refusal-guidance.ts:24,33,37,64 and content/apps/store-ui.ts:89-90 at 38b6278c Names a scientist cannot find; a pointer in the wrong direction; a feature promised that is not there Fixed 20 October 2026 (7d97c149, 09389aad), closes when they merge: labels are composed from EDUCATION_NAV[…].title (CPO memo of 20 October 2026, §6) and the test asserts them against content/education-tools.ts; no statement carries a position word (tested); "chromatograms" removed None
REL-390 Low Technical documentation contradicted the code it was changed to describe: app-calc.md:1003 gave the hand-off's qualifications bound as 6 strings of 240 characters (the reader allows 30 of 1,000, normalisation-samples.ts:98) and app-assay.md:1456 "up to 6 entries"; app-assay.md:360 listed "#?SAT" as a marker text (it is the pattern #?sat); app-assay.md:370 described an .xlsx refusal that did not occur (REL-386); app-sequence.md:777 said the guidance showed on refusal (SCI-174) Audit of 20 October 2026, reports/gemini-workflows.md M5 A team taking Drybench over would trust bounds and behaviour the code does not have Fixed 20 October 2026 (7d97c149, f8ac6330), closes when they merge: each passage rewritten with the code change it describes None
REL-391 Low RangeSelectorPanel (src/components/tools/assay-analyser/panels/import-panel.tsx:57) is loaded by next/dynamic with no loading fallback, so the space is blank while its chunk loads, and its chunk has no size-budget row The CTO's memo of 20 October 2026, item 4(b) A blank moment on a slow connection; growth of an unmeasured chunk would go unseen Partly addressed 20 October 2026 (f8ac6330): a "Loading the range selector…" status line ([data-range-selector-loading], copy in content/apps/assay-analyser.import-review.ts) stands in while it loads. The budget row assay-range-selector-chunk was added at its first measurement on the integrated build of 20 October 2026 (1,749 bytes gzip, maxKB 2.1, marker drybench-island:assay-range-selector; 2e35e3bf, the CTO's size ruling of 20 October 2026); the reading of record is the Fast chain's size step on the set's head Add the chunk's budget row, born green, from the integrated build's measurement
REL-397 Low The dose-plan receipt carries no titre, so requiredStockVolume = requiredQuantity / titre cannot be rechecked when a saved receipt is read. A saved stock volume of 42 L beside a valid quantity reads as valid Audit 2026-10-20, reports/counting-dose.md M2 (probe (c)); the CSO's memo of 20 October 2026, section 3 ("The dose receipt should also carry the titre ... That needs a new receipt version, which is the CTO's"); receipt-integrity-v1.json about.notCovered A historical dose receipt's stock volume is shown as captured, without an internal check Open (deferred): not done in this round, as the CSO ruled CTO: a dose receipt version that carries the titre (basis, value, per-volume unit), with its fixture first; old receipts keep reading under their version
REL-399 Low Copy and documentation defects in contract 10, and one Save label. The engine typed two user-facing bridge reasons, and one of them was never shown. "Hemocytometer" appeared twice. The labels were not the CPO's: "Target administration time" and "Target cell count". The form showed "(10c deferred)". The bridge dialog printed "500000", where the table prints "500,000". The oracle tests hard-coded 1e-9 instead of reading about.tolerances. app-calc.md named the method cell-counting-arithmetic, listed eleven dose refusal codes that do not exist and omitted six that do, gave Python 3.13.16 for 3.9.6 fixtures, said the tests ran against v2 only, and said the browser spec loads a worked example. On A280, buffer and the recipe table, the disabled Save key read "Save to Bench" where every other calculator reads "Save work" Audit 2026-10-20, reports/counting-dose.md m4, m5, m6, m7, M8; reports/codex-save.md m2; the CPO's memos of 17 October 2026 (labels) and 20 October 2026, section 5 (the Save label) Copy in code, a reference not British English, labels that read as instructions to administer, an unformatted number, and a technical page a team taking over could not trust Fixed 20 October 2026. e44815dd: the disabled key reads capture.save, stays aria-disabled with the live key's icon, and the reasons say "cannot be saved as work yet" and "a Study". d83dfe59: the reasons are in cellCountingNotes.seeding and shown in the bridge slot; "Haemocytometer"; the CPO's labels and matching prompts; no contract reference in the notice; the density formatted through displayValue; the tests read and assert the declared tolerance. 7025c241: the technical pages are corrected. The e2e expectations follow, each citing its change: counting-dose.spec.ts:83,125,130,139 and bench-app-tabs.spec.ts:74-75 —
REL-404 Low Contract 07A: after a pair check failed on a changed stamp, the surface retried, re-read the Study and showed the same pair again with no new choice when the result was filed as before (A→B→A), against the CTO's ruling that a reassignment requires another explicit choice. The button copy was typed twice, and the docs called a plain section "collapsible" and had no code-map row Audit run-comparison F8 (run-comparison.tsx:202, 240), F6 (workspace-run-comparison.ts:10-12 against workspace-experiments.ts:30-31), F7 (storage-and-state.md:550-551, docs/technical/README.md) A cited pair could be re-shown without the person choosing it again Fixed 20 October 2026 (d6dbd48b; F7's wording in c534e765): a result-membership failure clears both chosen results (run-comparison-selection.ts, unit test 4/4) and shows pairCleared until the person chooses again; the duplicate keys are deleted; the docs are corrected. E2e: a new A→B→A case; the existing reassignment case expects the cleared selection (comment cites the change) Run e2e/objects/run-comparison.spec.ts on the integrated build (it has never run in CI; audit F5); CPO: the pairCleared sentence
REL-405 Low Contract 11A minor items: the island composed its import sentence in the component (m1), showed the measured-review loading line (m2), formatted the union extent two ways (m3), and in comparison mode handed the shell the preset's share link (m6). Comparison mode lives in React state only, so a reload while unsaved returns to the start view (m7) Audit m1 (views/measured-comparison.tsx:690), m2 (bioreactor-workspace.tsx:95), m3 (object-tab.tsx, toFixed(2) against toPrecision(5)), m6 (bioreactor-workspace.tsx:596-605), m7 Copy in a component, wrong loading text, "−0.50 h" against "−0.5 h", a misleading share link; lost unsaved imports on reload Partly addressed 20 October 2026 (c534e765): m1 uses importedAnnounce; m2 uses measuredGrowthCopy.comparisonLoading (kept in the copy the workspace already loads, so the workspace chunk does not carry the comparison's copy file); m3 one formatter (formatComparisonNumber); m6 the workspace publishes shareable: false and the definition's share.available hides Copy link, with shareDisabledNotice in the view. Open: m7 m7 needs a bounded #s= mode token with a CTO ruling, or the CEO's acceptance
REL-408 Low A repeat save of older Protein work never adds its target as a Study material. Such manifests carry subjectRefs but have no material membership, and absence cannot be told apart from a deliberate removal, so the save preserves it (src/lib/workspace/save-work-subjects.ts:26 skips refs already in previousRefs) docs/technical/known-issues.md:716 (the prose "Compatibility limit"); save-work-subjects.test.ts test 8 ("legacy Protein"); docs/technical/app-protein.md, "Save work and Study retrieval"; audit reports/codex-save.md m3 A Study can hold Protein work without that protein among its materials until the person adds it Accepted limit of D-0102 (18 October 2026); a row since 20 October None planned. Add to Study is the explicit route. Revisit only if Study membership ever records removals
REL-409 Low A Work details note draft is lost when the window crosses the Popover/Sheet breakpoint: the responsive switch remounts the editor. WF-7's retained panel keeps the draft across close and reopen only known-issues.md:718 (the WF-7 bullet); src/components/suite/overlay/popover.tsx:265-266, drawer.tsx:174, src/components/suite/workspace/work-capture-controls.tsx:161-162,734,744, work-note-editor.tsx:21-24; audit reports/codex-save.md m3 An unfinished next-step note typed before a resize or a tablet rotation can disappear without warning Open (pre-existing; recorded in prose on 18 October, as a row on 20 October) Hold the draft above the Popover/Sheet switch: lift its state, or keep it in the work-draft store keyed by scope and work id. Add a resize test on desktop and phone. Owner: the shared Save controls' owner, with the CPO for the behaviour
REL-410 Low The cost of rendering a large Study is unmeasured. Study Overview's searchable contents renders every material card and saved-work row (src/components/suite/workspace/study-contents.tsx:17-20,37 renders visible in full, where the old preview capped at three). Each Molecule and Protein workspace's membership line also reads every Study, archived included (object-study-membership.tsx:9, useStudies({ includeArchived: true })) known-issues.md:716 ("Full-size Study rendering performance has not been benchmarked"); audit reports/codex-save.md m3 and its observations A Study with hundreds of members may paint slowly. No measurement exists either way Open (unmeasured) Benchmark a Study of about 500 materials and 200 works on the performance runner. Cap or virtualise the list only if it misses the two-second gate. Owner: the CTO for the measurement
REL-411 Low The shared helper src/lib/stats/degenerate.ts adds code to every chunk that carries Z′, the normalisers, screening, plate diagnostics, growth, qPCR, the groups models, survival or the thermal check; not measured (no build in the builder's worktree). Estimate: about 0.82 KB with comments stripped, about 0.4 KB gzipped, unminified (smaller minified), once per chunk The builder's estimate of 20 October 2026, made without a build; scripts/size-budgets/* not touched A tight row (the CTO's memo names the workspace row at its ceiling) could go over Unverified (20 October 2026): the integrated build of that day (fa1a58b0+d48113e5) attributes none of its regressed rows to the helper (the CTO's size ruling of 20 October 2026), which was not measured on its own Measure in the size step; if a row goes over, the CTO decides (the helper may move)
REL-421 Low The construct cropper's panel showed the aliphatic index only inside the paragraph that printed a tag's cleavage note, so an untagged construct, or one with His6, Strep-II, FLAG or AviTag-His6, showed no aliphatic index at all src/components/suite/protein/construct-cropper-panel.tsx:278-283 as it stood at 2bb0f02e (the index was rendered inside {profile.tag.cleavageSiteNote ? … }) A computed number the panel claims to show was withheld for five of the eight tag choices Fixed 20 October 2026 (branch worktree-agent-ab9704578bdd58177, b3bd5735): the notes block always carries the aliphatic index, with the cleavage note, the modification note and the initiator-Met note each shown when they apply —
REL-422 Low pipeline/protein-explorer/construct-cropper/reference.py rewrote its fixture on every run, including recordedOn, so rerunning the oracle silently edited a write-once fixture and scripts/check-write-once.mjs would then fail The script at 2bb0f02e wrote OUT unconditionally (OUT.write_text(...) at its end), unlike the other Protein oracles, which "refuse to overwrite an existing target" (docs/technical/oracles-and-verification.md, Protein oracles) A published reference could be changed by rerunning its own generator Fixed 20 October 2026 (898b149c): the script keeps construct-cropper-v1.json when it exists and refuses to replace construct-cropper-v2.json; publish refuses a version directory that exists or is already on origin/main —
REL-434 Low assay-view-combination 21.1 KB of 19.8 (base 19.6): B3's raw path with row roles, copy and the stale-result guard The CTO's size ruling of 20 October 2026 (docs/board/memos/2026-10-20-cto-size-rulings.md, row 2): 21,125 bytes gzip on the integrated build; the cause read from the diff (combination/import.ts, 112 lines of copy, the guard of the CTO's audit-fix item 6), not attributed module by module; REL-394's estimate The row is red on the size step Open, a failure that remains on main's head once landed (D-0074); no maxKB raised Load the raw-table parser on paste with await import() in the handler and its own row; about 0.25 day; owner the Assay combination builder; pre-live
REL-435 Low assay-combination-csv-family 1.2 KB of 1.1 (base 0.9): B3's declarations on every CSV row, which stay The CTO's size ruling of 20 October 2026 (docs/board/memos/2026-10-20-cto-size-rulings.md, row 3): 1,172 bytes gzip on the integrated build (combination/export.ts) The row is red on the size step; the declarations are SCI-178's fix Open, a failure that remains on main's head once landed (D-0074); no maxKB raised The CTO re-rules the row at the pre-live pass
REL-436 Low product-page-js 38.05 KB of 38.0 (base 38.0), not attributed: none of landingCatalogue, catalogueApps or verificationSets is in the page's first-load JS; within REL-42's noise The CTO's size ruling of 20 October 2026 (docs/board/memos/2026-10-20-cto-size-rulings.md, row 6): 38,050 bytes gzip on the integrated build 50 bytes over a ceiling, within build-to-build noise Open (20 October 2026) If the queue head's artifact reads 38.0, close this row; otherwise lighten the page at pre-live, as the row's $comment says
REL-438 Low work-note-editor-chunk 4.3 KB of 3.4 (not regressed): the CTO's item 1 diagnosis of the morning was wrong; the measured list is the Bioreactor group's copy, which includes the suite Textarea since ab89a086 made the editor lazy; copies in other apps measure 2.94 KB The CTO's size ruling of 20 October 2026 (docs/board/memos/2026-10-20-cto-size-rulings.md, the work-note-editor-chunk row): list 3yele5ghf4fap, the same file at base and head; the editor was a static import until ab89a086 (bioreactor-workspace.tsx:87 at e34c15e); the CTO's audit-fix memo of 20 October 2026, item 1 The row stays over its ceiling; REL-403's prop change was correct and its test stays, but it does not bring the row under Open, over its ceiling on main's head as on the base (D-0074); no maxKB raised Make ResearchContextEditor a static import again and delete its row (expected: note editor about 2.9 KB, measured comparison about −1.4 KB, workspace about +2.6 KB, re-ruled at pre-live); about 0.25 day; owner the Bioreactor builder, at pre-live or the next Bioreactor change
REL-441 Low The landing heading and lede promise more than the example shows: "From weighing a compound to fitting a curve." and "Follow one scientific question from the balance to the dose–response curve … then aligns your plan with published assay evidence — with zero manual copying." (content/apps/landing.ts:23-24, exported through /landing.json). The example now stops at the raw readings (the CSO's stage-3 condition 1: no fit, no curve); the fit happens only inside the walk. "aligns your plan" and "zero manual copying" were left as they were (REL-482) content/apps/landing.ts workflow.heading, workflow.lede; Gemini's own CMO memo of 18 October 2026 (2026-10-18-cmo-guided-example-redesign.md, a builder's claim, not a ruling) proposed them The section's promise and its example disagree; a reader may expect a fitted curve Fixed 21 October 2026 under D-0112 item 3 (builder B13's landing revision): the heading is "From the compound you weigh to the published plate readings." and the lede the CSO's shorter version, which leaves the fit to the guided example in Assay; "aligns" and "zero manual copying" are gone, with the CSO's six step fixes. landing-workflow-data.test.ts refuses "fit", "curve", "IC50", "potency" and "result" in the heading, absolutes in the lede, and "align", "match", "validat" and "confirm" anywhere in the workflow copy. The CSO clears the slot-filled strings before the change merges None, once the CSO has cleared the strings
REL-442 Low marketing-css stays over its budget after the simplification: the whole site's one stylesheet, measured 44.42 KB of 42 on the coordinator's build of claude/funny-newton-g829ba (20:42 UTC) size-check functions on /home/user/drybench/.next; B11-landing's builds at 3f71d3cb and c0876792: 44.21 KB; landing-js 55.46 to 53.13 KB of 64 The size step stays red on that row; this change lowers it but does not bring it under Partly addressed 20 October 2026 (3f71d3cb, 44.42 to 44.21 KB): the Gemini scene's own utility classes are gone (−0.2 KB gzip on a Tailwind-only compile of globals.css, before and after); the budget is not raised The CTO: find the remaining 2.2 KB in the shared stylesheet (it is the whole site's CSS, not the landing page's)
REL-486 Low Five size rows already over their ceilings grew by more than the CTO's 0.5 KB allowance between bc06b55d and 232feefe, readings in KB at bc06b55d / e34c15e / e1a52a4 / 232feefe / 40e5a3b4: pipeline-route-css 44.6 / 44.5 / 44.8 / 45.6 / 45.5 of 44 and marketing-css 43.4 / 43.3 / 43.5 / 44.3 / 44.2 of 42 (both grew after e1a52a4); sequence-island-motif-search 41.6 / 41.6 / 42.5 / 42.5 / 42.5 of 40, sequence-island-primer-check 48.6 / 48.6 / 49.3 / 49.3 / 49.4 of 48 and calculators-island-antibody-dilution 43.1 / 43.1 / 43.7 / 43.7 / 43.1 of 40 (the three islands grew before e1a52a4, with the refusal guidance of f7614d3 and 9daaa6b in their static import graph) The CTO's ruling of 20 October 2026, item 4 (a) (docs/board/memos/2026-10-20-cto-audit-fixes.md); size-measurements artifacts 12134139550 (run 39122553772, bc06b55d), 12146074406 (run 39154718053, e34c15e), 12227630334 (run 39336085376, e1a52a4), 12268451157 (run 39428988408, 232feefe) and 12312475855 (run 39520902459, 40e5a3b4), compared by the coordinator on 21 October 2026. marketing-css after the homepage simplification is also REL-442 Five rows over on the size step, up to 2.2 KB; the antibody-dilution island is back at its bc06b55d reading on 40e5a3b4, the other four are not Open, failures that remain on main's head (D-0074); no maxKB raised Each row is brought down by measurement, never by a raised ceiling: the refusal guidance comes out of the Sequence and Calc islands' static import graph (the CTO's item 4 (a)), and the two CSS rows with the CTO's stylesheet ruling; owner for placing the work the CTO
REL-485 Low assay-workspace-chunk grew 8.7 KB with no budget behind it, readings in KB at bc06b55d / e34c15e / e1a52a4 / 232feefe / 40e5a3b4: 271.9 / 272.1 / 279.7 / 280.8 / 280.9 of 300. The CTO attributes 7.6 KB of it to Milestone A and the refusal guidance (f7614d3, 9daaa6b; e1a52a4 holds no src/lib/assay/combination), on which the CTO was not consulted, and at most 1.1 KB to the combination panel, inside its 1.5 KB allowance (an estimate). The two lazy chunks the ruling named now have rows, both under their ceilings on 40e5a3b4: assay-range-selector-chunk 1.8 of 2.1 (REL-391 for its missing loading fallback) and assay-combination-worker 7.5 of 8.4 The CTO's ruling of 20 October 2026, item 4 (b) (docs/board/memos/2026-10-20-cto-audit-fixes.md); the same five artifacts as REL-486 The row is under its 300 KB ceiling, so the size step stays green, but the Assay workspace's first load carries 8.7 KB the CTO never budgeted Open (recorded) The CTO rules whether the 7.6 KB stays or moves to a lazy chunk; the Assay stage's next item takes it

Fixed by B6 without a row of their own, each found by the audit (reports/codex-protein.md, reports/codex-save.md): Protein finding 5 (744ab704: src/apps/protein-explorer/evidence-oracle.test.ts reads the mappings, confidence, camera.roundedLink and mismatch3ika sections of evidence-v1.json and evidence-v2.json against the product functions, 9 tests); finding 6 (8bec1a6c: the four size refusals give the measured size in bytes beside the limit and its remedy); finding 8 (0cffc070: the evidence reader refuses an unknown field as input.schema); Save m4 (2dd4bd03: four orphaned content/apps/study-dashboard.ts keys removed); Save m1 and m5 (fad99a9e: the Save contracts amended in place as the CPO worded them, primarySubjectSaved keyed by subject type). WF-1, WF-5 and WF-7 (18 October workflow review) were fixed in ac7238f, D-0102; see docs/reviews/2026-10-18-workflow/README.md.

Browser matrix of 20 October 2026: failures on main

Rows REL-460 to REL-466 were added on 21 October 2026 by builder B12-main-failures (Claude Opus 5.5) from the day's browser matrix (ci.yml run 39506157213 on claude/merge-queue-2026-10-20, queue head f7a33f87) and the coordinator's reproduction on a build of 232feefe: the failures that are main's own (they fail on main's build as well), each reproduced on a build of origin/main at 03d00d9f with one retry, its cause found and the commit that broke it named. Recorded elsewhere and not repeated here: e2e/reference-exports.spec.ts:8 at 375 px (Wave 6's phone export sheet; the Sequence coordinator's record of 21 October 2026 in docs/progress/roadmap-run.md, owner the Wave 6 builder), and e2e/assay-analyser/plate-walk.spec.ts:180 and e2e/objects/j3.spec.ts:653 on phone (the focus-not-obscured check at 375 px, recorded under D-0080 for the D-0105 walk rebuild in the merge record of 21 October 2026; REL-445 covers the shorter targets). REL-463 and REL-464 come from shard 11, which that matrix cancelled at its time limit, run to completion on a local build of 61917142 (main f1f03fbb's product code; this branch changes three specs outside the shard).

Id Severity Description Evidence Impact Status Suggested fix
REL-460 Medium e2e/inside-a-cell/tour.spec.ts:275 ("the product page's live preview opens at the example step and never writes the page's address") failed on every project: it still looked for the regulatory block's per-app lead ("Drybench Cell is off-the-shelf software for") and an eight-item #limits list on /cell. The About redesign (e1825c12, Codex, 18 October 2026; D-0103, "Remove the standalone limitations list from About; retain the existing documentation and concise policy statement") replaced both with the suite's one-line statement (landingCopy.trust.regulatory) and moved the limits to /docs/<app>; it changed product-pages.spec.ts to match but not this spec, and it landed (a57c618b) under the CEO's "skip tests and merge" instruction, with no matrix Matrix 39506157213 shards 2, 6 and 10, both attempts, expect(locator).toBeVisible at tour.spec.ts:278; reproduced on 03d00d9f (desktop, phone and desktop-dark, both attempts) The matrix showed red on three projects for a product that behaves as decided, hiding any real failure in this title Fixed 21 October 2026 (worktree-agent-a5121f273aee599c0): the expectation follows D-0103 and cites it: #regulatory holds landingCopy.trust.regulatory, the page has no #limits, and #open links the app's documentation (product-pages.spec.ts follows that link and checks every limit for every app). The test passes on desktop, phone and desktop-dark —
REL-461 Medium e2e/assay-analyser/keyboard-handoffs.spec.ts:131 ("Study Evidence › by keyboard: two runs of one export, saved, added to a Study, and the Evidence tab names the pair") failed on phone and was flaky on desktop: the spec's press focused Work details' "Save work" while it was still disabled, which does nothing, then waited 10 s for focus. Since the unified Save (ac7238f3, 18 October 2026, D-0102) that key is disabled until the destination picker, loaded when the details open, has loaded and validated the Studies (the CTO's memo of 18 October 2026, 2026-10-18-cto-unified-save-loading.md: "Disable destination confirmation until its picker has loaded and validated the selected destination"); at 375 px the picker took longer than the spec's first focus Matrix 39506157213 shard 5 (phone, both attempts); the trace: the locator resolved to <button disabled …>Save work at the focus, then enabled 0.05 s later and never focused; reproduced on 03d00d9f (phone both attempts, desktop flaky) A keyboard journey the matrix could not show green. The product is as ruled: a keyboard user reaches the key once it is enabled; nothing is lost or saved wrongly Fixed 21 October 2026 (worktree-agent-a5121f273aee599c0): press waits for the control to be enabled before focusing it, as a keyboard user does, with a comment citing ac7238f3 and the CTO's red line. The whole spec passes on desktop, phone and desktop-dark (9 of 9) CPO, at the accessibility pass (D-0080): whether a briefly unavailable primary key should be aria-disabled with its reason (focusable, as DS uses elsewhere) rather than disabled
REL-462 Medium e2e/marketing/product-hero.spec.ts:8 ("subject hero illustrations in light" and "… in dark") timed out at 45 s on desktop and desktop-dark: each test visited all ten About pages and took twelve captures. On the CI runners each scene capture took 2 to 6 s, so one test needed more than 45 s (the dark test on desktop-dark was in its tenth capture when the bound fell); every check had passed for every app before the timeout (all ten captures are in the failure folders). The spec was added with the About redesign (e1825c12, 18 October 2026) and landed without a matrix (REL-460) Matrix 39506157213 shards 2 and 10; the CI trace of the dark test (desktop-dark): ten navigations of 0.5 to 1 s, scene captures of 5.7, 3.6, 3.0, 3.9, 3.1, 2.7, 4.3, 3.0, 2.7 and 2.1 s, then the timeout; locally 16 to 28 s per test, flaky under load in the coordinator's reproduction. MarketingMotion holds no loop, and under reduced motion every scene settles, so the product is not the cause Two red titles on two projects, both from the test's grouping Fixed 21 October 2026 (worktree-agent-a5121f273aee599c0): one test per app and theme, with the same checks and captures; no timeout raised. 66 of 66 on desktop, phone and desktop-dark —
REL-463 Medium e2e/plasmid-map/cloning-walks.spec.ts:51 ("primer walk computes the selected pair, carries its product in a record and exports both mapped strands") fails on desktop and desktop-dark at step 3, in expectWalkTargetClear (e2e/support/walk.ts:31). After "Go to the part", the step's target (Sequence's Predicted PCR product section, which then has the focus) is 664.6 px tall and runs from 87.6 to 752.3 px of the 880 px viewport. The card has room on neither side of it, so it docks at the bottom edge (data-walk-dir="edge", 742 to 844 px) and covers the target's last 10.3 px. Between the 88 px top clearance that "Go to the number" scrolls to and the docked card there are 654 px, so no scroll clears the target. The check fails whenever the card overlaps the target's bottom edge at all: the CPO's interim fix 7 (61ca1054, 20 October 2026) removed 232feef's 4 px allowance. The edge dock is interim fix 3 (the same commit), on the floating card of 6f4ffe2 and 232feef (20 October 2026). Below 640 px the card docks to the bottom and clearOfDockedCard scrolls the target clear, so the phone project passes. This is the class of plate-walk.spec.ts:180 and j3.spec.ts:653 at 375 px (the merge record of 21 October 2026), here at desktop width Matrix 39506157213, shard 3 (desktop) and shard 11 (desktop-dark), both attempts: "expect(received).toBe(expected) … Timeout 10000ms exceeded while waiting on the predicate" at walk.ts:31. The 20 October queue's Wave 6 line had already seen it fail on main. Reproduced on 61917142 (main f1f03fbb's product code; this branch's three spec fixes do not touch this spec), desktop-dark, both attempts, in the local shard-11 run (REL-464). The boxes come from a probe of that build at 1408 × 880, identical in light and dark, with the focus on the target. docs/progress/e2e-baseline.json holds the title only as flaky on desktop-dark (as :52, no issue) A red title on two projects. A person sees the card over the panel's bottom 10 px, its padding and border below the last line of text; the panel's heading and all its text stay in view Open, recorded (D-0074) and not fixed here: the walk card and e2e/support/walk.ts are being rebuilt under D-0105 (builder B10, stopped, with uncommitted work in worktree agent-aecb963b4a5fc2583). The rebuild's new check (expectCardClear) says that a panel taller than the window cannot be cleared and asks the card to cover the least of it. Owner: the D-0105 walk rebuild. Under the baseline's rules this title now needs this issue and an owner on desktop-dark, and a CTO ruling to be added on desktop In the rebuild, by the CPO's order of protection (memo of 20 October 2026, 2026-10-20-cpo-walk-overlay-rebuild.md: the focus, then the target). One option within today's design: at desktop width, "Go to the number" puts a target that fits between the top bar (bottom at 61.6 px) and the docked card (here 680 px of room for 664.6 px) in that space, rather than always at 88 px. Never a larger allowance in the check
REL-464 Medium The browser matrix's shard 11 needs more than its job's 60 minutes on a slow runner. It is all desktop-dark, from molecule-workbench/workspace.spec.ts to search/catalogs.spec.ts (286 to 290 tests). In matrix 39506157213 it was cancelled at 60.3 minutes, 200 results in: its tests had 53.8 minutes after 6.5 minutes of setup, and 90 of its 286 tests got no result and no report. No spec hangs: on this branch's head the whole shard runs in 27.8 minutes locally, and no test takes over 109 s. Its files are the matrix's heaviest. REL-214 measured shards 3 and 11 (the same files on desktop and on desktop-dark) at 102 and 98 worker-minutes on 17 October. The job took 42 to 56 minutes in every recorded full run before (39076929838 to 39139495963: 47.5, 42.2, 56.3, 55.3, 48.9 and 42.3), so a runner about 1.25 times slower than usual passes the limit In 39506157213 the shard-11 runner took 1.53 times (tests without a viewer) and 1.63 times (with one) as long as shard 3's on the same tests: 183 matched, 99.0 against 62.4 worker-minutes. Across the whole matrix desktop-dark and desktop take the same time (median ratio 0.98 in 39139495963 and 1.04 in 39506157213). Shard 3 itself took 42.9 minutes of tests. Locally, --shard=11/12 ran on 61917142 (main f1f03fbb with three spec fixes outside the shard), on 4 cores with 2 workers and one retry as on CI: 290 tests; 277 passed, 4 failed, 9 skipped, 0 flaky; 27.8 minutes and 55.0 worker-minutes. On that runner CI took 2.33 times the local time per test (154 matched), which puts the whole shard at about 64 minutes of tests there. Shard 11's failures, all on desktop-dark and on both attempts: cloning-walks.spec.ts:91 and :130 (REL-27, in the baseline as :92 and :131); cloning-walks.spec.ts:51 (REL-463); and assembly.spec.ts:129 (REL-27 and REL-219). The last is in the baseline on desktop-dark only as flaky, so by the baseline's rule it joins failures there; its symptom, at :229, is the 30 s wait for "Designed assembly" that REL-219 records. In CI only, before the cancel, objects/work-draft-protein.spec.ts:92 failed on desktop-dark on both attempts (2.0 min and 40.2 s), with no error text because the shard wrote no report. It passes locally, in the shard and on all three projects with traces, where Discard to the Undo click takes 2.1 to 2.3 s, inside the Undo toast's 10 s. So it stays under REL-310 (the work-drafts row; owner the work-drafts builder). The four failing titles cost 4.0 worker-minutes locally with their retries A cancelled shard writes no e2e-report.json. The day's run is then incomplete for scripts/e2e-baseline.mjs, and the shard's last specs (reference-routes, research-communication, scientific-continuity and search/catalogs among them) go unread that day Open; owner the CTO (CI time limits). ci.yml is not changed here Proposed to the CTO, one of the following. (a) More shards: Playwright 1.56.1 splits a run by test count and has no shard weights, so at the slow runner's rate 14 shards bring the heaviest to about 55 minutes of tests and 16 to about 48, if the heavy files stay together. (b) A 75-minute bound on the e2e job. (c) The cure REL-214 names: fix REL-27's failing walks, which run twice
REL-454 Medium e2e/improvements/stock-autofill.spec.ts:66 fails at 375 px (project phone): its second export taps Menu while the sheet from the first is still closing, and the page behind a closing modal sheet takes no tap, so the Menu never opens and Export is never found Stage D's record of 21 October 2026 (D-0074), reproduced on a clean build of faaa9ff04; the same family as REL-449 The phone export flow is tested only up to its first export; the product is as ruled: a finished export closes the Menu sheet (the CPO's ruling of 12 October 2026, landed with Wave 6), and the spec, whose comment said the sheet stays open after its action, was written before Fixed 21 October 2026 on claude/sequence-rel454: the spec's exportMenu waits for a closing sheet to go before opening the Menu, and its stale comment is corrected. No product change: an inert leaving sheet was tried and is not needed (the spec passes without it, 16 of 16 with reference-exports and menu-sheet-export on phone) —
REL-484 Low On the product pages (/<app>) the live preview's frame (src/components/suite/marketing/preview-frame.marketing.tsx) was 16:10 up to 640 px whatever the window's height, so on a short window (a phone in landscape, a laptop under about 720 px) it was taller than the space below the sticky site header and the demo ran down the page past it: 479 px at 844 × 390 and 591 px at 1024 × 640, under a 68 px header The CEO, 21 October 2026; measured in Chromium on a local dev server The demo could not be seen whole; its status bar sat below the fold Fixed 21 October 2026 on claude/preview-frame-viewport-cap: the frame is capped at min(640px, 100svh - 6rem) with an 18 rem floor (296 px at 844 × 390, 546 px at 1024 × 640, 640 px from 900 px tall), and the live app scrolls inside it; DS §10.2's row amended None

Landing page revision, 21 October 2026 (D-0112)

Rows REL-467 to REL-473, and REL-489 to REL-491 from the CDO's merge review of the same day (the CDO's merge review of 21 October 2026, docs/board/memos/2026-10-21-cdo-landing-merge-review.md; REL-487, REL-488, REL-492, REL-494 and REL-495 are claimed by queued branches), were added on 21 October 2026 by builder B13 with the landing page revision of D-0112 (docs/board/decisions/D-0112-the-landing-page-leads-with-the-worked-example.md), from the CDO's landing review of the same day (docs/board/memos/2026-10-21-cdo-landing-review.md) and the CFO's (2026-10-21-cfo-landing-review.md), checked against the revised page on the builder's branch. Fixed in the same change, without rows of their own: Education's dose–response caption printed twice ("Prescribed curve · synthetic readings", then "Prescribed curve / synthetic readings"; the figcaption now prints the tool's caption once, and e2e/improvements/oct16-fixes.spec.ts follows), ↗ on the landing page's in-site links (Open, "Try the guided example", the closing band's links; they carry →, as Education's do, and ↗ stays on the dataset link that leaves the site, DS §9.7), and chart text below 11 px (the worked example's plot labels were drawn at about 9.3 px at 375 px and 30 px at 1,024 px, Education's teaching curve's at 9.9 px at 375 px; all are HTML labels now, and the drawings are capped at max-w-md in the worked example). REL-441 is closed above.

Id Severity Description Evidence Impact Status Suggested fix
REL-467 Low Light muted text (--color-fg-muted, #4a5b63) measures 6.63:1 on the canvas (#f6f8f7) and 6.21:1 on the tint (#edf1f0), below the CDO's 7:1 for muted text; the instrument palette's #44545e measures 7.36:1. On the landing page it carries the ledes, the card notes, the source line and the closing band's body text src/components/suite/tokens.css:19,22,27; the CDO's memo of 21 October 2026, §2 (a) and item 2 of "Off the design system" Long passages of secondary text below the suite's own contrast rule (WCAG AA's 4.5:1 is met; D-0080 holds no merge on it) Fixed 23 October 2026 on claude/landing-finish-oct23: CDO-approved Light muted #425159 in CSS/TypeScript and matching paper/print tokens; token and rendered theme checks pass —
REL-468 Low The worked example's two dose axes run in opposite directions: Calc's planned ladder runs from 10 µM down to 610 pM left to right, and Assay's plot runs from the lowest published dose up to 10 µM. The same dose is also written two ways ("610 pM" on the ladder, "0.00061034" µM on the plot) landing-workflow-j3.marketing.tsx (the ladder from dilution.json, the plot from doseX); the CDO's memo of 21 October 2026, §2 (b) Two neighbouring cards whose point is that the plan reproduces the published series show it mirrored and in different units Fixed 23 October 2026 on claude/landing-finish-oct23, CSO cleared: reverse only the copied display ladder; both graphics increase from low to high dose; original plan order, readings and plot coordinates preserved —
REL-469 Low The plot's tick labels print the fixture's raw values (15481.5, 0, 0.00061034, 10) with no unit beside them; the axis titles carry the units landing-workflow-j3.marketing.tsx (maxMfi, PLOT.floor, minDose, maxDose from landing-workflow-data.ts); the CDO's memo of 21 October 2026, item 6 Hard to read; no number is wrong Fixed 23 October 2026 on claude/landing-finish-oct23, CSO cleared: adaptive molar endpoint labels and grouped MFI ticks with visible units; exact table and tooltip values preserved —
REL-470 Low The landing page mixes corner styles: square catalogue cards, 3 px cards elsewhere (rounded-card), rounded-lg on Education's "Browse all education tools" disclosure and round icon keys in the header, where D-0086 set one corner language landing-blocks.marketing.tsx (LandingTools), landing-education.marketing.tsx, the CDO's memo of 21 October 2026, item 4 A small family inconsistency Fixed 23 October 2026 on claude/landing-finish-oct23: catalogue cards and Education disclosure use rounded-card; CDO rendered review accepted —
REL-471 Low The catalogue cards rise over 600 ms with a 110 ms stagger (data-marketing-catalogue, MS.draw), where DS §7.1 item 6 and §7.2 set a 60 ms stagger and keep 600 ms for signature moments. e2e/marketing/landing-catalogue.spec.ts:33 asserts the delays [0, 110, 220] src/components/suite/marketing-motion.marketing.tsx; docs/technical/shared-shell.md (Homepage catalogue selection and motion); the CDO's memo of 21 October 2026, item 3 Motion off the design system's tokens Fixed 23 October 2026 on claude/landing-finish-oct23: MS.move (300 ms) and 60 ms stagger; controller/spec agree and all three browser projects pass —
REL-472 Low The workspace's paid-entry line still prints a price figure: "The planned price is around £100 per year" (content/apps/workspace.ts:8, workspaceCopy.paid), shown by WorkspaceEntryBanner, the account page and Study recovery when account mode is on without a subscription. D-0112 item 7 removed the same figure from /pricing; the CFO's red line is no price figure on a public page until the pricing decision D-0061 calls for src/components/suite/workspace/entry-banner.tsx:49, account.tsx:60, study-recovery-controls.tsx:146; the CFO's memo of 21 October 2026 Not shown in the default browser Bench (D-0032 shows browserOffer and browserStorage instead); it would appear as soon as account mode is switched on Fixed 21 October 2026 by the coordinator at the merge of the D-0112 revision: the line now reads "The connected Bench requires a subscription. The final offer will be shown before purchase.", within the CFO's red line of 21 October (docs/board/memos/2026-10-21-cfo-landing-review.md §5) —
REL-473 Low The CSO asked on 21 October 2026 that the AI section's responseFields add "Refusals with reasons", because the dose–response tool withholds or refuses an IC50 the data cannot support (src/lib/mcp/tools/dose-response.ts); D-0112 did not take it up The CSO's memo of 21 October 2026, §2 (c); content/apps/landing-ai.ts Listing only output, versions and references implies that every call returns a value Fixed 23 October 2026 on claude/landing-finish-oct23: CMO/CSO-cleared “Refusals with reasons” in the visible/exported response list; planned status retained —
REL-489 Low In Dark the landing page's tint cannot be seen: the tinted ground (--color-sunken, #081711) measures 1.02:1 against the canvas (--color-canvas, #07140f), so the alternating ground (the tools and the AI section tinted, the rest on the canvas) shows only in Light; in Dark the page reads as one ground, its sections parted only by hairline rules and headings src/components/suite/tokens.css:636,639; the CDO's merge review of 21 October 2026, docs/board/memos/2026-10-21-cdo-landing-merge-review.md, change 3; the CDO's landing review of 21 October 2026, §2 (c) Section boundaries rest on rules and headings alone in Dark Fixed 23 October 2026 on claude/landing-finish-oct23: CDO-approved public Dark sunken #142a21; violet workspace override preserved; six rendered viewport/theme combinations reviewed —
REL-490 Low The 640 to 1,125 px layout of the worked example is one column: each card spans the column while its figures are capped at max-w-md, so at 1,024 px about the right 45 % of the Calc and Assay cards is empty. The two-column step layout from md (text left, card right), which the CDO offered as an alternative, is not built /tmp/claude-0/-home-user-drybench/0cc70254-b397-571c-a48d-7ae203533da9/scratchpad/landing-shots/after/sec-guided-example-light-1024x900.png; the CDO's merge review of 21 October 2026, docs/board/memos/2026-10-21-cdo-landing-merge-review.md, change 3 and "Choice 3" (accepted for this merge) Wide, half-empty cards at tablet width; nothing is cut or unreadable (chart text 12 px) Fixed 23 October 2026 on claude/landing-finish-oct23: md-to-lg step text/card columns at 2fr/3fr with natural heights; phone stacking and desktop aligned subgrid retained —
REL-491 Low Molecule's card on the worked example is 38 % full at 1,440 px (Calc's 56 %, Assay's 83 %): equal height at three columns spreads the room the Assay card sets over Molecule's key-figure and figure rows, and nothing may be invented to fill it (D-0112 item 4; the CDO's red line). The 8.5 % shortfall sits about 220 px below the two weights it comes from /tmp/claude-0/-home-user-drybench/0cc70254-b397-571c-a48d-7ae203533da9/scratchpad/landing-shots/measurements.json (light-1440x900); the CDO's merge review of 21 October 2026, docs/board/memos/2026-10-21-cdo-landing-merge-review.md, change 3 and "Choice 1" A sparse card beside two full ones; below the CDO's 75 % target (a judgement) Fixed 23 October 2026 on claude/landing-finish-oct23: CSO-cleared zero-baseline formula-weight bars from the existing fixture display values; salt/parent order, qualified shortfall and atomic-weight provenance retained —

Bench and Patent integration checks, 22 October 2026

REL-501 is already reserved for the queued Sequence view in the shared run record. The following rows use the next unreserved numbers after the Bench/Patent rows (REL-496 to REL-499).

Id Severity Description Evidence Impact Status Suggested fix
REL-500 Medium The non-gating Assay performance report’s 115-plate paste probe times out before placing the import: e2e/perf/assay-workspace-fit.spec.ts:93, title “a 115-plate paste (about 0.27 MiB) on the start: read and placed at CPU 4×, reported”, desktop, fails at line 114 selecting “Reader block to import” after 20 seconds CI run 39860397612 on 4e6b730945d8991f79669e5b68ac4407fad27283, performance artifact; the exact unchanged case reproduces on isolated main 24981a2270fa98407edab89f01ddf29e7fc41bd8, build lsHD-TTUauFfrJjgKSsxZ, same line and timeout. Original report and paired-main log are retained in docs/progress/bench-matrix-2026-10-22/. The performance spec, import panel and plate preview are identical between main and the candidate No 115-plate placement timing was obtained. The other two Assay report cases completed, and the separate Calc/Sequence timing checks passed. This is an inherited functional reporting-probe failure, not a missed numeric target Implemented on claude/core-workflow-finishing-oct24, 24 October 2026: a separate preview selector renders one complete map while retaining every parsed block, issue and import choice. Baseline diagnosis confirms a valid 117-option selector blocked by 115 simultaneously rendered maps (44,160 cells, 62,179 DOM elements) and multi-second main-thread tasks. Candidate verification is recorded in docs/reviews/2026-10-24-core-workflows/README.md; this is not a quiet-host timing claim Verify the unchanged 115-plate selection/import/Plate-map probe at CPU 4×, preserve every parsed reading and original selection semantics, and keep its bounds. Review single/all/channels/subtraction and replacement-source previews
REL-502 Low e2e/marketing/landing-catalogue.spec.ts:8 requires Patent’s About hero inside its homepage card, although the captured-store change restores Patent as a normally included landing app with its dedicated shorter catalogue description Run 39860397612, shard 2, desktop light and dark cases, both attempts at line 16. The CPO’s 18 October Patent-store memo approves the exact short card sentence and a different captured-FDA hero; D-0112 keeps the compact catalogue. The rendered card contains the approved alpha / independent-review-pending qualification A stale test expectation reports red for the intended product change; no incorrect rendered copy was established Expectation corrected on the integration follow-up: compare the complete canonical landingCopy.tools.descriptions["patent-exclusivity"] sentence, with the approved change cited; retain every inventory, order, layout, theme, navigation, export and qualification assertion. Focused verification pending. Original red results are retained, not added to the failure baseline Keep the exact catalogue-copy expectation and original red evidence with the CTO’s bounded-repair provenance. Exact-head Fast and final check totals are recorded separately from the original 4e6b730 matrix

| REL-503 | Medium | The phone plate walk’s target-clear predicate fails at step 4 after the existing first-step focus failure is reported softly: e2e/assay-analyser/plate-walk.spec.ts:90, called through line 140, in “The plate walk at 375 px: every target clear of the bar, the bar at most 300 px, no sideways scroll; Remove leaves nothing” | First observed in the focused follow-up to matrix 39860397612 on product 4e6b730945d8991f79669e5b68ac4407fad27283; the identical soft-focus harness on isolated main 24981a2270fa98407edab89f01ddf29e7fc41bd8 / build lsHD-TTUauFfrJjgKSsxZ reproduces the exact step-4 geometry failure after the same 10-second predicate. Relevant walk code, content, spec and oracle fixture have no committed difference. Both full error arrays and step-completion evidence are in docs/progress/bench-matrix-2026-10-22/plate-walk-soft-{candidate,main}* | Initial fit visibility, compound and count checks run, but oracle refit, report content, example removal, empty-storage and final CSP assertions remain unassessed. The target-clear check remains hard | Implemented on claude/core-workflow-finishing-oct24, 24 October 2026: measured sticky chrome, StatusBar and final dock height replace fixed clearance; the existing text disclosure compacts for fitting targets. The original baseline hard step-4 failure is reproduced: a 335 px target overlaps the dock by 39.922 px. Candidate full-journey outcomes are recorded in the core-workflow review. The closed disclosure also exposed secondary controls wrapping Leave onto a third row; reviewed two-row controls, 44 px touch targets and measured StatusBar anchoring reduce the phone dock from 234 to 176 px. The 335 px result remains complete. REL-445 has a separately diagnosed scrolling-region repair on this branch | Retain the complete target and all refit/report/removal/storage/CSP checks. Verify actual fitting-target clearance and ordinary scrolling for oversized panels without narrowing targets or changing predicates, allowances or timeouts |

| REL-504 | Low | Pipeline’s Patent hand-off test still expects NDA020690 to be absent from the synthetic store after the real capture is shipped | Matrix 39860397612, e2e/objects/send-to.spec.ts:252, phone, both attempts at line 262. Independent stdlib CSV reading of pinned capture 2d0b7be9 confirms N/020690 ARICEPT / DONEPEZIL HYDROCHLORIDE, products 001/002, at source physical lines 15360/15362; the real served shard retains those rows | A correct Pipeline arrival at Aricept is reported red by the obsolete missing-product expectation | Fixed in the test-only follow-up: preserve row action, arrival/source label, cleared query, sent application and combined object reference; assert exact Aricept heading, application identity, review-pending notice, canonical fragment and no missing-product alert. All three projects pass, one worker, zero retries/failures/skips/flakes. Unknown NDA999999 remains covered in Patent’s workspace spec | Retain the captured-product expectation and original matrix failure with the CPO/CTO product-change citation; no source, fixture, copy or timeout change. Exact-head Fast and final totals are in the dated check evidence |

Protein Stage F review — 24 October 2026

The charter seats' review of Codex's Stage F work as landed (ec0b3d355), checked on main at 0489ba5e. Review, evidence and fix list: docs/reviews/2026-10-24-codex-protein-review/README.md (findings P-01 to P-16); seat memos docs/board/memos/2026-10-24-{cso,cpo,cto,cdo}-protein-codex-review.md. No product code was changed by the review.

Id Severity Description Evidence Impact Status Suggested fix
PRC-22 High Protein Stage F reached main without the check chain on the landed head and without its seats' merge conditions met, although CLAUDE.md requires the checks to run before merging even when the CEO asks to skip them Fast 40078336348 on ec0b3d355 and 40078473201 on bcb7edda4 cancelled; browser run 79 passed / 3 skipped / 2 interrupted / 132 not started, desktop-dark 0 (docs/progress/protein-merge-final-checks/interrupted-browser-summary.json); conditions at docs/board/memos/2026-10-24-cto-protein-merge-final.md:34-36 and 2026-10-24-cso-protein-merge-final.md:5; the line "three-project browser acceptance … recorded" in the Stage F mapping section below D-0055's sign-off never applied to the landed tree; browser regressions on Protein could be undetected Closed on 25 October 2026 (claude/stage-f-exit): D-0129 records the landing and that its sign-off did not apply; the Protein browser projects on all three projects were run and recorded on 19adb348 (352 passed, 0 failed) and on every later Stage F landing (merge records in docs/progress/roadmap-run.md); the "recorded" line in the Stage F section below is corrected —
PRC-23 High No decision record exists for Stage F's start, its Astra/Sol model routing, the use of Codex agents in place of the charter's seats, or the partial landing with its check waiver docs/board/decisions/README.md (no Stage F entry; stages A–E and G each have one, D-0116 and D-0118 recording non-Claude officers); docs/board/charter.md:6; docs/roadmap-v0-depth.md:2865-2866 D-0055's CSO/CTO sign-off was given by agents the charter does not name; a successor cannot tell which rulings bind Closed on 25 October 2026 (claude/stage-f-exit): D-0129 (record only, the CEO's option 1) covers the start, the Astra/Sol routing, that the Astra rulings are not ratified, and the landing. Attribution for non-Claude vendors stays open as Q-161 (the CEO) —
SCI-243 Medium The residue-map oracle refuses above 20,000 co-optimal alignments while the runtime accepts any count up to 10,000 residues and 10⁷ cells, so the runtime is untested in a regime users can reach (two or three indels in long repeats) pipeline/protein-explorer/residue-map/reference_v2.py:32, :133-135; hardest case 4,096 optima on 31×25 (:209-210); src/lib/protein/align/correspondence.ts:23-81 A tie-handling error at high optimum counts would transfer pLDDT to the wrong residue without any test failing Fixed on claude/stage-f-finish, 24 October 2026, by the CSO's route (a): a second, non-enumerating reference (reference_v3.py, exact-integer path counts, verification 0.8.0, committed before its runtime test). It reproduces all 47 v2 cases and agrees with full enumeration at 16,384 and 20,000 optima. It adds 4^8, 4^40 and 5^499 optima (3,000 by 3,000) and three real revised AlphaFold DB/UniProt pairs. src/lib/protein/residue-map-v3.test.ts matches all eight. Still not shown for inputs outside these cases, as the method text says A non-enumerating second oracle (big-integer path counts) and a new write-once set: >20,000 optima, a tie-rich ~3,000×3,000 case, two real revised-sequence pairs
SCI-244 Medium Protein's copy says experimental selection "uses SIFTS" and "SIFTS mapping for experimental chains" beside the strict predicted rule, but the live path is PDBe SIFTS segment ranges with a constant offset per segment and an in-app split heuristic content/apps/protein-explorer.workspace.ts:210, :400; content/apps/protein-explorer.ts:40, :67; src/components/tools/protein-explorer/structures.ts:318-335, :368-459 Implies residue-level rigour the experimental side does not have until F-2 lands Fixed on claude/stage-f-finish, 24 October 2026, in the CSO's words (docs/board/memos/2026-10-24-cso-protein-optima-cap.md, ruling 2): the copy names PDBe SIFTS segments with gaps placed by sequence comparison; the pill reads "SIFTS-based mapping" only for a chain with segments, "Chain not mapped" for none and "Mapping unavailable" for a failed request. Residue-level mapping remains F-2 Reword until F-2 lands ("SIFTS segment ranges … residue-level mapping not yet built"); pill "SIFTS segments"; CSO and CPO wording
SCI-245 Medium protein.residue-map is labelled "unverified", defined as "No comparison has been recorded, and the app withholds the result", yet it has a recorded 47-case comparison and its result is shown; protein.source-confidence has no method record content/apps/protein-explorer.methods-sheet.ts:30, :38; content/apps/methods-sheet.ts:189-191; content/apps/protein-explorer.ts:276 The methods sheet misstates the evidence behind a shown number Fixed on claude/stage-f-exit, 25 October 2026, in the CSO's words (docs/board/memos/2026-10-25-cso-protein-stage-f-close.md): protein.residue-map verified against 0.5.1 and 0.8.0; protein.source-confidence@1.0.0 method record added, verified against 0.6.0; capture 3.0.0 unit-tested —
SCI-246 Low The pLDDT legend read "above 90" and "70 to 90" while the rule is ≥90/≥70/≥50; the methods entry claimed agreement with Google DeepMind's bands; a regional mean carried a band label; the predicted viewer's provider fractions had no label (review P-15) src/components/tools/protein-explorer/alphafold.ts:59-62; content/apps/protein-explorer.docs-entries.ts:15, :49; src/apps/protein-explorer/views/dossier/region-card.tsx:38; src/apps/protein-explorer/views/workbench/workbench.tsx:259-266; alphafold.test.ts:200 A scientist reads a cut-off, an agreement or a category the method does not support Fixed on claude/stage-f-exit, 25 October 2026, in the CSO's words (docs/board/memos/2026-10-25-cso-protein-stage-f-close.md, R5 items 1 to 4): legend "90 and above", "70 to below 90", "50 to below 70", "below 50"; the methods entry states the boundary rule and that some viewers place 90 and 70 in the lower band; no band on a range mean; "Provider-reported fractions of the source model" beside the legend; the test is named for the boundary rule, its assertions unchanged —
REL-538 Medium A Protein range readout with no transferable score joins the whole-protein coverage ("pLDDT shown for 80 of 101 UniProt residues") to the selection count ("0 of 2 selected residues …") in one field, assembled in components src/components/tools/protein-explorer/residue-card.tsx:111; src/apps/protein-explorer/views/dossier/region-card.tsx:38; src/apps/protein-explorer/confidence-feedback.ts:18-19; docs/progress/protein-f1b-checks/final-adverse/375-dark-partial-zero-contributors.png Two denominators in one field invite a misreading; copy composed outside content Fixed on claude/stage-f-finish, 24 October 2026: one rangeReadout(state, selected) in content/apps/protein-explorer.confidence.ts chosen by rangeConfidenceState (CSO ruling 3); a count only once settled, no whole-protein coverage; e2e/protein-explorer/confidence.spec.ts:64-66 follows the product change One content function with the selection denominator only; coverage stays in ConfidenceNotice
REL-539 Medium Protein drops an incoming shared range: its URL schema has no range, its inbound object rule forwards only id, and deepLinkParams omits it, while Protein itself emits range outbound. The shell shows "Ignored range: this app does not read it." (seen in the review's browser walk), so the drop is disclosed but the region is lost src/apps/protein-explorer/url-schema.ts:48-68; src/apps/protein-explorer/objects.ts:25, :83; content/apps/protein-explorer.ts:101; Stage F continuity inventory below A region sent from Sequence, Plasmid, Calc or a shared link arrives without its region (D-0061 item 3 defect) On main since 24 October 2026 (29ca7776): Partly addressed on claude/stage-f-finish, 24 October 2026: Protein admits range (schema, deepLinkParams, objectInbound.target) as an alias of sel under the reviewed F5 rules (selection-admission.ts, hand-derived cases first): sel wins with a note; a dropped malformed sel blocks the alias with a note; an accepted alias becomes sel; any request partly outside the entry is refused whole with its reason, never clipped. Remaining: Back/Forward restoration of a malformed sel beside a range, which needs the shared URL-store admission snapshot the CTO memo of 24 October describes (owner coordination first), and the F5 browser walks from Sequence and Calc. Closed on claude/url-admission-2: the Back case (an entry without history state carrying a malformed sel and a valid range) used to apply the alias, because the shared store's address-fallback restore discarded the fresh dropped-key list and Protein read the historical url.inbound.dropped. The store now publishes the current navigation's admission ({ dropped, token }, src/components/suite/store/use-url-state.ts, the CTO-approved scope in docs/design/protein-f4-f5-reviewed-brief.md), which Protein reads; e2e/protein-explorer/dossier.spec.ts "F5, Back without history state" proves it F5: admit range as an alias of sel with whole-bounds refusal; until then mark the round trip planned on the senders' side
REL-540 Medium The desktop-dark Playwright project sets only colorScheme: "dark"; under D-0035's Light default no Protein spec or shared helper sets suite:theme, so the project renders Light for those specs. Corrected count (CTO memo of 24 October 2026, the desktop-dark project): of the 189 of 252 spec files that never mention suite:theme, 82 get Dark from folder fixtures (75 Assay via e2e/assay-analyser/theme.ts, 7 via e2e/improvements/theme.ts) and 6 are perf or account-only, leaving 101 spec files that ran in desktop-dark with no Dark set anywhere, 13 of the 15 Protein specs among them; the light default dates from d4c434828 (7 October 2026) playwright.config.ts:103-105; docs/progress/protein-stage-f.md:441-445; docs/progress/protein-f1b-checks/confidence-worker-images/desktop-dark-*.png byte-identical to desktop-*.png Dark-theme regressions on Protein surfaces pass the browser projects Fixed on claude/codex-issue-repairs (25 October 2026): adopted abfe8078 project stored-Dark preference, probe and fresh-storage opt-out, preserving newer main workflow limits. Current handover section 4.7 authorises the repair under D-0135; historical nightly hold superseded. Project probes must pass before landing. CTO to rule: set suite:theme=dark for the project or in the shared fixture, re-run, record failures under D-0074
REL-541 Low The residue-map worker's own {error} replies fail response validation and are reported as a malformed "message" rather than a worker failure src/components/tools/protein-explorer/residue-map.worker.ts:12, :15, :33; residue-map-client.ts:32 Diagnostics name the wrong cause; the user copy is the same Closed on 25 October 2026 (claude/stage-f-exit): residue-map-client.ts settles a reply that is exactly { error: string } as "worker"; anything else invalid stays "message" (residue-map-client.test.ts) —
REL-542 Medium Fifteen Protein browser cases fail on main at 0489ba5e because their Save step still looks for a "Save work" button; the unified Save (5d02f522, D-0120) renamed it "Save" without updating Protein's specs, so recording, offline reopening and byte-identical export of retained evidence go unexercised e2e/protein-explorer/confidence.spec.ts:47 (fails at :77) and the four e2e/protein-explorer/evidence.spec.ts:24 cases (fail at :102), each in desktop, phone and desktop-dark: TimeoutError: locator.click … getByRole('button', { name: 'Save work', exact: true }); error context shows button "Save"; label was "Save work" at ec0b3d355 (content/apps/workspace-work.ts:48). Baseline docs/progress/e2e-baseline.json lists only the phone "experimental fallback" case (REL-509) Stage F's capture 3.0.0 evidence path has no passing browser coverage on main Closed on claude/stage-f-finish at 19adb348 (main f1d5fc78 merged in, carrying CW-05a and CW-05b): all 15 cases pass, confidence.spec.ts:48 and the four evidence.spec.ts:25 cases in desktop, phone and desktop-dark (Protein browser projects 352 passed, 0 failed, 14 skipped, 24 October 2026). Earlier: CW-05a fixed the button name; the confirmation text followed with CW-05b —
REL-543 Low With PDBe's structure list failing, the workbench's entry picker kept "Loading the PDB entries" while the status line said the list had failed src/apps/protein-explorer/views/workbench/entry-picker.tsx:29 (any status but "ready" read as loading); found in the Stage F routine-week re-walk of 25 October 2026 with mappings/** returning 503 A source failure looked like a slow load Fixed on claude/stage-f-exit, 25 October 2026: the error state shows the workbench's existing "PDBe unavailable"; workbench.spec.ts "a failed PDB structure list says PDBe is unavailable, never loading" —
MNT-206 Low The residue-map policy and its limits (10,000,000; 10,020,001; 12,582,912) are typed again in the protocol, client, worker and binding, and validators and the F-2 reference scripts are written in single lines of up to 1,197 characters src/components/tools/protein-explorer/residue-map-protocol.ts:76, :85, :93, :118; residue-map-client.ts:48; residue-map.worker.ts:24; pipeline/protein-explorer/experimental-map/receipt_v1.py, bounded_scan_v1.cjs A policy change silently rejects every result; the frozen F-2 oracle cannot be reviewed line by line Partly closed on 25 October 2026 (claude/stage-f-exit): the limits are named once in src/lib/protein/residue-map-limits.ts for the protocol, client, worker and binding, and pinned equal to RESIDUE_MAP_POLICY by residue-map-limits.test.ts (the engine keeps its own values under its ./align/*-only boundary). The F-2 reference republication closed on 25 October 2026 (claude/stage-f-f2-live): pipeline/protein-explorer/experimental-map/readable/, published as verification 0.10.0, is formatted one statement to a line (syntax trees identical to 0.7.0's), names the mapping limits once in limits-v1.json, pinned to src/lib/protein/experimental-map-limits.ts by experimental-map-limits.test.ts, and reproduces 0.7.0's three outputs byte for byte on CPython 3.12.3 and 3.13.17. The dense 0.7.0 originals stay unchanged, as that publication's pinned sources. Open: the single-line validators in src/ Split the validators
MNT-207 Medium Stage F committed 25.7 MB in 317 evidence files (raw gzipped logs and harnesses, two review tarballs of 1.94 and 2.08 MB, a 1.12 MB report, two unreviewed TypeScript modules in a tarball), and some images misstate their content docs/progress/protein-f1b-checks/ (237 files, 19 MB), protein-f2-checks/ (21, 4.1 MB), protein-stage-f-checks/ (23), protein-merge-final-checks/ (36); confidence-worker-images/ pairs with identical md5 across themes and states; CTO rule A of 24 October (yardstick; it post-dates these commits) Checkout and deploy weight; acceptance resting on images that do not show the claimed state; source outside lint and review Fixed on claude/stage-f-finish, 24 October 2026: 199 files (16.0 MB) removed from the tree, leaving 118 files and 9.82 MB (plus a 59 KB manifest, docs/progress/protein-stage-f-evidence.json, with each removed file's bytes, SHA-256, git blob and reason, retrievable at b1ecbdc4). No tarball or unreviewed source remains in the tree; the mislabelled worker images and the superseded sets are among those removed. History is not rewritten WIP modules to a branch; with the CEO's approval remove the tarballs and over-cap report from the tree; index mislabelled images; never rewrite history
MNT-208 Low protein-workspace-chunk grew 0.4 KB from Stage F's review fixes P-05/P-06 (a80310a2), against the charter CTO's red line on further growth of that chunk Local builds: 163.3 KB on 0489ba5e, 163.7 KB at a80310a2 (ceiling 166.7); proof on the queued head from the Fast chain's size-measurements artifact against origin/main's, quoted in the merge record Headroom left for F2–F5 shrinks to about 3 KB Accepted by the CTO on 24 October 2026 (docs/board/memos/2026-10-24-cto-protein-workspace-chunk-growth.md, items 1 and 4) as the last growth Stage F takes in this chunk; F2 live loads only lazily, F5 queues only at zero net growth, F3 and F4 offset any bytes in the same commit. Rebalanced on 24 October 2026 under the CTO's addendum (docs/board/memos/2026-10-24-cto-bioreactor-b2-engine-landing.md), for this pair of rows only: the two Record labels moved to content/apps/protein-explorer.evidence-prepare.ts, so the capture copy loads with Record; protein-workspace-chunk ceiling 166.7 -> 165.5 KB and protein-evidence-capture 22.2 -> 23.4 KB in one commit (2bc7c577), a transfer, not a raise. With F5 included the chunk measures 162.8 KB against main's 163.5 KB (2ee94280), so F5's growth is offset. On 25 October 2026 the CTO accepted the shared URL store's admission field (claude/url-admission-2) as suite infrastructure under the brief's approved scope, and its correction of F5 in this chunk (162,062 → 162,203 gzip bytes, local builds against main c9dc2791; the Fast artifact's figure goes in the merge record) under the growth memo's item 1. protein-workspace-chunk does not exceed 162,203 gzip bytes on any later Stage F landing; anything above it is offset in the same commit, corrections included Hold the line: measure every Protein change against this chunk before queuing
MNT-650 Medium The Fast chain's check job runs npm test as one serial node --test call, about 10 min 22 s on 24 October 2026, and the whole job 16 to 20 minutes by runner speed, so two runs with every step green were cancelled at the 20-minute cap Runs 40135689134 (claude/vibrant-bohr-nbeou0, cancelled at 22:07 UTC three seconds after "Complete job") and 40132324950 (main 688ed4ce, cancelled at 21:21 UTC); the CTO's memo docs/board/memos/2026-10-24-cto-fast-chain-cap.md A cancelled run is no record of a green chain (fast.yml's tested job accepts success only), so a slow runner costs the whole run and delays every landing under D-0135; the chain is about 22 runner-minutes a push, not the 10 on record Open; the cap is 30 minutes from 24 October 2026 (the CTO's memo); owner CTO Run npm test in a job parallel to the build (one more npm ci; wall time about 20 to 12 minutes) after reading per-file durations from the log for fixture tests that belong in scheduled.yml; estimated half a developer day
PRC-24 Low Protein's version and changelog were not updated for the exact-only pLDDT change and capture 3.0.0; the newest entry is 0.3.0 of 18 October content/apps/changelog/protein-explorer.ts:10; content/apps/protein-explorer.ts:32 The registry's version no longer describes what ships Closed on 25 October 2026 (claude/stage-f-exit): the registry reads 0.4.0, updated 2026-10-25, and the changelog has the dated 0.4.0 entry covering exact-only pLDDT, capture 3.0.0, F5 range links, F4 comparisons and the F3 construct and PAE changes —

Stage F independent-reference CommonJS lint — 24 October 2026

Fixture-only Fast40075918544 preserves published data but fails lint with22 no-require-imports errors: three executable independent Node CommonJS tools and their exact public0.7.0 mirrors. Scientific replay, publication hashes, 24 Python/seven resource/six publisher-guard/two Node checks pass. Frozen files cannot be edited merely to add inline lint directives. The CTO-approved repair classifies exactly those six paths as CommonJS and disables only the TypeScript require-import rule there; every other lint rule remains active. Two unused-crypto warnings remain alongside the12 inherited warnings. Full local lint after the repair passes with0 errors and14 warnings; exact-head Fast is still required; no scientific data, runtime code, CI workflow or broad ignore changes. Evidence and reviewed scope: docs/progress/protein-stage-f.md and the 24 October CTO CommonJS lint ruling.

Stage F mapping integration follow-up — 23 October 2026

F-1b replaces live AlphaFold confidence placement and predicted canonical focus with the separately reviewed exact correspondence consumer. The strict source parser refuses non-integer/duplicate/out-of-range indices, non-finite or out-of-range scores, unequal arrays and present JSON null as a whole. Sparse, unsorted and empty arrays are valid; missing values remain missing and valid zero scores count. Current-sequence means disclose valid n / whole-sequence N; provider means remain explicitly source-model-wide, including zero.

Source and current identities bind each fresh worker attempt. Pending, stale, failed or refused maps withhold current-sequence scores and exact focus; source model colours and separately qualified legacy placement remain distinct. A 512 KiB decompressed confidence-body cap applies before decoding/JSON parsing. This does not bound the inherited models-metadata or credit fetches, nor assert process-heap limits. Typed worker preflight, ten-second timeout, abort and exactly-once termination have focused coverage. Correction (25 October 2026, PRC-22): the three-project browser acceptance was not recorded when F-1b landed (79 of 216 cases ran); it was first recorded on claude/stage-f-finish at 19adb348 (desktop, phone and desktop-dark: 352 passed, 0 failed, 14 skipped, 24 October) and again on the F4 and URL-store heads (merge records in docs/progress/roadmap-run.md).

Experimental selection still uses segment-offset/split heuristics and is owned by F-2. AlphaMissense remains held on its recorded licence question; its placement is not expanded by this increment. Historical evidence is read independently without migration; newly prepared predicted captures use the closed schema 2 / payload 2 / adapter 2 / capture 3.0.0 branch, retaining exact runs, eligible versus actually applied targets, source/map qualifications and actual loaded-byte identity. This does not verify arbitrary loaded coordinates against their provider sequence. See the bounded CSO/CTO implementation memos and docs/progress/protein-stage-f.md; whole Stage F remains open.

Stage F continuity inventory — 23 October 2026

The Astra-medium follow-on inventory (docs/design/protein-stage-f-next-increments.md) identifies these open correctness/continuity items for the subsequent increments. These are source findings, not completed repairs or new engine claims.

  • Experimental canonical selection still uses segment offsets and heuristic chain splits, and its cache omits actual current sequence identity. F-2 will replace selection authority with residue-level SIFTS from the exact loaded coordinate bytes, including observed/author insertion/label identities and explicit missing/conflict states; ranking metadata stays separate.
  • D1 pairwise comparison independently refetches A and B and retains fulfilled promises by accession, even when the currently open A sequence has changed. F-4 owns actual-input identity, bounded B caching and explicit retry/generation behaviour; existing D1 scoring and published references are unchanged. Closed by F4 on claude/stage-f-f4: A is the displayed entry (its UniProt checksums and version written "unknown" in the exports), B is fetched afresh per job with an abort signal, Retry refetches, regions outside a sequence are refused in the client, protocol and worker, every job settles once, and the old export clears before paint.
  • Protein's inbound schema admits sel but drops the shared hand-off range. F-5 owns reviewed bounds/precedence/fragment normalisation and connected journeys, without inferring protein coordinates from untranslated DNA.
  • The construct cropper does not receive the selected region, and mounted start/end state may survive a subject change. F-3 owns explicit region use and subject-bound drafts, preserving typed input and existing science. Closed 24 October 2026 by REL-690 to REL-692 and REL-696 to REL-697.
  • Uploaded PAE has no confirmed association with the active model and may survive subject changes; its reader also lacks file/dimension caps. F-3 owns explicit uploaded-file identity/coordinate qualification, lifecycle and resource limits. Equal dimensions alone must not establish model identity. Closed 24 October 2026 by REL-693 and REL-695.

Owner: Stage F Protein. F-1b's frozen references and live consumers are landed under the CEO's 24 October merge/test-waiver instruction (earlier Fast40073270024: 7,799 unit passes; 202 affected browser passes/14 existing viewport skips; final CDO rendered acceptance). This is bounded F-1b acceptance, not F-2 or whole-stage completion; the detailed source hashes, original failures and scope limits remain in the Stage F progress record. AlphaMissense licensing remains held; no licence conclusion is made here.

Calibration intake finishing, 23 October 2026

Id Severity Description Evidence Impact Status Suggested fix
REL-505 Medium Calibration accepts only the fixed role/label/concentration/response/dilution CSV schema; arbitrary table/XLSX headers and explicit 96/384 response-grid assignment are missing calibration-import.ts; adoption backlog ADOPT-02/03; CSO/CPO/CDO/CTO intake consultations of 23 October Real-file intake can require spreadsheet restructuring Implemented and checked on claude/calibration-imports: 26 focused production browser cases and the full Fast chain pass; daily integration is tracked in docs/progress/calibration-matrix-2026-10-23/ Observe anonymised instrument/software exports separately; synthetic parsing and calibration → Calc reopening/export checks do not establish instrument compatibility

Integration performance result (23 October 2026)

Id Severity Description Evidence Impact Status Suggested fix
REL-506 Medium Sequence's task-page two-second test exceeds the existing 2,000 ms warm-answer target Daily matrix 40023148572 on 0c3635bac15f83486f18659aab76b0e65facc568, performance job 120652610667: the complete two-case core report has Calc passing at 1,669 ms and Sequence failing at 2,462.8 ms, interactive at 2,146 ms, e2e/perf/two-second.spec.ts:81; zero retries, skips or global errors. Full reports, numerical assertion, screenshot, installation timeline and cancelled job conclusion are retained in docs/progress/calibration-matrix-2026-10-23/performance/ A reported warm Sequence answer misses its target. The deadline cancellation does not erase the completed assertion; unchanged source and equal aggregate sizes do not establish inheritance Open; cause and candidate attribution unresolved. Owner: Sequence task-page performance; CTO/CI owns runner attribution. Under standing D-0074, expressly preserved by D-0092, retain and fix forward. CTO disposition: docs/board/memos/2026-10-23-cto-calibration-performance-disposition.md. This performance result is separate from the twelve-shard browser baseline Compare the route's transitive emitted assets and loading boundaries between main and candidate. If measurement is needed, predeclare five alternating main/candidate pairs on one quiet host with the unchanged case, throttles, one worker and zero retries; retain all ten outcomes and stop. Fix an identified cause on an owned branch; keep assertions and limits unchanged
REL-507 Medium Strict Assay reader-loop flake: “a plate map without a plate's controls does not fit: it says why and offers the plate map”, desktop, does not show the grid after keyboard Enter on “Change plate map” Matrix 40023148572, exact 0c3635bac, shard 1, e2e/assay-analyser/reader-loop.spec.ts:127: first attempt reports the Plate map grid absent after ten seconds; retry passes. Full errors and both outcomes retained in docs/progress/calibration-matrix-2026-10-23/ Plate navigation was not observed on the first attempt. This remains flakyBlocking against the frozen baseline; the separate earlier reader-loop title does not exempt it Implemented on claude/core-workflow-finishing-oct24, 24 October 2026. Bounded event tracing reproduces stale deferred Fit-heading focus taking focus from Change plate map before Enter. Superseded focus requests now cancel and the final focus callback yields to another focused control. Original baseline 9/9 passes remain separate from the failed diagnostic and deterministic regression against the old build; candidate evidence is in the core-workflow review Retain the original Enter/grid assertion and ten-second bound; verify the deterministic delayed-focus regression and complete reader-loop journeys across desktop/phone/Dark. No retry or accessibility exemption substitutes for the repair
REL-508 Medium Phone J3 walk repeats a hard target-clear geometry failure Matrix 40023148572 on 0c3635bac, shard 7, e2e/objects/j3.spec.ts:710 through line 682, title “J3 at 375 px: step 4 opens the well table, with the published plate's labels and the "not included" row; step 5's Z′ note; Leave removes the example”; both attempts fail the ten-second predicate. The earlier matrix also failed, while paired local main/candidate checks passed The failed target placement prevents later journey assertions from running; those assertions are not counted as coverage Repair on claude/core-workflow-finishing-oct24, 24 October 2026 includes measured placement and focus sequencing. The unchanged local J3 baseline passes; later candidate evidence separately reproduces a settled step-5 hard failure: the complete 496 px result cannot fit in its approximately 351.5 px band above the dock. Earlier passing observations during smooth transit do not establish settled clearance. The CPO/CDO-approved general Assay phone-card reflow gives long scientific fields full width and pairs short labelled facts, retaining all selected fields and the complete target. Final unchanged-journey outcomes are tracked in the core-workflow review. Historical CI-specific attribution remains open Keep the unchanged hard target predicate, bounds and later assertions. Retain complete oversized content in ordinary page flow, and report actual measured limits rather than a whole-title exemption or an unsupported inheritance claim
REL-509 Medium Phone Protein evidence image preparation does not reveal its image or preparation-status evidence within sixty seconds Matrix 40023148572 on 0c3635bac, shard 7, e2e/protein-explorer/evidence.spec.ts:141, title “blank start records experimental fallback with selection evidence, reopens without providers and exports identical bytes”; both attempts fail the same visibility assertion. Earlier paired local main/candidate passes did not reproduce the CI failure Prepared-image and subsequent capture/export assertions remain unassessed in the failing journey Open; recurring, cause and candidate attribution unresolved. Owner: Protein evidence/image-export maintainers. CTO ruling 2026-10-23-cto-calibration-eleven-shards.md; record and fix forward under D-0074 Investigate the prepared-image transition on an owned branch. Preserve the image/status assertion, subsequent image assertion, sixty-second bound and all failed-attempt evidence; do not call the cause inherited from local passes

Calibration-to-bench-sheet finishing gaps (22 October 2026)

Follow-up to REL-211. The calibration acceptance branch now wires the detached HTML sheet into Calc and persists edited configuration, ordered rows and explicit source/manual origins through the fragment and named work. It fixes evidence inferred from a repeated name and restoration that previously replaced edits. The existing scientific engine is unchanged.

The 24 October core-workflow branch extends the existing path with immutable normalisation results under lab-calculators.recorded-result v2, manual-only named work and strictly retained normalisation metadata in generic Bench-input bindings. Recipe/input/np remain v1; existing result kinds retain v1. Captured configuration, ordered explicit row origins, source qualifications and complete outputs remain detached from live edits; historical projection does not rerun the engine. Unsupported workspace versions, source/key mismatches and incomplete non-JSON-safe results refuse visibly. Source-only HTML sheet restrictions remain separate from named work/result eligibility. Candidate and compatibility evidence is in docs/reviews/2026-10-24-core-workflows/README.md; no main landing is implied by this branch implementation.

Remaining wider scope: upstream withholding has counts rather than individually named samples; real-file scientist observation, Western extensions and acceptance against the separately paused broad Stage D candidate remain open. Captures stay session-local; reopening the edited plan requires a new bench-sheet capture. See docs/progress/calibration-to-bench-sheet-acceptance.md.

Core workflow finishing — 24 October 2026

Id Severity Description Evidence Impact Status Suggested fix
REL-510 Medium Selecting a later single reader block loses source coordinates and rejected-well badges in its preview: source-map keys are reindexed, while location/issue plate identities remain the original block index selectImportPlate retains loc.plate/issue.plate; the old detected map compares them with its display index zero. The new regression checks the second block's R12/C2 location and SAT badge, plus independent all-plate/channel and subtraction review A rejected cell can appear blank and source coordinates disappear in the preview even though complete parsed evidence remains Implemented on claude/core-workflow-finishing-oct24: pass explicit original source plate indices and retain the computed subtraction review's own identity. Candidate browser results are recorded in docs/reviews/2026-10-24-core-workflows/README.md Preserve source/issue identity through display selection; verify previewing never changes the imported blocks or aggregate review
REL-511 Medium Candidate normalisation Bench input application briefly reset to Molarity during asynchronous recipe decoding, and same-task selection retained the old save manifest First build-4 picker failures and build-5 source-overwrite traces in docs/reviews/2026-10-24-core-workflows/README.md; the original named source disappeared after saving the selected input as new work Immediate edits could be replaced by later decoding, or a new plan could overwrite its source work Fixed in this branch by atomic strict input application, exact already-applied recipe marker, post-flush scope checks and a save lifetime changed only on successful normalisation selection. These candidate-only defects were caught before branch delivery, not observed on main. Final browser checks retain actual source np/ns, distinct destination identity and held-decoder edit survival Preserve selected historical/current binding identity and hashes; keep first Save/Record stable without keying the control to a UUID that changes during saving

Stage E Molecule source-origin persistence (23 October 2026)

ID Severity Finding Evidence Impact Status Follow-up
REL-513 Medium The v1 saved research-view reader rejected production chembl and gsrs origins, preventing a valid capture payload for ChEMBL fallback and curated GSRS lookup Regression-first workspace-inputs.test.ts fails exact producer-shaped ChEMBL and curated GSRS admission on the old reader; the bounded repair passes all 13 focused semantic tests Resolved inputs could not be saved and reopened through the existing Study workflow Fixed in source: discriminant-specific bounded receipt validation preserves exact inputs and source fields; no calculations, layout, shared storage or schema version change. Browser and final-head acceptance are tracked in the Stage E running record. On main since 92020aa1d (24 October, CEO direct merge, daily matrix not run); browser specs repaired for the unified Save in ba9e2c0b (REL-529); the CDO's V13 acceptance predates 836907fc Keep deterministic actual-lookup/save/Study/reopen coverage and existing malformed-input, destination and comparison guards. Metadata transport does not authenticate source evidence or preserve immutable descriptors; research views recompute
REL-514 Low Molecule's registry declared only smiles and name although its existing address schema already consumed private-fragment mine, so the shell could report valid reopened saved work as an unread parameter Source-confirmed pre-existing declaration mismatch; generated-index regression fails before the declaration repair. QA observed the misleading banner on the Stage E candidate; no main-runtime reproduction is claimed Saved work could reopen with a false “Ignored mine” notice Fixed in source by declaring the existing receiver key and regenerating only the Molecule index entry. Query-only rejection, canonical removal, malformed-value diagnostics, sharing projection and scoped record guards remain unchanged. On main since 92020aa1d (24 October, CEO direct merge, daily matrix not run); browser specs repaired for the unified Save in ba9e2c0b (REL-529); the CDO's V13 acceptance predates 836907fc Preserve app-level routing/privacy regressions and verify notice absence plus Copy link omission on actual reopened origin work. Final browser and visual acceptance remains in the Stage E record
REL-515 Medium Molecule captured initial mine from raw host URL state before its separate parser canonicalised the address, and discarded the parser's dropped/via report. Live writes could preserve unchecked extras; history arrivals lost rejection reports Regression-first address-report test fails on the previous reader; QA candidate probes found missing malformed/query/unknown refusal notices. Query-only valid-shaped unavailable input reached saved-work recovery; known saved-note query loading requires the separate real-record browser regression. No main-runtime reproduction is claimed Refused parameters could be misrepresented as unavailable saved work; canonical URL cleanup alone did not guard the initial lookup Fixed in source: workspace lookup starts from checked initial state, original reasons/via reach the existing shell report, live writes retain checked fields, and history revalidates/canonicalises before restoring. No shared parser/host/guard or scientific changes. On main since 92020aa1d (24 October, CEO direct merge, daily matrix not run); browser specs repaired for the unified Save in ba9e2c0b (REL-529); the CDO's V13 acceptance predates 836907fc Run real saved A/B query-only/mixed/history regressions and malformed/unknown/unavailable checks with exact loaded-input assertions. Keep existing preview/reference, source-origin, cancellation and sharing coverage; final acceptance is in the Stage E record
REL-516 Medium A same-document mine=B-only arrival could clear the molecule while the saved loader skipped B because it was already open; reference-only loaded/opened checks could not identify a new arrival Actual v7 browser history regression failed at the initial B-only navigation before Back/Forward; trace recorded same-document navigation from B plus SMILES to B-only. Source supports the loader-skip hypothesis; final acceptance requires the fixed journey Valid private saved-work href could show discovery instead of authoritative B inputs Fixed in source with a checked-arrival generation in scoped opened/loaded/failure identities, synchronous loading/save gating and generation/scope cancellation through all loader branches. Same-reference arrivals reread the record/kept draft; private-reference history never chooses unbound transient chemistry. On main since 92020aa1d (24 October, CEO direct merge, daily matrix not run); browser specs repaired for the unified Save in ba9e2c0b (REL-529); the CDO's V13 acceptance predates 836907fc Exercise authoritative same-reference saved/draft restoration, missing/deleted recovery, deferred B→C, original strict query/history cases and Assay/series arrival compatibility. Final browser/visual results belong to the Stage E record
REL-517 Medium Molecule breadcrumb/status publishers read chemistry without saved-loader opening/failure and deduplicated by sentence alone, leaving prior subjects or saved-success/chemistry text beside correct loading/recovery bodies Regression-first 8acd06988 against v9 server 4331: deleted-B recovery retained Aspirin/Saved on this device; held-B loading retained Paracetamol/Saved; same-reference ready publication remained Saved. Three targeted cases failed, one history case passed. No main-runtime reproduction is claimed The shell could contradict the current saved-work body App-local source repair replaces the old publishers with one commit-phase owner after saved state, keyed by reference/generation/scope/phase/sentence and retracting only its obsolete text. Loader/science/shared-announcer policy unchanged; acceptance pending. On main since 92020aa1d (24 October, CEO direct merge, daily matrix not run); browser specs repaired for the unified Save in ba9e2c0b (REL-529); the CDO's V13 acceptance predates 836907fc Run fresh functional/presentation/capture checks. Controlled sub-second identical-ready restoration remains an explicit shared-deduplication risk; do not close that edge without concrete evidence and any required further CTO ruling
REL-518 Medium Targeted announcement withdrawal retained the matching last-emission dedupe identity, suppressing an explicit rapid identical current-state request Actual production diagnostic on test source 0974540ae: source-backed same-input ready restoration in 99.3 ms, terminal blank footer beyond 10.17 s; presentation-production-diagnostic-atomic/ in the Stage E evidence folder (removed from the tree on 24 October; retrievable at 0489ba5e, listed in its removed-evidence-manifest.json). Regression-first 29da6d622: unchanged real factory, 35 tests, 31 pass/four expected failures; presentation-withdrawal-repair/regression-red.log.gz The body and subject can show a restored current molecule while the footer stays blank or obsolete Bounded source repair releases lastText/lastAt only for an explicit nonempty normalised matching target. Coalescing, queue spacing/order, progress cadence and unrelated/unscoped clears stay unchanged. Production/browser/official size acceptance pending. On main since 92020aa1d (24 October, CEO direct merge, daily matrix not run); browser specs repaired for the unified Save in ba9e2c0b (REL-529); the CDO's V13 acceptance predates 836907fc; the CPO concurs with conditions (memo docs/board/memos/2026-10-24-cpo-molecule-announcer-concurrence.md): the next daily matrix re-runs Sequence, Calc, Pipeline, palette and combobox consumers against the baseline Run fresh affected production presentation checks, shared consumers and exact-head gates; no claim of assistive-technology speech or full Stage E acceptance
REL-519 Medium A pre-existing deliberate-repeat animation-frame callback can republish text withdrawn between its blanking write and frame flush Unchanged announce.ts at 29da6d622; real-factory diagnostic presentation-withdrawal-repair/interframe-diagnostic.mjs.txt and .log.gz: ready emits at 400 ms, repeat clears at 1,900 ms, targeted clear occurs before frame, then the queued frame writes ready again A withdrawn repeated message can reappear in this separate inter-frame lifecycle edge Open. Predates and is not introduced by REL-518's targeted dedupe reset; not the E1 exact withdrawn-ready sequence. No scheduler rewrite is included Separate CTO-scoped cancellation/lifecycle contract and regression-first repair; preserve the raw diagnostic and existing frame-flush expectations

Integration note, 24 October 2026: Pipeline branch identifiers REL-505–REL-512 are filed here as REL-520–REL-527 because main already uses the earlier identifiers for calibration/core-workflow findings. Historical memos, test fixtures and evidence retain their original branch identifiers; their bytes are unchanged.

Pipeline Stage G source audit — 23 October 2026

ID Severity Finding Evidence Impact Status Follow-up
REL-520 Medium US-products CSV labels NDC marketing starts as first_approved and loses recorded details failures Base f85a4b512 exports-run.ts reads every Approval.date and the default discontinued boolean; the source model retains dateKind/notLoaded. CSO semantic fixture product-export-semantics-v1 committed before repair at 34738844a Export readers can mistake marketing start for regulatory approval or failed loading for known non-discontinuation Fixed on codex/stage-g-pipeline; not merged at this record Existing headers/rows preserved; append source_date, date_kind, details_not_loaded; first_approved requires explicit original-approval with no failed load; discontinued blank on failure. CPO/CSO/CTO/CDO memos dated 23 October. Exact checks and outstanding visual/merge evidence in progress/pipeline-stage.md
REL-521 Medium Trial downloads lose interrupted-download qualifications and do not distinguish full-result from current-list scope CPO G2 audit: fetchers retain partialError while old trialsData discarded it; old global export ignored chart/list filters without an explicit scope description Downloaded evidence can be mistaken for the complete registry result or the narrowed list Fixed on Stage G branch by separate G2 builder, integrated b45c3ce9a; final combined acceptance in progress/pipeline-stage.md Preserve old populations; additive current-list action uses existing ordered rows across pages; all trial-derived tabular ZIPs carry partial/cap/snapshot and population qualifications
REL-522 Medium openFDA export and learned-object retrieval dates are generated at export/first observation rather than successful acquisition CTO G4 audit of exports-provenance.ts, learn.ts and use-pipeline.ts; controlled production-hook tests exercise fetch, cache, expiry, abort, refresh and snapshot Evidence appears newly retrieved on export or rendering Fixed on Stage G branch by separate G4 builder, integrated 45c762f92; not merged Preserve one actual acquisition time through ready state and cache; reuse it for exports/objects; retain snapshot dates and unknown legacy dates
REL-523 Medium FDA precedent panel citation says every source was retrieved on the compilation's date precedent-provenance.ts previously used the cder retrieval date in an aggregate “all retrieved” sentence despite separate SourceRefs Panel citation can misdate breakthrough/CRL sources Fixed on Stage G branch by G4 follow-up; not merged Content-owned citation names each source's own retrieval date; regression uses three distinct dates; source references and live/snapshot semantics unchanged
REL-524 Medium A joined compilation row without a usable review interval can be labelled “not in compilation” CSO missingness ruling and independent 17-case review-missing-semantics-v1 fixture committed at 903f033ba before repair A missing date or invalid interval can be mistaken for absent compilation membership Fixed on Stage G branch in 01eb8c5dd by separate G3 builder; final checks in progress/pipeline-stage.md Computed values and all unjoined reasons preserved; receipt-not-recorded or invalid-review-interval with truthful table/inspector headings; no estimated dates or Q-19 closure
REL-525 Medium Empty filtered precedent figures imply there are no products in FDA's compilation CDO's actual filtered-zero capture shows a nonempty base with zero selected rows; CSO denominator review also identifies nonempty zero-eligibility cases A filter or unavailable denominator can be mistaken for absent source evidence Fixed on Stage G branch in 046fcfc09; final render/checks in progress/pipeline-stage.md Filtered-empty reasons say no products match these filters; nonempty accelerated/designation reasons describe their distinct existing evidence denominators; no calculations, values or small-n rule changed
REL-526 Low Public Pipeline help still says no file exports exist and precedent CSV/XLSX are planned Final CPO review compares the public Exports paragraph with the seven current tabular actions and two figures Users receive obsolete capability and delivery guidance Fixed on Stage G branch in 5005143fb; not merged CPO-approved paragraph describes actual populations, evidence ZIPs, saved-query limitations and public-link privacy; no XLSX-built claim; contradicted technical clause removed
REL-527 Medium Stage G export evidence eagerly enlarges the Pipeline definition chunk beyond 25 KB Actual-main artifact comparison: 23.9 KB at f85a4b512 to 28.3 KB at 86ad6568b New export-only material is downloaded with the definition rather than on export CTO-planned separate-builder repair integrated in d82fd9ca1; measured validation and current acceptance in progress/pipeline-stage.md Writer-only evidence copy and scope formatting move behind the existing lazy export boundary; wording, semantics and all budgets unchanged

Pipeline precedent export qualifications, 23 October 2026

The Stage G cited precedent ZIP preserves per-source dates, unchecked wording, original-application qualifiers and empty-result scope (see Pipeline exports). The bounded domain repair gives joined missing receipts and invalid review intervals truthful reasons in the domain, CSV, table and inspector, using an independent 17-case fixture committed first. Computed values and the method are unchanged. G4's panel citation repair also names each source's own retrieval date (REL-523); the former aggregate-date limitation is fixed on this branch. Existing review-time evidence is build-session transcription, not independent scientific sign-off; Q-19 remains open. G3's independent synthetic fixture checks projection semantics only. G4 preserves actual acquisition through cache/snapshots and G3 consumes the same export source helper; legacy live acquisition remains unknown and is never replaced with generation time.

Molecule E1 merge handoff — 24 October 2026

ID Severity Finding Evidence Impact Status Follow-up
REL-528 Medium Retained E1 source has unresolved workspace bundle growth Official Fast 40043750582, source 22d40f5f2, artifact 12541306143: 151.8 KB vs actual-main-at-the-time 151.1 KB; growth 0.7 KB exceeds the unchanged 0.5 KB allowance E1 has functional fixes but has not met size acceptance; merging the partial work does not close Stage E Open; on main since 92020aa1d (CEO: "Just merge to main skip tests"). Measured on main 0489ba5e at 151.8 KB against the 151.1 KB base, and the combined tree de84c2262 at 152.0 against 151.3 KB (Fast 40077058912): see REL-531. The "pending" comparison in progress/pipeline-molecule-handoff-2026-10-24.md is superseded by these figures Resume with the CTO structural recovery memo of 24 October, a separate Sol 6.1 builder and matched size measurements before another full QA cycle. Do not raise budgets, change scientific fixtures or label E2–E6 implemented
REL-529 High Stage E's own browser specs fail on main: 35 of 117 Molecule cases fail on head 0489ba5e (desktop, phone, desktop-dark), all in e2e/molecule-workbench/origin-save.spec.ts and arrival-save.spec.ts; every other Molecule spec passes Review run of 24 October (docs/reviews/2026-10-24-codex-molecule-review/README.md): 33 failures wait for or expect enabled getByRole('dialog', { name: /^(Save|Details)$/ }).getByRole('button', { name: 'Save work' }), but the unified Save brought in by 836907fc labels the button "Save"; two phone failures (malformed and unknown arrival) are strict-mode violations because the arrival notice renders twice, once in the page and once in "Molecule: page tools". None of the 35 titles is in docs/progress/e2e-baseline.json E1 (REL-513 to REL-518) has no passing browser evidence on main; a regression in Molecule save, reopen or arrival handling would not be caught Fixed on claude/stage-e-finish: both specs take the unified Save's labels from content (workspaceWorkText.capture.save, workspaceWorkText.resume, benchWorkflowSaveText.savedOnly), citing 836907fc; notice assertions select the copy a person sees (a hidden page copy and a visible page-tools copy below lg, since 836907fc); the recovery sentence is read from the page, not the shell's status line; saves wait for the analysis to finish. 42/42 pass on desktop, phone and desktop-dark at two workers. Nothing deleted, skipped or loosened Update the two specs' Save locators to the unified Save, citing 836907fc as the product change; decide whether the phone arrival notice should render once and fix the product or the locator accordingly; rerun all three projects
REL-530 Medium Back or Forward between two unsaved molecules puts Molecule into the saved-work opening state Production build of 0489ba5e, probe in docs/reviews/2026-10-24-codex-molecule-review/README.md: "Opening saved research view…" appears once after Back and once after Forward between two unsaved molecules, and never before. Source: workspace.tsx:140 increments arrivalGeneration on every restore (introduced by Stage E's 428a05cb); with mine null, sameSavedArrival no longer matches, so work.opening is true and workspace.tsx:401 returns the opening view; the !mine branch at use-saved-work.ts:108-109 then clears the research context and retained comparisons (source-inferred, not observed). e2e/molecule-workbench/workspace.spec.ts:186-189 checks only the end state Panels, including the 3D viewer, unmount and remount on every history step; unsaved research context typed beside an unsaved molecule may be lost Fixed on claude/stage-e-finish: onRestore advances the saved-work generation only when the restored entry names mine (workspace.tsx:139-141). Regression-first test arrival-save.spec.ts "Back and Forward between two unsaved molecules…" failed before (2 openings, expected 0) and passes on desktop, phone and desktop-dark; Molecule suite 113 passed, 7 existing skips, 0 failed Do not start a saved-work restoration when the arrival has no mine before and after; add a Back/Forward test between two unsaved molecules asserting no opening state and kept context
REL-531 Medium Molecule's size debt was absorbed into main rather than recovered Linux measurement on 0489ba5e in docs/reviews/2026-10-24-codex-molecule-review/README.md: molecule-workspace-chunk 151.8 KB against 151.1 KB in docs/progress/calibration-matrix-2026-10-23/main-size-measurements.json (+0.7 KB, over its 149.4 KB ceiling by 2.4 KB); molecule-workspace-route 165.0 of 165 KB with no headroom. The CTO's official comparison of the landed tree de84c2262 reads 152.0 against 151.3 KB (Fast 40077058912). No maxKB was raised Once on main, the growth is the new base and the per-merge 0.5 KB rule no longer sees it; the next Molecule change has no route headroom Candidate on claude/stage-e-finish under the CTO's size contract (docs/board/memos/2026-10-24-cto-molecule-size-contract.md): the 3D viewer moved unchanged behind shape-viewer-loader.ts with a new molecule-shape-viewer-chunk row (6.0 KB measured, 6.9 KB budget). Local Linux build: workspace chunk 148.1 KB (from 151.8), route 165.0 of 165 KB, no other row regressed. One official Fast measurement decides; on a miss the work stops and the drafted CEO debt decision goes to the CEO. Closes only on an official artifact on main at or below 151.3 KB Recover the workspace chunk to at most 151.3 KB under one CTO structural contract, or record the debt by a CEO decision; never raise a ceiling to close it
REL-555 Low A readout's unit could break away from its value, or split inside itself CDO memo docs/board/memos/2026-10-24-cdo-molecule-on-main-and-shape-loading.md (M2): with the Inspector open, retatrutide's Molecular weight tile showed "4,731.42 g/" over "mol"; the shared ReadoutStrip value cell sets overflow-wrap: anywhere, which the unit inherited. Regression-first check in e2e/molecule-workbench/origin-save.spec.ts failed for GSRS on desktop and phone Breaks the rule that units remain attached to their values; a reader can misread the quantity Fixed on claude/stage-e-finish: in src/components/suite/layout/readout-strip.tsx a value with a unit and the unit sit in one no-wrap run; values without units still wrap. Shared primitive (12 callers); their browser specs run in the next daily matrix —
REL-556 Medium Molecule's public product poster shows the retired page header CDO memo docs/board/memos/2026-10-24-cdo-molecule-on-main-and-shape-loading.md (M4): public/media/molecule-workbench/preview-light.webp and preview-dark.webp show "Save to Bench", a Calc chip and a pin beside the subject name, which D-0102 and the tab-row rule retired The public page shows people a header the product no longer has Closed, 24 October 2026: re-taken on claude/stage-e-finish from this branch's production build with scripts/capture-previews.mjs --only molecule-workbench (light 131,978 B, dark 117,302 B), so the header shows the tab-row actions. The CMO approved the public framing on condition the alt text names only what the image shows (docs/board/memos/2026-10-24-cmo-molecule-posters.md); content/apps/molecule-workbench.ts preview.alt now does. The Notepad button over QED stays in the image because the product shows it (REL-558); re-take when that changes Re-take both posters from main with scripts/capture-previews.mjs --only molecule-workbench, in both themes; the CMO approves the public framing
REL-557 Low Deleted or missing saved-work recovery in Molecule offers only Retry, with no search or examples CDO memo docs/board/memos/2026-10-24-cdo-molecule-on-main-and-shape-loading.md (M1), same-ref-deleted-B on phone: the page holds only the error box and the limits footer, while history rejection shows the discovery start under its notice A person whose saved work is gone has no way forward on the page but going elsewhere Open; accepted earlier at V12/V13, not a regression Render the recovery notice above the standard discovery start, as the rejection state does (D-0084)
REL-558 Medium The floating Notepad button covers scientific values CDO memo docs/board/memos/2026-10-24-cdo-molecule-on-main-and-shape-loading.md (S1): at 1440 px it covers Molecule's QED value ("0.389" part-hidden; "0.38" with the Inspector open); at 375 px it covers the depiction and the privacy line; the re-taken Molecule poster shows it too. It predates the workflow merge A scientist can misread a value hidden by chrome Kept open with no owner and no fix, by the CEO's decision of 24 October 2026: "you can scroll and move that button easily". Severity lowered from High Reserve a gutter or bottom padding equal to the button's footprint in the scrolling workspace, or move the button out of content's way
REL-572 Medium Molecule's series row detail said "RDKit cannot read this SMILES" for rows RDKit never read CDO and CSO memos docs/board/memos/2026-10-24-cdo-molecule-e3-e5-contract.md and 2026-10-24-cso-molecule-e3-e5-contract.md (red lines): RowDetail printed status.unreadable whenever the row had no result, so a withheld series' rows, a row with no SMILES or one too long, and a row still being described all claimed an RDKit failure A false scientific statement on the row a scientist opened Fixed on claude/stage-e-finish (E4, 24 October 2026): views/bench/series-row-detail.tsx shows the table's own reason (no SMILES, too long, unreadable, withheld, or the describing line) and no actions; e2e/molecule-workbench/series.spec.ts checks row 9 and the absence of actions —
REL-573 Low Back or Forward to a mine= entry may reopen a saved series over an unsaved repeat of it CTO memo docs/board/memos/2026-10-24-cto-molecule-e3-e5-contract.md (E5, "a pre-existing issue to record, not fix"): nothing in the series code writes mine, so after "Describe as a new series" the address still names the old note; by source reading, a Back/Forward step naming mine reloads the old series over the unsaved new one held in memory (views/workspace.tsx popstate). Inferred from source; not reproduced in a browser An unsaved repeated series can be replaced on screen by its saved original; the saved note itself is unchanged Open; recorded, not fixed: fixing it touches the arrival and popstate code, which trips MNT-210's trigger With MNT-210's address-read contract: clear or replace mine when a series is repeated, or guard popstate against replacing unsaved series work
REL-585 Low The series ZIP's README lists four files, not the series record CDO memo docs/board/memos/2026-10-24-cdo-molecule-e3-e5-built-review.md (condition 3): the shared writer's "Files" list (src/components/suite/data/csv-bundle.ts buildReadme) names the CSV, provenance, README and notice; the record, <base>.series-record.json, is named only in the series lines below it (src/apps/molecule-workbench/series-evidence.ts). The README's source lines also repeat their version ("ChEMBL 37 ChEMBL 37") A reader of the README may miss the record file Open; for the CTO (a shared §5.1 writer change was ruled out for E3, docs/board/memos/2026-10-24-cto-molecule-e3-e5-contract.md) An extraFiles option on buildTabularExport, or a series-only Files line
REL-586 Low The status bar kept "Series ready: …" after the series was put away CDO memo docs/board/memos/2026-10-24-cdo-molecule-e3-e5-built-review.md (condition 5): the ready announcement stayed in the status bar while the review form showed and no series existed A stale status contradicts the screen Fixed on claude/stage-e-finish (24 October 2026): views/bench/series.tsx withdraws its own ready line with clearAnnouncement when the series is put away; e2e/molecule-workbench/series.spec.ts checks the status bar after "Use another table" —
REL-587 Low On a phone, a saved series reopened by address opens off screen E6 routine-week walk, docs/progress/molecule-stage-checks-2026-10-24-e3-e6/walk/08-reopen-saved-series-375-dark.jpg: with no molecule, the discovery start fills the first screen and the reopened series sits below it. Pre-existing A person reopening saved work sees no sign of it without scrolling Open; for the CDO (layout of a reopened series with no molecule) Scroll to or lead with the series section when mine= names a saved series
REL-663 Medium A Bioreactor browser test read a readout's value with its unit after the ReadoutStrip unit-wrap fix Coordinator, 24 October 2026 (D-0074), on Builder A's Bioreactor run of a head containing main 88fba74a: e2e/bioreactor-simulator/workspace.spec.ts:250 ("a kept run reopens from its object page with the same run") read [data-tile="oxygenOut"] dd span and got "14.1h" for "14.1" on desktop and desktop-dark, because 204c6586 (Stage E, M2) wraps a readout's value and unit in one span (src/components/suite/layout/readout-strip.tsx), so the first span became the wrapper A failing browser test on main; no user-facing defect (the unit staying on its value's line is the intended product change) Fixed on claude/rel-663-readout (24 October 2026): the spec reads the value's own span (dd span:not(:has(span))), citing 204c6586; reproduced before ("14.1h") and passing after on desktop and desktop-dark; the Bioreactor folder and the other readout-consumer specs on three projects: 106 passed, 3 skipped, 0 failed. No other spec read a readout's dd span —

Pipeline REL-520–REL-527 implementation is included in this combined merge; earlier “not merged” phrases above describe historical branch records. Q-19 remains open. See the dated integration handoff for landing and combined-check receipts.

Scientist workflow source repairs, 24 October 2026

Reviewed Repeat no longer falls back to source Study A while an included result is inspected in B, including Work history and conclusion/Experiment inspectors. Transactions refuse stale source/destination/membership or immutable receipts. Fresh-task and material navigation now invalidate delayed superseded intents; backup operations refuse work after the original Study unmounts. Prepared PDF preflight and generation share one full validated capture/document, with actual drift checks rather than a second export. Focused adversarial checks pass; final production size/browser acceptance remains outstanding. These are source repairs, not evidence of external participant use or portable-recovery success in the wild.

Codex Stage G review — 24 October 2026

Ids are in the range the coordinator allocated to Pipeline on 24 October 2026 (REL-546 to REL-554 and REL-559, SCI-247 to SCI-249 and SCI-254); the review's commits and the CSO memo docs/board/memos/2026-10-24-cso-pipeline-date-labels.md cite the earlier SCI-238/SCI-240, REL-529 to REL-538 and SCI-241 to SCI-243 for the same rows. Found by the review of Codex's Stage G (Pipeline) work on main 0489ba5e (review: docs/reviews/2026-10-24-codex-pipeline-review/README.md, findings F3, F4, F6, F7, F8, F10). Governance and hygiene findings (F1, F2, F5) are in the review and the run record.

ID Severity Finding Evidence Impact Status Follow-up
SCI-247 High NDC marketing-start dates are presented as approvals on the Board card, timeline pins, precedent table/inspector and citation, and the public FAQ says the date shown is the original approval Production walk of 0489ba5e, Sickle cell disease snapshot: CASGEVY (labelled "NDC marketing start" in US approvals) reads "First approved Dec 2023" on its Board card and "Original approval 8 December 2023" in the precedent inspector at 1440/375 px, Light/Dark; views/board.tsx:255, landscape-model.ts:311-326, views/timeline.tsx:55, views/precedent.tsx:795, precedent-provenance.ts:118, content/apps/drug-pipeline-explorer.ts:257. Pre-existing (beacebb4) A scientist can cite a marketing start as an FDA approval; screen and the Stage G precedent export (blank original_approval) disagree Fixed on claude/stage-g-finish (24 October 2026) under the CSO's ruling docs/board/memos/2026-10-24-cso-pipeline-date-labels.md, test-first against display-date-semantics-v1.json (14/14 unit) and e2e/drug-pipeline-explorer/display-dates.spec.ts: dates are labelled and cited by source (display-dates.ts), only original approvals are pinned, the FAQ, registry lines and a limits line say so CSO fixture first, then label or exclude by dateKind/notLoaded with the existing content string; CPO wording, CDO captures
REL-546 Medium The product-export browser test rewrites the fixture's expected label_use e2e/drug-pipeline-explorer/product-evidence.spec.ts:49 maps expected indicated to indicated_unchecked because every case shares NDA000001 and one merged unchecked set (:22-25) A regression marking every row unchecked passes the browser test Fixed on claude/stage-g-finish (24 October 2026): each case has its own application numbers in product-evidence.spec.ts and in the combined-table unit check, and both compare the fixture's label_use exactly; the product already matched (3/3 browser projects, 10/10 unit) Distinct application per case; compare fixture values unchanged
REL-547 Medium Pipeline/Molecule landing records misstate the checks Handoff pipeline-molecule-handoff-2026-10-24.md:66,74 says remote checks unverified, but Fast 40077058912 on de84c2262 succeeded; the official combined size comparison fails on molecule-workspace-chunk 151.3 → 152.0 KB (cap 149.4, +0.7 over 0.5 tolerance) while the handoff cites a local pass (:62); REL-520–527 still say "not merged" Readers cannot tell what was checked on main Fixed in the records on claude/stage-g-finish (24 October 2026): a dated correction in docs/progress/pipeline-molecule-handoff-2026-10-24.md (Fast 40077058912 succeeded; the official combined size comparison fails on the Molecule row) and the finishing section of docs/progress/pipeline-stage.md; the Molecule row stays failing on main for its owner Correct the records; record the Molecule row as failing on main (D-0074)
REL-548 Medium Pipeline's registry entry does not describe Stage G content/apps/drug-pipeline-explorer.ts:38-49: version 0.1.0, updated 2026-10-05, no export, scope, cited precedent or saved-view capability; no changelog entry in content/apps/changelog/drug-pipeline-explorer.ts Public pages and the registry describe the 5 October app Fixed on claude/stage-g-finish (24 October 2026): version 0.2.0, updated 2026-10-24, export and saved-view capabilities (six lines, the registry's limit), a 0.2.0 changelog entry; the FAQ and date lines under SCI-247 Bump version and date, add capabilities and a changelog entry
REL-549 Medium Pipeline's lazy export writer has no size budget though Stage G grew it No marker in src/apps/drug-pipeline-explorer/exports-run.ts; local build of 0489ba5e emits it in five chunk variants of 9,543–14,003 bytes gzip, none in scripts/size-budgets/drug-pipeline-explorer.json Writer growth is unmeasured Fixed on claude/stage-g-finish (24 October 2026): markers on runPipelineExport and PrecedentView; rows pipeline-writer-chunk 12.9/14.9 KB and pipeline-precedent-chunk 16.4/18.9 KB (first marked build plus 15 %, the CTO's item 2); no maxKB raised Markers and rows for the writer and precedent view chunks at first measurement plus 15 % (CTO)
REL-550 Medium Pipeline layout changed after the stage without review, and the technical page is stale 836907fc moved Save work and object actions to the tab row and rebuilt the Landscape metrics; no CDO/CSO capture or review covers it; docs/technical/app-pipeline.md:170,574 still place WorkCaptureControls in the header Visual evidence predates what main renders Fixed (25 October 2026, claude/stage-g-fixes): the two technical-page lines place the controls on the tab row (claude/stage-g-finish), and the CDO's recapture on c34de814 (docs/progress/pipeline-stage-g-finish-captures-2026-10-24/) covers main fa5b5af5c: git diff c34de814 fa5b5af5c over Pipeline's views, parts and tools changes only REL-553's median tile, under the CDO's own ruling, and Pipeline uses none of the shared layout files that changed since CDO recapture at 1440/375 px, Light/Dark; correct the two lines
REL-551 Medium Nineteen Pipeline browser cases fail on main 0489ba5e, none in docs/progress/e2e-baseline.json Review run, three projects, two workers, no retries: 207 passed, 23 skipped, 19 failed (docs/reviews/2026-10-24-codex-pipeline-review/browser-summary.json). work-draft-pipeline.spec.ts:98,130,139,160 wait for a "Save work" button the unified Save now labels "Save"; pipeline-objects.spec.ts:46 and send-to.spec.ts:74 expect "…It is on your objects page…" where content/apps/objects.ts:131 now says "…It is in your Library…"; phone workspace.spec.ts:305 finds the Board/Console control at y 363 instead of 589 after 836907fc moved Save work to the tab row. At 92020aa1d both strings still matched the specs (content/apps/workspace-work.ts:48, content/apps/objects.ts:125) Stage G's saved-view (G4) and Pin acceptance is unproven on main; the landing of the scientist-workflow merges skipped these checks Fixed (25 October 2026). CW-05a (f96e18a69), claude/stage-g-finish and CW-05b's continuation (on main at fa5b5af5c) fix 18 of 19: on claude/stage-g-fixes (main fa5b5af5c merged) the Pipeline set passes 246, skips 23 and fails only phone workspace.spec.ts:305. That one was not the layout: since 836907fc the control sits at y 589 at 375 px, under the floating Notepad button (REL-558), which takes the centre of "Matrix" (elementFromPoint returns data-notepad-key), so Playwright scrolled the page 226 px to click it whenever the button had appeared (2 of 3 runs). The spec now scrolls the control clear first, instantly, as the CEO's REL-558 decision says a person does; the x and y equalities are unchanged; 30/30 on three projects × 10 repeats Scientist-workflow coordinator: update the expectations citing the product changes (unified Save, Library copy, tab-row actions), or fix the product; never loosen the assertions
SCI-248 Low A saved date of unrecorded type is treated as an approval when FDA precedent explains a missing review time src/components/tools/drug-pipeline-explorer/precedent/review-time.ts:91-93 places an unjoined U date against the compilation's coverage, so it can read "Approved after the compilation's coverage" or "Approved before 1985" (content/apps/drug-pipeline-explorer.workspace.ts, reasonShort/reason); the CSO's ruling of 24 October 2026, Risks Legacy saved captures only Open A CSO ruling and a v2 missingness fixture (v1 is write-once)
SCI-249 Low Unjoined precedent rows pass an NDC marketing-start date to the breakthrough-list check src/components/tools/drug-pipeline-explorer/precedent/nme.ts:132 gives breakthroughFromLists the product date whatever its kind; probably inert because CBER products are not on CDER's lists (unverified) A marketing start could be compared with list approval dates Open CSO to confirm; pass only original-approval dates
SCI-254 Low A mixed application group whose earliest date is an NDC marketing start hides its Drugs@FDA approval date buildApprovals keeps the earliest date and its kind (openfda.ts:672-675); the display now labels that date as a marketing start (case mixed-group in display-date-semantics-v1.json) while originals holds the approval The approval is not shown for such groups Open (a recorded limit; the CSO's 23 October ruling forbids changing date selection here) A date-selection ruling and v2 export and display fixtures
REL-552 Low ApprovalsPanel is unused and keeps copy in the component src/components/tools/drug-pipeline-explorer/approvals-panel.tsx:189 exports ApprovalsPanel, imported nowhere; it hard-codes "First approved", "Not in Drugs@FDA" and "NDC marketing start" (:278-282, :321-322) and has no SCI-247 labels Dead code that would reintroduce the date defect if revived Fixed on claude/stage-g-fixes (24 October 2026): ApprovalsPanel, its two private parts and the Pipeline scroll-box.tsx wrapper only it used are removed; the module keeps detail, modalityOf, headline and caveats and is no longer a client module Remove the component (keep detail, modalityOf, headline, caveats)
REL-553 Low A filtered-empty FDA precedent shows "No products match these filters" twice in the median tile views/precedent.tsx Figures passes the same string as the tile's naReason and its footnote when rows.length === 0 (the CSO's filtered-zero ruling of 23 October 2026 names both); seen in docs/progress/pipeline-stage-checks-2026-10-23/visual-copy/filtered-zero-1440-dark.png ("No products match these filters · No products match these filters") Repeated text in one tile Fixed on claude/stage-g-finish (24 October 2026) under the CDO's ruling (docs/board/memos/2026-10-24-cdo-pipeline-stage-g-recapture.md): the median tile states its reason once, as naReason, with no footnote when filtered-empty or when no product has both dates; the CSO's string is unchanged; export-scopes.spec.ts asserts one occurrence (it failed with two before the fix) CDO to rule the tile's layout; CSO wording unchanged (drop the footnote when filtered-empty)
REL-554 Low The provenance chip's pop-over shows a date-only retrieval as a local date and time src/components/suite/data/provenance-chip.tsx:211 renders retrievedAt with formatDateTime; a date-only value such as FDA precedent's 2026-10-05 (since F12) reads as the evening before in US time zones. The chip's label already uses formatDate's exact date-only path. The CSO's ruling of 24 October 2026 (docs/board/memos/2026-10-24-cso-pipeline-crl-and-snapshot-dates.md, Risks) A snapshot date can read one day early in the pop-over Open; shared primitive, the CTO and CDO Use formatDate when the value is date-only
REL-559 Low FDA precedent citations build their prose in code src/apps/drug-pipeline-explorer/precedent-provenance.ts composes the compilation, review-time, breakthrough and letters citations as template strings (about lines 88, 101, 114 and 124-125), and repeats one labelShort string that content already holds; the CPO's exit memo of 24 October 2026 (docs/board/memos/2026-10-24-cpo-pipeline-stage-g-exit.md, condition 2). Pre-existing Copy outside content is harder to review and keep consistent Fixed on claude/stage-g-fixes (24 October 2026): the short labels and citation sentences are in content/apps/drug-pipeline-explorer.precedent-citations.ts, imported only by precedent-provenance.ts so the definition chunk does not grow (the Drugs@FDA label reuses workspaceCopy.dates.labelShort.original); precedent-provenance.test.ts pins each string, written against the old code first and unchanged after the move Move the citation templates to content/apps/drug-pipeline-explorer.workspace.ts with a unit check of each string

Scientist workflow post-merge checks, 24 October 2026

The immediate main merge preserves Molecule's checked canonical arrivals and reference seed together with flush-before-Clear, private-reference removal and unified Save. Incoming browser helpers still named the earlier Save work, Resume and Library destinations. Their bounded follow-up uses the explicit Save/Continue/Work contract and exact saved-activity confirmation while retaining all scientific, origin, immutable-record, draft and restore assertions. A separate Clear-to-new-molecule case checks that the old saved record is unchanged. Missing arrival assertions distinguish the main-content notice from the one shared live announcement. Original failures remain in the dated progress evidence.

The CTO-authorised discovery copy leaf removes the unrelated Bench guidance from DiscoveryStart's static import owner; the public guidance values and wording are unchanged. No runtime guard, scientific reader, fixture, budget or matcher changes. Post-merge and follow-up source pins and measurements belong in the progress record; earlier acceptance is not retroactively attributed to the merged runtime.

Stage H Bioreactor: room and the record — 24 October 2026

Rows from Stage H's BR1 (docs/roadmap-v0-depth.md, "Stage H: Bioreactor"; branch claude/stage-h-record). Ids were the next free on origin/main at commit time; the merging session re-checks them.

ID Severity Finding Evidence Impact Status Follow-up
REL-532 Low Bioreactor's preset-run island is over its 40 KB ceiling: 40.3 KB on 23 October 2026, between 40.1 and 40.3 KB since 18 October, with no row recording it until now docs/progress/calibration-matrix-2026-10-23/main-size-measurements.json (row bioreactor-island-preset-run); the CTO's memo of 24 October 2026, §1 (docs/board/memos/2026-10-24-cto-bioreactor-stage.md). The island imports the whole workspace copy module for one key, workspaceCopy.slow (islands/preset-run.tsx:35) The size check fails on the row; nothing a user sees Open. The CTO ruled no raise: the row's $comment records the reading and the ruling and is not a raise. The CTO's lever 1 (move slow into a small module the island imports) is split between Builder A, who moves the copy, and Builder B, who switches the import and measures (Stage H BR1.4) Close when the row reads green on the stage head from the Fast chain's size-measurements artifact
SCI-240 Low Contract 11A's projection mapped a simulation reference time with no finite elapsed hours to 0 h (computeElapsedHours(...) ?? 0), a silent numeric fallback in scientific code The CSO's memo of 24 October 2026, ruling 6 (measured-comparison.ts:972 on 6d386c614); prior validation refuses a non-finite anchor, so it was unreachable from the reader None observed; had it been reached, the reference would have been drawn at 0 h and widened the elapsed-time union Fixed 24 October 2026 (Stage H BR1.6): the reference is dropped instead, recorded as unavailable with unsupported-simulation-reference-output and its claimed hashes, left out of the union, and qualified simulation-reference-unavailable; code only, so the method stays measured-comparison-time-alignment@1.0.0. measured-comparison.test.ts drives it by handing the projection a non-finite anchor None; SCI-143's 11A item closes when Bioreactor's next verification set (SCI-186, Stage H BR3.3) also lands
REL-533 Low verifyMeasuredComparison also accepted a slot whose payloadHash was the hash of the whole imported payload, analysis ref included, beside the hash the writer records (slotPayloadHash, analysis ref left out). No shipped writer produced the whole-payload hash The CTO's memo of 24 October 2026, §7 (measured-comparison.ts:697-707 on 6d386c614; c3f867964 had no UI and merged with ab89a0863 at 1d0766e). The test helper built slots with the whole-payload hash, which equals slotPayloadHash only while the analysis ref is null A second accepted witness widened what counts as a verified slot; after an analysis-ref remap a whole-payload hash would no longer match, so the fallback could only accept records no writer made Fixed 24 October 2026 (Stage H BR1.6): the fallback is removed; the test helper uses slotPayloadHash; every fixture verifies without the fallback (measured-comparison.test.ts, 11 tests), and a new test refuses a whole-payload hash on a slot with an analysis ref None
SCI-241 Low A Bioreactor share link carries no model version. A link names the preset by id and version and the changes from it; a kept run stamps the model it was made on (objects.ts:118). A teaching link made before model 2.0.0 (7 October 2026) therefore opens on the current model with a slightly different run and no notice The CSO's memo of 24 October 2026, ruling 7; app-bioreactor.md, known gaps item 8; SHARE_KEYS in src/components/tools/bioreactor-simulator/address.ts (ex, view, d, cmp, lect, h) A link's run can move under a model change while its preset version stays the same Open (recorded under the CSO's condition for keeping the presets at @1 under model 2). The rule text now reads: a preset version tracks values, a model version tracks equations, and every run, export and recorded result names both (model.ts, presets/types.ts, the product page's FAQ; Stage H BR1.9) Before B4 changes any default curve: the reduction fixture shows no default curve moves, or links gain a model version (a CTO grammar decision), or the affected presets go to @2
SCI-242 Medium Van 't Riet's range (500 to 10,000 W/m³, volume from 0.002 m³), compared only with an OCR scan of the 1979 paper, decides the extrapolated verdict of the public kLa calculator's default output ("Inside Van 't Riet's and Hughmark's ranges"), the scale-up page and the klasrc_correlation route, and of any preset run once a lever or a rescue step changes the aeration. D-0043 forbids an unread value moving an example's or preset's default result; the copy said "marked Unverified" while the code carried only extrapolated:van-t-riet The CSO's Stage H memo of 24 October 2026, ruling 4; setup.ts vanTRietFlag; ranges.ts; islands/kla.tsx A verdict moved by an unread range was shown without its Unverified label, and the copy claiming the label was false (a D-0043 breach) Partly fixed 24 October 2026 (Stage H BR3.7): setup 2.2.0 attaches unverified:van-t-riet-range (rule van-t-riet-range-source@1) wherever the range decides the verdict, inside or outside, over exactly those aeration intervals (the CSO's ruling of that day); KlaEstimate.unverifiedRange marks the correlation's estimates; three goldens re-recorded as flags-only revisions; no preset version moved. The calculator and scale-up pills are the screens track's, still to be placed. Held for the CEO: whether the flag is an acceptable interim, or Van 't Riet 1979 must be read before the stage exits (the CSO: strictly, D-0043 says the latter) Place the pills on the calculator and scale-up verdicts; the CEO's ruling; read Van 't Riet 1979 (access costed by the CFO, archive held for the General Counsel)
MNT-204 Low The measurement register declares bioreactor-simulator as the writer of titre, but no Bioreactor code writes one, and a titre from model 2's biomass-equivalent product would be wrong src/components/suite/objects/measurements.ts (titre.writers); the CTO's memo of 24 October 2026, §6; inbound.test.ts requires every kind to name at least one writer, so the declaration cannot simply be dropped A declared writer that never writes is a false contract; nothing a user sees Open. Kept as declared on the coordinator's ruling of 24 October 2026 (the shared test's invariant is a suite contract, the CTO's ground); the test question goes to the CTO Remove the declaration, or realise it, when B4 (Stage H BR8) is decided
REL-534 Medium Lecturer mode does not withhold the pump sheet. With lect=1 and no prediction entered, the Pump sheet view still draws PumpView (the interval table, the total fed and the stop line, all built from the worker's run), and its "Print the pump sheet" key calls the workspace's unguarded print, which prints the whole bench sheet. Rescue and Compare check hidden and show the lecturer gate instead src/apps/bioreactor-simulator/views/bioreactor-workspace.tsx:906 draws PumpView with no hidden check, against the gate at :800 (Run) and :840 (Rescue); print at :569-573 has no Lecturer-mode check and views/pump-view.tsx:74 calls it; found by the CPO and CSO (docs/board/memos/2026-10-24-cpo-bioreactor-h28-lecturer-mode.md, 2026-10-24-cso-bioreactor-h28-key-states.md) Breaks the registry's promise that lecturer mode "shows nothing of the run until a prediction is entered" (content/apps/bioreactor-simulator.ts:75): a student opening Pump sheet or printing it sees the feed schedule and, on the bench sheet, the run itself before predicting Fixed on claude/stage-h-handoffs (Stage H BR5, H28): the workspace draws the lecturer gate in place of PumpView while hidden, as Rescue and Compare do, and "Print the pump sheet" left the view for the Export menu's "Print the bench sheet", which carries exports.hidden in Lecturer mode. Test "in lecturer mode the pump sheet is withheld until a prediction is entered" in e2e/bioreactor-simulator/workspace.spec.ts BR5: gate the Pump sheet view and its print on hidden, as Rescue and Compare are
REL-680 Medium Work saved through Save work (the work capture's Save) wrote no made-from links: only Keep (⋯, Keep this run) linked the run to the construct and the vessel in play, so work saved the other way lost them. The CTO's H27 notice memo of 24 October 2026, §1: keep() linked, onSaved did not (src/apps/bioreactor-simulator/views/bioreactor-workspace.tsx) A run saved as work did not show what it was made from on its object page or in a Study Fixed on claude/stage-h-handoffs (Stage H BR5): one linkMadeFrom, used by Keep and by Save work, links the construct, the vessel and each applied recipe (derived from runData.recipes). Tests: e2e/bioreactor-simulator/handoffs.spec.ts (Keep links the recipe and the construct) Write the links on both paths from one function
REL-535 Low Bioreactor's definition chunk is over its 24.6 KB ceiling: 24.9 KB on the Fast chain run of the assembled Stage H head (run 40101476508, head d8b4d1e6), 24,946 bytes on the session host's build of the same tree, over by 346 bytes node scripts/size-check.mjs on a clean build; Builder A's A/B builds of 24 October 2026: 24.6 KB at 28201f72 (before BR3.8) and 25.0 KB at c2a55552. The app's registry entry rides in the definition chunk, so its LIMITS and SOURCES text counts there. The causes: the BR3.8 limits lines for scale-up and yield feasibility (aead6028) and the Kaiser et al. 2017 source credit with the Np limit's wording (c2a55552), about 0.4 KB together, and BR3.7's range-flag words (about 0.1 KB). The workspace chunk (130.4 of 137 KB) and the preset-run island (35.2 of 40 KB) are under, Builder B's BR2 growth offset by the copy and print levers The size check fails on the row; nothing a user sees Open. The CTO's ruling of 24 October 2026 (docs/board/memos/2026-10-24-cto-bioreactor-definition-chunk.md): no ceiling rises and the copy is not shortened; the row's $comment records the overrun and is not a raise. No further copy goes into the registry entry or words.ts until the CTO's next ruling (the coordinator, 24 October 2026) Closed 24 October 2026: the Fast chain read the row green, 23.6 of 24.6 KB (run 40127744687 on 744f45d5; run 40130738535 on 7fc630fe, the landed head), the batch fit's three limits lines included. The CTO's ruling of 24 October 2026 named the lever: PRESET_WORDS moved to content/apps/bioreactor-simulator.preset-words.ts and definition.ts imports it there, so the chunk no longer carries the rest of bioreactor-simulator.words.ts. Measured 23,586 bytes of 24,600 on the session host with the batch fit's three limits lines added in the same commit (Builder A, claude/stage-h-record). The registry-wide move of LIMITS and SOURCES stays the pre-live candidate. Close when the row reads green from the Fast chain's size-measurements artifact
REL-536 Low Patent's workspace registers Export menu items with disabled, a key ExportItem does not have (it reads disabledReason), so an item that needs a product shows as live with no reason when none is chosen. The same mismatch was in Bioreactor's two measured islands src/apps/patent-exclusivity/views/workspace.tsx:285 (disabled: PRODUCT_VIEWS.includes(id) && !hasProduct ? copy.exports.needsProduct : undefined); ExportItem.disabledReason in src/components/suite/data/export-items.ts:58; found by Builder B in Stage H BR4 (screen 1's Export menu finding, docs/design/bioreactor-stage/compare-selector.md), 24 October 2026. An object literal inside useMemo escapes TypeScript's excess-property check, so tsc did not catch it A product-only export can be chosen with no product; what it then writes is Patent's to check Open, record only (the coordinator's ruling of 24 October 2026). Bioreactor's islands fixed on claude/stage-h-screens (53cfea72f); Patent not touched Patent's owner: rename the key to disabledReason; consider typing useExports' items so an unknown key fails tsc
REL-537 Low For a saved task with unsaved edits, Bioreactor's Save slot shows a direct Save key and a "More for …" key whose menu offers no "Name & Study" (workflow.saveOptions), so the shared test helper openWorkDetails (e2e/support/work-capture.ts) cannot reach the save details there Found by Builder B on 24 October 2026 while writing the Compare chips' save test (e2e/bioreactor-simulator/measured-comparison.spec.ts, "one Save slot across the chips"): a probe on a production build of c2bb369d3 and of Builder A's head d8b4d1e6 alike found no menu item after saving a scenario and changing kLa. The item is drawn by WorkMenuItems in src/components/suite/objects/object-actions.tsx when WorkActionContext is provided Renaming the task or changing its Study from that state needs another route; the direct Save key saves the edits. Not introduced by Stage H Open, record only (the coordinator's ruling of 24 October 2026); the new test saves with the direct key The workflow fix line (shared Save controls): decide whether the menu should offer "Name & Study" here and align the helper
SCI-262 Low B2's engine measures its prediction envelope with one term the oracle's measure lacks: each row's eᵢ is the largest difference from the shipped prediction at the looser and tightened levels plus the state's shipped absolute tolerance (exactly that, no multiple), over the scale. The CSO's item 3 said the engine's eᵢ is "measured the same way" as the oracle's; the CSO amended item 3 after the failure was seen (docs/board/memos/2026-10-24-cso-bioreactor-b2-engine-acceptance.md, ruling 1) on conditions (a) to (e) Found by batch-fit-oracle.test.ts item 3 on 24 October 2026 before the term (shipped level rtol 1e-8; S atol 1e-10 g/L in both cases). The four readings, as value / difference from the oracle / oracle eᵢ / engine eᵢ (level differences) / shortfall, in g/L: methanol-haldane s-9 (36 h) 2.779e-7 / 2.43e-10 / 1.28e-12 / 2.21e-10 / 2.0e-11; s-10 (40 h) 1.407e-8 / 2.17e-11 / 5.9e-13 / 1.47e-11 / 6.4e-12; s-12 (48 h) 3.605e-11 / 1.25e-13 / 7.6e-14 / 3.8e-14 / 1.1e-14; maintenance-transition s-2 (2 h) −1.22e-12 / 1.39e-12 / 2.2e-15 / 1.32e-12 / 7e-14. Each is below the shipped atol ÷ rtol (1e-2 g/L), asserted in the test (condition (c)). Convergence (condition (b); docs/science/evidence/bioreactor/b2-acceptance-2026-10-24/): the difference falls monotonically at every tightening and reaches the oracle's eᵢ plus that level's atol by rtol 1e-12 at all four; at the tightened level (1e-10) it is within that bound at s-12 and s-2 but not at s-9 (2.16e-11 against 2.28e-12) and s-10 (6.92e-12 against 1.59e-12): it shrank 11× and 3.1×, not about 100×, from shipped to tightened None on any estimate, verdict, reason or flag of 0.9.0; items 5 and 7 pass with and without the term (it widens item 5's tolerance by 36 percent at poorly-excited, under 1 percent elsewhere) Closed for bioreactor-batch-fit@1.0.0 by D-0137 (CEO override, 24 October 2026, docs/board/decisions/D-0137-b2-engine-acceptance-override.md). The record: 1(b) as first worded failed at s-9 and s-10 (tightened 2.16e-11 against 2.28e-12; 6.92e-12 against 1.59e-12); 1(b′) as first worded (2026-10-24-cso-bioreactor-b2-engine-acceptance-2.md) failed its clause (i) at maintenance-transition s-2 between rtol 1e-7 and 1e-8 (1.72e-13 rising to 1.39e-12 g/L), and the CSO withheld acceptance (-acceptance-3.md). D-0137 amends (i), after the data were seen, to the CSO's replacement text: "between adjacent levels, the difference does not increase where the looser level's difference exceeds that level's S atol; where it does not, the difference is ≤ that level's S atol". Under it all 36 records pass (s-2's rising pair falls under the second branch: 1.39e-12 ≤ the 1e-7 level's S atol 1e-9). Full sequences (|engine − oracle|, g/L, rtol 1e-7 to 1e-12): s-9 3.95e-10, 2.43e-10, 9.83e-11, 2.16e-11, 4.81e-12, 1.18e-12; s-10 2.93e-11, 2.17e-11, 1.43e-11, 6.92e-12, 1.54e-12, 2.13e-13; s-12 1.45e-13, 1.25e-13, 1.06e-13, 8.71e-14, 6.84e-14, 4.95e-14; s-2 1.72e-13, 1.39e-12, 2.40e-13, 7.03e-14, 2.38e-14, 6.89e-15 (step counts in docs/science/evidence/bioreactor/b2-acceptance-2026-10-24/README.md). The engine is accepted on items 1 to 10; item 11 stays with BR7.3. The check is src/lib/hosts/fit/b2-acceptance.check.ts, run by the check job's step "B2 acceptance" (continue-on-error; outcome in the job summary; TAP artifact b2-acceptance, 30 days); the tripwire "1(b′) tripwire" in batch-fit-oracle.test.ts expects no failure and turns npm test red on any Any later failure of the amended condition fails item 3 outright (D-0137; the CSO's rule): the tripwire and the step summary say so. The receipt shows values below the shipped atol as "below 1e-10 g/L (numerically zero)" (BR7.3)
REL-578 Low B2's worker has no size row, no deadline value and no perf spec yet No page loads fit.worker.ts before the receipt surface (BR7.3), so the build has no chunk to measure; the CTO's rules set the row at the Fast chain's first measurement + 15 % (cap 45 KB), the deadline at the slowest qualifying acceptance case plus a documented margin (at most 30 s), and add e2e/perf/bioreactor-fit-worker.spec.ts to the worker-gate matrix (Stage H memo §3; B2 receipt memo §1). Node timings on the session host, 24 October 2026: 0.1 to 7.8 s per fixture case (oxygen-limited the slowest) A chunk born without a row would break the Stage H red line ("a new chunk without a row that is green when it is created") Open; closes with BR7.3's first push that loads the worker (Builder C) Measure from that push's Fast chain artifact; set the row, the deadline and the spec in the same change
REL-681 Medium B2 1.0.0 does not check that the initial state taken from the data is physical before evaluation. Admission admits finite negative readings unchanged (admit.ts:17) and passes the single kept t = 0 reading per channel into the model's initial state (admit.ts:84; batch-fit.ts levelSpecs). Neither batchFit nor the worker applies the model's physical checks to it: fit-job.ts calls checkSpec with a placeholder initial: { X: 1, S: 0 }, and model.ts:225 and :232 would refuse X ≤ 0 and S < 0. The contract requires the check (proposal of 11 October, lines 29-30). The CTO's probe, 25 October 2026, on 0.9.0's noiseless-glucose with the t = 0 reading replaced: X0 = −0.1 and −1e-6 g/L gave not resolved, profile-incomplete; X0 = 0 gave not resolved, bound-contact, competing-minimum and profile-not-rising after 43.6 s; S0 = −0.1 and −1e-6 g/L gave the same three numerical reasons. The CSO's memo 2026-10-24-cso-bioreactor-b2-not-estimated-lines.md §3. No estimate appeared in the probes, but nothing guarantees that. The reasons shown misdescribe the cause, and a receipt carrying a non-physical initial state can be saved. B2 has not reached users (D-0137). Closed for bioreactor-batch-fit@1.0.0 by the interim guard (Builder C, 25 October 2026; the coordinator's close of the same day): fit-job.ts runs admitDetailed and, when admission admits the data and initialStateNotPhysical finds X0 not finite or ≤ 0, or S0 not finite or < 0, posts initial-state-not-physical with its detail (channels in the order biomass, substrate; initial { X, S }) before batchFit is called; not-batch and admission's refusals still come first. The engine, 0.9.0, 0.11.0 and batch-fit-reference.py are unchanged. The words are the CSO's of 25 October 2026 (2026-10-25-cso-bioreactor-b2-initial-state-lines.md): batchFitCopy.notEstimated.initialStateNotPhysical, one form per channel and one for both, printing detail.initial. Tested in fit-job.test.ts (X0 = −0.02, −1e-6, 0 and −0; S0 = −0.01 and −1e-6; both channels; S0 = 0 reaching the engine; not-batch, a bounds refusal, initial-state-missing and initialStateSeveral taking precedence; each refusal the only message posted) and refusal-copy.test.ts (printed values equal detail.initial). The guard covers 1.0.0 In 1.1.0 (D-0139; Builder C, 25 October 2026) the refusal is in admission (admit.ts, admitDetailed) and in the 1.1.0 reference script (batch-fit-reference-2.py), applies to the t = 0 mean, and comes after initial-state-missing; the worker guard was deleted in that same commit, and the engine's refused outcome carries the detail. The fixture cases are in the CTO's memo of 25 October 2026 (2026-10-25-cto-bioreactor-b2-initial-state-and-1-1-0.md) and the CSO's of the same day (cases (l) and (m)). The receipt's own count of kept t = 0 rows (receiptBody's observations.timeZero) is read from 1.1.0's initial-state basis, no longer recounted
SCI-284 Low B2 admission labels kept biomass, optical density and no kept substrate od-only-refused, although mass biomass is present: the channel check returns od-only-refused whenever a mass channel is missing and any OD row is kept (admit.ts, first check; the 0.9.0 reference's admit alike). The words would then say these data are optical density alone The CSO's memo 2026-10-24-cso-bioreactor-b2-not-estimated-lines.md §3; read from the code, 25 October 2026 Unreachable from the v1 import: the batch-observations payload carries no OD channel, so a request built from it cannot hold OD rows Open A ruling from the CSO if another input path ever carries OD; not in 1.1.0. Any change is a method version and a new reference script; the 0.9.0 reference and 1.0.0 stay as published
SCI-285 Low B2 1.1.0's decimals (the places a t = 0 value is printed to) counts the fraction digits of each supplied value as its shortest round-trip string writes it, so trailing zeros typed in a sheet are lost before admission: "0.120" g/L arrives as the number 0.12 and counts two decimals, not three The batch-observations payload carries value: number (batch-observations.ts); the import parses the typed text and discards it. The CSO's memo 2026-10-25-cso-bioreactor-b2-mean-precision.md §3 and the CTO's 2026-10-25-cto-bioreactor-b2-mean-decimals.md ruling 4 The printed precision can only under-state the readings' (fewer digits shown), never over-state it Open Recovering the zeros needs the payload to carry the typed text, a payload-version question not raised now
SCI-286 Medium On an exactly flat profile (every profile point's objective equal to the lowest, as when S0 = 0 and nothing grows) B2's not-resolved receipt summary would take boundContact ("Not resolved: at the lower bound, … per hour") or competingMinimum and their "why" lines, including "Widen them only if your organism allows": it presents a tie-break point as a μmax and offers a remedy that changes nothing. Present under 1.0.0 (0.9.0's no-growth carries bound-contact) The CSO's memo 2026-10-25-cso-bioreactor-b2-flat-profile-reasons.md §1(3); 0.13.0's (j) and (l) (flatObjective) A scientist would read that the data pushed μmax to the floor they set, when the readings do not distinguish any growth rate Open Panel copy and logic, riding the receipt view (BR7.3), before B2 shows a flat-profile receipt: when both profile rises are ≤ the objective envelope (profileRiseLeft and profileRiseRight each ≤ objectiveEnvelope, not both rises 0; the CSO's addendum of 25 October 2026), the summary takes neither line, shows no μmax and no "widen the bounds", and says the readings do not distinguish any value of μmax; with initialState.S === 0 one cause sentence (no substrate, no growth at any μmax). The CPO words it. The receipt records the engine's reasons unchanged

Stage H Bioreactor: the visual layer in the workspace (BR11.1, BR11.2) — 24 October 2026

Rows from Builder D (claude/stage-h-motion; docs/progress/bioreactor-stage-briefs/builder-d-motion.md). The ids are those the CTO's sign-off memo of 24 October 2026 allocated in BR11's range and the coordinator confirmed (docs/progress/bioreactor-stage-briefs/br11-rulings.md, §1.16).

ID Severity Finding Evidence Impact Status Follow-up
SCI-270 Medium The preset pages' data tables and the workspace's time cursor showed valueAt's linear interpolation between two output points as if the model had computed it (run-table.tsx:22-30, 87, run-card.tsx:85; the preset pages' tables at preset-run.tsx:307). On the preset pages' 0.12 h grid two whole-hour rows in three were interpolations The CSO's finding of 24 October 2026 (BR11, "Pre-existing defect"); the CTO's rev3 sign-off memo A number a scientist reads that nothing computed, beside computed ones and indistinguishable from them Fixed 24 October 2026: valueAt is gone; stored-points.ts reads stored points only. The cursor stands on the latest stored point at or before its time (step 0). The table follows the CSO's rule of 24 October 2026 (docs/board/memos/2026-10-24-cso-bioreactor-br11-table-rule.md, BR11.1): a grid row reads the latest stored point at or before its hour and shows that point's time to 0.01 h; an event row reads the point at the event; a point appears once; with two runs the second shows a value only where it stored a point at that time; the caption carries the CSO's note. playback.test.ts checks the row times 0, 0.96, 1.92, 3.00, 3.96, 4.92, 6.00 h, the 3.00 h tolerance, no repeats and the two-run rule —
SCI-650 Medium The landing page's AI figure shows a stock mass ("Mass to weigh") on the dilution tool's result card, but no MCP tool returns a mass: dilution_series (src/lib/mcp/tools/dilution.ts) takes molar inputs, has no formula weight and holds no CIAAW reference; the mass is Calc's mass-for-molarity method (src/lib/dilution/fixtures/dilution.json, case mass-erlotinib-hydrochloride-5mm), and set dilution's method list (content/apps/lab-calculators.ts) does not name it The CSO's memo docs/board/memos/2026-10-24-cso-ai-figure-engine-lines.md; the figure's engine header names {massMethod} for the mass and {toolId} for the series, and its caption says the stock mass is Calc's own method, shown with it A reader could take the mass as something the connection returns; the arithmetic itself is right (5 mM × 2 mL × 429.901 g/mol = 4.29901 mg) Open; qualified on the page; owner CTO Before public release either ship a stock-mass MCP tool (then the caption may say the connection returns both) or take the mass off the card; list mass-for-molarity in set dilution's methods
REL-650 Medium The workspace's time cursor ([data-cursor], a line on the run chart's SVG) carried no data-export="exclude", so a cursor the person had set reached the SVG export, Copy and the bench sheet's chart, and it printed The design agent's screen 6 open question; the CTO's rev3 sign-off memo; run-chart.tsx before this change A reading aid exported as if it were part of the figure Fixed 24 October 2026: data-export="exclude" and data-print="hide" on the cursor, data-print="hide" on its readout; e2e/bioreactor-simulator/motion.spec.ts checks Print and the bench sheet's chart —
MNT-240 Low reduceMotion() in e2e/support/motion.ts always emulated the OS setting, so settingsSwitch: true never tested the Settings switch alone, and the helper had no save-data driver The CTO's screens 12–13 memo (T13-5) A switch-only or save-data case built on it tested the OS setting Fixed 24 October 2026: reduceMotionBy(page, "os" | "switch" | "save-data") turns on exactly one source (the OS set to no-preference in the other two), expectOnlyTrigger asserts the detected triple; motion.spec.ts runs each in its own context —
REL-664 Low At 375 the rescue's step stamps 1 to 3 sit edge to edge in the static chart The design agent's screen 7 open question, seen in s7-storyboard-375-light-part1.png R7; the CTO's rev3 sign-off memo (from the capture, not confirmed in code) Stamps hard to tell apart at phone width; the playback's clone copies whatever the static chart draws Open The CDO rules the form
REL-665 Low At 375 the flag lane boxes cut off their own labels As REL-664 A lane's label is partly hidden at phone width Open The CDO rules the form
REL-666 Low The run card's still line and the rescue's computing line carry role="status", implicit live regions beside the suite's one announcer The CTO's screen 7 memo (run-card.tsx, bioreactor-workspace.tsx "computing" line) Assistive technology may hear these lines twice or out of order Open: the accessibility pass (D-0080) Remove the roles; the announcer says these states
REL-671 Medium At 375 on a two-run view (Rescue, Compare › Scenarios) the key row's blank placeholder key is empty, so it is narrower than the real key; when the playback chunk arrives the legend beside it wraps and the row grows from 28 to 44 px, moving the chart down 16 px BR11.2's captures (docs/reviews/2026-10-24-bioreactor-stage-design/build-br11-2/metrics.json, the arrival boxes at 375 with fonts aborted and at a 20 px root); views/run-card.tsx (the key slot) A layout shift when the chunk arrives, against BR11.5's zero Fixed (BR11.2, 25 October 2026): the placeholder (KeyPlaceholder in views/run-card.tsx) holds the key's own labels, invisible, Skip to end and Replay run in one grid cell or Back to the start under reduced motion or save-data, from keyLabels in bioreactor-simulator.visual-frame.ts, which playbackCopy also takes; BR11.2's captures measure no box moved on arrival at 375 —