Skip to content

[obvious-fleet] Merge origin/alpha into the capture-API placement-case replay runner (resolve stale early-#271 conflicts) - #274

Merged
SamGu-NRX merged 4 commits into
alphafrom
obv/burst7-bs-capture-placement-runner
Oct 16, 2026
Merged

SamGu-NRX merged 4 commits into
alphafrom
obv/burst7-bs-capture-placement-runner

Conversation

@obvious-autobuild

@obvious-autobuild obvious-autobuild Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

fleet-packet: burst10-land-bs-placement-runner

What changed and why

This branch (obv/burst7-bs-capture-placement-runner, pre-merge head c255a23) carries the capture-API replay runner backend/scripts/capture_placement_cases.py and focused tests for placement cases (manifest server/placement/tests/data/cases/manifest.json walked through the real capture front door — create → register → signed upload → commit → finalize → events → result — with placement real under SD-73 dev settings and HSS_ORCH_STAGE_STUBS=1). GitHub reported conflicts against alpha in backend/server/placement/case_suite.py and backend/tests/test_placement_case_suite.py because the branch had merged an early commit of #271 (ffd476d) while #271 landed in alpha with later edits to those files.

This task merges origin/alpha into the branch so the PR is mergeable. Nothing else changed: the branch's own files (backend/scripts/capture_placement_cases.py, backend/tests/test_capture_placement_cases.py, backend/tests/test_capture_placement_frontdoor.py) are byte-identical to pre-merge, and the two conflicted files take alpha's landed #271 versions in full.

How you verified it, with commands and results

Merged alpha

  • alpha SHA merged: 72062663d47601cc82920474d6106d1e8a8ebcb8 → merge commit 627533fa (normal merge; no rebase, no force-push). GitHub now reports PR [obvious-fleet] Merge origin/alpha into the capture-API placement-case replay runner (resolve stale early-#271 conflicts) #274 MERGEABLE / CLEAN at head 627533fa.
  • Conflicted files and how each was resolved:
  • Test commands and results:
    • uv run pytest tests/test_capture_placement_cases.py tests/test_capture_placement_frontdoor.py tests/test_placement_case_suite.py -q → 37 passed (the PR's named suite; count grew from 21 because alpha's landed [obvious-fleet] test(backend): placement case gate rejects invalid manifests and forged input hashes #271 added tests to test_placement_case_suite.py).
    • uv run ruff check → all checks passed; uv run ruff format --check → 490 files already formatted; uv run lint-imports → Contracts: 5 kept, 0 broken.
    • uv run pytest -q (full backend suite) → 5 failed, 1371 passed, 18 skipped, 14 errors in ~270s:
      • The 5 failures are exactly the known pre-existing baseline (SSR shingle-overlap hygiene + the 4 server/eval/tests/test_gates.py eval gates) — unchanged from this PR's own baseline runs.
      • The 14 errors are all backend/tests/test_capture_cold_restart.py, a file that only exists on alpha: it imports load_receipt from scripts.replay_capture, which alpha's replay_capture.py no longer defines (alpha replaced it with receipt_problem). Proven pre-existing on pure alpha: in a worktree at 72062663 the same import raises the same ImportError, and the three involved blobs in this merge are byte-identical to alpha's. Not a merge defect; left unfixed per scope.

What is not verified

  • iOS suites and anything needing Xcode or a Mac (Linux sandbox).
  • Alpha's own cold-restart breakage (above) is reported, not fixed — out of scope for this task.

Assumptions

  • The branch made no independent edits to the two conflicted files beyond the stale early-[obvious-fleet] test(backend): placement case gate rejects invalid manifests and forged input hashes #271 merge, so alpha's versions were taken wholesale for both.
  • Work done in a fresh clone (~/work/burst10-land-bs-placement-runner) on the existing BaseScanning repo sandbox, not in any other checkout.
  • Per "change nothing else", the alpha-side cold-restart import failure was not repaired here; it needs a small fix on alpha (restore load_receipt or update the import) before those tests run green anywhere.

backend/scripts/capture_placement_cases.py replays every hash-pinned case in
server/placement/tests/data/cases/manifest.json through the real capture front
door (create, register, signed upload, commit, finalize, events, result) over
the documented dev settings (SD-73), in-process under HSS_ORCH_STAGE_STUBS=1.

Each case's synthetic source scene is injected only at the upstream scene stage
boundary and an explicit object list at the objects_3d boundary, stamped with
the actual capture/run/packet identity the scene contract requires. The runner
collects a schema-versioned receipt (hss-capture-placement-receipt/v0):
scene-merge equivalence against the case's stamped source merged once with the
injected objects, refusal type/pointer against the manifest declaration, the
conservative device outcome with exactly one terminal event, the tap-hazard
merge count, cross-capture scene distinctness, a finalize-replay idempotency
probe, and token redaction. Blockers print and the CLI exits 1; the receipt
carries no secrets.

Pinned fixture state (2026-10-15), recorded as blockers rather than papered
over: both positive sources refuse conversion at /objects/0/geometry/standoff_m
(a stand-off meter anchor the bridge does not synthesise) with no expected
error declared, and generated-hazard-unsupported refuses at /generated_regions
instead of its declared /objects/1/evidence pointer. The suite therefore exits
nonzero until the fixtures or the bridge converge.

backend/tests/test_capture_placement_cases.py pins the journey evidence, proves
the boundary checks bite (reference-scene substitution and removal of the real
placement stage both fail the suite), and exercises the one-command entry from
a temporary working directory.
@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 8e7c805b-9255-4eac-be8d-319eb70f28c0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@obvious-autobuild

Copy link
Copy Markdown
Author

Independent review (Obvious, Autobuild + Max)

Verdict: changes needed — one gate-completeness fix requested; everything else verified and non-blocking. The pinned blocked state is real and honestly reported (nothing papered over), the boundary checks genuinely bite, and the body's numbers all reproduce.

Findings (ranked)

1. [medium] A failed finalize-replay probe (or cross-capture collision) never affects the exit code.
blockers is built only from per-case data (backend/scripts/capture_placement_cases.py:645), and receipt["ok"] = not blockers (:690) — but finalizeReplay.ok is computed at :419-422 and crossCapture.distinctScenes at :640-643 without ever being consulted. So the receipt can say ok: true while its own finalizeReplay.ok says false.

Evidence (local mutation, reverted after): with finalizeReplay.ok forced false, running python scripts/capture_placement_cases.py --workdir=... --cases=multiwall-source-unsupported exits 0 with receipt ok: true, finalizeReplay.ok: false, blockers: 0. The unchanged code on the same command exits 0 with finalizeReplay.ok: true. The in-process tests do catch a replay regression (test_capture_placement_cases.py:87 asserts finalizeReplay["ok"] is True), but backend/ has no CI workflow on this branch, so the CLI exit code is the only automation-facing gate — and it currently passes a replay-idempotency regression (e.g. a second terminal event after replay) silently. Today replay.ok is genuinely true, so this doesn't change the pinned blocked state; it bites the moment the fixtures converge and the suite would otherwise go green.

Smallest fix: in run_cases, after the case loop, append a blocker when replay is not None and not replay["ok"] and when not cross_capture["distinctScenes"], plus one mutation-style test that breaks the replay and asserts exit 1.

2. [low] The cross-capture "distinct scenes" check is vacuous by construction.
mergedSceneSha256 hashes stored scene bytes whose scene_id embeds {case}+{packet}+{capture}+{run} (_stamped_scene, :150-166), so any two captures differ even with identical geometry; distinctScenes (:640-643) can only be false when a scene artifact is missing entirely (None != None is false). The body presents this as evidence of "different scenes"; it actually pins distinct identity stamps. The real protection against scene reuse is the per-case sceneBoundaryMatchesCase equality (:470-476), which does bite (test 4 proves it). Smallest fix: compare identity-normalized documents (drop scene_id/provenance.inputs before hashing), or reword the claim.

3. [low] The solved path has zero coverage on the committed fixtures.
directComparison (:521-530), wireSemanticComparison (:538-544) and convertedSha256/resultSha256 run only when a case solves, and none does today (pinned solved=0); all six tests assert refused paths. The body states this correctly as conditional ("When a case converts"), so this is not an accuracy problem — but the first real exercise of these branches will come from the future PR that converges the fixtures, and it should carry a test for them.

4. [informational] _apply_dev_env (:136-150) mutates os.environ with no restore.
Five of the six tests call run_cases/main in-process, leaving STATE_BACKEND, STORAGE_BACKEND, VOLUME_ROOT, UPLOAD_URL_HMAC_SECRET etc. set for the rest of the pytest process (no conftest on the backend/tests chain resets env). Empirically quiet — the full suite shows no new failures — but any future test that asserts env-derived defaults becomes order-dependent. Smallest fix: snapshot/restore env in the receipt fixture.

Verified (commands and results)

  • Read the full body, the one comment (a CodeRabbit skip notice), zero reviews, and the complete diff: +2131/−0 across 12 files, head bdfbb3fc on obv/burst7-bs-capture-placement-runner into base obv/burst7-bs-capture-scene-stage @ 38a5735a (stacked draft). Checked out the head in a throwaway worktree and followed AGENTS.md/CONTRIBUTING.
  • uv run --frozen --extra api pytest -q tests/test_capture_placement_cases.py tests/test_capture_placement_frontdoor.py tests/test_placement_case_suite.py → 18 passed (6 runner + 10 case-suite + 2 front-door). Matches the body.
  • uv run --frozen ruff check . → all checks passed; ruff format --check . → 476 files already formatted; lint-imports → "Contracts: 5 kept, 0 broken." Matches the body.
  • CLI replay from /tmp (python scripts/capture_placement_cases.py --output=... --workdir=...): stdout cases=4 solved=0 refused=4 (declared=2) mismatched=3 errored=0, exit 1, receipt hss-capture-placement-receipt/v0 with codeSha bdfbb3fc, realStages: ['placement'], and blockers exactly the body's pinned state: both positives refused at /objects/0/geometry/standoff_m with no declared error, generated-hazard-unsupported pointer mismatch vs its declared /objects/1/evidence, multiwall-source-unsupported clean. finalizeReplay same-run-id with 1 terminal event; receipt passes the token/redaction check before writing.
  • The nested body claim, verified directly through the bridge (scene_bridge.convert_scene): each positive source refuses placement_scene_unsupported at /objects/0/geometry/standoff_m as authored, and after removing only that field refuses at /objects/1/geometry/kind (footprint hazard) — for both hazard-right-ground-gap and hazard-left-ground-gap.
  • The boundary mechanism is real: stage callables resolve via importlib + getattr per call (server/orchestrator/runner.py:33-42), so patching server.orchestrator.stubs.scene.run / objects_3d.run intercepts actual dispatch; placement is stubs_exempt (server/orchestrator/graph.py:174-175) and dispatches to server.placement.run — test 5 proves removal surfaces as placement_boundary_missing, and test 4 proves a substituted reference scene fails the suite.
  • Revert/bite check: checked out base 38a5735a in a throwaway worktree, copied the two new test files in, ran pytest → both files fail at collection (ImportError: cannot import name 'case_suite'). The tests pin this PR's code and cannot pass vacuously without it.
  • Full suite on head: uv run --frozen --extra api pytest -q → 5 failed, 1269 passed, 17 skipped (252s). The failure set is exactly the known pre-existing baseline (SSR shingle-overlap hygiene + the 4 test_gates.py gates), identical to the baseline reproduced on base commits across earlier reviews of this branch family. No regression.

Couldn't verify

  • Fixture authorship independence — the sha256 pins verify integrity, not that the source/wire pairs were authored by hand rather than generated.
  • Nothing above ran on GitHub CI: backend/ has no CI workflow on this branch (pre-existing repo-wide gap), so all evidence here is local.

Worktrees used for this review were removed afterwards; no code was changed, pushed, or merged, and this comment is the only write.

Review of PR #274 (changes needed) found that blockers were built only from
per-case data: finalizeReplay.ok and crossCapture.distinctScenes were recorded
but never consulted, so a replay-idempotency regression or a cross-capture
scene collision left receipt ok:true and the CLI exiting 0 — the exit code is
the only automation-facing gate while backend/ has no CI workflow. Both checks
now append blockers, and a mutation-style test forces a failing replay and
asserts exit 1.

The cross-capture distinctness check also compared verbatim scene bytes, whose
scene_id embeds the case, packet, capture and run — it could only ever fail
when an artifact was missing entirely, presenting identity-stamp difference as
evidence of different scenes. It now hashes identity-normalized documents
(scene_id and provenance.inputs stripped), so identical geometry fails the
check; a two-case same-geometry test manifest proves the twins' raw bytes
differ while their geometry hashes are equal and the suite blocks.

The dev-env flags are now applied reversibly: _apply_dev_env returns a restore
callable and run_cases restores the prior environment in a finally block, so
in-process runs no longer leak STATE_BACKEND/STORAGE_BACKEND/VOLUME_ROOT/
UPLOAD_URL_HMAC_SECRET into the rest of the pytest process; a test pins the
full environ equality across a run.

The solved-path evidence (directComparison, wireSemanticComparison,
convertedSha256, resultSha256) still has zero coverage on the committed
fixtures (none solves); per the review, its first real exercise belongs to the
fixture-convergence PR that will make a case solve.
obvious-autobuild Bot added a commit that referenced this pull request Oct 16, 2026
…into the pytest process

Scoped port of the #274 review fix at c255a23 (the one piece the burst8
integrated copy lacked): _apply_dev_env returns a restore callable and run_cases
restores the prior environment in a finally block, so in-process runs no longer
leak STATE_BACKEND/STORAGE_BACKEND/VOLUME_ROOT/UPLOAD_URL_HMAC_SECRET into the
rest of the pytest process; a test pins the full environ equality across a run.

The rest of c255a23 (replay and cross-capture blockers, identity-normalized
geometry hashing, the mutation tests) is already present in this branch's
stronger #275-integrated form — distinctScenes AND distinctNormalizedGeometry
AND distinct captureIds, applicable-aware replay blocking, full-run positive
solve requirements — and is retained unchanged; the supported default manifest
is not weakened.

Evidence: the new test fails against the pre-port script (env leaked) and passes
after; the placement-cases/pairs/suite suites pass (60 passed).

Co-authored-by: obvious-autobuild[bot] <262744130+obvious-autobuild[bot]@users.noreply.github.com>
@SamGu-NRX
SamGu-NRX changed the base branch from obv/burst7-bs-capture-scene-stage to alpha October 16, 2026 04:32
@SamGu-NRX
SamGu-NRX marked this pull request as ready for review October 16, 2026 04:32
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-16T05:26:22.281798Z 627533f Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@codemetrics-ai

Copy link
Copy Markdown

Note

Review skipped

Codemetrics is installed on this repository, but it hasn't been added to your team yet.

To enable AI code reviews for this repo, go to your dashboard and add BaseScanning to your team's repositories.

@SamGu-NRX
SamGu-NRX marked this pull request as draft October 16, 2026 04:35
@greptile-apps

greptile-apps Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 3/5

[Medium impact] Adds a test harness for the placement case replay pipeline.

The PR needs fixes before merging because two earlier gaps still let broken behavior pass the runner.

Fix All in Claude CodeFindings

  1. P1 Broken results still pass ▶
  2. P1 Expected refusals can pass ▶
  3. P2 Failed runs lose receipts ▶
Fix with agent prompt
### Issue 1
backend/scripts/capture_placement_cases.py:625-629
`_collect_case` records the served result's HTTP status and outcome but never checks them. If `/result` returns 503 or a wrong outcome while the capture remains `manual_review`, an otherwise clean case still passes. Add mismatches unless the served response is 200 with outcome `manual_review`, and test that these failures reach the CLI exit code.

### Issue 2
backend/scripts/capture_placement_cases.py:556-558
The solved branch never checks `record.expected_error`. If a bridge change wrongly accepts a negative case, matching the direct solver response is enough to pass it. These cases have no `wire_path`, so their expected refusal is never checked. Add a mismatch whenever a case declaring `expected_error` solves.

### Issue 3
backend/scripts/capture_placement_cases.py:437-439
`_replay_finalize` skips only journeys without `captureId`, but registration, upload, commit, and finalize failures leave a capture ID without a `runId`. When the first case hits one of these failures, replay accesses `journey['runId']` and crashes before the receipt is written. Skip replay for failed journeys or those without a run ID, preserving the original error in the receipt.

```suggestion
    capture_id = journey.get("captureId")
    if capture_id is None or journey.get("runId") is None or journey.get("errors"):
        return None
```

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

Adds a local runner that sends placement fixtures through the capture API and writes a receipt.

  • Placement cases now run through the capture API and produce a receipt.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
    A[Case fixtures] --> B[Create capture and upload files]
    B --> C[Commit and finalize]
    C --> D[Inject scene and objects]
    D --> E[Real placement stage]
    E --> F[Read artifacts, events, and result]
    F --> G[Write receipt and choose exit code]
Loading

Reviews (2) · Last reviewed commit: "Merge remote-tracking branch 'origin/alp..." · Reviewed by Greptile

Comment on lines +625 to +629
case["deviceOutcome"] = {
"captureStatus": capture.get("status"),
"servedResultHttpStatus": served.status_code,
"servedResultKind": served.json().get("outcome", {}).get("kind") if served.status_code == 200 else None,
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Broken results still pass

_collect_case records the served result's HTTP status and outcome but never checks them. If /result returns 503 or a wrong outcome while the capture remains manual_review, an otherwise clean case still passes. Add mismatches unless the served response is 200 with outcome manual_review, and test that these failures reach the CLI exit code.

Knowledge Base Used: Verification execution

Prompt To Fix With AI
This is a comment left during a code review.
Path: backend/scripts/capture_placement_cases.py
Line: 625-629

Comment:
**Broken results still pass**

`_collect_case` records the served result's HTTP status and outcome but never checks them. If `/result` returns 503 or a wrong outcome while the capture remains `manual_review`, an otherwise clean case still passes. Add mismatches unless the served response is 200 with outcome `manual_review`, and test that these failures reach the CLI exit code.

**Knowledge Base Used:** [Verification execution](https://app.greptile.com/s-gu/-/custom-context/knowledge-base/samgu-nrx/basescanning/-/docs/verification-execution.md)

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Claude Code Fix in Codex

Comment on lines +556 to +558
if stage_status == "done" and case["hasPlacementArtifact"]:
case["status"] = "solved"
placement = json.loads(deps.storage.get_bytes(placement_artifact_key))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Expected refusals can pass

The solved branch never checks record.expected_error. If a bridge change wrongly accepts a negative case, matching the direct solver response is enough to pass it. These cases have no wire_path, so their expected refusal is never checked. Add a mismatch whenever a case declaring expected_error solves.

Prompt To Fix With AI
This is a comment left during a code review.
Path: backend/scripts/capture_placement_cases.py
Line: 556-558

Comment:
**Expected refusals can pass**

The solved branch never checks `record.expected_error`. If a bridge change wrongly accepts a negative case, matching the direct solver response is enough to pass it. These cases have no `wire_path`, so their expected refusal is never checked. Add a mismatch whenever a case declaring `expected_error` solves.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Claude Code Fix in Codex

Comment on lines +437 to +439
capture_id = journey.get("captureId")
if capture_id is None:
return None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Failed runs lose receipts

_replay_finalize skips only journeys without captureId, but registration, upload, commit, and finalize failures leave a capture ID without a runId. When the first case hits one of these failures, replay accesses journey['runId'] and crashes before the receipt is written. Skip replay for failed journeys or those without a run ID, preserving the original error in the receipt.

Suggested change
capture_id = journey.get("captureId")
if capture_id is None:
return None
capture_id = journey.get("captureId")
if capture_id is None or journey.get("runId") is None or journey.get("errors"):
return None
Prompt To Fix With AI
This is a comment left during a code review.
Path: backend/scripts/capture_placement_cases.py
Line: 437-439

Comment:
**Failed runs lose receipts**

`_replay_finalize` skips only journeys without `captureId`, but registration, upload, commit, and finalize failures leave a capture ID without a `runId`. When the first case hits one of these failures, replay accesses `journey['runId']` and crashes before the receipt is written. Skip replay for failed journeys or those without a run ID, preserving the original error in the receipt.

```suggestion
    capture_id = journey.get("captureId")
    if capture_id is None or journey.get("runId") is None or journey.get("errors"):
        return None
```

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Claude Code Fix in Codex

Comment thread backend/server/placement/case_suite.py Outdated
Comment thread backend/server/placement/case_suite.py Outdated

@chatgpt-codex-connector chatgpt-codex-connector 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 Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c255a23529

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +262 to +263
import server.orchestrator.stubs.objects_3d as objects_3d_stub
import server.orchestrator.stubs.scene as scene_stub

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Patch the stage entry point that the orchestrator actually invokes

The runner patches server.orchestrator.stubs.objects_3d.run, but STAGES["objects_3d"] is configured with module objects and entry run_3d, so runner.stage_callable imports server.orchestrator.stubs.objects and looks up run_3d instead. The injected objects boundary is therefore never used (and the current stub module has no run_3d), causing the stage to fail before the intended case output is produced and making the tap-hazard/merge assertions invalid.

Useful? React with 👍 / 👎.

Comment on lines +684 to +687
merged = [case.get("mergedGeometrySha256") for case in cases[:2]]
cross_capture = {
"captureIds": [case.get("captureId") for case in cases[:2]],
"distinctScenes": len(merged) == 2 and merged[0] != merged[1],

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Check scene distinctness across every captured case

The cross-capture gate only compares cases[:2], even though the runner processes every manifest case in the same app. If a later capture reuses an earlier case's geometry (or otherwise receives the wrong scene), the receipt still passes as long as the first two differ, so the advertised cross-capture isolation check does not cover the rest of the suite.

Useful? React with 👍 / 👎.

@github-actions github-actions Bot added size:XL 500-999 effective changed lines. and removed size:XXL 1,000+ effective changed lines. labels Oct 16, 2026
@obvious-autobuild obvious-autobuild Bot changed the title Capture-API replay runner for placement cases (backend/scripts/capture_placement_cases.py) + focused tests [obvious-fleet] Merge origin/alpha into the capture-API placement-case replay runner (resolve stale early-#271 conflicts) Oct 16, 2026
@SamGu-NRX
SamGu-NRX marked this pull request as ready for review October 16, 2026 05:22
@SamGu-NRX
SamGu-NRX merged commit ff0d463 into alpha Oct 16, 2026
3 checks passed
@codemetrics-ai

Copy link
Copy Markdown

Note

Review skipped

Codemetrics is installed on this repository, but it hasn't been added to your team yet.

To enable AI code reviews for this repo, go to your dashboard and add BaseScanning to your team's repositories.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 effective changed lines.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants