One veil, one door; a sibling is not a parent - #186
Merged
Conversation
Two confirmed hunt findings, both about a rule that was right and a surface that did not follow it. The veil gate moved into core earlier this cycle so both faces read one rule, but the MCP face only shared the gate, not the door: its room lookup was the catalog alone, so a learner the terminal admitted to an unlisted room was told here that the room does not exist. One player, one standing, two answers. describe, reveal, and play now find rooms through one door on both faces. A player outside the veil still finds the room unlisted: this opens the same door, not a wider one, and the test pins both halves. On the Gallery wall, an untitled creation's canonical link excludes lineage, so two unedited forks of the same parent carry identical links and identical descents. Matching on the link alone let each adopt the other: both wore a remix badge, the real parent went uncredited, and D walked a circle between them forever. A candidate that descends from the same creation is standing beside this one, not above it. The test walks up from both twins and requires the walk to end, at the parent, and requires the parent to carry both remixes.
There was a problem hiding this comment.
Pull request overview
This pull request aligns behavior across faces and fixes a gallery lineage resolution edge case that could create incorrect remix attribution and parent cycles.
Changes:
- MCP face now resolves room IDs through a shared lookup path that includes hidden rooms only when the journey is behind the veil, matching terminal behavior.
play_roomis updated to accept the journey context, and a regression test pins consistent behavior for describe, reveal, and play.- Gallery lineage resolution now avoids treating sibling forks (same parent link) as parent candidates, with a test covering the twin fork scenario.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| faces/mcp/src/main.rs | Introduces find_room_for and threads journey context into play_room, plus tests to ensure hidden room access matches terminal rules. |
| faces/app/src/gallery.rs | Prevents sibling fork mis-parenting in resolve_lineage and adds a regression test to ensure lineage walks terminate at the real parent. |
| CHANGELOG.md | Documents both fixes in the Unreleased section. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The last two confirmed findings from this hunt round. Both are the same shape: a rule that was right, and a surface that did not follow it.
One veil, one door
The veil gate moved into core earlier this cycle so both faces read one rule. But the MCP face only shared the gate, not the door: its room lookup was the catalog alone, so a learner the terminal admitted to an unlisted room was told here that the room does not exist. One player, one standing, two answers depending on which face they asked through.
describe_room,reveal_room, andplay_roomnow find rooms through one door (find_room_for), which is the catalog always plus the unlisted ones for a journeybehind_the_veiladmits. A player outside the veil still finds the room unlisted, because this opens the same door the terminal opens, not a wider one; the test pins both halves.play_roomneeded the journey threaded in to ask that question, which it now has from the dispatcher that already held the path. Variation stays a catalog contract, as on the terminal.A sibling is not a parent
An untitled creation's canonical link excludes lineage, so two unedited forks of the same parent carry identical links and identical descents. Matching on the link alone let each adopt the other: both wore a remix badge, the real parent went uncredited, and D walked a circle between them forever.
A candidate that descends from the same creation is standing beside this one, not above it. The test puts a parent and two twin forks on one wall, walks up from each twin and requires the walk to end (at the parent), and requires the parent to carry both remixes.
Full workspace gates green through the pre-commit hook.