Skip to content

Fix: Correct repository file paths#2

Merged
pcharbon70 merged 1 commit into
mainfrom
feature/governance-system-v2
Mar 18, 2026
Merged

Fix: Correct repository file paths#2
pcharbon70 merged 1 commit into
mainfrom
feature/governance-system-v2

Conversation

@pcharbon70
Copy link
Copy Markdown
Collaborator

This PR fixes the incorrect directory structure from the merged PR #1.

Problem

The previous PR (#1) had files nested under ash/ash_ui/ instead of being at the repository root, which is incorrect since this repository is ash_ui itself.

Solution

  • Moved all governance files from ash/ash_ui/ to the repository root
  • Updated README.md to the correct project documentation
  • Git history is preserved with renames (100% match)

Files Changed

  • 41 files moved from ash/ash_ui/ to root level
  • All paths now correct (e.g., .github/, guides/, specs/, etc.)

Verification

# Verify structure
git ls-files | grep -E '^(specs|guides|rfcs|scripts|.github)/'

This commit fixes the incorrect directory structure where files were
nested under ash/ash_ui/ instead of being at the repository root.

- Moved all governance files from ash/ash_ui/ to root level
- Updated README.md to the correct project documentation
- Preserved git history with renames where possible
@pcharbon70 pcharbon70 merged commit 5bc3137 into main Mar 18, 2026
0 of 3 checks passed
ty13r added a commit that referenced this pull request May 18, 2026
…t binding allow-list

Authoring validator (`validate_element_binding_locality!` at
lib/ash_ui/resources/validations/authoring.ex:373) raises ArgumentError
"does not expose collection semantics" for any :list-typed binding on
Elements whose canonical widget_type isn't in @list_widgets ("list",
"table", "info_list", "select", "list_repeat").

`custom:*` opaque widget types are application-extension primitives
outside the canonical catalog (per Storage.canonical_widget_type at
lib/ash_ui/dsl/storage.ex:162). The validator can't know their
collection semantics and shouldn't gate the :list binding allow-list
on them; trust the authoring intent.

Conservative scope:
  - Bypass applies ONLY to "custom:*" string widget_types
  - nil widget_type (`ui_element` block missing entirely) still
    raises through downstream missing-element error paths
  - Canonical list-supporting widgets (`list`, `table`, etc.) remain
    the exclusive allow-list for non-custom Elements; row-template
    primitives like `:artifact_row` continue to belong INSIDE a
    `:list_repeat` parent that owns the list binding (per the
    Phase31RepeatListElement canonical pattern + Codex P2 #2 review)

Triggered by Wave AshUI-3.9 Item 2 dispatch (2026-05-17/18). The
original sizing investigation proposed adding `artifact_row` to
@list_widgets so destination Elements could hold :list bindings
directly; Codex P2 #2 review correctly pointed out that
:list_repeat is the canonical destination wrapper (not :artifact_row)
per the Phase31RepeatListElement test fixture. Per umbrella CLAUDE.md
"substrate gaps become our roadmap, not asks-of-Pascal" — the
`custom:*` bypass DOES belong here since the canonical catalog has
no opinion on opaque application types.

Per Codex P2 #3 review: the bypass is tightened to ONLY match
`"custom:*"` binary strings. Earlier draft included `is_nil(widget_type)`
which would have silently accepted bindings on Elements missing their
`ui_element` declaration entirely; that case should still surface
as a downstream missing-element error.

Test coverage:
  - Existing negative test (`:text` widget rejecting :list) still passes
    (regression check that the allow-list still gates unknown-bad types)
  - New positive test: `"custom:thread_card"` widget compiles with
    `binding_type :list`

The positive test uses a helper `assert_validator_accepts_list_binding`
that checks the SPECIFIC validator error is not raised; downstream
Ash domain-registration exceptions (which fire only AFTER the validator
we're testing passes) are acknowledged as proof the validator accepted.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ty13r added a commit that referenced this pull request May 18, 2026
…t binding allow-list (#113)

Authoring validator (`validate_element_binding_locality!` at
lib/ash_ui/resources/validations/authoring.ex:373) raises ArgumentError
"does not expose collection semantics" for any :list-typed binding on
Elements whose canonical widget_type isn't in @list_widgets ("list",
"table", "info_list", "select", "list_repeat").

`custom:*` opaque widget types are application-extension primitives
outside the canonical catalog (per Storage.canonical_widget_type at
lib/ash_ui/dsl/storage.ex:162). The validator can't know their
collection semantics and shouldn't gate the :list binding allow-list
on them; trust the authoring intent.

Conservative scope:
  - Bypass applies ONLY to "custom:*" string widget_types
  - nil widget_type (`ui_element` block missing entirely) still
    raises through downstream missing-element error paths
  - Canonical list-supporting widgets (`list`, `table`, etc.) remain
    the exclusive allow-list for non-custom Elements; row-template
    primitives like `:artifact_row` continue to belong INSIDE a
    `:list_repeat` parent that owns the list binding (per the
    Phase31RepeatListElement canonical pattern + Codex P2 #2 review)

Triggered by Wave AshUI-3.9 Item 2 dispatch (2026-05-17/18). The
original sizing investigation proposed adding `artifact_row` to
@list_widgets so destination Elements could hold :list bindings
directly; Codex P2 #2 review correctly pointed out that
:list_repeat is the canonical destination wrapper (not :artifact_row)
per the Phase31RepeatListElement test fixture. Per umbrella CLAUDE.md
"substrate gaps become our roadmap, not asks-of-Pascal" — the
`custom:*` bypass DOES belong here since the canonical catalog has
no opinion on opaque application types.

Per Codex P2 #3 review: the bypass is tightened to ONLY match
`"custom:*"` binary strings. Earlier draft included `is_nil(widget_type)`
which would have silently accepted bindings on Elements missing their
`ui_element` declaration entirely; that case should still surface
as a downstream missing-element error.

Test coverage:
  - Existing negative test (`:text` widget rejecting :list) still passes
    (regression check that the allow-list still gates unknown-bad types)
  - New positive test: `"custom:thread_card"` widget compiles with
    `binding_type :list`

The positive test uses a helper `assert_validator_accepts_list_binding`
that checks the SPECIFIC validator error is not raised; downstream
Ash domain-registration exceptions (which fire only AFTER the validator
we're testing passes) are acknowledged as proof the validator accepted.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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