Repository navigation
Description
Overview
Phase 0, sub-issue 0A of the likelihood-lifecycle epic (PyAutoMind draft/research/autolens_profiling/likelihood_lifecycle_epic.md, report §3.1–§3.2, §3.6, §3.8, §4). Pulse is the contract owner, so it goes first: this issue adds profiling-summary@3 with producer-declared class (optimal/secondary/experimental) and status (current/superseded/archived), the walltime-validation@1 evidence axis, the designation decision kind, and a Class-first, current-only setup browser. 0B (autolens_profiling builder), 0C (autolens_inference exporter), 0D (Insight) and 0E (Brain template) follow as their own issues once this ships. Pulse still validates and renders only: it infers no optimal, selects no fastest row and computes no ratio.
Rulings assumed (approved in chat 2026-10-21): R1 vocabulary/setup_id grammar (§3.1); R2 label-only history cut; R3 provisional designations as phase-0 labels; R7 host_class is provenance and laptop/local-GPU rows are never current; R4/R5 enter as validator enumerations only.
Plan
- Add
profiling-summary@3to the reader: v2 shape plus lifecycle fields with the one-current-per-key, optimal-needs-decision_idand laptop-never-current rules; v2 instances (autofit_profiling) validate unchanged. - Add the
walltime-validation@1schema as a second producer-declared evidence axis, registrable as its own instance row (the autolens_inference row itself lands in 0C). - Add the
designationdecision kind to the decision index and template; no designation record is written here (phase 3). - Rework the setup browser for @3 snapshots: Class is the first selector with Optimal default, current-only view, History toggle for superseded rows, per-class Coverage panel, archived records counted never rendered. v2 snapshots keep the current browser.
- Fix REFERENCE/README drift that still calls v1 live; add the @3, walltime and designation sections; one CHECKIN.md line that research lookups read
class: optimal+status: currentunless asked otherwise. - Fixtures and tests for every rule and for the board selector order.
Tier: judge — merge mode: human /prm
Detailed implementation plan
Affected Repositories
- PyAutoPulse (primary, only)
Branch Survey
| Repository | Current Branch | Dirty? |
|---|---|---|
| ./organs/PyAutoPulse | main (e3d411e) | clean |
Warning (not a conflict): unregistered worktree .worktrees/pulse-checkin-2026-10-17 on checkin/2026-10-17. Pulse PR #68 (docs/receipts) is open and unmerged: branch from main, rebase after it merges.
Suggested branch: feature/likelihood-lifecycle-p0-pulse (worktree ~/Code/PyAutoLabs-wt/likelihood-lifecycle-p0-pulse/)
Implementation Steps
pulse/summary.py:SUPPORTEDadds("profiling-summary", 3)and("walltime-validation", 1);validate()dispatches v3 tocatalogue.validate(doc, version=3)and walltime to a newpulse/walltime.py;hardware()/group_label()learnhost_class.pulse/catalogue.py:_recordgains a v3 branch validatinglikelihood {dataset_type, variant},instrument,regime,setup {backend, device, operator, precision, transformer, threads}+setup_id,host_class,model_variant,measurement,class,status,superseded_by,day_zero,figures[] {kind, path, sha256},decision_id,release_pin,measured_at; enumerations: tendataset_types (imaging, interferometer, datacube, point_source_image, point_source_source, multi_galaxy, group, cluster, multi_dataset, weak),host_class∈ {hpc_ral_cpu, hpc_a100, local_laptop, local_gpu},measurement∈ {runtime, breakdown, gradient, compile, memory_host, memory_device, parity, walltime_validation},class∈ {optimal, secondary, experimental},status∈ {current, superseded, archived}.validate(version=3): key = (likelihood, instrument, setup_id, host_class, model_variant, measurement); refuse a secondcurrentper key; refuseclass: optimalwithoutdecision_id; refusestatus: currentonlocal_laptop/local_gpu; refuse anyarchivedrecord inrecords[](they belong inarchive_record_count);supersededrequiressuperseded_byresolving in-document;planned_cells[]must carryclass.pulse/ingest.py+checkCLI: resolve everydecision_idagainstdecisions.yamlat ingest/check time (doc-only validator checks presence); receipt records schema and current/superseded/archived counts.pulse/walltime.py(new): records keyed by (likelihood, instrument, setup_id, host_class, model_variant, sampler, seed) withwall_s,likelihood_evals,implied_ms_per_eval,reference_runtime_record_id,predicted_ms_per_eval,ratio_measured_over_predicted,cores,parallel_efficiency,release_pin,slurm_job_id,max_log_likelihood,parity_status∈ {match, diverged, not_assessed}; all producer-declared; duplicate keys refused.pulse/registry.py:supported_schemaacceptswalltime-validation@1; a registry fixture row exercises it (no live row here).pulse/decisions.py+decisions/README.md: optionalkind: designationwithlikelihood,regime,hardware_class∈ {cpu_many_core, gpu_a100, laptop},optimal,secondary[],evidence[],rule,supersedes; template appended; validation of the designation fields whenkindis set.pulse/setup_browser.js: for v3 snapshots the selector block (before today's Instrument selector, ~line 909) becomes Class (Optimal default | Secondary | Experimental | All) → Likelihood (dataset type → variant) → Instrument → Hardware class → Measurement; default filterclass == optimal && status == current; History checkbox includessuperseded; Coverage panel listsplanned_cellswithclass: optimallacking a current record; v2 eligibility/curated()heuristics (lines 150–198) bypassed for v3. v2 path unchanged.pulse/board.py+dashboard.md: per-instance status lines show current/superseded/archived counts; walltime axis renders as its own table under Profiling Results.- Tests: fixtures
tests/fixtures/setup_summary_v3.json,walltime_validation_v1.json, refusal fixtures (duplicate current, optimal without decision, laptop current, archived in records); new cases intest_catalogue.py,test_summary.py,test_registry.py,test_decisions.py,test_ingest.py,test_board.py,test_setup_browser.py(first<select>is Class with Optimal selected; superseded hidden until History). - Docs: REFERENCE.md lines 9, 36, 42, 99–101 corrected; new @3, walltime and designation sections; README mirrors; CHECKIN.md lookup sentence.
Trade-off: one versioned reader with a v3 branch, not a parallel module, keeps the v2 instance untouched and lets 0B migrate lens by changing one registry pin.
Key Files
pulse/summary.py— SUPPORTED set and version dispatchpulse/catalogue.py— v2/v3 record and catalogue validationpulse/walltime.py— new walltime-validation@1 validatorpulse/decisions.py,decisions/README.md,decisions.yaml— designation kindpulse/setup_browser.js,pulse/board.py— Class-first browser and boardREFERENCE.md,README.md,CHECKIN.md— contract docstests/— fixtures and cases
Original Prompt
Click to expand starting prompt
Likelihood lifecycle phase 0A: profiling-summary@3 (class/status), walltime-validation@1, designation decisions and Class-first Pulse board
Type: feature
Target: PyAutoPulse
Repos:
- PyAutoPulse
Themes: - profiling
- dashboard
Difficulty: large
Autonomy: supervised
Priority: high
Status: formalised
Consequence: judge
Witness:pyauto-pulse checkaccepts a fixtureprofiling-summary@3catalogue in which every record carriesclassandstatus, refuses a secondcurrentrecord on one (likelihood, instrument, setup_id, host_class, model_variant, measurement) key, refusesclass: optimalwithout a resolvabledecision_id, accepts awalltime-validation@1document, and the rendered board's first<select>is Class with Optimal selected and superseded rows hidden until the History toggle
Review-minutes: 30
Unattended: never
Epic: likelihood-lifecycle
Phase: 0
Parent: draft/research/autolens_profiling/likelihood_lifecycle_epic.md
Filed: 2026-10-21
Note: Pulse PR docs: link /prm close-outs and refresh receipts after 2026-10-17 merges #68 (docs/receipts) is open and unmerged on 2026-10-21; branch from main and rebase after it merges — not a gate.
Phase 0 of the likelihood-lifecycle epic (ledger: draft/research/autolens_profiling/likelihood_lifecycle_epic.md; bodies and architecture: likelihood_lifecycle_epic_report.md §3.1, §3.2, §3.6, §3.8, §4 phase 0; evidence: likelihood_lifecycle_epic_surveys/02_pulse_insight_contracts.md). Phase 0 is the spine and has five sub-issues, one per repo, issued in order: 0A PyAutoPulse (this prompt) → 0B autolens_profiling → 0C autolens_inference → 0D PyAutoInsight → 0E PyAutoBrain. Each later sub-issue is filed as its own prompt (likelihood_lifecycle_p0_<target>.md, Phase: 0) once 0A is shipped, because 0B's catalogue builder and 0C's exporter emit the contract this issue defines. Library first: Pulse is the contract owner, so it goes first.
Rulings assumed (report §5; the human confirms or amends at plan approval)
- R1 vocabulary and
setup_idgrammar as report §3.1 (<backend>_<device>_<operator>_<precision>[_<transformer>]; site/tier moves tohost_class). - R2 day-zero history cut is label-only; nothing is deleted or re-run in phase 0.
- R3 the provisional designations in report §3.3 are the phase-0 labels; phases 2–3 confirm.
- R7
host_classis provenance, never identity;local_laptop/local_gpurows can never becurrent. - R4/R5 enter as validator enumerations only (mixed precision allowed with
class: experimental;compileis a measurement, not a class axis).
What (sub-issue 0A, PyAutoPulse only)
profiling-summary@3contract (pulse/summary.pySUPPORTED,pulse/catalogue.pyvalidate,REFERENCE.md): additive on v2 with a version bump. Record fields:likelihood {dataset_type, variant},instrument,regime,setup {backend, device, operator, precision, transformer, threads}+setup_id,host_class,model_variant,measurement,class∈ {optimal, secondary, experimental},status∈ {current, superseded, archived},superseded_by,day_zero,figures[] {kind, path, sha256},decision_id,release_pin,measured_at. Enumerations for the tendataset_types,host_class,measurement(addsgradient,parity,walltime_validation) andclass/statuslive in REFERENCE.md and the validator. Rules: exactly onecurrentper (likelihood, instrument, setup_id, host_class, model_variant, measurement);class: optimal⇒decision_idpresent and resolvable indecisions.yaml;host_class∈ {local_laptop, local_gpu} ⇒status != current;archivedrecords are excluded fromrecords[]and counted inarchive_record_count;planned_cellscarryclassso coverage is reported per class. v2 instances keep validating unchanged (autofit_profiling stays @2).walltime-validation@1evidence axis (new schema, producer autolens_inference): record keyed by (likelihood, instrument, setup_id, host_class, model_variant, sampler, seed) withwall_s,likelihood_evals,implied_ms_per_eval,reference_runtime_record_id,predicted_ms_per_eval,ratio_measured_over_predicted,cores,parallel_efficiency,release_pin,slurm_job_id,max_log_likelihood,parity_status∈ {match, diverged, not_assessed}. All derived numbers producer-declared; Pulse validates and renders only. Registry accepts a second summary per instance (or a second instance kind) for this axis; REFERENCE.md states these are full-fit measurements.designationdecision kind (decisions/README.mdtemplate,decisions.yaml,pulse/decisions.py): fieldslikelihood,regime,hardware_class∈ {cpu_many_core, gpu_a100, laptop},optimal: <setup_id>,secondary: [<setup_id>…],evidence: [record ids],rule(one sentence in dataset-property terms),supersedes. The validator's optimal⇒decision_id rule resolves against these rows. No designation records are written in 0A (phase 3 writes them); the kind, template and test fixture are.- Board (
pulse/setup_browser.js,pulse/board.py,dashboard.md): for @3 instances the selector order becomes Class (Optimal default | Secondary | Experimental | All) → Likelihood (dataset type → variant) → Instrument → Hardware class → Measurement; a History toggle revealssupersededrows; a Coverage panel lists Optimal cells that arenot_measured; archived records are counted, never rendered. @2 instances keep today's browser. The check-in prose (CHECKIN.md) says research lookups readclass: optimal+status: currentunless asked otherwise. - Doc drift: REFERENCE.md :9, :36, :42, :99-101 still describe v1 as live; fix alongside the @3 section. README mirrors.
- Tests: @3 fixture catalogue under
tests/fixtures/exercising every rule above (accept, duplicate-current refusal, optimal-without-decision refusal, laptop-current refusal, archived exclusion);walltime-validation@1fixture; browser test asserting the first<select>is Class with Optimal default and that superseded rows are hidden until History.
Out of scope for 0A
The autolens_profiling catalogue builder and move-only PRs (0B), the autolens_inference exporter (0C), Insight's additive fields (0D), the Brain lifecycle template and conductor grid (0E), any designation decision record (phase 3), any re-measurement (phase 3) and the setup-baseline campaign closure (phase 3).
Boundaries (epic invariants)
Optimal is always a producer-declared class backed by a Pulse decision record; Pulse infers nothing, selects no fastest row and computes no ratio. Exactly one current per key, chosen by the producer under the day-zero rule, never by date. Sessions end at their deliverable; the human runs /prm.
🤖 Generated with Claude Code
Activity
Jammy2211 commentedon Oct 21, 2026
Library PR Created: #70 (branch
feature/likelihood-lifecycle-p0-pulse, 5 commits; ruff clean, pytest 296 passed, node browser checks pass,pyauto-pulse check --offlineOK).API change summary:
profiling-summary@3(class/status lifecycle records, one current per key, optimal ⇒ decision_id, laptop never current),walltime-validation@1,designationdecision kind, Class-first current-only board with History and Coverage. v2 instances unchanged. Two shape decisions versus the plan (records carrymetric/unit/values; v3 has nosetups[]/selections[],planned_cellsinstead) are flagged in the PR body for /prm.No workspace impact (organ repo). Tier judge: the human runs
/prm. Next phase step after merge: file the 0B autolens_profiling prompt.Merge pull request #70 from PyAutoLabs/feature/likelihood-lifecycle-p…
Jammy2211 commentedon Oct 21, 2026
Shipped: #70 merged (91870ad). Pulse now reads
profiling-summary@3(producer-declared class/status, one current per key, optimal ⇒ decision_id, laptop never current),walltime-validation@1,designationdecisions, and renders a Class-first current-only browser with History and Coverage. v2 instances unchanged; thelenspin moves to @3 in phase 0B (autolens_profiling builder emits the v3 shape per REFERENCE.md). Closing; Mind record follows.