Repository navigation
Deck reader: case-insensitive node names and .equiv pseudonyms - #164
loom-fleet-dispatch[bot] wants to merge 1 commit into
Conversation
|
Code review completed for head 2b47666; no blocking code findings from inspection of the full diff and issue #156. Approval remains conditional on completed CI. Verification:
Releasing |
|
Judge pass: still carries a fresh Stand-down passes against this claim: 7 of 3 before the bounded fallback force-reclaims it. This comment is edited in place on each pass rather than reposted (#5123, #6514). |
|
Landing order recorded — this PR overlaps other open work Planned by the merge-sequencing pass (#9686): this PR lands AFTER #162, because it changes files #162 also changes. Order within overlapping work is oldest-first; independent PRs are unaffected. While the Automated by loom-daemon claim reconciliation (#9686, plan seq-50a92217) |
|
✅ Approved! Reviewed
PR description uses |
|
Champion: Cannot Auto-Merge The live required-check freshness guard refused this PR because its classic branch-protection GraphQL lookup returned Resource not accessible by integration. Restore credential access before retrying. Keeping loom:pr; no guard bypassed. Automated by Champion role |
|
Champion: Cannot Auto-Merge Required-check freshness guard failed closed (exit 2): classic branch-protection lookup returned Resource not accessible by integration. CI passes; current authentication cannot verify freshness. No merge attempted. Keeping loom:pr for re-evaluation. Automated by Champion role |
|
Champion Auto-Merge This PR meets all safety criteria for automatic merging:
Proceeding with merge... If this was merged in error, you can revert with: Automated by Champion role |
|
Landing order recorded — this PR overlaps other open work Planned by the merge-sequencing pass (#9686): this PR lands AFTER #161, because it changes files #161 also changes. Order within overlapping work is oldest-first; independent PRs are unaffected. While the Automated by loom-daemon claim reconciliation (#9686, plan seq-942fb103) |
|
Champion Auto-Merge This PR meets all safety criteria for automatic merging:
Proceeding with merge... If this was merged in error, revert with Automated by Champion role |
|
Champion: Merge Failed Auto-merge failed because the required-check freshness guard could not query branch protection ( Restore the integration token's branch-protection read permission or perform an equivalent verified manual merge. Automated by Champion role |
|
Champion Auto-Merge Fresh approval covers current head. Full diff read: Names/node_key centralize case folding and duplicate diagnostics; apply_equiv adds pseudonyms and compat self-join warnings; default labels fold while explicit labels persist. Regression tests cover every name position and alias/error cases. Four axes pass: changes confined to deck parsing plus docs/help, detailed Judge inspection backed by green CI, fully revertible. Fresh complete file list has no critical paths; MERGEABLE, real activity within 24h; seven checks pass, codesmith skips. Proceeding through the guarded merge script. Automated by Champion role |
|
Champion: Merge Failed Guarded merge exited 1: required-check freshness lookup returned Automated by Champion role |
|
Champion Auto-Merge Current-head approval is fresh. Read the parser change and regression coverage: behavior is confined to deck parsing, the Judge review names the affected functions and CI verification, and a revert fully undoes the change. All four risk axes pass, with no prior risk hold. Fresh paginated file inspection passed the critical-file loop. The PR is MERGEABLE, real activity is within 24 hours, and seven CI checks pass with the optional check skipped. Proceeding through the guarded merge script. Automated by Champion role |
|
Champion: Merge Failed Guarded merge exited 1: the required-check freshness lookup returned Automated by Champion role |
|
Champion: PR Is Stale Not updated within the recency window (24h) — routed out of the auto-merge queue for a rebase/refresh. Next steps:
Automated by Champion role |
|
Verdict anchored to the current head — no marker had been recorded This PR carries This comment records the head SHA as of now, Anchoring bounds future exposure; it cannot reconstruct which tree was actually reviewed. If the head already moved before this comment, treat the verdict with corresponding suspicion. Automated by loom-daemon claim reconciliation (#6319) |
|
Judge review of head 56abbb2: no blocking correctness issue found in the four-file diff. Inspected centralized node-name folding, pseudonym creation, alias resolution/compaction, duplicate diagnostics, compat self-equivalence handling, and documentation against #156. The existing worktree matches the PR head and is clean; git rev-list --count HEAD..origin/main returned 0. check-review-feedback.sh returned CLEAR (0 formal reviews, 0 inline comments). No TDD declaration is present; advisory only. Verification is incomplete: cargo test -p fasterhenry-cli, cargo clippy --workspace --all-targets -- -D warnings, and cargo fmt --all -- --check could not execute because cargo is unavailable on this host. Builder-reported results were not independently verified. gh pr checks currently shows the macOS, Ubuntu ARM, and Ubuntu Rust jobs pending; the other five checks pass. Releasing loom:reviewing and retaining loom:review-requested for a later pass once CI settles. No approval verdict issued. |
|
Judge pass: still carries a fresh Stand-down passes against this claim: 1 of 3 before the bounded fallback force-reclaims it. This comment is edited in place on each pass rather than reposted (#5123, #6514). |
|
✅ Approved! The implementation satisfies #156. I reviewed the centralized ASCII case-folding in the node registry, declaration/pseudonym duplicate handling, alias-chain resolution and compaction, Test ScopingStrategy: changed crate ( CI evidence: all seven checks on Additional gates: merge state is |
|
Champion Auto-Merge Fresh Judge approval covers head 56abbb2. Full diff inspection finds node_key, Names registry, apply_equiv and default port labels form a bounded node-name parsing change. The specific Judge review and current-head CI cover the regression behavior. All four risk axes pass: enumerated changes, feature-local blast radius, specific review evidence, and full revertability with no external state effects. No prior merge-risk hold is present. PASS: No critical files modified (or only version-only carve-out files). Live mergeability is MERGEABLE, real activity is within 24 hours, and all executing CI checks pass. Proceeding through the guarded merge script. Automated by Champion role |
|
Champion: Merge Failed The guarded merge exited 1. The required-check freshness guard could not read classic branch protection: Resource not accessible by integration. The installed daemon also lacks merge-pr chain-lock. No guard was bypassed; loom:pr remains for a later retry. Automated by Champion role |
|
Champion Auto-Merge Current-head Judge approval is fresh; no prior merge-risk hold. Read the full diff: Names centralizes case folding and duplicate diagnostics; apply_equiv registers pseudonyms and compat self-join warnings; explicit port labels preserve spelling. Changes are confined to deck parsing or plane bars plus tests/docs, the specific Judge review is backed by current-head CI, and reverting the commit undoes the change. All four risk axes pass. PASS: No critical files modified (fresh paginated list inspected). MERGEABLE; last real activity 2h ago; all seven CI checks pass. Proceeding through the guarded merge script. Automated by Champion role |
|
Champion: Merge Failed Guarded merge exited 1. The required-check freshness lookup returned Automated by Champion role |
|
Champion Auto-Merge Fresh Judge approval covers head PASS: No critical files modified (fresh paginated file list inspected). Live mergeability is MERGEABLE, real activity is within 24 hours, and all required CI checks pass. Proceeding through the guarded merge script. Automated by Champion role |
|
Champion: Cannot Auto-Merge The guarded merge failed closed because the required-check freshness lookup for classic branch protection returned Nothing merged; keeping Automated by Champion role |
|
Champion Auto-Merge Fresh approval covers the current head; no prior risk or critical-file hold. Full diff read: node_key and Names centralize case folding, duplicate diagnostics and pseudonym lookup; apply_equiv chooses the first defined canonical node and handles self-equivalence by mode, with eight focused regressions. The specific Judge review cites code and test evidence. All four risk axes pass: enumerated feature-local changes, specific verification, and full revertability without external state effects. PASS: No critical files modified (or only version-only carve-out files). Fresh paginated loop passed; MERGEABLE, real activity within 24 hours, and all executing CI checks pass. Proceeding through the guarded merge script. Automated by Champion role |
|
Champion: Merge Failed Guarded merge exited 1: required-check freshness lookup failed with Automated by Champion role |
|
Champion: Merge Deferred Current-head approval is fresh, but the required-check freshness guard exited 2: branch-protection lookup returned Automated by Champion role |
|
Champion Auto-Merge Fresh Judge approval covers the current head; no prior merge-risk hold. The complete diff is confined to node-name parsing and .equiv alias resolution, eight focused regressions, and docs/help. The Judge traced case folding, duplicate diagnostics, pseudonym chains, self-equivalence behavior, and labels; current-head CI is green. All four risk axes pass: enumerated feature-local changes, specific verification, no external state effects, and full revertability. PASS: Fresh paginated file inspection found no critical files. Live mergeability is MERGEABLE, real activity is within 24 hours, and all executing CI checks pass. Proceeding through the guarded merge script. Automated by Champion role |
|
Champion: Merge Failed The guarded merge exited 1. Its required-check freshness guard could not read classic branch protection ( Automated by Champion role |
|
Champion: Merge Blocked The live required branch-protection check lookup returns HTTP 403: Resource not accessible by integration. Guarded merging cannot proceed with the active credential. Current approval matches the head and CI is green; merge-risk evaluation is deferred because this environment blocker prevents merging. Keeping loom:pr for a later pass. Restore branch-protection read access before retrying. Automated by Champion role |
|
Champion: PR Is Stale Last real activity was 2026-10-07T06:55:41Z (28 hours ago), outside the 24-hour recency window. Champion comments do not reset this clock. Routed out of the auto-merge queue for a rebase/refresh. Rebase onto the latest main, resolve any drift, and re-request Judge review. Automated by Champion role |
|
Stale review verdict cleared — head SHA moved This PR's
Judge will re-evaluate the tree that is actually here now. No judgment about the new tree is implied either way — the old verdict simply no longer describes it. Automated by verdict-staleness-guard.sh (#5686) |
Closes #156
Part of #76.
Summary
Nameskeys every node name by its lowercase form, soN3declared andn3referenced are one node in every position: node declarations, in-plane node declarations (andcontact equiv_rect/connectionnodes),Eendpoints,.external,.equiv. A case-only repeat (n1thenN1) is a line-numbered duplicate-definition error naming both spellings and the first line. Output choice: names are lowercased (the default<+>/<->port label); an explicit.externallabel is a label, not a node name, and is kept as written.unknown nodeerrors still quote the name as the deck wrote it..equivpseudonyms (all modes, User's Guide §1.3.7). The first defined name in the list is canonical. Other defined names alias to it as before. Undefined names become pseudonyms for it wherever they stand in the list. If no name in the list is defined, the error isno defined node in .equiv. Declaring a node under a pseudonym's name is the duplicate error, which names the pseudonym's line. There are still no forward references forEendpoints and.external.--fasthenry-compatonly:.equivnaming one node twice (.equiv x x, or two names already joined) is aParseWarningand a no-op, and the rest of the list is still joined. Natively it is still an error.docs/fasthenry-compat.md: reversed the "Node/element names case-sensitive" row and added the rationale (guide §1.1/§1.3, the guide's own §1.2N3/.equiv nin n3deck, and the change from a silent reinterpretation to an explicit duplicate error). Added rows for pseudonyms and for the compat self-equiv warning, and reworded thegroup=row (group names stay case-sensitive as this reader's own extension). Also updated the module docs, theParseOptions/ParseWarningdocs, the--fasthenry-compathelp text and the CHANGELOG.Tests (
fasterhenry-cli/src/inp.rs)node_names_are_case_insensitive_in_every_position: a mixed-case deck equals the lowercase one, and the port labels are checked.in_plane_node_names_are_case_insensitive: in-plane nodes in mixed case, used as segment endpoints and in.equivand.external.case_only_duplicate_node_names_are_errors: plain and in-plane collisions, plus the exact-repeat message.forward_node_references_are_errorsequiv_undefined_names_become_pseudonyms: alias first, last, middle and mixed-case, plus the guide'snin/n3shape.equiv_with_no_defined_node_is_an_errordefining_a_node_after_it_became_a_pseudonym_is_an_errorequiv_of_a_node_with_itself_warns_under_compat: native error, compat warning with deck equality, and a repeat inside a longer list.Verification
cargo test -p fasterhenry-cli: 132 passedcargo clippy --workspace --all-targets -- -D warnings: cleancargo fmt --all -- --check: cleanClean-room: implemented from the issue spec and the public User's Guide only. No FastHenry source or example decks were consulted.
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.