Skip to content

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.

issuestatuswavedepends ontitle
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

a-derive-answers-within-a-second dependency graphfrom .ai/repo/project
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:2px

Canonical 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.

Searches the titles and descriptions of every page this site publishes.