Skip to content

[#446 STEP 2] Tier 1 — idaptik blockers (10 bindings) #450

Description

@hyperpolymath

Part of #446. STEP 2 of the top-50 bindings roadmap.

Goal

File 10 sub-issues for Tier 1 bindings (idaptik blockers). Each becomes its own scope-bounded work item that can be picked up independently.

Tier 1 contents

  1. PixiJS core (~Application + Container + Sprite minimal)
  2. PixiJS sound
  3. PixiJS UI
  4. Motion (Spine / tween)
  5. WASM-exports calling pattern — recommended kickoff; <1 day
  6. Phoenix Channels / WebSocket
  7. DOM (gated on affinescript#255 codegen bug)
  8. WebGL / Canvas2D
  9. IPC / postMessage for Gossamer
  10. Ajv coverage audit

Acceptance

Notes

The DOM binding (item 7) is blocked on affinescript#255 (wasm-codegen for-in/while bug); that's tracked separately.

Activity

  1. added
    bindingsABI, FFI, WASM, and cross-language interop surfaces
    tier-1AS bindings top-50 Tier 1 (idaptik blockers)
    on May 30, 2026
  2. hyperpolymath commented on May 31, 2026

    @hyperpolymath
    OwnerAuthor

    Tier 1 #10 — Ajv coverage audit (analysis-only)

    stdlib/Ajv.affine ships 2 extern types + 4 extern fns (16 lines). Audit against AJV v8 + ajv-formats v3 mainline surface.

    Currently bound

    AS extern AJV v8 binding
    ajv_new() new Ajv({allErrors:true, strict:false}) + addFormats(ajv)
    ajv_compile(a, schema) ajv.compile(JSON.parse(schema))
    ajv_validate(v, value) validator(JSON.parse(value)) // Bool
    ajv_errors_json(v) JSON.stringify(validator.errors)

    Sufficient for the named consumer

    The row note flags idaptik UMS pipeline (level config validation) as the canonical consumer. That pipeline shape is:

    init   → ajv_new + ajv_compile(level_schema)
    runtime → for each level: ajv_validate + (if !ok) ajv_errors_json
    

    The 4-extern surface covers this 100%. Treating row #10 status ◑ as "consumer-complete-but-narrow" rather than "broken-incomplete".

    Gaps surfaced for broader estate use

    For the wider estate use-cases mentioned in the row note (a2ml + schema work), the missing surface clusters around three axes:

    Multi-schema registry — for repos validating many schemas (hyperpolymath/standards, multi-doc workflow_audit, the a2ml suite):

    • ajv.addSchema(schema, key) — register named schema
    • ajv.getSchema(key) — retrieve compiled validator by key
    • ajv.removeSchema(key) — remove named schema
    • ajv.validate(schemaOrRef, data) — one-shot validate against a registered schema by ref

    Custom format / keyword extension — for a2ml's domain-specific format identifiers (a2ml:semver, a2ml:spdx-id, etc.) and the AI-MANIFEST shape:

    • ajv.addFormat(name, regex | fn) — register custom format
    • ajv.addKeyword({keyword, ...}) — register custom keyword

    Async compile (for $ref resolution) — for distributed schemas with HTTP-loaded $refs:

    • ajv.compileAsync(schema) — Promise

    Human-readable errors:

    • ajv.errorsText(errors, opts) — formatted error string (versus the JSON dump from ajv_errors_json)

    Estimate (if/when broader use lands)

    • Multi-schema registry: 4 externs + 4 codegen entries
    • Custom format/keyword: 2 externs (registering native AS lambdas as format/keyword callbacks needs the same opaque-Json-handler pattern as pixiContainerOn / messagePortOnMessage)
    • Async compile: 1 extern with / { Async } effect row
    • errorsText: 1 extern

    That's ~8 additional externs — modest, ship-when-needed. The current ◑ partial is accurate; the question for any future expansion is which consumer surfaces the need (drive by demand, not by pre-emptive coverage).

    Recommendation

    • Leave row ci: Bump erlef/setup-beam from 1.17.5 to 1.24.0 #10 at ◑ partial with the audit-result note that the consumer-complete-but-narrow state is intentional.
    • Open expansion sub-issues only when a specific estate consumer surfaces a need (a2ml custom keyword work would be the natural trigger).

    Refs #446 (Tier 1 umbrella), stdlib/Ajv.affine.

  3. added
    meta:campaignCoordinated multi-repo push with a defined end state
    and removed on Aug 26, 2026
  4. added
    scope:repoConfined to this repository
    status:readyFully specified and ready to be picked up
    feeds:valence-shellFeeds valence-shell's proofs/engineering (D127): judge progress by what it contributes there
    on Sep 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bindingsABI, FFI, WASM, and cross-language interop surfacesfeeds:valence-shellFeeds valence-shell's proofs/engineering (D127): judge progress by what it contributes theremeta:campaignCoordinated multi-repo push with a defined end statepriority:p2Normal - queue itscope:repoConfined to this repositorystatus:readyFully specified and ready to be picked uptier-1AS bindings top-50 Tier 1 (idaptik blockers)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions