Skip to content

docs(proposal): a parameter point is a design coordinate or a sample, and the cell says which - #962

Merged
vsbuffalo merged 5 commits into
mainfrom
docs/coordinate-kind-proposal
Oct 5, 2026
Merged

vsbuffalo merged 5 commits into
mainfrom
docs/coordinate-kind-proposal

Conversation

@vsbuffalo

Copy link
Copy Markdown
Owner

Proposal: docs/dev/proposals/2026-09-27-coordinate-kind-design-vs-sample.md (status: accepted, no open questions). Docs only.

camdl decides whether parameter points are conditions to compare (design) or samples of one distribution from the CLI flag that produced them. It gets that wrong for hand-written grids: simulate --draws grid.tsv --quantities-out pools three β conditions into one meaningless band (reproduced on main). The proposal replaces ParamSource with ParamPlan { design: DesignAxis, sample: SampleAxis{…, measure, varying} }; each cell carries its coordinates. Collision policy, labels and banding all read that one recorded property.

User surface: --sweep / --sweep-file (design) and --draws posterior|prior|uniform / --draws-file (sample); a bare --draws FILE is refused, naming both replacements. Design points share random numbers. Outputs gain point_id, round-trip coordinates, a per-row band column and a self-describing manifest. --draws-out writes a provenance sidecar.

13 end-to-end workflows; normative output schema; 9 stages, each landable alone with a test that can fail on the bug it guards. No IR or golden change; no re-key beyond the per-build engine-version fold, with the baseline taken after gh#949.

Reviewed by five agents (three modeler personas, a code-claims check, a feasibility check), then a feasibility re-review. All findings are incorporated; the decisions are in §16.

Relates: gh#562, gh#572, gh#575, gh#949 (prerequisite, in progress).

Revised after a fresh no-context consistency review: posterior --draws-out keeps [fixed] columns (B1); per-stage point/band rule for both verbs (B2); --design-from seeds by dataset index (B3); schema string camdl.quantities/v2; SampleProvenance; gh#949 treated as landed; citations re-pinned to main 15cf347. Replaces #950 (rebased history).

Draft. Collision policy, leaf labels and provenance, and quantity
banding each decide whether a parameter point is a labelled design
condition or a sample from a stated measure, and each reads that off
ParamSource -- the CLI flag -- because the cell does not carry it.
The flag classifies a hand-authored grid passed via --draws as a
sample, and an iid uniform design as a partition in batch run but a
band in simulate.

Proposes a ParamPlan of a typed design axis crossed with a sample
axis (a sample cannot be built without a Measure), CellCoords in
place of point_idx + point_overrides with plan_grid as the single
constructor, one collision guard keyed on the kind, a manifest
summary block naming what a band is over, and fit predict's sweep
moved onto the grid. Seeds and resolved values are preserved, so
nothing re-keys; IR and goldens are untouched. Five calls are left
for the maintainer in section 10.

Relates-to: gh#562, gh#572, gh#575
Every open call is decided, so the proposal ships with no open
questions. The ambiguous --draws FILE splits by axis into
--draws-file (a sample) and --design (design points), and a bare
--draws <path> is refused naming both; simulate gains --sweep on the
CLI grammar fit predict already uses; --draws uniform is a sample
under a uniform-bounds measure; fit predict's sweep moves onto the
grid behind a byte-identity gate; seeds and the sweep:<param> prefix
stay as they are.

DesignAxis becomes a sum type with Unit as its own variant, and the
collision diagnostic names the design's origin. New sections set out
how the user drives each axis and walk eleven workflows end to end on
one SIR model. The staged plan places the flag split with the guard
rework, now that the gh#572 guard is on main keyed on ParamSource.
Every file:line is re-checked against ebe845a.

Relates-to: gh#562, gh#572, gh#575, gh#948
Renames --design to --sweep-file, so flags pair by axis (--sweep /
--sweep-file, --draws / --draws-file). Design coordinates leave the
process seed, giving common random numbers across design points. Adds
a normative output schema (point_id, exact sweep: values, a band
column, a self-describing manifest), landed as its own stage before
fit predict's grid move; a provenance sidecar for --draws-out and
--draws-file, with -n subsampling a file; and refuses duplicate rows
only in --sweep-file.

Sampled columns are now the ones the measure varies. A scenario,
--param or design value that sets one is recorded as an imposition
in plain words, and --param joins the collision footprint. Quantity
mode is decided per quantity, so ODE replicates and one-row samples
no longer render zero-width bands.

The staged plan is reordered so no stage pools design points or drops
a refusal, and byte-neutral checks compare level hashes and bytes
rather than run_ids, which fold the git hash. Workflows are updated
and extended with --param on a swept parameter and a sidecar round
trip. Follow-ups are listed to be filed.

Relates-to: gh#562, gh#572, gh#575, gh#630, gh#948, gh#949
Twelve corrections from the feasibility re-review.

Point versus band is now decided by the data in each group rather
than by the backend: a quantity collapses to a point only when every
group's realizations are bit-identical, and the band column is set
per row from what actually varied. --draws-file gets no default row
cap, so it keeps today's --draws FILE seeds; with -n the seed index
is the position in the subsample.

Stage 7 is gated on byte identity against its parent commit, and it
slices one global plan by design index so partition keys stay
global. Predict's design shadows and varying list land in the commit
after the A/B passes; the A/B compares report.json and manifests
unmasked, since they carry no version string or timestamp.

Also: the ensemble axis-kind fold is an optional field, so no
existing grid hash moves; the CRN test and the Stage 2 test are made
able to fail; posterior varying columns fall back to non-constant
columns when estimated is empty; imposition notes print once per
invocation; the no-re-key baseline is main after gh#949.

Relates-to: gh#562, gh#572, gh#630, gh#949
Rebased onto main with gh#949 landed; every citation is re-pinned to
15cf347.

A posterior --draws-out keeps today's columns, the fit's [fixed]
columns included, so a reused posterior needs no --fit; only the
sidecar's varying list narrows to the estimated set. --design-from
keeps dataset-index seeds as a stated exception to the design-seed
rule, since its datasets are independent replicates. Stage 4 adds
per-group attribution for both verbs under today's mode predicate,
Stage 5 moves both to the bit-identical rule, and Stage 7's byte gate
sits on a parent already on the final rule.

The guard returns impositions and design shadows as separate lists.
The types gain SampleProvenance, DesignRow, FitRef, PriorSource and
a Seeds that holds the replicate count. The manifest becomes
camdl.quantities/v2 with its remaining fields defined. simulate sorts
quantity groups design-major explicitly. The --fit source check
accepts the new flags, the draws reader loses its two-column minimum,
and the constant-column refusal needs two or more rows. Smaller
wording and interface fixes from the same review are folded in.

Relates-to: gh#562, gh#572, gh#949
@vsbuffalo
vsbuffalo merged commit e8219d1 into main Oct 5, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant