TAVERN_FIT-V2 (M-ALIGN capstone retry): density-law tavern (14 real props) — HONEST NEGATIVE (6.0, density refuted as the gap)#1559
TAVERN_FIT-V2 (M-ALIGN capstone retry): density-law tavern (14 real props) — HONEST NEGATIVE (6.0, density refuted as the gap)#1559100yenadmin wants to merge 4 commits into
Conversation
Author the furniture the #1557 panel LIKED as REAL collision props (the architect ruling on PR #1557's honest negative): grow the 6-prop tavern_fit interior to 14 props — benches flanking each of the 3 tables, a bar stool row, a back-bar shelf + cask cluster, a hearth-side woodpile, and a corner barrel pair. All LOW/MID kinds (fallen_log/supply_crates/barrel), each a short 2-cell run for a tight occlusion hull. Camera-fit + wall_run perimeter band kept from tavern_fit; tavern + tavern_fit stay byte-identical (new room key tavern_fit2). Validated: 0 disconnected pockets (8-conn flood-fill), door zone (8,0)+(8,1) clear, 43 clear combat-floor cells (>=12), frame-lit PASS (mean 0.220).
…+ Gemini style best-of-3 + s1111 panel (6.0)
- gen_base/room_tavern.png: flux.1-dev depth-CN, cs0.95 seed222, edge-recall 0.98 vs greybox (>=0.95 masonry gate PASS)
- gen_style/candidate_s{1000,1111,1222}.png: Gemini 3.1 style pass, STRUCTURE+ADDITIONS-LOCK, density-aware grounding
- s1111 blind 5-panel: candidate median 6.0 vs incumbent 8.0 (7.0 canon) vs control 9.0, delta -3.0 (density CLOSED, s1111 flat-lit)
- s1000 (tenebrist) panel staged for the best-of-N re-score
…anel gap Full pipeline (density-law): 14-prop tavern_fit2 greybox -> flux.1-dev depth-CN base (recall 0.98) -> Gemini 3.1 style best-of-3 (STRUCTURE+ADDITIONS-LOCK, density-aware grounding) -> two blind 5-scorer panels -> promote gate. Result: BOTH flat-lit (s1111) and deep-tenebrist (s1000) variants plateau at panel median 6.0 vs incumbent 9.0 (7.0 canon) / control 9.0 -> delta -3.0 < -2.5 adopt bar. promote.py --dry-run: rejected / passed=false / tier=null. Capstone finding: authoring the furniture the #1557 panel LIKED as 14 REAL collision props did NOT move the score (6.0 == #1557's faked-sparse 6.0 == both lighting variants). Density is CLOSED (no sparse/missing flags); the residual gap is (1) house-style anchoring (house_best == incumbent) and (2) the single additions-locked Gemini pass's brushwork ceiling vs the incumbent's layered pipeline. Evidence-only; no adoption; plates_manifest/recipes untouched; no box. Walkslice reconciliation reported (report-only, not changed): door [0,0]->[8,0], +8 props/16 cells, walkable 59->43, spawns unchanged, validate_scene_grid passes.
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 36 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughAdds the ChangesTavern Fit 2 density-law pipeline
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant RoomAuthor
participant StylePass
participant EvaluationPanel
participant EvidenceGallery
RoomAuthor->>StylePass: provides tavern_fit2 geometry and base image
StylePass->>EvaluationPanel: supplies generated candidate images
EvaluationPanel->>EvidenceGallery: records registration, pregate, and panel verdicts
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
evaOS review status: completedPR: #1559 - TAVERN_FIT-V2 (M-ALIGN capstone retry): density-law tavern (14 real props) — HONEST NEGATIVE (6.0, density refuted as the gap) evaOS review completed for this PR head. Automation note: agents should wait for this comment to reach PR URL: #1559 Review URL: #1559 (review) |
There was a problem hiding this comment.
Actionable comments posted: 15
🤖 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 `@qa/evidence/tavern-fit2/findings.json`:
- Line 3: The verdict summary incorrectly states the incumbent scored 9.0
this-panel. Update the verdict text to accurately report the incumbent’s
per-panel results: 8.0 for s1111 and 9.0 for s1000, or explicitly identify which
panel the 9.0 refers to; ensure the corrected values are consistent with the
recorded panel entries.
In `@qa/evidence/tavern-fit2/gallery.html.rows.json`:
- Around line 14-18: Update the drift records in gallery.html.rows.json and
gallery_s1000.html.rows.json so zero checked props with all props skipped are
represented as not_evaluated (or null), never passed; adjust the associated
gate/consumer logic to distinguish not_evaluated from a successful pass.
In `@qa/evidence/tavern-fit2/gemini_style_pass.py`:
- Around line 32-37: The _downscale function currently stretches images to
_PLATE_W × _PLATE_H without preserving aspect ratio. Update _downscale to
validate the input aspect ratio and reject unexpected ratios, or crop/pad the
image to the target dimensions while preserving geometry before saving; retain
RGB conversion and the existing size check.
- Around line 45-47: Validate the parsed `args.n` value in the argument-handling
flow before any uploads or job submissions; if it is less than 1, call
`argparse.error(...)` with a clear message and prevent execution from
continuing. Use the existing `--n` definition and main execution entry point to
locate the validation.
In `@qa/evidence/tavern-fit2/loop_s1000/panel_verdict.json`:
- Around line 2-10: The panel verdict omits the required house-style assessment
for candidate A. Add raw per-image house_style results and an aggregate
candidate-level house_style result to the verdict, then propagate the same data
into tavern_fit2_visual_gate_panel.json, following the schema required by
loop_s1000/panel/prompts.json.
In `@qa/evidence/tavern-fit2/loop_s1000/panel/prompts.json`:
- Line 35: The prompt’s ±1.2 control-band acceptance rule is inconsistent with
the gate’s delta >= 0 check. Update the gate logic in felt_rest_panel.py to read
and apply the declared control_band value, ensuring candidates within the
permitted band pass consistently with the prompt, or remove the band language
from prompts.json. Add regression tests covering candidates exactly at, inside,
and outside the cutoff boundary.
In `@qa/evidence/tavern-fit2/loop/panel/contract.json`:
- Around line 12-16: Update the drift aggregation logic that produces the
contract JSON so any zero-evaluation run (`checked=0`), including all-`SKIP`
props or missing `ref_fp`/`--baseline`, is emitted as `SKIPPED` or
`INCONCLUSIVE` rather than `passed: true`; keep the gate non-passing until
fingerprint data is available, covering both tavern-fit2 loop variants.
In `@qa/evidence/tavern-fit2/loop/panel/prompts.json`:
- Around line 4-24: The factual_defect_checklist lacks a measurable check
supporting the later “Density gap CLOSED” verdict. Add an explicit
density/occupancy checklist flag with criteria for furniture count, spatial
coverage, or crowding, and propagate its result into panel_verdict.json;
alternatively remove the unsupported density conclusion from the verdict.
- Around line 26-35: The required house_style result is requested by the scorer
but discarded during verdict ingestion and gallery persistence. Update the
verdict schema and ingest_verdict() to validate and retain each image’s
house_style classification, include it in the committed verdict, and persist it
in gallery rows so the house-style regression rule remains available.
In `@qa/evidence/tavern-fit2/nomination.jsonl`:
- Line 1: The nomination record uses a machine-specific absolute source_path
that cannot be resolved in other checkouts. Update the source_path field in the
nomination entry to the repo-relative path
qa/evidence/tavern-fit2/tavern_fit2_visual_gate_panel.json, preserving the rest
of the record.
In `@qa/evidence/tavern-fit2/plateloop_tavern_fit2_s1000.json`:
- Around line 4-9: Remove workstation-specific absolute paths from the
manifest’s generate, registration, and panel fields. Replace repository
artifacts with repo-relative paths, and move the external panel.control image to
an explicit override key consistent with sibling contract.json manifests;
preserve the existing manifest structure and values otherwise.
In `@qa/evidence/tavern-fit2/plateloop_tavern_fit2.json`:
- Around line 4-9: The QA contracts contain machine-specific absolute paths,
making replay impossible elsewhere. In both plateloop_tavern_fit2.json and
plateloop_tavern_fit2_s1000.json, replace candidate, greybox, manifest,
incumbent, and house_anchor paths with repository-relative references under
qa/evidence; move the external control image to a configurable override outside
the committed fixtures.
- Around line 11-16: The declared model chain omits the base LoRA used by this
plate. Update the model_chain loras field to include
model_MB22WaRCBLtfhi5R2CRpHoEL with lora_scale 0.78, or ensure plate_loop
receives the candidate’s actual scenario_meta.json before promotion so the
complete chain and provenance are preserved.
In `@qa/room_manifests/tavern_fit2.cells.json`:
- Around line 11-19: The tavern_fit2 manifest uses a fixed camera while its
geometry opts into camera_fit, causing derivation and validation to use
inconsistent projection paths. Either remove the camera_fit setting from
tavern_fit2_geometry.json and regenerate the manifest, or update
derive_room_manifest.py, check_plate_drift.py, and check_grid_paint_coherence.py
to propagate and use the fitted orthographic camera consistently.
In `@tools/author_room_geometry.py`:
- Around line 346-350: The walkability comment incorrectly claims row 8 is fully
open while barrels_corner occupies [10,8] and is folded into impassable geometry
by _geometry(). Move the barrel pair to a valid non-circulation location outside
row 8, updating the barrels_corner definition and any dependent validation or
placement metadata while preserving connectivity.
🪄 Autofix (Beta)
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: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: e5a29cb2-e369-481f-bf32-7963ce6760e0
⛔ Files ignored due to path filters (28)
qa/evidence/tavern-fit2/before_after.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/gen_base/room_tavern.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/gen_style/candidate_s1000.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/gen_style/candidate_s1111.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/gen_style/candidate_s1222.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop/panel/house_best.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop/panel/image_1.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop/panel/image_2.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop/panel/image_3.jpgis excluded by!**/*.jpgqa/evidence/tavern-fit2/loop_s1000/panel/crop1_a.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/crop1_b.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/crop1_pit.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/crop2_chars.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/crop2_chars2.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/crop3_a.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/crop3_b.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/crop3_bar.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/crop3_left.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/crop3_tables.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/house_best.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/image_1.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/loop_s1000/panel/image_2.jpgis excluded by!**/*.jpgqa/evidence/tavern-fit2/loop_s1000/panel/image_3.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/refs/v1_1557_candidate_s1000.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/tavern_fit2_depth.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/tavern_fit2_greybox.pngis excluded by!**/*.pngqa/evidence/tavern-fit2/tavern_fit2_normal.pngis excluded by!**/*.pngqa/scores.dbis excluded by!**/*.db
📒 Files selected for processing (23)
qa/evidence/tavern-fit2/findings.jsonqa/evidence/tavern-fit2/gallery.htmlqa/evidence/tavern-fit2/gallery.html.rows.jsonqa/evidence/tavern-fit2/gallery_s1000.htmlqa/evidence/tavern-fit2/gallery_s1000.html.rows.jsonqa/evidence/tavern-fit2/gemini_style_pass.pyqa/evidence/tavern-fit2/gen_base/scenario_meta.jsonqa/evidence/tavern-fit2/loop/panel/contract.jsonqa/evidence/tavern-fit2/loop/panel/prompts.jsonqa/evidence/tavern-fit2/loop/panel_mapping.jsonqa/evidence/tavern-fit2/loop/panel_verdict.jsonqa/evidence/tavern-fit2/loop_s1000/panel/contract.jsonqa/evidence/tavern-fit2/loop_s1000/panel/prompts.jsonqa/evidence/tavern-fit2/loop_s1000/panel_mapping.jsonqa/evidence/tavern-fit2/loop_s1000/panel_verdict.jsonqa/evidence/tavern-fit2/nomination.jsonlqa/evidence/tavern-fit2/plateloop_tavern_fit2.jsonqa/evidence/tavern-fit2/plateloop_tavern_fit2_s1000.jsonqa/evidence/tavern-fit2/style_pass_prompt_v2.txtqa/evidence/tavern-fit2/tavern_fit2_geometry.jsonqa/evidence/tavern-fit2/tavern_fit2_visual_gate_panel.jsonqa/room_manifests/tavern_fit2.cells.jsontools/author_room_geometry.py
📜 Review details
⏰ Context from checks skipped due to timeout. (8)
- GitHub Check: CodeRabbit
- GitHub Check: Analyze (python)
- GitHub Check: viewer-tests
- GitHub Check: test
- GitHub Check: Analyze (python)
- GitHub Check: Analyze (csharp)
- GitHub Check: viewer-tests
- GitHub Check: test
🧰 Additional context used
📓 Path-based instructions (1)
**/*
📄 CodeRabbit inference engine (AGENTS.md)
**/*: Treat/Users/lume/WorldOSas the canonical local Mac app/private-art checkout for WorldOS GUI and native-app testing.
Use/Volumes/LEXAR/Codexfor Codex artifacts, scratch files, screenshots, reports, and downloaded CI/VM artifacts.
Before install, build, or test commands, verifypwd; GUI/native app runs must use/Users/lume/WorldOSor an approved same-disk worktree configuration.
Use thecodex/prefix for new branches unless instructed otherwise.
Files:
qa/evidence/tavern-fit2/loop/panel_mapping.jsonqa/evidence/tavern-fit2/plateloop_tavern_fit2_s1000.jsonqa/evidence/tavern-fit2/tavern_fit2_geometry.jsonqa/evidence/tavern-fit2/findings.jsonqa/evidence/tavern-fit2/gallery.htmlqa/evidence/tavern-fit2/loop/panel_verdict.jsonqa/evidence/tavern-fit2/gen_base/scenario_meta.jsonqa/evidence/tavern-fit2/loop_s1000/panel_mapping.jsonqa/evidence/tavern-fit2/loop/panel/prompts.jsonqa/evidence/tavern-fit2/gallery_s1000.htmlqa/evidence/tavern-fit2/loop_s1000/panel_verdict.jsonqa/evidence/tavern-fit2/style_pass_prompt_v2.txtqa/evidence/tavern-fit2/plateloop_tavern_fit2.jsonqa/evidence/tavern-fit2/loop_s1000/panel/prompts.jsonqa/evidence/tavern-fit2/tavern_fit2_visual_gate_panel.jsonqa/evidence/tavern-fit2/gallery_s1000.html.rows.jsontools/author_room_geometry.pyqa/evidence/tavern-fit2/gemini_style_pass.pyqa/room_manifests/tavern_fit2.cells.jsonqa/evidence/tavern-fit2/nomination.jsonlqa/evidence/tavern-fit2/loop_s1000/panel/contract.jsonqa/evidence/tavern-fit2/gallery.html.rows.jsonqa/evidence/tavern-fit2/loop/panel/contract.json
🧠 Learnings (1)
📚 Learning: 2026-07-10T08:23:11.857Z
Learnt from: 100yenadmin
Repo: electricsheephq/WorldOS PR: 1489
File: qa/evidence/plate-sprint/adopt-crypt/crypt_armb_iter3_visual_gate_panel.json:0-0
Timestamp: 2026-07-10T08:23:11.857Z
Learning: In the WorldOS qa evidence JSONs, do not flag `control_image` and `reference_frame` values that intentionally use absolute paths under `/Volumes/LEXAR/WorldOS-Unity-spike/refs/...` (e.g., referencing registered visual controls like `control:visual:...`) as violations of any `/Volumes/LEXAR/Codex` scratch-path guidance—this is the established convention.
Conversely, `candidate_image` and `incumbent_image` must not point at session-scratch locations (e.g., `/Users/lume/worldos-session-notes/...`). Instead, create/commit repo-relative copies under the corresponding `qa/evidence/.../source-plates/` directory for the plate, and update `candidate_image`/`incumbent_image` to reference those committed copies (rather than moving them to `/Volumes/LEXAR/Codex`).
Applied to files:
qa/evidence/tavern-fit2/tavern_fit2_visual_gate_panel.json
🪛 LanguageTool
qa/evidence/tavern-fit2/style_pass_prompt_v2.txt
[style] ~19-~19: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ements, signatures, frames, or borders. Do NOT add any characters, people, figures...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
🔇 Additional comments (12)
tools/author_room_geometry.py (1)
381-383: LGTM!qa/evidence/tavern-fit2/tavern_fit2_geometry.json (1)
1-1: LGTM!qa/evidence/tavern-fit2/findings.json (1)
8-8: 🗄️ Data Integrity & IntegrationDisambiguate the two G1 luminance values.
The pipeline summary reports mean luminance
0.220, while pregate reports0.118under the sameG1_frame_litlabel. If these are different artifacts or stages, name them explicitly; otherwise regenerate the evidence.Confidence: 93%.
Also applies to: 18-18
qa/evidence/tavern-fit2/plateloop_tavern_fit2_s1000.json (1)
11-16: 🗄️ Data Integrity & IntegrationNo LoRA needs to be added here. This
s1000plate is using a separate, config-declared provenance chain (base_model+style_pass), and the painterly LoRA lives inqa/evidence/tavern-fit2/gen_base/scenario_meta.json, not in this artifact. The current chain already matches the registry gate path. Confidence: 96%.> Likely an incorrect or invalid review comment.qa/evidence/tavern-fit2/gen_base/scenario_meta.json (1)
2-2: 🗄️ Data Integrity & IntegrationThis
roomvalue is correct.
scenario_meta.jsontracks the semantic room class (tavern), whiletavern-fit2is the scenario/evidence label; the generated asset is alsoroom_tavern.png. Confidence: 92%.> Likely an incorrect or invalid review comment.qa/evidence/tavern-fit2/style_pass_prompt_v2.txt (1)
1-20: LGTM!qa/evidence/tavern-fit2/loop/panel_mapping.json (1)
1-17: LGTM!qa/evidence/tavern-fit2/gallery_s1000.html (1)
1-46: LGTM!qa/evidence/tavern-fit2/loop_s1000/panel/contract.json (1)
12-16: Duplicate of the unevaluated-drift-gate finding.The same
checked: 0/skipped: 19/passed: truepattern appears here; fix the producer once and regenerate both contracts.Confidence: 97%.
Also applies to: 113-119
qa/evidence/tavern-fit2/loop_s1000/panel_mapping.json (1)
1-17: LGTM!qa/evidence/tavern-fit2/tavern_fit2_visual_gate_panel.json (1)
1-78: LGTM!qa/evidence/tavern-fit2/gallery.html (1)
38-42: 🗄️ Data Integrity & IntegrationVerify that this panel badge is sourced from the s1111 run.
qa/evidence/tavern-fit2/loop/panel/contract.jsonrecordspregate: FLAGandrow.panel: null, yet this card rendersA 6 · B 8 · C 9. The supplied s1000 verdict isA 6 · B 9 · C 9, and no s1111 verdict is included here. Regenerate from a run-keyed verdict and showblocked/N/Awhen no panel result was ingested.Confidence: 91%.
| "drift": { | ||
| "passed": true, | ||
| "room": "tavern_fit2", | ||
| "checked": 0, | ||
| "skipped": 19, |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Do not mark an unevaluated drift gate as passed.
This record says passed: true while zero props were checked and all 19 were skipped because no baseline exists. That is “not evaluated,” not a successful drift check; consumers could incorrectly treat unverified geometry as validated. Use an explicit not_evaluated/null status and make gate logic distinguish it from pass. The same issue exists in gallery_s1000.html.rows.json.
Confidence: 99%.
🤖 Prompt for 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.
In `@qa/evidence/tavern-fit2/gallery.html.rows.json` around lines 14 - 18, Update
the drift records in gallery.html.rows.json and gallery_s1000.html.rows.json so
zero checked props with all props skipped are represented as not_evaluated (or
null), never passed; adjust the associated gate/consumer logic to distinguish
not_evaluated from a successful pass.
| def _downscale(path: str) -> None: | ||
| from PIL import Image | ||
| im = Image.open(path).convert("RGB") | ||
| if im.size != (_PLATE_W, _PLATE_H): | ||
| im.resize((_PLATE_W, _PLATE_H), Image.LANCZOS).save(path) | ||
| print(f"[gemini_style_pass] downscaled {os.path.basename(path)} {im.size} -> {_PLATE_W}x{_PLATE_H}") |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift
Preserve aspect ratio before writing the plate.
1344x768 is 1.75:1, while common 2K outputs are 16:9. Resizing directly to the target dimensions can stretch the tavern geometry and violate the prompt’s pixel-level structure lock, degrading edge recall and visual comparisons. Reject unexpected aspect ratios or crop/pad while preserving geometry.
Confidence: 97%.
🤖 Prompt for 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.
In `@qa/evidence/tavern-fit2/gemini_style_pass.py` around lines 32 - 37, The
_downscale function currently stretches images to _PLATE_W × _PLATE_H without
preserving aspect ratio. Update _downscale to validate the input aspect ratio
and reject unexpected ratios, or crop/pad the image to the target dimensions
while preserving geometry before saving; retain RGB conversion and the existing
size check.
| ap.add_argument("--n", type=int, default=3, help="best-of-N seeds") | ||
| ap.add_argument("--model", default="model_google-gemini-3-1-flash") | ||
| ap.add_argument("--timeout", type=int, default=300) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Reject invalid --n values.
--n 0 and negative values return success with zero candidates, producing an apparently completed but empty evidence run. Validate args.n >= 1 with argparse.error(...) before uploading or submitting jobs.
Confidence: 99%.
🤖 Prompt for 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.
In `@qa/evidence/tavern-fit2/gemini_style_pass.py` around lines 45 - 47, Validate
the parsed `args.n` value in the argument-handling flow before any uploads or
job submissions; if it is less than 1, call `argparse.error(...)` with a clear
message and prevent execution from continuing. Use the existing `--n` definition
and main execution entry point to locate the validation.
| "scores": {"A": [6,6,6,6.5,7], "B": [9,9,9,6,6], "C": [9,9,9,9,9.5]}, | ||
| "medians": {"A": 6.0, "B": 9.0, "C": 9.0}, | ||
| "control_valid": true, | ||
| "defects": { | ||
| "A": {"on_prop": false, "t_pose": false, "floating": false, "duplicate": false, "missing": false}, | ||
| "B": {"on_prop": false, "t_pose": false, "floating": false, "duplicate": false, "missing": false}, | ||
| "C": {"on_prop": false, "t_pose": false, "floating": false, "duplicate": false, "missing": false} | ||
| }, | ||
| "verdict": "candidate s1000 (deep-tenebrist) median 6.0 vs incumbent 9.0 (7.0 canon) vs control 9.0; delta -3.0. Same 6.0 as flat-lit s1111 AND as #1557 sparse -> density is NOT the binding gap." |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Persist the house-style verdict required by the panel contract.
loop_s1000/panel/prompts.json:26,35 requires per-image house_style results and makes losing the house-style read a regression. This verdict stores only scores and defect flags, so the evidence cannot establish whether candidate A passed that adoption-critical criterion. Add raw per-image values plus an aggregate candidate result, and carry it into tavern_fit2_visual_gate_panel.json.
Confidence: 99%.
🤖 Prompt for 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.
In `@qa/evidence/tavern-fit2/loop_s1000/panel_verdict.json` around lines 2 - 10,
The panel verdict omits the required house-style assessment for candidate A. Add
raw per-image house_style results and an aggregate candidate-level house_style
result to the verdict, then propagate the same data into
tavern_fit2_visual_gate_panel.json, following the schema required by
loop_s1000/panel/prompts.json.
| "generate": {"candidate": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/evidence/tavern-fit2/gen_style/candidate_s1000.png"}, | ||
| "registration": {"greybox": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/evidence/tavern-fit2/tavern_fit2_greybox.png", "min_recall": 0.95, "manifest": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/room_manifests/tavern_fit2.cells.json"}, | ||
| "panel": { | ||
| "incumbent": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/evidence/new-tavern/tavern_truegrey_v1.png", | ||
| "control": "/Users/lume/worldos-session-notes/plate-sprint/armB/poe2_control.jpg", | ||
| "house_anchor": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/evidence/new-tavern/tavern_truegrey_v1.png" |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
pwd
git ls-files qa/evidence/tavern-fit2/plateloop_tavern_fit2_s1000.json qa/evidence/tavern-fit2 | sed -n '1,80p'
python3 - <<'PY'
from pathlib import Path
p = Path('qa/evidence/tavern-fit2/plateloop_tavern_fit2_s1000.json')
print('exists', p.exists(), 'size', p.stat().st_size if p.exists() else None)
if p.exists():
text = p.read_text()
for i, line in enumerate(text.splitlines(), 1):
if 1 <= i <= 40:
print(f"{i:3}: {line}")
PYRepository: electricsheephq/WorldOS
Length of output: 3766
🏁 Script executed:
sed -n '1,220p' qa/evidence/tavern-fit2/plateloop_tavern_fit2.json
printf '\n---\n'
sed -n '1,220p' qa/evidence/tavern-fit2/loop_s1000/panel/contract.json
printf '\n---\n'
sed -n '1,220p' qa/evidence/tavern-fit2/loop/panel/contract.jsonRepository: electricsheephq/WorldOS
Length of output: 50379
Remove author-local absolute paths from this manifest.
qa/evidence/tavern-fit2/plateloop_tavern_fit2_s1000.json serializes /Users/lume/WorldOS-worktrees/... and /Users/lume/worldos-session-notes/... into generate, registration, and panel.control, so the replay contract is pinned to one workstation and breaks outside that filesystem. Use repo-relative artifact paths and move the external control image behind an explicit override key, matching the sibling contract.json files. Confidence: 99%.
🤖 Prompt for 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.
In `@qa/evidence/tavern-fit2/plateloop_tavern_fit2_s1000.json` around lines 4 - 9,
Remove workstation-specific absolute paths from the manifest’s generate,
registration, and panel fields. Replace repository artifacts with repo-relative
paths, and move the external panel.control image to an explicit override key
consistent with sibling contract.json manifests; preserve the existing manifest
structure and values otherwise.
Source: Path instructions
| "generate": {"candidate": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/evidence/tavern-fit2/gen_style/candidate_s1111.png"}, | ||
| "registration": {"greybox": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/evidence/tavern-fit2/tavern_fit2_greybox.png", "min_recall": 0.95, "manifest": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/room_manifests/tavern_fit2.cells.json"}, | ||
| "panel": { | ||
| "incumbent": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/evidence/new-tavern/tavern_truegrey_v1.png", | ||
| "control": "/Users/lume/worldos-session-notes/plate-sprint/armB/poe2_control.jpg", | ||
| "house_anchor": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/evidence/new-tavern/tavern_truegrey_v1.png" |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
pwd && git ls-files qa/evidence/tavern-fit2/plateloop_tavern_fit2.json qa/evidence/tavern-fit2 | sed -n '1,120p' && wc -l qa/evidence/tavern-fit2/plateloop_tavern_fit2.json && cat -n qa/evidence/tavern-fit2/plateloop_tavern_fit2.json | sed -n '1,120p'Repository: electricsheephq/WorldOS
Length of output: 3834
🏁 Script executed:
#!/bin/bash
set -euo pipefail
pwd
echo '--- file ---'
wc -l qa/evidence/tavern-fit2/plateloop_tavern_fit2.json
cat -n qa/evidence/tavern-fit2/plateloop_tavern_fit2.json | sed -n '1,120p'
echo '--- nearby json files with absolute paths ---'
rg -n '"/Users/|"/Volumes/' qa/evidence -g '*.json' | sed -n '1,200p'
echo '--- references to tavern_fit2 / plateloop ---'
rg -n 'plateloop_tavern_fit2|tavern_fit2' qa . -g '!**/node_modules/**' | sed -n '1,200p'Repository: electricsheephq/WorldOS
Length of output: 29036
🏁 Script executed:
#!/bin/bash
set -euo pipefail
pwd
echo '--- evidence path conventions ---'
rg -n 'absolute path|/Users/lume|worldos-session-notes|repo-relative|committed artifact|run contract|evidence' README* qa docs .github -g '!**/node_modules/**' | sed -n '1,240p'
echo '--- tavern-fit2 directory tree ---'
find qa/evidence/tavern-fit2 -maxdepth 2 -type f | sort | sed -n '1,200p'Repository: electricsheephq/WorldOS
Length of output: 42170
Replace the hard-coded author paths in this QA contract.
qa/evidence/tavern-fit2/plateloop_tavern_fit2.json serializes /Users/lume/WorldOS-worktrees/... and /Users/lume/worldos-session-notes/... verbatim, so the loader only works on one machine. On a clean checkout or CI runner, the candidate, greybox, manifest, and control inputs are unresolved, which makes the committed run contract non-portable and breaks replayability. Switch the committed paths to repo-relative refs under qa/evidence/... and keep any external-control override outside the fixture. The same pattern also appears in qa/evidence/tavern-fit2/plateloop_tavern_fit2_s1000.json. Confidence: 98%.
🤖 Prompt for 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.
In `@qa/evidence/tavern-fit2/plateloop_tavern_fit2.json` around lines 4 - 9, The
QA contracts contain machine-specific absolute paths, making replay impossible
elsewhere. In both plateloop_tavern_fit2.json and
plateloop_tavern_fit2_s1000.json, replace candidate, greybox, manifest,
incumbent, and house_anchor paths with repository-relative references under
qa/evidence; move the external control image to a configurable override outside
the committed fixtures.
Source: Path instructions
| "model_chain": { | ||
| "base_model": "model_bfl-flux-1-dev", | ||
| "controlnet_model": "model_bfl-flux-1-dev", | ||
| "control_modality": "depth", | ||
| "loras": [], | ||
| "style_pass": {"model": "model_google-gemini-3-1-flash", "loras": [], "strength": null} |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
pwd
printf '\n--- target file ---\n'
cat -n qa/evidence/tavern-fit2/plateloop_tavern_fit2.json
printf '\n--- nearby metadata files ---\n'
fd -a 'scenario_meta.json|plateloop_tavern_fit2.json' qa/evidence
printf '\n--- search for referenced model id and plate_loop provenance handling ---\n'
rg -n 'model_MB22WaRCBLtfhi5R2CRpHoEL|plate_loop|loras|style pass|style_pass|candidate-local metadata|candidate local metadata' qa/evidence qa -g '*.json' -g '*.md' -g '*.ts' -g '*.js' -g '*.py'Repository: electricsheephq/WorldOS
Length of output: 50379
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n--- plate_loop provenance code ---\n'
sed -n '250,290p' qa/plate_loop.py
printf '\n--- plate_loop config schema comments ---\n'
sed -n '45,80p' qa/plate_loop.py
printf '\n--- base scenario metadata ---\n'
cat -n qa/evidence/tavern-fit2/gen_base/scenario_meta.json
printf '\n--- promotion/gate references to model_chain or loras ---\n'
rg -n 'model_chain|lorasScale|lora|style_pass|provenance gate|promote provenance|panel JSON|scenario_meta' qa/plate_loop.py qa/test_visual_promotion_gate.py qa/evidence/tavern-fit2 -g '*.py' -g '*.json' -g '*.md'Repository: electricsheephq/WorldOS
Length of output: 19267
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n--- read_model_chain + panel write path ---\n'
sed -n '296,345p' qa/plate_loop.py
printf '\n---\n'
sed -n '810,845p' qa/plate_loop.py
printf '\n--- tavern-fit2 loop config / contract evidence ---\n'
sed -n '120,150p' qa/evidence/tavern-fit2/loop/panel/contract.json
printf '\n---\n'
sed -n '126,156p' qa/evidence/tavern-fit2/loop_s1000/panel/contract.json
printf '\n--- search for explicit declared model_chain in tavern-fit2 artifacts ---\n'
rg -n '"model_chain"|'"'"'model_chain'"'"' qa/evidence/tavern-fit2 -g '*.json'Repository: electricsheephq/WorldOS
Length of output: 6078
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n--- provenance gate tests ---\n'
sed -n '330,430p' qa/test_visual_promotion_gate.py
printf '\n--- any tavern-fit2 declared model_chain in evidence ---\n'
rg -n '"model_chain"\s*:' qa/evidence/tavern-fit2 -g '*.json'
printf '\n--- any scenario_meta attached to tavern-fit2 loop outputs ---\n'
fd -a 'scenario_meta.json' qa/evidence/tavern-fit2Repository: electricsheephq/WorldOS
Length of output: 6459
Propagate the base LoRA into this plate’s declared chain.
plate_loop falls back to the config model_chain when the candidate has no local scenario_meta.json, and this hand-fed plate stamps loras: []. That drops model_MB22WaRCBLtfhi5R2CRpHoEL (lora_scale: 0.78) from qa/evidence/tavern-fit2/gen_base/scenario_meta.json, so promotion records an incomplete chain and can’t enforce provenance on the actual LoRA used. Add the base LoRA here, or attach the real scenario metadata to the candidate path before promote runs. Confidence: 98%.
🤖 Prompt for 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.
In `@qa/evidence/tavern-fit2/plateloop_tavern_fit2.json` around lines 11 - 16, The
declared model chain omits the base LoRA used by this plate. Update the
model_chain loras field to include model_MB22WaRCBLtfhi5R2CRpHoEL with
lora_scale 0.78, or ensure plate_loop receives the candidate’s actual
scenario_meta.json before promotion so the complete chain and provenance are
preserved.
| "camera": { | ||
| "recipe": "greybox_render_headless (verified vs Unity Quaternion.Euler(30,45,0) <1e-3)", | ||
| "ortho_size": 13.0, | ||
| "pitch_deg": 30.0, | ||
| "yaw_deg": 45.0, | ||
| "px_w": 1344, | ||
| "px_h": 768, | ||
| "cell_world_units": 2.0, | ||
| "cam_dist": 80.0 |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
🧩 Analysis chain
🏁 Script executed:
pwd && git ls-files | rg '(^qa/room_manifests/tavern_fit2\.cells\.json$|derive_room_manifest\.py$|camera_fit|findings|tavern_fit2|room_manifest)'Repository: electricsheephq/WorldOS
Length of output: 1492
🏁 Script executed:
ast-grep outline qa/room_manifests/tavern_fit2.cells.json --view expanded
printf '\n--- build_room_manifest.py ---\n'
ast-grep outline qa/build_room_manifest.py --view expanded
printf '\n--- collect_findings.py ---\n'
ast-grep outline qa/collect_findings.py --view expanded
printf '\n--- tavern_fit2 findings ---\n'
cat -n qa/evidence/tavern-fit2/findings.json | sed -n '1,220p'Repository: electricsheephq/WorldOS
Length of output: 11284
🏁 Script executed:
cat -n qa/room_manifests/tavern_fit2.cells.json | sed -n '1,120p'
printf '\n--- qa/build_room_manifest.py camera-related lines ---\n'
sed -n '78,110p' qa/build_room_manifest.py
printf '\n--- tool refs ---\n'
rg -n "camera_fit|ortho_size|cam_dist|pitch_deg|yaw_deg|cell_world_units|build_manifest|derive_room_manifest" qa tools -g '!**/node_modules/**'Repository: electricsheephq/WorldOS
Length of output: 24173
🏁 Script executed:
sed -n '1,260p' tools/derive_room_manifest.pyRepository: electricsheephq/WorldOS
Length of output: 9545
🏁 Script executed:
sed -n '1,260p' qa/test_derive_room_manifest.py
printf '\n--- check_plate_drift projection path ---\n'
sed -n '1,260p' qa/check_plate_drift.py
printf '\n--- greybox extent contract tests ---\n'
sed -n '1,140p' qa/test_greybox_extent_contract.pyRepository: electricsheephq/WorldOS
Length of output: 24412
🏁 Script executed:
sed -n '1,260p' qa/check_grid_paint_coherence.pyRepository: electricsheephq/WorldOS
Length of output: 15334
Align the tavern_fit2 room to one projection path. qa/evidence/tavern-fit2/tavern_fit2_geometry.json opts into camera_fit, but tools/derive_room_manifest.py stamps the fixed 13.0 rig and both check_plate_drift.py and check_grid_paint_coherence.py reproject from that same fixed camera. If the candidate plate is built from the camera-fit greybox, the derived screen_bbox/occlusion no longer describe the same image plane, so localization and drift/coherence checks can false-fail or miss the authored cells. Either drop camera_fit for this room and regenerate, or teach the derivation/gates to carry the fitted ortho through. Confidence 99%.
🤖 Prompt for 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.
In `@qa/room_manifests/tavern_fit2.cells.json` around lines 11 - 19, The
tavern_fit2 manifest uses a fixed camera while its geometry opts into
camera_fit, causing derivation and validation to use inconsistent projection
paths. Either remove the camera_fit setting from tavern_fit2_geometry.json and
regenerate the manifest, or update derive_room_manifest.py,
check_plate_drift.py, and check_grid_paint_coherence.py to propagate and use the
fitted orthographic camera consistently.
| Walkability is preserved BY CONSTRUCTION (validate_scene_grid / an 8-connectivity flood-fill both | ||
| pass): the door zone (8,0)+(8,1) is clear, the front lane (row 8) is fully open, and every added | ||
| prop hugs a table, a wall band, or a corner — never a circulation lane or a door approach. LOW props | ||
| stay in cols 2-9 / rows 1-7 off the two NEAR walls (col0, the front wall) that would occlude them | ||
| under the 30/45 dimetric camera; only the tall hearth + bar sit on the back/far bands. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
pwd && git ls-files tools/author_room_geometry.py findings.json && python3 - <<'PY'
from pathlib import Path
for path in ["tools/author_room_geometry.py", "findings.json"]:
p = Path(path)
if p.exists():
print(f"\n== {path} ({sum(1 for _ in p.open())} lines) ==")
with p.open() as f:
for i, line in enumerate(f, 1):
if path == "tools/author_room_geometry.py" and 320 <= i <= 380:
print(f"{i}: {line.rstrip()}")
if path == "findings.json" and i <= 240:
print(f"{i}: {line.rstrip()}")
PYRepository: electricsheephq/WorldOS
Length of output: 5016
🏁 Script executed:
python3 - <<'PY'
from pathlib import Path
path = Path("tools/author_room_geometry.py")
text = path.read_text().splitlines()
targets = ["def _geometry", "def validate_scene_grid", "def _perimeter_wall_run_props", "def author_tavern_fit2"]
for target in targets:
for i, line in enumerate(text, 1):
if line.startswith(target):
start = max(1, i - 20)
end = min(len(text), i + 120)
print(f"\n== {target} at line {i} ==")
for j in range(start, end + 1):
print(f"{j}: {text[j-1]}")
break
PYRepository: electricsheephq/WorldOS
Length of output: 26381
Move barrels_corner off row 8
At tools/author_room_geometry.py:346-371, barrels_corner occupies [10,8], and _geometry() folds prop cells into walls/impassable. That makes the claim that row 8 is “fully open” false. Move the barrel pair out of row 8 or rewrite the walkability contract to match the actual topology. Confidence: 99%.
🤖 Prompt for 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.
In `@tools/author_room_geometry.py` around lines 346 - 350, The walkability
comment incorrectly claims row 8 is fully open while barrels_corner occupies
[10,8] and is folded into impassable geometry by _geometry(). Move the barrel
pair to a valid non-circulation location outside row 8, updating the
barrels_corner definition and any dependent validation or placement metadata
while preserving connectivity.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bf00f026d9
ℹ️ 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".
| }, | ||
| "camera": { | ||
| "recipe": "greybox_render_headless (verified vs Unity Quaternion.Euler(30,45,0) <1e-3)", | ||
| "ortho_size": 13.0, |
There was a problem hiding this comment.
Use the camera-fit projection for this manifest
When this manifest is used for tavern_fit2 drift/coherence or promotion checks, it will validate against the wrong camera: the source geometry sets camera_fit=True and the evidence says the greybox was rendered with a fitted ortho around 9.26, but this committed manifest records the fixed 13.0 rig and the screen_bbox values below were generated with that fixed projection. qa/check_plate_drift.py consumes those bboxes directly, and qa/check_grid_paint_coherence.py regenerates/locates manifest geometry through the same fixed rig, so a camera-fit plate will be compared to fixed-rig boxes and can produce misleading drift/coherence results. Please derive this manifest with the fitted projection, or keep it out of the committed manifest set until the manifest/gates carry camera_fit.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Walkthrough
PR: #1559 - TAVERN_FIT-V2 (M-ALIGN capstone retry): density-law tavern (14 real props) — HONEST NEGATIVE (6.0, density refuted as the gap)
Head: bf00f026d918a6b94314d8886b2c9cc06a729140 into main. Review event: COMMENT.
Provider: GLM/Z.ai through ZCode (zcode-glm, zcode, model GLM-5.2).
Estimated review effort: 5/5 (~70 min)
Changed Files
| File | Status | Churn | Purpose | Risk |
|---|---|---|---|---|
qa/evidence/tavern-fit2/before_after.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/findings.json |
added | +31/-0 | Changed file | Moderate: validated P3 finding |
qa/evidence/tavern-fit2/gallery.html |
added | +46/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gallery.html.rows.json |
added | +181/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gallery_s1000.html |
added | +46/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gallery_s1000.html.rows.json |
added | +179/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gemini_style_pass.py |
added | +80/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gen_base/room_tavern.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gen_base/scenario_meta.json |
added | +29/-0 | Changed file | Moderate: validated P2 finding |
qa/evidence/tavern-fit2/gen_style/candidate_s1000.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gen_style/candidate_s1111.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gen_style/candidate_s1222.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel/contract.json |
added | +314/-0 | Changed file | Elevated: large change |
qa/evidence/tavern-fit2/loop/panel/house_best.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel/image_1.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel/image_2.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel/image_3.jpg |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel/prompts.json |
added | +36/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel_mapping.json |
added | +17/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel_verdict.json |
added | +11/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop_s1000/panel/contract.json |
added | +310/-0 | Changed file | Elevated: large change |
qa/evidence/tavern-fit2/loop_s1000/panel/crop1_a.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop_s1000/panel/crop1_b.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop_s1000/panel/crop1_pit.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop_s1000/panel/crop2_chars.png |
added | +0/-0 | Changed file | Low |
25 additional changed files omitted from this walkthrough.
Review Signal
Validated inline findings: 3 (P0: 0, P1: 0, P2: 1, P3: 2).
Dropped findings before posting: 0. High-severity findings: 0.
Risk Taxonomy
- API compatibility: 2
- Proof gap: 1
Validation and Proof
1 required validation/proof recommendation(s) selected from changed files.
- required: Unity editor or Play Mode smoke - WorldOS repo profile implies Unity runtime risk. Proof: Unity editor smoke; Play Mode log; scene/prefab screenshot or recording.
Proof status: missing - 1 required validation/proof recommendation(s) missing from PR metadata.
Profile validation hints: Prefer correctness, persistence, CI, release, and regression findings over style-only feedback.
Profile proof expectations: Look for Unity editor, play-mode, fixture, or focused smoke evidence when runtime behavior changes.
Related Context
Related issues/PRs: #1557, #1534.
Suggested labels: none.
Suggested reviewers: none from current metadata.
Review Settings Preview
- Profile: assertive
- Enabled sections: Review summary (inline_review); Walkthrough (inline_review); Changed-files table (walkthrough); Effort estimate (walkthrough); Related issues/PRs (walkthrough); Suggested labels (suggestion_only); Review status comment (sticky_status)
- Path instructions:
Assets/**- Prioritize scene, prefab, save-state, asset-reference, and gameplay regressions. - Path instructions:
ProjectSettings/**- Treat build, platform, input, graphics, and release behavior changes as high risk. - Label suggestions: unity, gameplay, regression-hardening
- Reviewer suggestions: none
- Suggestion behavior: suggestions only; labels and reviewers are not auto-applied.
- Roadmap-only settings: auto-apply labels; auto-request reviewers; required status checks
Pre-merge checklist
- Inline comments target current RIGHT-side diff lines.
- No secret-like content survived into posted inline comments.
- REQUEST_CHANGES is only used when eligible P0/P1 findings survive validation.
- Required behavior proof is present or not applicable.
- Labels and reviewers are suggestions only; the bot did not auto-apply them.
| "guidance": 7.5, | ||
| "num_outputs": 4, | ||
| "model_id": "model_bfl-flux-1-dev", | ||
| "lora": "model_MB22WaRCBLtfhi5R2CRpHoEL", |
There was a problem hiding this comment.
P2: Base gen provenance declares a LoRA, but model_chain blocks (and findings.json) claim 'NO LoRA' / loras:[]
The registered-base generation provenance in gen_base/scenario_meta.json declares "lora": "model_MB22WaRCBLtfhi5R2CRpHoEL" and "lora_scale": 0.78 (lines 9-10). This contradicts (a) findings.json line 9 which states the base was run with 'NO LoRA', (b) the plate_loop config model_chain blocks in loop/panel/contract.json and plateloop_tavern_fit2.json (line 15) which declare "loras": [], and (c) the gallery.html.rows.json model_chain.loras: []. The provenance gate claim in findings.json line 12 ('model_chain_provenance ... promote provenance gate PASS') is therefore based on a model_chain that OMITS the LoRA actually applied at base generation. Even though the verdict is an honest negative (not adopted), this is a real provenance inconsistency that would mask the LoRA from any future provenance gate if this base were ever re-used. Either add the LoRA id to the model_chain loras blocks and drop the 'NO LoRA' claim in findings.json, or regenerate the base without the LoRA to match the declared chain. If the lora id is not in qa/model_registry.json, that is an additional unapproved-model provenance gap.
Category: API compatibility
Why this matters: The RRI/provenance contract requires the plate_loop model_chain to be the true record of models applied. A base baked with an unrecorded LoRA makes the declared chain non-authoritative and would let an unregistered/undocumented LoRA silently enter the promotion record if this base is reused.
| "walkslice_reconciliation": "REPORT-ONLY (per packet — NOT changed here; the walkslice build_tavern_grid must eventually match an ADOPTED geometry, and this is an honest negative so nothing is adopted). IF tavern_fit2 were ever adopted, qa/seed_gfx_walkslice.py needs: (a) TAVERN_BACK_DOOR [0,0] -> [8,0] (the #1534 durable fix — real back-wall door gap now authored, so the door cell and the painted opening coincide; update the 107-112 comment). (b) ADD 8 props to _TAVERN_PROPS (16 impassable cells), footprints VERBATIM from tavern_fit2 geometry: woodpile [(3,1),(4,1)], bench_nw [(3,5),(4,5)], bench_ne [(6,5),(7,5)], bench_s [(7,6),(7,7)], stools_bar [(8,3),(8,4)], shelf_bar [(10,2),(10,3)], casks_bar [(10,4),(10,5)], barrels_corner [(10,7),(10,8)]. (c) walkable 59 -> 43. (d) spawns UNCHANGED: party [(4,8),(5,8)], npcs [(7,8)] — none collide with any new prop (all new props are off row 8). validate_scene_grid still PASSES on the updated grid (connectivity intact, 43 clear-floor cells >> 12, door (8,0) walkable).", | ||
| "runbook_gaps_hit": [ | ||
| "The coherence gate (check_grid_paint_coherence per-prop NCC) is over-sensitive for CAMERA-FIT painterly rooms: the geometry-locked BASE at registration-recall 0.98 fails it INCOHERENT, as does the deployed 7.0 incumbent. Runbook step 5 already calls it a diagnostic, but a cold agent will read 'INCOHERENT (19 checked)' as blocking. Suggest the runbook explicitly note that camera-fit + soft-edge painterly plates fail per-prop NCC by construction and to lean on registration-recall (base) as the registration floor.", | ||
| "plate_loop.py's registration recall check runs on the STYLED candidate (0.81) against the 0.95 min and prints '-> FAIL / pre-gate FLAG', but for painterly rooms styled-recall is ADVISORY (#1491) and the real gate is the BASE recall (0.98). The FLAG is misleading; the base recall is the number that matters.", |
There was a problem hiding this comment.
P3: Registration/drift check skipped all 19 props — 'recall_pass:false, drift passed:true' is structurally vacuous
In both plateloop configs (loop/panel/contract.json, loop_s1000/...) the registration drift reports 'passed': true with 'checked': 0, 'skipped': 19 and reason 'no fingerprintable props (manifest carries geometry only; pass --baseline or seed ref_fp to gate)'. So the styled-candidate registration 'passed' verdict is not actually computed — it passes because nothing was checked. findings.json line 16 correctly downgrades styled recall (0.81/0.75) to ADVISORY and leans on the BASE recall 0.98, but the drift.passed:true value is exported into the row JSON as if it were a positive registration result. Worth adding a note in findings.json that drift.passed is vacuous-true for this manifest so a future agent doesn't read it as evidence that per-prop registration succeeded.
Category: API compatibility
Why this matters: A 'passed:true' registration field that results from checking zero props can be misread by a downstream promotion/gate consumer as positive registration evidence, overstating the plate's structural fidelity.
| 6.5, | ||
| 7 | ||
| ], | ||
| "B": [ |
There was a problem hiding this comment.
P3: s1000 incumbent scorer spread (9,9,9,6,6) spans the adopt/control bands — scorer agreement is low
The s1000 incumbent (B) scores array is [9,9,9,6,6] (lines 58-64): a 3-point split where two scorers rate the deployed 7.0-incumbent plate a 6 and three rate it a 9. The median is reported as 9.0 and used as the bar for delta_candidate_minus_control=-3.0. With only 5 scorers and a 3-point IQR on the reference image, the single-median comparison is fragile. The findings' headline 'density refuted' rests on candidate medians that equal the incumbent's low-scorer mode. This is advisory (the honest-negative conclusion is robust to it, since both s1111 and s1000 candidates also plateau at 6.0 against a 9.0 control), but the panel should report agreement/spread, not only the median, before treating the 6.0-vs-9.0 gap as a law.
Category: Proof gap
Why this matters: Conclusions drawn from a 5-scorer panel with a 3-point split on the anchor image are over-precise; reporting only medians hides disagreement that affects how 'binding' the negative result is.
… canonical 7.0) — review catch
|
@coderabbitai review — verdict summary corrected to report both incumbent panel medians (8.0 s1111 / 9.0 s1000; canonical adoption median 7.0) instead of a single 'this-panel' figure. |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== findings.json ==="
cat qa/evidence/tavern-fit2/findings.json
echo "=== visual_gate_panel.json ==="
cat qa/evidence/tavern-fit2/tavern_fit2_visual_gate_panel.json
echo "=== loop/panel_verdict.json ==="
cat qa/evidence/tavern-fit2/loop/panel_verdict.json
echo "=== loop_s1000/panel_verdict.json ==="
cat qa/evidence/tavern-fit2/loop_s1000/panel_verdict.json
echo "=== grep for medians/verdicts across evidence dir ==="
rg -n "median|verdict|8\.0|9\.0|7\.0" qa/evidence/tavern-fit2 --type json -g '!*.rows.json'Length of output: 22011 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== rows.json verdict fields ==="
rg -n '"verdict"' qa/evidence/tavern-fit2/gallery.html.rows.json qa/evidence/tavern-fit2/gallery_s1000.html.rows.json qa/evidence/tavern-fit2/nomination.jsonl 2>/dev/null
echo "=== full nomination.jsonl ==="
cat qa/evidence/tavern-fit2/nomination.jsonl
echo "=== panel section in rows.json (medians/delta) ==="
rg -n '"panel"|"median|"delta_vs_control"|"incumbent' qa/evidence/tavern-fit2/gallery.html.rows.json qa/evidence/tavern-fit2/gallery_s1000.html.rows.jsonLength of output: 2226
Confidence: 90% What was checked:
No remaining inconsistencies found between the corrected summary text and the underlying per-panel evidence ( ✅ Action performedReview finished.
|
evaOS review status: completedPR: #1559 - TAVERN_FIT-V2 (M-ALIGN capstone retry): density-law tavern (14 real props) — HONEST NEGATIVE (6.0, density refuted as the gap) evaOS review completed for this PR head. Automation note: agents should wait for this comment to reach PR URL: #1559 Review URL: #1559 (review) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7bcdf5420d
ℹ️ 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".
| @@ -0,0 +1 @@ | |||
| {"artifact_id": "room_tavern_fit2_densitylaw_s1000_20260711", "class": "room", "room": "tavern_fit2", "source_path": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/evidence/tavern-fit2/tavern_fit2_visual_gate_panel.json", "note": "TAVERN_FIT-V2 density-law capstone — 14 real props; density refuted as the binding panel gap"} | |||
There was a problem hiding this comment.
Use a repo-relative panel path in the nomination
When this committed nomination is consumed outside the original /Users/lume worktree, tools/library/promote.py resolves this absolute source_path literally, so promote.py --batch --dry-run --nominations qa/evidence/tavern-fit2/nomination.jsonl skips it as score-failed instead of reaching the intended rejected visual-gate verdict. Point this at qa/evidence/tavern-fit2/tavern_fit2_visual_gate_panel.json repo-relatively so the evidence can be replayed from other checkouts.
Useful? React with 👍 / 👎.
| "panel_id": "panel-visual-tavern-fit2-densitylaw-20260711", | ||
| "protocol": "control-anchored 5-scorer blind panel (fast-worker sonnet, independent). Candidate=TAVERN_FIT-V2 density-law (tavern_fit2 14-prop greybox -> flux.1-dev depth-CN base cs0.95 seed222 recall 0.98 -> single Gemini instruction-edit style pass STRUCTURE-LOCK+ADDITIONS-LOCK, density-aware grounding, no external referenceImages, tenebrist best-of-3 seed1000). Blind A=candidate B=incumbent(tavern_truegrey_v1, deployed 7.0) C=disguised real-art control(PoE2).", | ||
| "scale": "0-10 visual-critic delta-anchored (absolute number is NOT a quality verdict)", | ||
| "candidate_image": "qa/evidence/tavern-fit2/gen_style/candidate_s1000.png", |
There was a problem hiding this comment.
Stamp the model chain into the promotion artifact
When this panel is the source_path for a room nomination, promote.py only runs the provenance check against nom.get("model_chain") or panel.get("model_chain"); this panel has neither, and the committed nomination does not either, so the model-registry gate silently no-ops even though the evidence claims the chain was registry-approved. In any candidate that reaches the visual delta bar, an unregistered or wrong model chain would be promotable and the experiment cannot be audited; stamp the recorded model_chain here or on the nomination.
Useful? React with 👍 / 👎.
| @@ -0,0 +1 @@ | |||
| {"artifact_id": "room_tavern_fit2_densitylaw_s1000_20260711", "class": "room", "room": "tavern_fit2", "source_path": "/Users/lume/WorldOS-worktrees/wt-tavern-fit2/qa/evidence/tavern-fit2/tavern_fit2_visual_gate_panel.json", "note": "TAVERN_FIT-V2 density-law capstone — 14 real props; density refuted as the binding panel gap"} | |||
There was a problem hiding this comment.
Add candidate_plate so drift gate runs
This room nomination does not declare candidate_plate, so tools/library/promote.py's _paint_drift_gate() returns a no-op (no candidate_plate on nomination) instead of checking the committed tavern_fit2 manifest. If the panel delta is later updated into the adoption band, this same nomination can promote the room without the paint-drift hard floor ever running; include the candidate plate path (and a usable baseline/ref fingerprints) in the nomination.
Useful? React with 👍 / 👎.
| "pregate": { | ||
| "verdict": "PASS", | ||
| "blocking": [], | ||
| "gates": [ |
There was a problem hiding this comment.
Record the full visual pre-gate floor
The promotion gate treats the deterministic visual floor as frame-lit plus occupancy/pin checks, but this panel records only G1_frame_lit and the non-blocking G6_luma_staging_law; G2_occupancy, G3_floor_contact, and G4_screen_scale are absent. Because visual_pregate_floor_passed() accepts any present hard-floor gate with no HIGH/CRITICAL severities, a candidate with an adoption-band delta would pass without evidence that the occupancy/pin floor actually ran, so record the full pre-gate output instead of this abbreviated list.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Walkthrough
PR: #1559 - TAVERN_FIT-V2 (M-ALIGN capstone retry): density-law tavern (14 real props) — HONEST NEGATIVE (6.0, density refuted as the gap)
Head: 7bcdf5420dc1890d55cf9e4d4a375ad52ebfe403 into main. Review event: COMMENT.
Provider: GLM/Z.ai through ZCode (zcode-glm, zcode, model GLM-5.2).
Estimated review effort: 5/5 (~70 min)
Changed Files
| File | Status | Churn | Purpose | Risk |
|---|---|---|---|---|
qa/evidence/tavern-fit2/before_after.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/findings.json |
added | +75/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gallery.html |
added | +46/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gallery.html.rows.json |
added | +181/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gallery_s1000.html |
added | +46/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gallery_s1000.html.rows.json |
added | +179/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gemini_style_pass.py |
added | +80/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gen_base/room_tavern.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gen_base/scenario_meta.json |
added | +29/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gen_style/candidate_s1000.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gen_style/candidate_s1111.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/gen_style/candidate_s1222.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel/contract.json |
added | +314/-0 | Changed file | Elevated: large change |
qa/evidence/tavern-fit2/loop/panel/house_best.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel/image_1.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel/image_2.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel/image_3.jpg |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel/prompts.json |
added | +36/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel_mapping.json |
added | +17/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop/panel_verdict.json |
added | +11/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop_s1000/panel/contract.json |
added | +310/-0 | Changed file | Elevated: large change |
qa/evidence/tavern-fit2/loop_s1000/panel/crop1_a.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop_s1000/panel/crop1_b.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop_s1000/panel/crop1_pit.png |
added | +0/-0 | Changed file | Low |
qa/evidence/tavern-fit2/loop_s1000/panel/crop2_chars.png |
added | +0/-0 | Changed file | Low |
25 additional changed files omitted from this walkthrough.
Review Signal
No validated inline findings.
Dropped findings before posting: 0. High-severity findings: 0.
Risk Taxonomy
No finding categories.
Validation and Proof
1 required validation/proof recommendation(s) selected from changed files.
- required: Unity editor or Play Mode smoke - WorldOS repo profile implies Unity runtime risk. Proof: Unity editor smoke; Play Mode log; scene/prefab screenshot or recording.
Proof status: missing - 1 required validation/proof recommendation(s) missing from PR metadata.
Profile validation hints: Prefer correctness, persistence, CI, release, and regression findings over style-only feedback.
Profile proof expectations: Look for Unity editor, play-mode, fixture, or focused smoke evidence when runtime behavior changes.
Related Context
Related issues/PRs: #1557, #1534.
Suggested labels: none.
Suggested reviewers: none from current metadata.
Review Settings Preview
- Profile: assertive
- Enabled sections: Review summary (inline_review); Walkthrough (inline_review); Changed-files table (walkthrough); Effort estimate (walkthrough); Related issues/PRs (walkthrough); Suggested labels (suggestion_only); Review status comment (sticky_status)
- Path instructions:
Assets/**- Prioritize scene, prefab, save-state, asset-reference, and gameplay regressions. - Path instructions:
ProjectSettings/**- Treat build, platform, input, graphics, and release behavior changes as high risk. - Label suggestions: unity, gameplay, regression-hardening
- Reviewer suggestions: none
- Suggestion behavior: suggestions only; labels and reviewers are not auto-applied.
- Roadmap-only settings: auto-apply labels; auto-request reviewers; required status checks
Pre-merge checklist
- Inline comments target current RIGHT-side diff lines.
- No secret-like content survived into posted inline comments.
- REQUEST_CHANGES is only used when eligible P0/P1 findings survive validation.
- Required behavior proof is present or not applicable.
- Labels and reviewers are suggestions only; the bot did not auto-apply them.
TAVERN_FIT-V2 (M-ALIGN wave-2 capstone retry) — HONEST NEGATIVE
Apply the DENSITY LAW to the tavern: the #1557 regen was coherence-perfect but scored 6.0 vs the 7.0 incumbent because a truth-rooted 6-prop greybox is sparser than the incumbent, whose density is invented walk-through furniture (chandelier, lanterns, extra stools — no collision cells). The #1557 architect ruling: author the furniture the panel LIKED as REAL props. Done — the 6-prop
tavern_fitinterior grown to 14 authored collision props, then regenerated through the fully-amended pipeline.Verdict: HONEST NEGATIVE — the density hypothesis is REFUTED as the binding gap. Evidence-only; no adoption,
plates_manifest.json/room_recipes/libraryuntouched, no box deploy.Before / after (incumbent · #1557 v1 · v2 density-law ×3 seeds)
Left→right: deployed incumbent (7.0, faked density) · #1557 v1 (6-prop, 6.0 honest-negative) · TAVERN_FIT-V2 s1000/s1111/s1222 — every solid object now maps to an authored collision cell, and the room reads as dense as the incumbent.
Verdict table
promote.py --dry-runCapstone finding — density is NOT the binding gap
Authoring the furniture the #1557 panel liked as 14 real collision props did not move the score:
6.0 == #1557's faked-sparse 6.0 == both a bright (s1111) and a tenebrist (s1000) style pass. Density is closed (no scorer flagged sparseness/missing furniture). The 5 blind scorers repeatedly named two residual causes:house_bestreference IS the incumbent (byte-identical), so scorers rate the incumbent "same-hand" 9 and any different-pipeline plate "lesser". The gate structurally defines quality as the incumbent's exact hand, so a new-pipeline plate rarely clears it regardless of craft.The untried lever (now viable): run the
--layeredpipeline — its populate pass was the #1557 no-go on a sparse greybox (invents furniture) but on a 14-prop greybox + STRUCTURE-LOCK it has little room to invent, and it is the exact pipeline that produced the incumbent's richer brushwork.Pipeline (all steps ran)
author_room_geometry.py tavern_fit2→ 14 interior props + camera-fit + continuouswall_runband split at door (8,0); no crenellation.derive_room_manifest.py→qa/room_manifests/tavern_fit2.cells.json(43 walkable).greybox_render_headless.py --camera-fit --wall-height 5(+ sidecars). G1_frame_lit PASS.model_bfl-flux-1-dev), cs0.95 seed222 → recall 0.98.model_google-gemini-3-1-flash), STRUCTURE-LOCK + ADDITIONS-LOCK + density-aware scene grounding (all 14 props named), no externalreferenceImages, best-of-3.promote.pyreal gate.Model chain
[model_bfl-flux-1-dev, model_google-gemini-3-1-flash]— both registry-approved, provenance gate PASS.Walkslice reconciliation (report-only, per packet — NOT changed here)
IF
tavern_fit2is ever adopted,qa/seed_gfx_walkslice.pyneeds: doorTAVERN_BACK_DOOR [0,0]→[8,0](the #1534 durable fix); +8 props / 16 impassable cells (footprints verbatim: woodpile(3,1)(4,1), bench_nw(3,5)(4,5), bench_ne(6,5)(7,5), bench_s(7,6)(7,7), stools_bar(8,3)(8,4), shelf_bar(10,2)(10,3), casks_bar(10,4)(10,5), barrels_corner(10,7)(10,8)); walkable59→43; spawns UNCHANGED (party(4,8)(5,8), npcs(7,8)— none collide);validate_scene_gridstill PASSES. Not changed in this lane (honest negative).Evidence
qa/evidence/tavern-fit2/findings.json— full write-up + runbook gaps + walkslice reconciliationqa/evidence/tavern-fit2/gallery.html(s1111),gallery_s1000.html(s1000)qa/evidence/tavern-fit2/loop{,_s1000}/panel_verdict.json; promote paneltavern_fit2_visual_gate_panel.json🤖 evidence-only; auto-merge NOT armed (armed only on ADOPT).