Skip to content

feat(placement-plan): apply the owner decisions of 2026-10-19 - #48

Merged
zoeyrose merged 8 commits into
mainfrom
feat/placement-plan-owner-decisions
Oct 20, 2026
Merged

zoeyrose merged 8 commits into
mainfrom
feat/placement-plan-owner-decisions

Conversation

@zoeyrose

@zoeyrose zoeyrose commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Summary

Applies the owner's 2026-10-19 answers to the six questions the overworld placement plan (version 2, #45 and #47) left open, plus the answer to the one question this PR raised (decision 7). Each answer is a dated input of the generator, recorded in the JSON settings, bound to the evidence it was made on, and checked by the verifier. The plan, the JSON and REPORT.md are regenerated from atrinik/content main 3828651987a5.

# Owner decision (2026-10-19) What the plan does now
1 Zechna's first hole stays a portal OWNER_PORTALS: the blocked stairwell site of world_7_66_-1 (13,15) carries owner_decision; the exit stays a portal; no stairwell through zechna_temple_1_1
2 Stair art for stairwells without stairs Recorded rule: stair family first, then STAIRWELL_APPEARANCE_FALLBACKS by exit archetype (well_bucket, well_stone -> ladder_down; invis_exit -> stairs_stone_down). Applied to SR17, SR18 (ladder_down) and SW6 (stairs_stone_down).
3 Rockforge mines accepted OWNER_ALIGN: #26 rockforge_c is a proposed placement (no longer tentative) on layer -7, exactly under rockforge_b at the same x/y (-13, 1347, -7)
4 "Below" confirmed OWNER_ORIENTATIONS for #3 cave_morlarg, #16 lab, #17 dark_cave, #18 giant_stronghold
5 v1 judgement calls confirmed OWNER_CLASSIFICATIONS: Everlink and the Loki desert-plane chain (incl. unusual_garden) other_world; the three Incuna lower decks ship; hall_of_dms system
6 Relayering judgement calls confirmed OWNER_RELAYERING_JUDGEMENT_CALLS (all 11, exactly as listed), OWNER_PLACEMENT_CHANGES_FROM_V1 (ellamin, rockforge_a/_b/_c one layer deeper), SEAM_STAIR_ARCHETYPES (the 46 seam stairs keep stairs_stone_up / stairs_stone_down)
7 rockforge_c stays placed with no footprint (answer to the question this PR raised) OWNER_NO_FOOTPRINT: its 25 maps are empty headers, so it occupies no tile. A footprint appears automatically when content is added and the plan is regenerated, and the spot is fixed, so a later collision makes the generator refuse.

REPORT.md moves items 1-6 (and adds 7) to "Owner decisions applied" under "Decided 2026-10-19", updates the summary (28 placed groups / 207 maps, 30 separate / 267 maps, no unreachable group), and lists no open owner decision.

Implementation / behavior

  • Plan schema /5. New settings: owner_portals, stairwell_appearance_fallbacks (with the arch file defining each appearance), owner_alignments (replaces tentative_alignments), owner_no_footprint, owner_orientations, owner_classifications, owner_relayering_judgement_calls, seam_stair_archetypes. Each entry has a decided date. A placement fixed by the owner carries alignment_reason (replaces tentative_reason). A blocked site whose exits the owner keeps as portals carries owner_decision.
  • Each decision is bound to the evidence it was made on, and stops applying when that evidence changes. A portal is bound to its exit object (map, line, tile, archetype) plus the premise of its blocked-site record; a premise is the SHA-256 of a record's canonical JSON. A stair-art fallback is bound to the (id, premise) of each stairwell it dresses. The alignment is bound to the premise of the group's sheet layout. An orientation is bound to its derived evidence (name keyword (below)). A classification is bound to the premise of its evidence. The judgement calls are bound to their exact texts. The generator fails closed: it refuses to publish when any binding no longer holds (naming the new premise), or when an archetype it adds is not defined in content. This follows the existing pattern for the 2026-10-18 decoration decision.
  • Owner alignment = exact spot. The forced spot is tried alone, with no layer or shift search. If it breaks the gap rule, the group fails and the plan does not verify. It is placed right after the place pool and before any uncertain group.
  • Verifier re-checks each decision and its binding from the JSON:
    • a decided portal is at a blocked site with the recorded premise and stays a portal, and a site carries owner_decision exactly when all its exits are decided;
    • the intermediate archetypes follow the two-tier rule from settings (a family still wins over a fallback);
    • every owner alignment is applied as a proposed placement at anchor + delta with no shift or extra layer, and a tentative placement is now allowed only for an uncertain group;
    • the confirmed orientations, classifications (with their evidence), judgement calls and v1 placement changes (each v2 equal to the group's offsets) hold, and every confirmation a group carries has its settings entry;
    • every group kept placed without a footprint is placed;
    • every seam stair uses the recorded archetypes.
  • Placements, stairwell geometry, exit labels and counts are unchanged from fix(placement-plan): check the exit inventory and refuse failed placements #47's plan. The JSON diff is limited to the settings, the evidence and orientation texts, rockforge_c's classification/status, the Zechna site's owner_decision, SW6/SR17/SR18's appearance (5 intermediate tiles) and the schema. No PNG changes, because rockforge_c occupies no tiles (see below).

Validation

Run in /home/zoey/dev/worktrees/content-toolkit-decisions against a clean clone of atrinik/content main 3828651987a5 (/home/zoey/dev/worktrees/content-plan-v2-input):

  • PATH=~/.cargo/bin:<syft 1.50.0, checksum-verified>:$PATH PLACEMENT_PLAN_CONTENT=<clone> tools/validate.sh: passed (exit 0)
  • python3 -I scripts/verify_plan.py placement-plan.json --content <clone>: ok, exit 0
  • python3 -I scripts/build_plan.py --content <clone> --out . --check: all 34 artifacts byte-identical
  • Two more fresh regenerations into empty directories: all 34 artifacts identical to each other and to the published set (sha256)
  • PLACEMENT_PLAN_CONTENT=<clone> python3 -I scripts/test_placement_plan.py: 100 tests OK, including the new OwnerDecisions (verifier tampering), OwnerDecisionRules (the generator's fail-closed checks, no content needed) and report open-decision tests
  • git diff --check: clean

Content main moved from 3ad20150da76 (#45/#47) to 3828651987a5. The only new commit (atrinik/content#274) touches .github/dependabot.yml and package*.json, nothing under arch/ or maps/. The inputs digest is unchanged (fadd4780f4b88028), and with the old code the rebuild differed only in content_git_head.

Limitations / follow-up

  • Discovered: rockforge_c has no footprint. All 25 rockforge_c maps are empty: a map header and tile links, no objects (rockforge_b has 23 of 25 empty; listed under "Data problems found"). The owner answered on 2026-10-19: keep it placed with no footprint (decision 7).
  • Decisions are matched exactly against their evidence (premises, evidence lists, judgement-call texts). Any content change that alters that evidence makes the generator refuse until the owner confirms again and the constants are updated; the refusal prints the new premise. This is intended. Decision 7 is the exception the owner chose: content added to rockforge_c just gives it a footprint.
  • The engine and format follow-up for stairwells (classic server/client, Tilewright world format) is unchanged and still not implemented here.

🤖 Generated with Claude Code

Record the owner's answers to the six questions plan version 2 left open as
dated generator inputs and check each one:

1. Zechna's first hole stays a portal: its blocked stairwell site carries
   owner_decision (OWNER_PORTALS).
2. Stairwells without stair archetypes show the owner's fallback on their
   intermediate tiles: wells ladder_down (SR17, SR18), invis_exit
   stairs_stone_down (SW6). A stair family still wins.
3. rockforge_c is a proposed placement on layer -7, exactly under rockforge_b
   (OWNER_ALIGN replaces the tentative alignment hint).
4-6. The 'below' orientations, version 1's classifications, the relayering
   judgement calls, the v1 placement changes and the seam stair archetypes are
   confirmed as derived.

The generator refuses to publish when a decision no longer matches, and
verify_plan.py re-checks every decision from the JSON (plan schema /5).
Regenerated from atrinik/content main 3828651987a5 (inputs digest unchanged).
REPORT.md lists one new open question: rockforge_c's 25 maps are empty, so
its placement occupies no tile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues found.

Scanned Files

None

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex review Please do a deep, thorough review of the whole diff and the code it touches. Report every issue you find in this pass: correctness, security, concurrency, error handling, edge cases, tests and docs, including lower-severity (P2) findings, not only the most important few. Every finding gets fixed each round, so a complete list now saves extra rounds. Please do a deep, thorough review of the whole diff and the code it touches and report every issue you find in this pass, including P2s, not only the most important few. Risky areas: the fail-closed owner-decision checks in build_plan.py, the verifier's new checks for decided portals, appearance fallbacks and owner alignments in verify_plan.py, and whether the generator and verifier agree.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 20, 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-20T02:41:23.894296Z 7e1d57c Manual request
🔒 Security Review ✅ Completed 2026-10-20T02:33:46.553718Z 7e1d57c Manual request
ℹ️ 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.

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 4aa9b9cad7

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@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: 4aa9b9cad7

ℹ️ 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 thread migration/placement-plan/scripts/build_plan.py Outdated
Comment thread migration/placement-plan/scripts/verify_plan.py
Comment thread migration/placement-plan/scripts/build_plan.py Outdated
Comment thread migration/placement-plan/scripts/verify_plan.py
Address the first Codex review round of #48:

- A portal decision names one exit object (source map, line, tile,
  archetype) and the plane ends of its blocked site, so a duplicate hole on
  the tile or a moved site is not silently treated as decided.
- Every stair-art fallback must still dress a stairwell; an unused one is a
  stale decision (generator and verifier).
- The verifier rejects an owner alignment on a group with exit records, and
  the generator re-checks it after wiring.
- Each confirmed placement change must end at its group's current offsets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@zoeyrose

Copy link
Copy Markdown
Member Author

Round 1 (Codex review of 4aa9b9c): 4 P2 findings, all fixed in 3fdbe3e.

  1. Stale appearance fallbacks: the generator now refuses to publish when a configured stair-art fallback dresses no stairwell, and the verifier reports any unused fallback.
  2. Owner alignment on a connected group: the verifier rejects an aligned group with exit records. The generator checks this at classification and again after wiring.
  3. Portal decision bound to a unique exit: the decision is keyed by source map, line, tile and archetype, plus the blocked site's plane ends. A duplicate object on the tile or a moved site fails closed.
  4. Confirmed placement changes re-derived: each v2 must equal the group's current offsets.

Validation on 3fdbe3e: tools/validate.sh with PLACEMENT_PLAN_CONTENT passed (99 placement tests OK). verify_plan.py --content is ok, build_plan.py --check finds all 34 artifacts byte-identical, and two fresh regenerations are identical to the published set. The only JSON change is settings.owner_portals, which now records line, site_top and site_bottom.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex review Please do a deep, thorough review of the whole diff and the code it touches. Report every issue you find in this pass: correctness, security, concurrency, error handling, edge cases, tests and docs, including lower-severity (P2) findings, not only the most important few. Every finding gets fixed each round, so a complete list now saves extra rounds. Please do a deep, thorough review of the whole diff and the code it touches and report every issue you find in this pass, including P2s, not only the most important few. Risky areas: the fail-closed owner-decision checks in build_plan.py, the verifier's checks for decided portals, appearance fallbacks and owner alignments in verify_plan.py, and whether the generator and verifier agree.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 3fdbe3ee72

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@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: 3fdbe3ee72

ℹ️ 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 thread migration/placement-plan/scripts/build_plan.py Outdated
Comment thread migration/placement-plan/scripts/build_plan.py Outdated
Address the second Codex review round of #48 with one rule instead of more
special cases: a decision holds only while the evidence it was made on is
unchanged.

- Portal: the premise (SHA-256 of the canonical JSON) of the blocked site
  record: owners, ends, exits and what occupies the column.
- Orientation: the derived evidence itself ("name keyword (below)"), so a
  directional exit that also says "below" is a new premise.
- Classification: the premise of the derived evidence.
- Alignment: the premise of the group's sheet layout.
- Stair-art fallback: the stairwells it dresses (SW6, SR17, SR18).

The generator refuses to publish on any change and names the new premise;
verify_plan.py recomputes every binding from the JSON.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@zoeyrose

Copy link
Copy Markdown
Member Author

Round 2 (Codex review of 3fdbe3e): 2 P2 findings, both fixed in bb28657.

Both findings were cases of a decision outliving its premise. Instead of adding checks one case at a time, every owner decision is now bound to the evidence it was made on, and it stops applying when that evidence changes:

  • Portal (finding 1): the premise (SHA-256 of the canonical JSON) of the blocked site record, which covers owners, ends, exits and column occupants.
  • Orientation (finding 2): the derived evidence itself (name keyword (below)). A directional exit that also says "below" changes it.
  • Classification: the premise of the derived evidence.
  • Alignment: the premise of the group's sheet layout.
  • Stair-art fallback: the stairwells it dresses (SW6, SR17, SR18).

The generator refuses to publish on any change and names the new premise. verify_plan.py recomputes each binding from the JSON.

Validation on bb28657: tools/validate.sh with PLACEMENT_PLAN_CONTENT passed (99 placement tests OK). verify_plan.py --content is ok, build_plan.py --check finds all 34 artifacts byte-identical, and two fresh regenerations are identical to the published set. The JSON changes only in the settings (premises, evidence, stairwell ids) and the conventions text.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex review Please do a deep, thorough review of the whole diff and the code it touches. Report every issue you find in this pass: correctness, security, concurrency, error handling, edge cases, tests and docs, including lower-severity (P2) findings, not only the most important few. Every finding gets fixed each round, so a complete list now saves extra rounds. Please do a deep, thorough review of the whole diff and the code it touches and report every issue you find in this pass, including P2s, not only the most important few. Risky areas: binding each owner decision to its evidence (premise fingerprints) in build_plan.py and verify_plan.py, and whether the generator and verifier agree.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: bb286579e7

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@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: bb286579e7

ℹ️ 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 thread migration/placement-plan/scripts/verify_plan.py
Comment thread migration/placement-plan/scripts/build_plan.py Outdated
zoeyrose and others added 2 commits October 19, 2026 20:32
Address the third Codex review round of #48:

- Each stair-art fallback is bound to the stairwells it dresses by id and by
  the premise of the stairwell record (kind, owners, direction and every
  replaced exit), so a different stairwell that takes a positional id such as
  SW6 is not dressed by the old decision.
- The verifier requires a settings entry for every owner confirmation a group
  carries in its evidence (orientations, classifications), so dropping an
  entry from settings fails.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rint

Record the owner's 2026-10-19 answer to the question this plan raised
(decision 7, OWNER_NO_FOOTPRINT, settings.owner_no_footprint): rockforge_c
stays placed although its 25 maps are empty headers, so it occupies no tile.
A footprint appears automatically when content is added and the plan is
regenerated, and the spot is fixed, so a later collision makes the generator
refuse. The open item in REPORT.md clears; no owner decision is open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@zoeyrose

Copy link
Copy Markdown
Member Author

Round 3 (Codex review of bb28657): 2 P2 findings, both fixed in eee0cdc.

  1. Embedded confirmations need their settings entry: the verifier now requires a valid settings.owner_orientations / owner_classifications entry for every group that carries the confirmation marker in its evidence.
  2. Stair art bound to stairwell records, not ids: each fallback records {id, premise} per stairwell. The premise covers kind, owners, direction and every replaced exit.

Also in this push: d9ede80 records the owner's answer (2026-10-19) to the question this PR raised: keep rockforge_c placed with no footprint. Its 25 maps are empty headers, a footprint appears automatically when content is added and the plan is regenerated, and the spot is fixed, so a later collision makes the generator refuse. This is decision 7 (OWNER_NO_FOOTPRINT, settings.owner_no_footprint); REPORT.md now lists no open owner decision.

Validation on d9ede80: tools/validate.sh with PLACEMENT_PLAN_CONTENT passed (100 placement tests OK). verify_plan.py --content is ok, build_plan.py --check finds all 34 artifacts byte-identical, and two fresh regenerations are identical to the published set.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex review Please do a deep, thorough review of the whole diff and the code it touches. Report every issue you find in this pass: correctness, security, concurrency, error handling, edge cases, tests and docs, including lower-severity (P2) findings, not only the most important few. Every finding gets fixed each round, so a complete list now saves extra rounds. Please do a deep, thorough review of the whole diff and the code it touches and report every issue you find in this pass, including P2s, not only the most important few. Risky areas: binding each owner decision to its evidence (premise fingerprints) in build_plan.py and verify_plan.py, the new owner_no_footprint decision, and whether the generator and verifier agree.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex security review

@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: d9ede80f8c

ℹ️ 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 thread migration/placement-plan/scripts/verify_plan.py
Comment thread migration/placement-plan/scripts/report.py Outdated
Comment thread migration/placement-plan/scripts/build_plan.py Outdated
@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

…t decisions

Address the fourth Codex review round of #48:

- The owner alignment's premise covers what its reason rests on: the sheet
  layouts of rockforge_a, rockforge_b and rockforge_c and the exit records
  between them (the a<->b stairs), not only rockforge_c's own sheets.
- Every placed group without a footprint needs an owner decision to keep it
  placed: the generator refuses otherwise and the verifier fails, so dropping
  or redirecting settings.owner_no_footprint is caught. A decided group may
  still gain a footprint later.
- REPORT.md describes a decided group by its current footprint, so it no
  longer calls a group empty once content is added.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@zoeyrose

Copy link
Copy Markdown
Member Author

Round 4 (Codex review of d9ede80): 3 P2 findings, all fixed in 2f9460a.

  1. Every footprintless placement needs a decision: the verifier derives the placed groups with no occupied tile and requires a settings.owner_no_footprint entry for each. The generator refuses otherwise. A decided group may still gain a footprint later.
  2. Report follows the current footprint: "without a footprint" wording appears only while the group is empty. After content arrives, decision 7 reports the tiles it now occupies.
  3. Alignment premise covers its whole rationale: it now covers the sheet layouts of rockforge_a/_b/_c and the 12 a<->b stair exit records (evidence_groups, alignment_evidence()), shared by the generator and the verifier.

Validation on 2f9460a: tools/validate.sh with PLACEMENT_PLAN_CONTENT passed (100 placement tests OK). verify_plan.py --content is ok, build_plan.py --check finds all 34 artifacts byte-identical, and two fresh regenerations are identical to the published set.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex review Please do a deep, thorough review of the whole diff and the code it touches. Report every issue you find in this pass: correctness, security, concurrency, error handling, edge cases, tests and docs, including lower-severity (P2) findings, not only the most important few. Every finding gets fixed each round, so a complete list now saves extra rounds. Please do a deep, thorough review of the whole diff and the code it touches and report every issue you find in this pass, including P2s, not only the most important few. Risky areas: the evidence bindings (premises) of the owner decisions in build_plan.py and verify_plan.py, and whether the generator and verifier agree.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 2f9460a5a0

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@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: 2f9460a5a0

ℹ️ 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 thread migration/placement-plan/scripts/build_plan.py Outdated
Comment thread migration/placement-plan/scripts/build_plan.py
Address the fifth Codex review round of #48 for the whole class rather than
case by case: every premise now covers the full JSON records behind its
decision, computed the same way by the generator and the verifier.

- Portal: the blocked site record and the full record of each of its exits.
- Classification: the derived evidence plus the group's maps, the content
  fields of every exit record it holds (the garden's hole target included)
  and its script references.
- Orientation: the derived evidence plus the same group content.
- Relayering judgement calls: the calls and every record they summarise
  (regions, kept regions, moved units, caves, split tiles, seams, new stairs,
  steep steps, new contacts) and the one-way relayering stairwells.

premise() hashes the evidence as the plan's JSON holds it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@zoeyrose

Copy link
Copy Markdown
Member Author

Round 5 (Codex review of 2f9460a): 2 P2 findings, both fixed in 11092ef.

Both were premises that left part of the evidence out. Instead of adding the specific missing piece, every premise now covers the full JSON records behind its decision, computed by the same functions in the generator and the verifier (a test checks the two copies agree):

  • Portal: the blocked site record and the full record of each of its exits.
  • Classification (finding 1, the garden's hole): the derived evidence plus group_evidence(), which covers the group's maps, the content fields of every exit record it holds, and its script references.
  • Orientation: the derived evidence plus the same group content.
  • Relayering judgement calls (finding 2): the calls and every record they summarise (regions, kept regions, moved units, caves, split tiles, seams, new stairs, steep steps, new contacts, one-way stairwells).

Validation on 11092ef: tools/validate.sh with PLACEMENT_PLAN_CONTENT passed (100 placement tests OK). verify_plan.py --content is ok, build_plan.py --check finds all 34 artifacts byte-identical, and two fresh regenerations are identical to the published set.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex review Please do a deep, thorough review of the whole diff and the code it touches. Report every issue you find in this pass: correctness, security, concurrency, error handling, edge cases, tests and docs, including lower-severity (P2) findings, not only the most important few. Every finding gets fixed each round, so a complete list now saves extra rounds. Please do a deep, thorough review of the whole diff and the code it touches and report every issue you find in this pass, including P2s, not only the most important few. Risky areas: the evidence premises of the owner decisions (build_plan.py and verify_plan.py), and whether the generator and verifier agree.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 11092ef9d4

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@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: 11092ef9d4

ℹ️ 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 thread migration/placement-plan/scripts/verify_plan.py
Comment thread migration/placement-plan/scripts/verify_plan.py Outdated
Comment thread migration/placement-plan/scripts/verify_plan.py Outdated
Comment thread migration/placement-plan/scripts/build_plan.py
Address the sixth Codex review round of #48:

- The verifier derives each placed group's footprint from its member
  occupied_rows and requires occupied_tiles_by_layer to repeat it, so a
  claimed footprint cannot bypass the no-footprint decision.
- An owner decision's date must be one schema /5 records (2026-10-19), not
  any digit-shaped value.
- The generator checks up front that every group an owner decision names
  still exists, and refuses with the documented message instead of a
  KeyError.
- New fidelity tests: an owner decision removed from settings together with
  its effect is a self-consistent edit that the JSON-only check cannot see;
  verify_content (the rebuild from the generator's OWNER_* constants) rejects
  it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@zoeyrose

Copy link
Copy Markdown
Member Author

Round 6 (Codex review of 11092ef): 4 P2 findings. 3 are fixed in 7e1d57c and 1 is declined with evidence.

  1. Pin the settled decision set in the JSON-only verifier: declined. Which decisions apply is a generator input (OWNER_*). Removing a decision together with its effect is a self-consistent edit, the class the verifier assigns to the fidelity check (--content / --check). The new ContentFidelity.test_an_owner_decision_dropped_with_its_effect reproduces both scenarios: each passes verify() and fails verify_content(). The docstring now names this case.
  2. Footprint derived from rows: occupied_tiles_by_layer must equal what the member occupied_rows claim, and the no-footprint rule uses the derived footprint.
  3. Decision date pinned: decided must be one of OWNER_DECISION_DATES (2026-10-19).
  4. Removed groups fail closed: check_decision_groups() runs before placement and refuses with the documented message instead of a KeyError.

Validation on 7e1d57c: tools/validate.sh with PLACEMENT_PLAN_CONTENT passed (102 placement tests OK). verify_plan.py --content is ok, build_plan.py --check finds all 34 artifacts byte-identical, and two fresh regenerations are identical to the published set. The plan artifacts are unchanged in this round.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex review Please do a deep, thorough review of the whole diff and the code it touches. Report every issue you find in this pass: correctness, security, concurrency, error handling, edge cases, tests and docs, including lower-severity (P2) findings, not only the most important few. Every finding gets fixed each round, so a complete list now saves extra rounds. Please do a deep, thorough review of the whole diff and the code it touches and report every issue you find in this pass, including P2s, not only the most important few. Note: the JSON-only verifier deliberately leaves self-consistent edits (a decision dropped from settings together with its effect) to the content-fidelity check, per its docstring.

@zoeyrose

Copy link
Copy Markdown
Member Author

@codex security review

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review

Security review completed. No security issues were found in this pull request.

Reviewed commit: 7e1d57c71c

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Hooray!

Reviewed commit: 7e1d57c71c

ℹ️ 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".

@zoeyrose
zoeyrose marked this pull request as ready for review October 20, 2026 02:42
@zoeyrose zoeyrose self-assigned this Oct 20, 2026
@zoeyrose
zoeyrose requested a review from a team October 20, 2026 12:50
@zoeyrose
zoeyrose merged commit 6f82d61 into main Oct 20, 2026
10 checks passed
@zoeyrose
zoeyrose deleted the feat/placement-plan-owner-decisions branch October 20, 2026 12:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant