a-derive-answers-within-a-second — An ordinary derive answers in under a second, runs independent nodes in parallel, and a budget gate holds it
Derive scenarios (no-op, one input, batch, plus the ten of c255#7) are bench targets under the existing benchmark policy. bench --check refuses a regression. Independent nodes run in bounded parallel against one immutable snapshot, with output identical under any order, and a derive's whole output set is published atomically.
BLOCKED 0 of 2 issues done
- ready
- 0
- blocked
- 2
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
The 10-13 graph plan makes a derive do less, but it sets no time budget, runs nodes one at a time and publishes file by file. The owner's 10-17 order asks for 'sub second, in parallel' with every algorithm, cache and architectural choice reviewed. ChatGPT's own reply (c292#1) called sub-second without benchmarks 'marketing'. Proposed in ADR 0185 (A derivation is a typed graph of the generators the executable already plans, keyed by the content of what each node reads, and the full derive stays its oracle) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c292#0, chatgpt-majordomus:c292#2.
Outcome
Derive scenarios (no-op, one input, batch, plus the ten of c255#7) are bench targets under the existing benchmark policy. bench --check refuses a regression. Independent nodes run in bounded parallel against one immutable snapshot, with output identical under any order, and a derive's whole output set is published atomically.
Current state
Verified on master: the benchmark harness (I0823-I0827, rule rust-benchmark-coverage, test/cases/82_bench_check.sh) has no derive target, and .ai/repo/benchmarks/ holds economics, observatory, pages and rust only. MJ_TIMING phase timers exist in lib/common.sh. generate::write is atomic per file, not per set. Off master: I2349 (rescue ref) plans the derive and CI budgets.
Desired state
I2349 revived and amended; I3236 parallel nodes; I3237 transactional publication. Order follows c292#2: baseline, then no-op and invalidation, then graph and cache, then parallelism, then transactional publish, so each regression can be attributed.
Scope
- apps/majordomus-cli/src
- apps/majordomus-cli/src/bench
- .ai/repo/benchmarks
- scripts/derive
- docs/PERFORMANCE.md
Out of scope
- Cold rebuild budgets (separate contract)
- Removing or narrowing the machine derive lock (rule project.one-derive-at-a-time; see open question)
- Mesh-shared derive cache
Acceptance criteria
- Derive scenarios are bench targets with a committed baseline and a declared reference machine
- bench --check fails a derive regression beyond its noise-aware threshold and names the stage
- Output bytes are identical across randomized node order and worker counts
- A derive killed mid-run leaves the previous consistent set on disk
Validation
- majordomus plan validate
Risks
- Parallel nodes raise peak load on the shared machine that the lock exists to bound (2026-10-09: nine sessions at load 57)
- Budgets measured at load 20-68 (I2880, 10-18) are noise; I2068 already says one cold sample is not a regression
Issues
Each one is an execution contract with its own acceptance criteria, validation command and required evidence. The wave column is the layer of the dependency graph it sits in.
| issue | status | wave | depends on | title |
|---|---|---|---|---|
| I3236 | BLOCKED | 6 | I2525, I2527, I2521, I2068 | Independent derive nodes run in bounded parallel against one snapshot, and the bytes do not depend on the order |
| I3237 | BLOCKED | 2 | I2522, I2521 | A derive publishes its whole output set at once after validating it, and a killed derive leaves the previous set |
The graph
flowchart LR
I3236["I3236<br/>Independent derive nodes run in bounded parallel against one snapshot, and the bytes do not depend on the order"]:::blocked
I3237["I3237<br/>A derive publishes its whole output set at once after validating it, and a killed derive leaves the previous set"]:::blocked
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxCanonical record: .ai/repo/project/milestones/a-derive-answers-within-a-second.yaml. Read it back with majordomus plan show a-derive-answers-within-a-second.