Skip to content

fix(openspec): rebind hifi lifecycle to landed snapshot - #501

Merged
monkey1sai merged 1 commit into
mainfrom
fix/hifi-lifecycle-landed-ancestry
Aug 11, 2026
Merged

fix(openspec): rebind hifi lifecycle to landed snapshot#501
monkey1sai merged 1 commit into
mainfrom
fix/hifi-lifecycle-landed-ancestry

Conversation

@monkey1sai

Copy link
Copy Markdown
Owner

Summary

  • Repair the lifecycle watermark broken when PR chore(openspec): preserve hifi browser and baseline gaps #497's pre-existing auto-merge used SQUASH despite the PR's merge-commit constraint.
  • Rebind migrate-console-to-hifi-design.subject_commit from off-history ca53d35 to landed source snapshot de40d6181ca287788fcffc7e6b09b3f0915c907d.
  • Shorten current_slice to a pointer to tasks.md, addressing the low-severity duplication finding from chore(openspec): preserve hifi browser and baseline gaps #497's final tri-adversarial review.
  • Baseline on landed main reproduced subject_not_ancestor; the same 24-test machine-truth suite passes after this patch.

Scope and ancestry

  • Base: main @ de40d6181ca287788fcffc7e6b09b3f0915c907d.
  • Head: fix/hifi-lifecycle-landed-ancestry @ a8a76a30966de08479eb40db141a499c3536ed8c.
  • Scope: one lifecycle ledger row; no task checkbox, runtime, API, frontend, or design asset change.
  • MUST merge with gh pr merge --merge --match-head-commit a8a76a30966de08479eb40db141a499c3536ed8c; squash would recreate the same off-history failure.

AI Coding Governance

Item Result
Change lane F
Behavior contract changed no
Linked issue PR #497 landed-ancestry fixpoint
Requirement source existing contract (openspec machine truth)
CODEOWNERS / owner review requested
GitNexus evidence not needed (docs-only)
Browser E2E evidence not applicable
Agent workflow changed? no
Required checks expected CI / Agent Governance / PR Metadata Contract / Governance Base Audit

Frontend Verification

Item Result
Frontend route not applicable
Main button(s) tested not applicable
Fixture used not applicable
Backend API called not applicable
Runtime action not applicable
Visible success state not applicable
E2E command not applicable
Screenshot / trace not applicable
Design gate status not applicable
Design screen(s) not applicable
Reference-missing route(s) / surface(s) not applicable
Full completion claimed no
Design reference manifest docs/plans/design-system-reference.manifest.json
Visual fidelity result not applicable
Visual comparison not applicable
Visual artifacts not applicable
Manual test steps not applicable
Known gaps hifi tasks 2.8/3.7/7.2 remain open in tasks.md

Deploy Path Verification

Item Result
Affects runtime / docker / Kit / viewer / ports / env? no
Canonical deploy path updated? not needed
New root script added? no
Deploy dry-run command not applicable
Full deploy tested not applicable
Verify command not applicable
Frontend URL verified not applicable
Evidence path openspec/lifecycle-ledger.json

Self-Referential Bootstrap

Item Result
Self-referential bootstrap no
Bootstrap ledger entry not applicable
Bootstrap reason not applicable

Validation

  • Baseline node --test scripts/tests/test-openspec-machine-truth.mjs on de40d61 → 23/24, subject_not_ancestor (expected reproduction).
  • Patched same command → 24/24 passed.
  • node scripts/tests/verify-openspec-repository-lifecycle.mjs → parity passed.
  • npx openspec validate migrate-console-to-hifi-design --strict → valid.
  • git diff --check origin/main...HEAD → clean.

Known Risks

  • Merge method is correctness-critical. Auto-merge must remain disabled; use the pinned merge-commit command only after exact-head gates pass.

Copilot AI balanced review requested due to automatic review settings August 11, 2026 21:34
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The lifecycle ledger entry for migrate-console-to-hifi-design now contains refreshed status, verification timestamp, and subject commit metadata.

Changes

Lifecycle ledger update

Layer / File(s) Summary
Refresh migration metadata
openspec/lifecycle-ledger.json
The migration entry has a new current-slice note, an updated last_verified timestamp, and a new subject_commit hash.

Estimated code review effort: 1 (Trivial) | ~2 minutes

Possibly related PRs

Suggested reviewers: monkey1sai-blip

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the lifecycle rebind to the landed snapshot.
Description check ✅ Passed The description directly explains the lifecycle watermark repair, scope, validation, and merge requirements.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/hifi-lifecycle-landed-ancestry

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@openspec/lifecycle-ledger.json`:
- Line 1494: Update the current_slice field in the lifecycle ledger to the
canonical tasks.md value required by the lifecycle contract, replacing the prose
note and its inconsistent 2026-08-12 date. Reuse the exact tasks.md slice value
established by the contract and leave last_verified unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f7a9c8f-def0-4f80-acd4-8e2e11932c4b

📥 Commits

Reviewing files that changed from the base of the PR and between de40d61 and a8a76a3.

📒 Files selected for processing (1)
  • openspec/lifecycle-ledger.json

Comment thread openspec/lifecycle-ledger.json

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR repairs a single row in the OpenSpec lifecycle machine-truth ledger for the migrate-console-to-hifi-design change. When PR #497 was squash-merged (contrary to its merge-commit constraint), the previously recorded subject_commit (ca53d35…, the discarded pre-merge branch head) stopped being an ancestor of main, causing the machine-truth suite to fail with subject_not_ancestor. The fix rebinds the row to the landed squash commit de40d618… (the current base of main, verified as a real ancestor) so the ancestry watermark resolves again, and trims the verbose current_slice note down to a pointer at tasks.md.

Changes:

  • Rebind subject_commit from off-history ca53d35… to the landed snapshot de40d618….
  • Replace the long duplicated current_slice narrative with a short pointer to tasks.md.
  • Refresh last_verified to the re-verification timestamp.

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

@codex-tri-adversarial-bot codex-tri-adversarial-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Codex Tri-Adversarial Bot

Automated tri-adversarial ship-gate (L0 terra triage / L1 tier-routed lens fanout / L2 refute-by-default / L3 sol apex — Codex models).
Mapped event: COMMENT


Codex Tri-Adversarial ship-gate — PR #501

  • Repo head: fix/hifi-lifecycle-landed-ancestry @ a8a76a3
  • Base: main @ de40d61
  • Files changed: 1
  • Engine: four-model tri-adversarial gate on Codex — L0 triage gpt-5.6-terra/low; L1 lens finders routed gpt-5.6-terra/low → gpt-5.6-luna/medium → gpt-5.5/xhigh (security floor gpt-5.5); L2 refute-by-default gpt-5.5/xhigh, top-tier findings refuted by gpt-5.6-sol/xhigh (every refutation cross-model); L3 apex gpt-5.6-sol/max. 誠實聲明:層級與 Claude 三層 gate 同構(terra≈haiku、luna≈sonnet、gpt-5.5≈opus、sol≈fable),但模型池是 Codex 的,非 Anthropic 的。

Verdict

SHIP

  • 阻擋門檻 severity: critical, high
  • mapped GitHub event: COMMENT
  • ℹ️ 判定為 SHIP,但刻意不送 APPROVE:GitHub App 的 approving review 不計入 required_approving_review_count(2026-07-31 實測)。本報告是證據,approving 那一票請由真人帳號投。

Difficulty & routing

  • overall: high (source: terra-triage)
  • lens tiers: correctness→gpt-5.5, security→gpt-5.5, simplification→gpt-5.6-luna, test-gap→gpt-5.5

Layer stats

  • L1: raw=2 deduped=2 finder_failures=0
  • L2: confirmed=0 refuted=2 unverified=0
  • L3 final: 0

Killed (did not survive L2/L3)

  • L1-TG-001 [medium] Subject commit rebind has no adversarial validation in the changed set — The finding is unsupported and conflates “no test changed in this PR” with “no validation exists.” Trusted metadata directly shows that the new subject_commit exactly equals the PR’s landed base snapshot: base: main @ de40d6181ca287788fcffc7e6b09b3f0915c907d. This is affirmative evidence for the
  • L1-TG-002 [low] Verification timestamp advances without a failing proof gate — The diff consistently rebinds the ledger entry to the landed snapshot: subject_commit exactly matches the trusted base SHA, while current_slice points to the existing tasks.md for status and evidence gaps. The finding cites no schema, repository policy, or validator requiring every `last_verif

Summary

No findings survive the tri-adversarial review gate. PR #501 may proceed based on this gate; the two contextual L1 findings remain killed by L2 and were not resurrected.

Agent calls

  • 8/8 ok, engine wall-clock 182.6s

VERDICT

SHIP

VERDICT: SHIP

@monkey1sai-blip monkey1sai-blip 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.

Approved by monkey1sai-blip (the reviewer account pinned by the repo's merge governance).

Submitted through scripts/blip_review.py — a scripted approval carrying the operator's authority, pinned to head a8a76a30966de08479eb40db141a499c3536ed8c. This is the mechanism the GitHub App cannot satisfy: an App's approving review does not count toward required_approving_review_count.

@monkey1sai
monkey1sai merged commit 4721923 into main Aug 11, 2026
24 of 26 checks passed
@monkey1sai
monkey1sai deleted the fix/hifi-lifecycle-landed-ancestry branch August 11, 2026 21:45
monkey1sai added a commit that referenced this pull request Aug 12, 2026
#512)

Same pattern as #482/#501: the row's subject_commit pointed at the
pre-squash branch commit (bccf251) which is not an ancestor of main after
the #504 squash (881f6da); any PR CI running the machine-truth source
observation against this ledger fails subject_not_ancestor. Rebound to
the landed squash. Local gates: machine-truth 24/0, metrics 13/0.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
monkey1sai added a commit that referenced this pull request Aug 12, 2026
 squash (#514)

Same pattern as #482/#501/#512: the row's subject_commit pointed at the pre-squash branch commit (1229171) which is not an ancestor of main after the #506 squash (cba6265) and whose branch was auto-deleted; any PR CI running the machine-truth source observation against this ledger fails subject_unavailable. Rebound to the landed squash. Local gates: machine-truth 24/0, metrics 13/0.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
monkey1sai added a commit that referenced this pull request Aug 12, 2026
…nd hifi row to #507 squash

一、撤除 bootstrap 層(依 #520 裁決=docs/agents/self-referential-bootstrap.md §2.1,PR #521):
量測 harness 的報告無任何 gate 機器消費者,不屬 mechanism surface,不入 ledger。
classifier 擴張+open entry gpu-session-baseline-harness+evidence 一併撤除,
scripts/lib/self-referential-bootstrap.ps1、scripts/tests/test-self-referential-bootstrap.ps1、
scripts/self-referential-bootstrap-ledger.json 還原為 origin/main 版本。
機械上這條路也是死路:base-pinned 裁決者以 base 版 classifier 驗證新 entry 宣告的
mechanism paths,同 PR 擴張 classifier 永遠無法讓自己的 entry 合法(實測兩輪
pr-metadata-contract-diagnostic 均以 not classified verification-mechanism paths 拒絕)。

二、rebind migrate-console-to-hifi-design row:#507 squash 後該 row 仍綁 pre-squash
commit af60c29(已被丟棄,CI checkout 抓不到)→ 全部後續 PR 的 machine-truth
test 25 紅。依 #482/#501/#512 慣例 rebind 到 landed squash 4187102。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
monkey1sai added a commit that referenced this pull request Aug 12, 2026
Same pattern as #482/#501/#512/#514: subject_commit pointed at the
pre-squash branch commit (af60c29) which is not an ancestor of main after
the #507 squash (4187102); PR CIs fail subject_not_ancestor until rebound.
Local gates: machine-truth 24/0, metrics 13/0.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
monkey1sai added a commit that referenced this pull request Aug 12, 2026
…baseline 1.1) (#511)

* feat(scripts): add GPU session baseline measurement harness (gpu-session-baseline-and-idle-reclaim 1.1)

Add scripts/measure-session-baseline.ps1 (root CLI) and
scripts/lib/measure-session-baseline.ps1 (testable core) implementing task
1.1 of openspec/changes/gpu-session-baseline-and-idle-reclaim: a read-only
harness that captures nvidia-smi GPU inventory (VRAM/utilization, consumer
RTX classification, MIG availability), a GET-only WebRTC/coordinator health
probe (/health, /api/runtime/status), and the environment fingerprint
required by the gpu-session-baseline spec (GPU model, driver version, Kit
version from kit-sdk.packman.xml, fixture hash+size).

The harness never opens a WebRTC session or creates/joins/closes a review
session, so TTFF and session-creation success rate cannot be honestly
measured locally; those fields are null with measured:false and an explicit
reason unless supplied by a caller (e.g. a future task 1.3 soak run), never
fabricated. Every other unmeasurable signal (no nvidia-smi, no GPU rows,
insufficient OS permission on the compute-apps VRAM column, coordinator
unreachable) degrades the same way instead of throwing or guessing.

Registered in scripts/script-registry.json as a measurement-harness (not
deploy.ps1/verify-all.ps1: it measures, it does not deploy or gate; not
scripts/lib alone: it is the operator-invoked CLI entry; not scripts/tests:
it produces a JSON report, not a pass/fail check).

Add scripts/tests/test-measure-session-baseline.ps1: unit tests for GPU line
parsing/consumer-RTX/MIG classification, fail-safe behavior with nvidia-smi
entirely absent, report schema shape, script-registry.json consistency, and
a real CLI smoke test (both -OutputPath and the default
artifacts/gpu-baseline/<timestamp>.json path). Verified on pwsh 7.5.4 and
Windows PowerShell 5.1 (powershell.exe), invoke-powershell-static.ps1, and
scripts/tests/test-agent-governance-check.ps1 (45/45 green).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore(openspec): tick gpu-session-baseline-and-idle-reclaim task 1.1

Mark tasks.md 1.1 done (measure-session-baseline.ps1 harness landed) and
sync openspec/lifecycle-ledger.json: task_ledger completed 0->1,
current_slice points at the 1.2 env-fingerprint gate as the next slice,
last_verified refreshed, subject_commit rebound to 405e2b6 (the commit that
landed the harness + tests + registry entry), evidence_refs extended to the
new script and test paths.

Verified: node scripts/tests/verify-openspec-repository-lifecycle.mjs
--repo-root . (openspec/changes, lifecycle-ledger.json and
docs/plans/NOW.md agree -- NOW.md's projection is id+status only, and
status stays "active", so it needed no edit); node --test
scripts/tests/test-openspec-machine-truth.mjs (24/24) and
scripts/tests/test-ai-coding-metrics.mjs (13/13); pwsh
scripts/tests/test-agent-governance-check.ps1 (45/45 embedded
repository-lifecycle subtests green).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(scripts): honest gpu-baseline measurements — real binding enum, per-role lease counts, validated inputs, untick 1.1 (review)

* fix(scripts): declare gpu fingerprint scope — multi-GPU host is first_gpu_only, per-GPU fingerprint deferred to 1.2 (review)

* fix(scripts): harden GPU baseline harness per PR #511 review

Addresses the valid findings from the 13 unresolved review threads on
scripts/measure-session-baseline.ps1 (gpu-session-baseline-and-idle-reclaim
task 1.1/1.2), keeping the "measured:false, never fabricate" contract intact:

- Get-SafeProperty: fix a PowerShell pipeline-unroll bug where `return
  $value` on an empty array collapsed to $null, making an observed empty
  kit_instance_bindings/viewer_leases indistinguishable from "unmeasured".
- Get-WebRtcHealthProbe: count non-terminal KitInstanceBinding statuses
  (allocated/starting/ready/draining) instead of a literal status='active'
  that the real coordinator API never emits; count active primary/spectator
  viewer_leases by role (the actual 1-primary-plus-k-spectator cardinality)
  instead of sessions.active_count; clarify that `reachable` reflects only
  coordinator /health liveness, not independent WebRTC/signaling reachability.
- Get-SessionVramWatermark: only claim a clean measured total when exactly
  one Kit GPU process is observed and fully readable; multi-process or
  partially-readable readouts are surfaced only as the informational
  unscoped_total_kit_vram_mb, never as a fabricated measured:true total.
- Get-EnvironmentFingerprint: fail closed (measured:false) on a multi-GPU
  host instead of blindly binding the fingerprint to gpus[0].
- Get-KitVersionFingerprint: carry an explicit source/caveat noting this is
  the checkout's declared dependency version, not a live-process read.
- Get-SessionBaselineReport: range-validate caller-supplied -TtffMs /
  -SessionCreationSuccessRate (reject negative/out-of-range instead of
  recording as measured); resolve host.hostname via the cross-platform Dns
  API with HOSTNAME/COMPUTERNAME fallback so Linux deployment targets don't
  silently null out host identity.
- Root wrapper: derive the default -OutputPath from the report's own
  collision-resistant run_id instead of a bare second-resolution timestamp.
- CI: run test-measure-session-baseline.ps1 (PS7 + Windows PowerShell 5.1)
  as part of the required `powershell-static` job, mirroring the existing
  test-spec-to-done-port-helper.ps1 pattern -- neither `root-contracts`
  (pytest) nor the PSScriptAnalyzer-only `powershell-static` gate command
  previously executed this suite.

The lifecycle-ledger subject-ancestry finding (PRRT_kwDOSPoer86YcZ4d) was
independently verified as already resolved at current HEAD and needed no
change; see PR reply for evidence.

Verified: pwsh + Windows PowerShell 5.1 test-measure-session-baseline.ps1,
invoke-powershell-static.ps1, and node --test test-openspec-machine-truth.mjs
(24/24) all green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(scripts): carry a live-build staleness caveat on kit_version (PR #511 review)

Get-KitVersionFingerprint reads bim-streaming-server/tools/deps/kit-sdk.packman.xml
-- the checkout's DECLARED kit-kernel dependency version -- not a value read
from the live Kit process. If the checkout is updated without a
rebuild/restart, this can be stale relative to the session actually being
measured, and no local mechanism exists to introspect a running Kit.exe's
build identity to close that gap. Surface a `source` ('checkout_packman_declared')
and an explicit `caveat` string alongside the existing value/measured/reason
shape (both on the raw fingerprint and propagated through
Get-EnvironmentFingerprint's kit_version field) so downstream SLO-writers
know what this field does and does not attest to, rather than silently
trusting checkout state as if it were live-process state.

This was the one review thread not already covered by the concurrent fixes
landed in 37e3247/2eee19b on this branch (real KitInstanceBinding status
enum, per-role viewer lease counts, VRAM attribution transparency,
TTFF/success-rate validation, hostname fallback, GPU fingerprint scope
disclosure, collision-resistant default filename, task 1.1 unticked); this
commit reconciles with that work rather than duplicating it.

Verified: pwsh + Windows PowerShell 5.1 test-measure-session-baseline.ps1,
invoke-powershell-static.ps1, and node --test test-openspec-machine-truth.mjs
(24/24) all green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(scripts): fold GPU-attribution gap into complete, fix MIG-gating and test cleanup (PR #511 review round 2)

Three round-2 findings on the GPU baseline harness:

- Get-EnvironmentFingerprint: gpu_fingerprint_scope='first_gpu_only' (a
  multi-GPU host) was disclosure-only -- `complete` was computed from the
  five base fields before the scope was known, so a report that has
  admittedly NOT attributed every relevant GPU could still report
  complete:true and silently suppress the wrapper's "SHALL NOT be used to
  set SLOs or admission parameters" warning. `complete` now also requires
  gpu_fingerprint_scope != 'first_gpu_only'.
- Get-GpuInventorySnapshot: software_queue_required was gated on
  consumer_grade_all AND NOT mig_available_any. On a non-consumer, non-MIG
  fleet (e.g. a lone RTX A6000, which Test-ConsumerRtxGpuName excludes but
  which does not support MIG at all), that reported
  software_queue_required=false with no MIG route in fact available.
  Software queuing is now required whenever MIG is unavailable, regardless
  of consumer/professional classification.
- test-measure-session-baseline.ps1: the default-OutputPath cleanup deleted
  every new file under artifacts/gpu-baseline/, not just the one this test
  produced -- a concurrent harness invocation sharing the checkout would
  have its evidence collaterally deleted. Now deletes only
  "$($defaultReport.run_id).json".

Also strengthened Assert-ReportSchemaShape's `complete` expectation and
added regression tests for the professional/no-MIG inventory shape and the
multi-GPU complete=false path.

Verified: pwsh + Windows PowerShell 5.1 test-measure-session-baseline.ps1,
invoke-powershell-static.ps1, and node --test test-openspec-machine-truth.mjs
(24/24) all green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* revert(ci): defer harness CI wiring until the open mechanism debt closes

ci.yml is a classified verification-mechanism path (design gate
infrastructure, Lane G minimum + self-referential bootstrap scope); wiring
test-measure-session-baseline.ps1 into CI from this measurement-harness PR
would collide with the open mechanism-hardening-2 ledger entry owned by
PR #513. The wiring moves to a follow-up alongside issue #516 (CI coverage
for the streaming pytest suite) after fixpoint closure.

Refs #516

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(scripts): gpu-baseline r2 - bootstrap registration, honest kit-version provenance, MIG-driven queue flag (review r2)

* fix(scripts): honest fixture provenance binding for baseline fingerprint (review r4, operator-delegated adjudication)

* fix(governance): revert harness bootstrap-layer per #520 ruling; rebind hifi row to #507 squash

一、撤除 bootstrap 層(依 #520 裁決=docs/agents/self-referential-bootstrap.md §2.1,PR #521):
量測 harness 的報告無任何 gate 機器消費者,不屬 mechanism surface,不入 ledger。
classifier 擴張+open entry gpu-session-baseline-harness+evidence 一併撤除,
scripts/lib/self-referential-bootstrap.ps1、scripts/tests/test-self-referential-bootstrap.ps1、
scripts/self-referential-bootstrap-ledger.json 還原為 origin/main 版本。
機械上這條路也是死路:base-pinned 裁決者以 base 版 classifier 驗證新 entry 宣告的
mechanism paths,同 PR 擴張 classifier 永遠無法讓自己的 entry 合法(實測兩輪
pr-metadata-contract-diagnostic 均以 not classified verification-mechanism paths 拒絕)。

二、rebind migrate-console-to-hifi-design row:#507 squash 後該 row 仍綁 pre-squash
commit af60c29(已被丟棄,CI checkout 抓不到)→ 全部後續 PR 的 machine-truth
test 25 紅。依 #482/#501/#512 慣例 rebind 到 landed squash 4187102。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(scripts): gpu-baseline r5 — unknown-runtime honesty, session-scoped lease counts, fixture overwrite guard (review r5)

PR #511 review r5, three of four threads:

1. PRRT_kwDOSPoer86YeUls — an unreachable/malformed /api/runtime/status left
   every observed count null, and the fixture-binding defaults coerced those
   nulls to 0, so an UNKNOWN runtime state was published under the
   'no_live_session_observed' (observed-idle) label with complete=true beside
   a declared fixture. Adds a distinct fixture_binding_scope='runtime_state_unknown'
   that withdraws completeness and names the failed probe (GET /api/runtime/status).
   A positive observation still outranks the unknown; an observed 0/0 idle host
   keeps its previous semantics.

2. PRRT_kwDOSPoer86YeUlw — per-role lease counts are summed across every
   sessions.items[] entry while total_kit_vram_mb is one host-wide sample, so a
   host serving 2+ sessions mixed multiple primaries/spectators against a single
   VRAM number. Takes the reviewer's reject option: the aggregate counts are kept
   (they are real observations) but session_scope='multi_session_aggregate' is
   published and the 1-primary+k-spectator watermark interpretation is marked
   measured=false with reason 'non-isolated multi-session snapshot; per-session
   VRAM attribution unavailable in this slice'. Exactly one active session yields
   session_scope='single_session' and keeps current semantics.

3. PRRT_kwDOSPoer86YeUly — -FixturePath and -OutputPath resolving to the same
   file made Set-Content truncate the fixture with the report, destroying the very
   artifact the report fingerprints. Canonicalises both ([System.IO.Path]::GetFullPath,
   case-insensitive only on Windows) and throws before any write.

PRRT_kwDOSPoer86YeUlo (P1, bootstrap mechanism-path regression) is NOT addressed
here and is moot as of 286bbac on this branch: per the #520 ruling the harness is
not a mechanism surface, and the three measure-session-baseline classifier patterns
the thread asked the test to pin were removed. Adding them to $expectedMechanismPaths
now would fail the suite; re-registering them would revert an owner ruling.

Verified on Windows: test-measure-session-baseline.ps1 (all groups pass),
test-self-referential-bootstrap.ps1 (all assertions pass),
Invoke-ScriptAnalyzer -Severity Error on the changed .ps1 files = 0.

* fix(scripts): gpu-baseline r6 — reject malformed runtime counts, require observed primary, finite TTFF (review r6)

- Get-SessionVramWatermark / Get-EnvironmentFingerprint: a non-null-but-
  unparseable observed_active_session_count / observed_kit_instance_binding_count
  (coordinator version skew, e.g. a string) was silently coerced to 0 via a
  try/catch default, relabeling an UNKNOWN runtime state as an OBSERVED zero.
  New ConvertTo-NonNegativeIntOrNull helper returns null instead of 0 on parse
  failure; both call sites now treat that null the same as a missing probe
  (new 'malformed_runtime_observation' session scope; runtime_state_unknown
  fixture-binding scope).
- Get-SessionVramWatermark: exactly one active session was enough to accept
  the "1 primary + k spectator" watermark interpretation even when zero
  primary viewers had joined (idle-but-created or spectator-only session).
  Now requires observed_primary_lease_count == 1.
- New-OptionalMeasurement TTFF validator only checked ">= 0", which
  +Infinity satisfies; now also rejects non-finite values.
- openspec/lifecycle-ledger.json: added scripts/lib/measure-session-baseline.ps1
  to the change's evidence_refs (the entire measurement implementation lives
  there; only the CLI wrapper and test were previously listed).

Addresses the three still-open findings from the chatgpt-codex-connector
review on c759057, plus the infinite-TTFF gap from an earlier round that
was never landed.

Co-authored-by: monkey1sai <26239865+monkey1sai@users.noreply.github.com>

* fix(scripts): gpu-baseline r7 — keep kit process-count fields in every report shape (review r7)

gpu-session-baseline-report/v1 的兩個早退路徑補齊 kit_process_count 與
kit_process_vram_unreadable_count:查詢失敗=null(未知非零)、查詢成功但無
Kit process=0(觀測到的真零),consumer 不再因 host 狀態拿到不同 shape。
測試補四條斷言鎖住兩態。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: monkey1sai <xshiujj@gmail.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
monkey1sai added a commit that referenced this pull request Aug 12, 2026
…quash (#528)

#511 squash-merge 後 gpu-session-baseline-and-idle-reclaim row 仍綁 pre-squash
commit 405e2b6(已被 squash 丟棄)→ machine-truth test 25 對所有後續 PR 假紅。
依 #482/#501/#512/#514/#524 慣例 rebind 至 landed squash 797c5c8。

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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.

3 participants