Layered-on-registered (M-ALIGN w2): HONEST NEGATIVE — registration breaks at relight; #1560 anchor-fix moves fit2 6.0→7.0#1561
Layered-on-registered (M-ALIGN w2): HONEST NEGATIVE — registration breaks at relight; #1560 anchor-fix moves fit2 6.0→7.0#1561100yenadmin wants to merge 3 commits into
Conversation
… prompts, chain runner)
…base 0.98 -> final 0.805 vs greybox)
…ht; panel + promote reject; #1560 anchor-fix moves fit2 6.0->7.0
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 29 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 ignored due to path filters (23)
📒 Files selected for processing (19)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
| from journey_visual_sweep import inverse_coherence_flags, load_plate_edges # noqa: E402 | ||
|
|
||
| LR = Path("qa/evidence/layered-reg") | ||
| manifest = json.load(open(LR / "tavern_fit2.cells.json")) |
evaOS review status: completedPR: #1561 - Layered-on-registered (M-ALIGN w2): HONEST NEGATIVE — registration breaks at relight; #1560 anchor-fix moves fit2 6.0→7.0 evaOS review completed for this PR head. Automation note: agents should wait for this comment to reach PR URL: #1561 Review URL: #1561 (review) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1db56825bf
ℹ️ 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_layered_reg_p3_20260711", "class": "room", "room": "tavern_layered_reg", "source_path": "/Users/lume/WorldOS-worktrees/wt-layered-reg/qa/evidence/layered-reg/layered_visual_gate_panel.json", "note": "LAYERED-ON-REGISTERED — 3-pass layered treatment on the reused fit2 registered base; registration broke at the relight pass"} | |||
There was a problem hiding this comment.
Use a portable panel path in the nomination
When this committed nomination is passed to tools/library/promote.py --batch --dry-run, the visual gate reads source_path directly; because it points at the author's Mac worktree under /Users/lume/WorldOS-worktrees/..., any checkout that doesn't have that exact path skips the nomination as score-failed instead of reproducing the recorded passed=false / control_valid=true verdict. The panel JSON is committed beside this file, so this should use a repo-relative path like qa/evidence/layered-reg/layered_visual_gate_panel.json.
Useful? React with 👍 / 👎.
| "singlepass_s1000": LR / "gen_base/fit2_singlepass_s1000.png", | ||
| "layered_p1_material": LR / "passes/p1_material_s1111.png", | ||
| "layered_p2_lighting": LR / "passes/p2_lighting_s2111.png", | ||
| "layered_p3_final": LR / "passes/p3_scatter_s3000.png", |
There was a problem hiding this comment.
Include all p3 seeds in inverse-coherence evidence
The findings claim the staging-scatter pass reliably costs one inverse-coherence flag for both p3 seeds (s3000 and s3111), but this reproducibility script only evaluates p3_scatter_s3000.png. Rerunning the committed evidence therefore cannot reproduce or audit the s3111 -> (1,3) claim, so the “both seeds” reliability conclusion can be stale or wrong unless the second p3 sample is added to targets.
Useful? React with 👍 / 👎.
|
|
||
| Take this already-detailed painterly tavern plate and deepen its LIGHTING into dramatic Pillars of Eternity II: Deadfire tenebrism, WITHOUT losing or smoothing any of the hand-painted surface detail and brushwork already present — preserve every wood-grain, stone, plank-wear, tarnish, and soot stroke; only the light and shadow change. | ||
|
|
||
| The scene is lit by a SINGLE warm source — the hearth fire at the back — with faint secondary glow from small hanging iron lanterns. Build the chiaroscuro: a concentrated HOT AMBER light pool spilling across the plank floor and near walls immediately around the hearth, warm amber rim-light on the edges of tables, benches, barrels and stone facing the flame, and cool blue-violet BOUNCE on the shadow sides. Push the falloff HARD: the far corners, the side walls, and the near-wall interiors should sink into deep, saturated blue-violet shadow reading as near-black, with only faint low-contrast value steps that still let you trace the layout in the dark, exactly like a real oil-painted tenebrism reference. Throw strong directional CAST SHADOWS from the hearth across the floor and from every table, bench, barrel, and the bar counter. This is NOT an evenly-lit room — it is a dark, crowded tavern hall with one fire. Keep the doorway to the right of the hearth reading as a dark recessed OPEN opening. |
There was a problem hiding this comment.
Remove lanterns from locked relight prompt
This pass is supposed to test whether a STRUCTURE+ADDITIONS-LOCK relight drifts, and the findings later cite invented lanterns as part of the failure. However this line explicitly asks for secondary glow from small hanging iron lanterns, which are not in the authored object list and contradict the additions-lock below; in runs where lanterns appear, the result is prompt-contaminated rather than a clean lock failure.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Walkthrough
PR: #1561 - Layered-on-registered (M-ALIGN w2): HONEST NEGATIVE — registration breaks at relight; #1560 anchor-fix moves fit2 6.0→7.0
Head: 1db56825bf60afb6294313543cc3e6f6f0567c5b 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/layered-reg/chain.log |
added | +120/-0 | Changed file | Low |
qa/evidence/layered-reg/chain_layered.py |
added | +117/-0 | Changed file | Low |
qa/evidence/layered-reg/findings.json |
added | +45/-0 | Changed file | Moderate: validated P3 finding |
qa/evidence/layered-reg/gemini_style_pass.py |
added | +80/-0 | Changed file | Low |
qa/evidence/layered-reg/gen_base/base_fit2.png |
added | +0/-0 | Changed file | Low |
qa/evidence/layered-reg/gen_base/fit2_singlepass_s1000.png |
added | +0/-0 | Changed file | Low |
qa/evidence/layered-reg/gen_base/fit2_singlepass_s1111.png |
added | +0/-0 | Changed file | Low |
qa/evidence/layered-reg/gen_base/scenario_meta.json |
added | +29/-0 | Changed file | Low |
qa/evidence/layered-reg/inverse_coherence_netnew.json |
added | +64/-0 | Changed file | Low |
qa/evidence/layered-reg/inverse_coherence_netnew.py |
added | +50/-0 | Changed file | Low |
qa/evidence/layered-reg/layered_visual_gate_panel.json |
added | +19/-0 | Changed file | Low |
qa/evidence/layered-reg/make_strips.py |
added | +53/-0 | Changed file | Low |
qa/evidence/layered-reg/nomination.jsonl |
added | +1/-0 | Changed file | Low |
qa/evidence/layered-reg/p2b.log |
added | +15/-0 | Changed file | Low |
qa/evidence/layered-reg/panel/A.png |
added | +0/-0 | Changed file | Low |
qa/evidence/layered-reg/panel/B.png |
added | +0/-0 | Changed file | Low |
qa/evidence/layered-reg/panel/C.jpg |
added | +0/-0 | Changed file | Low |
qa/evidence/layered-reg/panel/D.png |
added | +0/-0 | Changed file | Low |
qa/evidence/layered-reg/panel/HOUSE_REF_camp.png |
added | +0/-0 | Changed file | Low |
qa/evidence/layered-reg/panel/INCUMBENT_tavern.png |
added | +0/-0 | Changed file | Low |
qa/evidence/layered-reg/panel_mapping.json |
added | +13/-0 | Changed file | Low |
qa/evidence/layered-reg/panel_strip.png |
added | +0/-0 | Changed file | Low |
qa/evidence/layered-reg/panel_verdict.json |
added | +71/-0 | Changed file | Low |
qa/evidence/layered-reg/pass1_material.txt |
added | +21/-0 | Changed file | Low |
qa/evidence/layered-reg/pass2_lighting.txt |
added | +18/-0 | Changed file | Low |
17 additional changed files omitted from this walkthrough.
Review Signal
Validated inline findings: 2 (P0: 0, P1: 0, P2: 0, P3: 2).
Dropped findings before posting: 0. High-severity findings: 0.
Risk Taxonomy
- Proof gap: 2
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: #1560, #1559, #1491, #1540, #1546.
Suggested labels: docs.
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.
| "medians": {"layered_p3": 5.0, "layered_p1": 6.0, "fit2_singlepass": 7.0, "incumbent": 7.5, "control": 8.0}, | ||
| "deltas_vs_control": {"layered_p3": -3.0, "layered_p1": -2.0, "fit2_singlepass": -1.0, "incumbent": -0.5}, | ||
| "control_valid": true, | ||
| "camera_break_or_incoherent_flags": {"layered_p3": "2/5 scorers flagged camera_break/structure_incoherent", "others": 0} |
There was a problem hiding this comment.
P3: Camera-break flag count not reconcilable with raw panel_verdict.json
findings.json (line 29) and layered_visual_gate_panel.json (line 18) both state "2/5 scorers flagged camera_break/structure_incoherent" for layered_p3. But panel_verdict.json records camera_break_flags.A_layered_p3 = 1 and structure_incoherent_flags.A_layered_p3 = 1 as two independent per-defect-type counts, with no per-scorer linkage. That raw data only proves '1 scorer flagged camera_break and 1 (possibly the same) scorer flagged structure_incoherent' — it does not by itself establish '2 distinct scorers' or '2/5'. Add a per-scorer defect matrix (scorer_id -> {camera_break, structure_incoherent, ...}) so the 2/5 summary is auditable from the raw evidence rather than asserted. Low impact here because the verdict is REJECT regardless, but the same pattern on an ADOPT panel would be a real proof gap.
Category: Proof gap
Why this matters: The camera-break flag is the load-bearing defect that justifies the negative verdict and the 'registration broke at relight' conclusion. If the raw per-scorer matrix were committed, a reviewer could verify the 2/5 claim directly; without it the strongest evidence in the PR rests on an unverifiable aggregate.
| "p2b_lighting_camera_locked_retry": {"prompt": "pass2b_lighting_camlock.txt", "winner": "passes_v2/candidate_s1000.png", "recall_vs_base": 0.7354, "recall_vs_greybox": 0.7362, "note": "packet-sanctioned retry-once with a HARD dimetric camera-lock: HELD the top-down dimetric camera but RELOCATED the hearth (back-center -> right) and round->rectangular tables. Milder break, still a break."}, | ||
| "p3_scatter": {"prompt": "pass3_scatter.txt", "winner": "passes/p3_scatter_s3000.png", "recall_vs_base": 0.7941, "recall_vs_greybox": 0.805, "note": "richest brushwork of the set (real stone masonry, deep hearth-pool tenebrism, tabletop mugs/bottles) BUT built on the camera-broken p2 -> inherits the camera break; +1 net-new inverse-coherence flag (invented micro-object on authored-clear floor)."} | ||
| }, | ||
| "recall_trail_note": "edge-recall vs base is ADVISORY for soft-edge painterly plates (#1491) — a painterly Gemini pass structurally scores ~0.75-0.81 (measured: single-pass s1111=0.81, s1000=0.75 vs base). The literal packet gate 'abort below 0.95 vs base' would abort EVERY paint pass by construction; the 0.95 masonry gate is on the BASE (met at 0.98). Per-pass styled recall tracked as advisory + relative no-drift; the real per-pass structural gate is inverse-coherence net-new==0. IMPORTANT: edge-recall UNDER-reports the camera break (p3 '0.805 vs greybox' is a fully-recomposed wrong-camera plate) because it is brightness-robust + tolerance-based and inflated by plate busy-ness. Visual inspection is ground truth.", |
There was a problem hiding this comment.
P3: Advisory-recall framing lowers but does not remove the registration-gate ambiguity
findings.json:16 correctly discloses that edge-recall vs base is advisory and that the p3 winner's 0.805-vs-greybox number masks a full camera recomposition. However the recall_trail.json winner-selection logic (chain_layered.py:102) still picks the MAX recall_vs_base as the pass winner, which is exactly the metric the PR itself says is unreliable for painterly/relit plates. p3_scatter_s3000 won on recall_vs_base=0.7941 vs s3111's 0.5405, yet both are below the 0.95 base floor and both carry the inherited camera break. The winner-selection is therefore not what drove the negative verdict (visual inspection did), but committing a one-line note in recall_trail.json that the 'winner' label is advisory and not a registration pass would prevent a future reader from misreading the trail as a quality ladder. No code/runtime impact.
Category: Proof gap
Why this matters: This PR will be read by future M-ALIGN waves as the record of why the all-Gemini layered chain was rejected. A reader who skips the caveat and trusts recall_trail.json's winner field could re-derive a false positive ('p3 recalled 0.80, almost there').
LAYERED-ON-REGISTERED (M-ALIGN wave-2) — HONEST NEGATIVE
The precisely-determined next lever after #1559: the layered multi-pass style treatment (base → sequential DETAIL passes → staging-last, the July-2 breakthrough that produced the incumbent) had never been combined with the registered true-greybox path. Hypothesis: sequential detail passes on the dense fit2 base recover the incumbent's LAYERED brushwork while keeping registration. Base REUSED from #1559 (recall 0.98) — not regenerated.
Verdict: HONEST NEGATIVE — do NOT adopt. The layered treatment recovers brushwork richness but cannot keep registration: the second heavy Gemini relight edit breaks the dimetric camera. Evidence-only;
room_recipes/plates_manifest/libraryuntouched, no box deploy. Auto-merge NOT armed.Per-pass progression (base → p1 material → p2 lighting → p3 scatter)
Per-pass recall trail
Edge-recall is advisory for painterly plates (#1491) and under-reports the break — p3 "0.805 vs greybox" is a fully-recomposed wrong-camera plate. Visual inspection (the strip above) is ground truth.
Why registration breaks: the incumbent's layered pipeline pins the camera with a low-strength z-image img2img base pass (strength 0.5–0.6) before the Gemini detail passes. An all-Gemini instruction-edit chain accumulates composition drift on the 2nd heavy edit — camera flip (p2) or prop relocation (p2b). Only the p1 material-only pass holds registration (0.93), but by the layered order-law it keeps lighting flat and so lacks the incumbent's dramatic staging.
Inverse-coherence (ADDITIONS-LOCK, #1540 detector)
Net-new flags vs base: base/single-pass/p1/p2 = 0, p3 = 1 (s3000→(9,1), s3111→(1,3) — the staging-scatter pass reliably costs one flag). Caveat: p2's "0" is misleading — once the camera drifts off the contract projection the detector measures the wrong cells.
Blind 5-scorer panel — CORRECTED anchoring (issue #1560)
Neutral anchors: disguised PoE2 real-art control (band [6.8,9.2]) + disclosed CAMP house-ref (non-competing room). Incumbent = disclosed comparison, not house_best.
promote.py --batch --dry-run: passed=false · tier=null · control_valid=true (layered_p3 Δ−3.0 < −2.5 adopt floor).★ Did the anchor fix move the fit2 re-score? YES.
Under #1559's incumbent-as-house_best anchoring the fit2 single-pass was 6.0 / Δ−3.0. Under corrected neutral anchoring it is 7.0 / Δ−1.0 — a +1.0 score and +2.0 delta gain. The incumbent itself scored only 7.5 (Δ−0.5). Issue #1560 is confirmed: the circularity was suppressing challenger deltas by ~2 points, and the #1559 honest-negative was substantially an anchor artifact — the fit2 single-pass sits only 0.5 below the incumbent and, at Δ−1.0, is at statistical parity with real PoE2 art (≥−1.2) under neutral anchoring.
Remaining levers
Spend
Base reused (0 CU) + 8 Gemini-3.1-flash 2K instruction-edits (chain best-of-2 ×3 + camera-lock retry ×2), no training. Well under the 80 CU cap.
Evidence
qa/evidence/layered-reg/—findings.json,passes/recall_trail.json,inverse_coherence_netnew.json,panel_verdict.json,layered_visual_gate_panel.json, prompts, progression/panel strips.🤖 evidence-only; auto-merge NOT armed (armed only on ADOPT).