Skip to content

Qualify RSI trials with explicit completeness and lifecycle checks - #341

Open
amy-why-3459 wants to merge 5 commits into
mainfrom
feat/omni-evidence-contract
Open

amy-why-3459 wants to merge 5 commits into
mainfrom
feat/omni-evidence-contract

Conversation

@amy-why-3459

@amy-why-3459 amy-why-3459 commented Nov 4, 2026 •

Copy link
Copy Markdown
Collaborator

Governing Issue and delivery slice

Refs #340

The contributor requested implementation and PR submission of the Omni integration workflow improvements. This delivers a bounded harness change plus portable workflow guidance. Merge and goal acceptance remain with the owner/maintainers.

Problem and resulting behavior

A benchmark can exit successfully and emit a faster metric while lacking evidence that all requests finished, stage workers exited normally, or the intended graph controls were used. The external-command harness previously had no way to require these adapter-produced qualifications on every trial.

Repeatable --require-trial-check DOTTED_KEY options now freeze selected checks in RunSpec. Both arms must emit literal true for every selected key on every measured trial. Missing, unreadable, non-boolean or false checks yield INCONCLUSIVE and no improvement_pct; raw metrics and selected checks remain in the artifacts. Checks are optional for backward compatibility and do not replace explicit quality validation or source-integrity gates. They attest to adapter-owned evidence; the harness does not independently inspect detached workers or accelerator graph state.

The packaged RSI evidence workflow now covers reference initialization/RNG contracts, feedback-aware stage boundaries, matching full/stream reference decoding, internal graph controls, streaming protocol preflight, device qualification, and complete-comparison reruns after harness repair. Quickstart and contributing guidance link to it. Campaign thresholds and hardware constants remain outside reusable defaults; no CI lane changes.

Changed artifacts and evidence

  • CLI/RunSpec, collection and evaluation: exercised with real synthetic commands and regression cases for both arms, malformed evidence and unchanged default behavior.
  • Packaged skill and its generated catalog: the catalog uses one committed source revision, so unrelated generated records receive provenance-only revision refreshes.
  • Independent review found one positional RunSpec compatibility issue; the field was moved to the end and the reviewer verified the fix. Independent focused validation: 23 new tests and 38 existing runtime tests passed. This is review evidence, not merge approval.

Checks and limitations

  • Python 3.12: 61 focused tests and 15 subtests passed (new qualification tests plus existing runtime tests).
  • ruff check src tests tools, skill structure validation, relative links and git diff --check: passed.
  • Generated catalog consistency: all 79 records passed against the committed source snapshot.
  • Wheel build and clean installation outside the checkout, including tests/check_installed.py: passed.
  • Full repository pytest on Python 3.12: 3572 passed, 5 skipped, 284 subtests passed; 3 failures. Two cleanup tests (test_outer_worker_loss_detects_and_recovers_independent_session_survivors[timeout/cancel]) also fail on unchanged base 663f3b327998526a13aa31e72ad729025c18983c (2 failed, 7 passed in that baseline file). They are not counted as passes.
  • The third failure was a stale generated docs/skill-coverage.md; regenerated it in the final commit. Post-fix coverage-view, qualification and runtime verification: 79 passed, 15 subtests passed. Only the generated coverage document changed after the full run; the full suite was not repeated.
  • The PR remains draft because exact session model/effort metadata is unavailable; the required knowledge-author policy does not admit unknown values. No compliance or merge readiness is claimed.
  • No accelerator/model acceptance run; no hardware speedup or quality claim.

No NPU/GPU or model-quality run is claimed: this change qualifies framework evidence and documents adapter responsibilities. It does not implement an Omni benchmark adapter, automatically reserve hardware, or turn boolean fields into independent hardware proof.

Remaining work and Issue closure

The bounded implementation is submitted for maintainer review and owner acceptance. No automatic Issue closure or campaign PASS is requested. Applying these checks to a real campaign requires frozen adapter validators and retained request/worker/graph receipts.

Knowledge authorship

{
  "schema_version": 1,
  "head_sha": "8d01acd0d505a687261496d26b516c02453f79df",
  "human_only": false,
  "material_ai_authors": [
    {
      "tool": "Codex",
      "model_id": "unknown",
      "effort": "unknown",
      "role": "author"
    }
  ]
}

Exact session model/effort settings are awaiting contributor confirmation; unknown values are intentionally retained rather than inferred.

Add optional per-trial qualification without changing default command behavior. Document Omni reference, streaming, graph and lifecycle evidence contracts.

Agent-assisted-by: Codex (implementation)
Signed-off-by: amy-why-3459 <wuhaiyan17@huawei.com>
Regenerate all catalog provenance from one committed source snapshot as required by the index contract.

Agent-assisted-by: Codex (implementation)
Signed-off-by: amy-why-3459 <wuhaiyan17@huawei.com>
@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Skill evaluation

PLANNED: not executed; there are no task outcomes yet.
No approval, model efficacy or current-head test result is implied.

  • Next: run the pinned source/index --check below at head 1cdbb70d11b4d335ba907113791c4a096beb75bd.
  • Task selection: no supported automatic comparison; choose a relevant source/content check and disposition uncovered claims.
  • Selected comparisons: 0 · Estimated task calls: 0. Uncovered/unsupported changes: 96; Canonical library paths: 3; Generated projection paths: 80; Other paths: 13. These are paths, not independent claims.
  • Return: command, input/source pin, exit status, outputs/failures and untested claims for independent verified/refuted/unverified disposition.
Author verification steps (nonpaid; not yet run)
  1. Bind the checkout. Run git rev-parse HEAD; it must equal 1cdbb70d11b4d335ba907113791c4a096beb75bd. If it differs, obtain a current plan; do not reuse old results.
  2. Check source/index consistency. At that PR checkout, using the reviewed repository tool and its documented development dependencies, run:
python tools/build_skill_index.py --source-revision 9e6a51cab505a8ae17575dc83ea53fc0d3b8b027 --check

The declared source pin matches this head's canonical library bytes. The command has not run: retain its exit code and full drift/success output. It checks the generated projection, not claim truth or skill efficacy.
No supported automatic comparison is selected. Review the canonical changes and explain which claims need evidence, are unaffected, or remain unverified; do not treat generated records as separate behavioral claims.
Uncovered scope by location: Canonical library paths: 3; Generated projection paths: 80; Other paths: 13. Path counts are not claim counts; no metadata-only conclusion is inferred.
3. Return evidence for independent review: head, check/task/source pin, command, environment, exit status, outputs/failures and untested claims. Label scripted controls. Request each claim's disposition: verified, refuted or unverified; this plan proves neither model provenance nor benefit.
Check recipes and evidence limits

Evidence and logs · Retention: 30 days.
Retained artifacts are verifiable only before Unix time 1796376563 while the linked artifact is available. Expired evidence is unverified.

Plan bindings, budget, frozen exam and advisory details

Advisory: obtain missing evidence

Retained evidence availability: planned / unexecuted. No approval or merge authorization is issued.
Applicable only while these revisions and inputs match the current PR.
Paid execution requires trusted label authorization and cumulative PR reservation. Unknown accounting blocks new paid calls; planning is not execution.
Pipeline evidence only; offline fixed outputs do not establish skill efficacy.
Unchanged-correct is valid neutral evidence, not incremental benefit.
Content/source review and authorship admission remain separate.
Trusted regrading checks retained answers, not model/hardware provenance or a hostile executor; this is not an efficacy certification.

  • Retained evidence is planned / unexecuted.
  • No supported comparison cases were selected.
  • Uncovered/unsupported scope needs a case or explicit reviewer disposition.
    Plan SHA-256: d38e94aad7fb98e75a0d50faf884a135c4ca73e01368724422bfeb415c98b414
    Base: 663f3b327998526a13aa31e72ad729025c18983c · Head: 1cdbb70d11b4d335ba907113791c4a096beb75bd
    Trusted implementation: 663f3b327998526a13aa31e72ad729025c18983c

Model/settings: {"effort":"not_applicable","name":"claude-opus-5-5"}
Budget: {"comparisons":0,"estimated_calls":0,"limits_per_comparison":{"campaign_seconds":600,"max_task_calls":2,"repeats":1,"timeout_seconds":180,"token_stop_new_trials":200000},"provider_config_sha256":"b28d80f8194fbe0f5a9f01515efb24b218979fd45f702776560da276f4b30d04","reservation":null}

Skill Comparison Cases Estimated calls

Automatic execution / cumulative PR budget:

{"reason":"Trusted configuration or pricing missing, invalid or expired","remaining_usd":"unknown","reserved_or_unresolved_usd":"unknown","spent_or_legacy_usd":"unknown","state":"blocked"}

Projection check selection (not an executed result):

{"declared_in":"src/inferrsi/data/repo_packs/inferrsi/knowledge/README.md","source_revision":"9e6a51cab505a8ae17575dc83ea53fc0d3b8b027","status":"ready"}

Provider/settings: {"client":{"api_version":"2023-06-01","endpoint":"https://yibuapi.com/v1/messages","kind":"anthropic-messages-full-context-v1","max_output_tokens":4096,"max_read_bytes":32768,"max_request_bytes":262144,"max_requests":1,"max_tool_calls":12,"provider":"yibuapi"},"limits":{"token_stop_new_trials":200000},"model":{"effort":"not_applicable","name":"claude-opus-5-5"},"pricing":{"currency":"USD","expires_at":1793271228,"group":"default","max_input_tokens":1000000,"model":"claude-opus-5-5","rate_evidence":"https://github.com/InferMatrixLab/InferRSI/issues/215#issuecomment-6467531341","rates":{"cache_read":"0.4","cache_write":"10","input":"8","output":"40"},"request_fee":"0","unit":"per_million_tokens"},"spend_limit":{"amount":"200","currency":"USD"}}

Uncovered / unsupported paths (96)
  • uncovered: "docs/campaign-summary-chart.md"
  • uncovered: "docs/contributing.md"
  • uncovered: "docs/operations.md"
  • uncovered: "docs/quickstart.md"
  • uncovered: "docs/skill-coverage.md"
  • uncovered: "src/inferrsi/arguments.py"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/README.md"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/ascend-aclgraph-capture-replay.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/ascend-device-health.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/ascend-distributed-parallel.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/ascend-graph-mode.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/ascend-model-adaptation.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/ascend-operator-profiling.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/ascend-operator-tuning.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/ascend-optimization-casebook.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/ascend-performance-analysis.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/ascend-video-diffusion-optimization.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/ascendc-tiling-design.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/cann-attribution-overlap.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/torch-npu.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/torchnpu-device-memory-lifecycle.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/ascend/skills/torchnpu-pinned-host-memory-lifecycle.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/assess-serving-preemption.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/assess-split-backward-schedule.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/audit-fixed-workload-claim.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/audit-h3-metal-fasth3-semantics.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/audit-h3-runtime-residency.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/audit-llama-runtime-state.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/audit-recurrent-kv-finalization.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/audit-sd-cpp-residency.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/audit-sglang-diffusion-lifetimes.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/audit-vllm-kv-lifetimes.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/bound-windowed-attention-replay.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/budget-speculative-verification.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/calibrate-serving-simulation.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/cgroup-resource-controls.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/checkpoint-recovery-consistency.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/choose-parallel-training-plan.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/cite-check-downstream-pr.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/claim-contract.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/comfy-ui.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/competitor-scan.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/dcp-async-save-performance.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/dense-performance-evidence.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/diagnose-vllm-admission-pressure.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/diffusers-invocation-state.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/draft-acceptance-issue.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/dwarfstar.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/evaluate-elastic-serving-placement.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/generation-cache-lifecycle.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/host-memory-management.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/host-overhead-optimization.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/husky.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/inference-benchmark-design.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/inference-optimization-casebook.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/kernel-writing-guide.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/kv-tier-management.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/lazy-evaluation-stream-lifetimes.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/lily.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/lithos-metal.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/local-dream.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/mistral-rs.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/mlc-llm.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/mlx-swift-lm.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/npu-skill-factory.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/optimization-search-policy.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/os-process-placement.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/performance-ceiling-analysis.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/plan-activation-residency.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/project-maya.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/pytorch.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/repository-evolution-analysis.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/rsi-evidence.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/skill-evolution-playbook.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/splash.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/storage-io-measurement.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/training-input-pipeline.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/training-resource-budget.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/video-diffusion-optimization.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/vllm-metal.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/common/skills/weight-loading-optimization.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/cuda/skills/audit-afd-p2p-exchanges.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/cuda/skills/audit-flare-session-lifecycle.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/cuda/skills/diagnose-attention-bottlenecks.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/cuda/skills/host-overhead-profiling.json"
  • uncovered: "src/inferrsi/data/repo_packs/inferrsi/knowledge/cuda/skills/reason-hopper-kernels.json"
  • uncovered: "src/inferrsi/data/skill_library/workflows/rsi-evidence/SKILL.md"
  • uncovered: "src/inferrsi/data/skill_library/workflows/rsi-evidence/metadata.json"
  • uncovered: "src/inferrsi/data/skill_library/workflows/rsi-evidence/references/omni-experiments.md"
  • uncovered: "src/inferrsi/harness/evaluation.py"
  • uncovered: "src/inferrsi/harness/reporting.py"
  • uncovered: "src/inferrsi/harness/runner.py"
  • uncovered: "src/inferrsi/harness/scenarios/external.py"
  • uncovered: "src/inferrsi/runspec.py"
  • uncovered: "src/inferrsi/summary_chart.py"
  • uncovered: "tests/test_trial_checks.py"

Agent-assisted-by: Codex (implementation)
Signed-off-by: amy-why-3459 <wuhaiyan17@huawei.com>
@Dong1017 Dong1017 added the area:workbench CLI workbench: profile, A/B loop, quality gates, evidence reports label Nov 4, 2026 — with ChatGPT Codex Connector

@Dong1017 Dong1017 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Scoped static review of draft #341 at head 8d01acd0 against Issue #340: inspected CLI/RunSpec freezing, per-trial result collection, evaluation precedence, the synthetic tests, and the existing HTML/SVG report consumer. One P2 evidence-presentation risk is attached inline: unqualified trials correctly suppress improvement_pct, but the report still plots an apparent gain ratio from their raw medians. Please make the unqualified status unmistakable in that consumer. This does not challenge retention of raw measurements or the declared adapter-attestation boundary.

I did not run tests, model workloads, or hardware experiments. The separate current-head knowledge-authorship admission failure remains an author/maintainer matter; this COMMENT is neither approval nor integration/goal acceptance.

t.get("status") == "completed" and t.get("metric") is not None for t in baseline + candidate
)
if all_metrics:
if all_metrics and trials_qualified:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 — unqualified trial checks still produce a comparative gain chart. With baseline=100 ms, candidate=80 ms and evidence.workers_closed=false, this branch correctly leaves improvement_pct=None and yields INCONCLUSIVE. However harness/reporting.py::_summary_figure() calls summary_chart.py::spec_from_evaluation(), which derives a candidate/baseline ratio directly from the retained medians and renders it in report.html even when checks failed. The point note says INCONCLUSIVE, but the chart still visually communicates an improvement that this new gate is meant to withhold. Consider suppressing the gain figure for an unqualified comparison, or explicitly marking the plotted ratio as raw/unqualified — not an accepted gain. Please add a regression that reads the HTML/SVG report after a false/missing required check; the existing tests only assert evaluation.json.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 8970059. evaluate() now records trials_qualified, and spec_from_evaluation() refuses to derive a candidate/baseline ratio when it is false. For an unqualified comparison, report.html labels the retained medians as raw measurements (not an accepted gain) and no summary-chart.svg is written; qualified comparisons still plot the measured ratio. Added regressions that read the HTML report for both a false and a missing evidence.workers_closed check (baseline 100 ms / candidate 80 ms), asserting no SVG and no 0.80×. ruff and pytest tests/test_trial_checks.py tests/test_summary_chart.py tests/test_runtime.py pass locally; CI pending.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Follow-up on the 8970059 repair (static review only): the single-run path now guards trials_qualified=false, but harness/reporting.py:69–75 prioritizes a pre-existing summary-chart.json and never calls the guarded spec_from_evaluation() in that branch. With a valid campaign spec alongside an unqualified current evaluation, _summary_figure() still writes and inlines an SVG, so “no gain figure on unqualified checks” is not guaranteed for this path. Please clarify whether the campaign figure is intentionally independent historical evidence; if so, label that boundary explicitly and ensure it cannot represent the unqualified current step as an accepted gain. Otherwise apply the qualification guard before either chart path. A regression using summary-chart.json plus trials_qualified=false would distinguish the intended behavior. No tests or model/device experiments run here.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1cdbb70: when the current evaluation has trials_qualified=false, the report now stops before both chart paths, so no gain chart is written or inlined, even if a summary-chart.json exists. The spec file stays on disk untouched and the report notes it as separate historical evidence that was not drawn. Regression test: a summary-chart.json that would render 0.80× plus trials_qualified=false produces no chart and leaves the spec bytes unchanged.

@amy-why-3459
amy-why-3459 marked this pull request as ready for review November 4, 2026 08:27
cursoragent and others added 2 commits November 4, 2026 08:49
A false or missing required check already leaves improvement_pct unset and
the verdict INCONCLUSIVE, but the HTML report still plotted a
candidate/baseline ratio from the retained medians. Refuse that derived
figure and say the medians are raw measurements, not an accepted gain.

Addresses #341 (comment)

Agent-assisted-by: Cursor Grok 4.7 (implementation)
Signed-off-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: amy-why-3459 <amy-why-3459@users.noreply.github.com>
summary-chart.json is historical campaign evidence and still wins for a
qualified run, but an unqualified evaluation was inlining that figure as
this step's gain summary. Guard both chart paths before rendering, leave
the committed specification unchanged, and say it was not drawn for this
step.

Addresses #341 (comment)

Agent-assisted-by: Cursor Grok 4.7 (implementation)
Signed-off-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: amy-why-3459 <amy-why-3459@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:workbench CLI workbench: profile, A/B loop, quality gates, evidence reports

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants