Skip to content

Canonical nav_witnessed vocabulary term — one source of truth for the Klickwege navigation-witness plane (assembler owns vocabulary) #210

Description

@AdaWorldAPI

Context (from the #209 lowering, a2ui-rs side)

The #209 Klickwege lowering shipped in a2ui-rs (a2ui_server::lowering): lower_action_fire(&KlickwegEdge, u16) -> ogar_vocab::ActionInvocation and lower_screen_jump(&KlickwegEdge) -> NavWitness. A 5+3 council + a layer-boundary-warden pass (verdict: COMPILE-TIME-CLEAN) explicitly held that a2ui-rs must NOT mint its own nav_witnessed predicate string constant, and must not stamp an SPO triple, because:

  • It would erase the compile/runtime split. ogar-emitter::emit_do_adapters(classes, nav_witnessed: &BTreeSet<String>) (crates/ogar-emitter/src/do_adapter.rs:46) is a codegen-time gate over a set of witnessed concept names; a runtime SPO predicate would be a different shape at a different phase. They share only the English name today.
  • Assembler owns vocabulary (F2). Minting a predicate string used in an SPO fact shape is an OGAR-owned decision, not a consumer's. SPO emission from an invocation is already OGAR's ogar-emitter::emit_action_invocation (crates/ogar-emitter/src/lib.rs:774).

So a2ui-rs's lower_screen_jump returns a plain NavWitness value ({ from_concept, predicate, seq }), derived purely from the edge — no const, no triple.

The ask (OGAR-side, small)

Define one canonical nav_witnessed vocabulary term in OGAR so both ends of the Klickwege navigation-witness plane reference a single source of truth:

  1. A canonical predicate/const (e.g. pub const NAV_WITNESSED: &str in ogar-vocab or the appropriate ogar-emitter vocabulary home) — the string an SPO framing of a witnessed navigation would use.
  2. Reconcile it with the existing emit_do_adapters(nav_witnessed: &BTreeSet<String>) gate so the codegen-time witness set and any runtime/emission-time predicate are documented as two phases of the same navigation-witness concept, referencing one name — not two coincidentally-equal string literals.

Non-goals / boundary

  • No a2ui-rs change is required by this issue — a2ui-rs already does the doctrine-clean thing (a value, not a const). When/if this canonical term lands, a consumer can reference it downstream; until then nothing is blocked.
  • This is the nav_witnessed follow-up recorded in a2ui-rs .claude/plans/a2ui-reusable-client-and-209-lowering-v3.md (change-ledger row A2) and the session handover.

🤖 Generated with Claude Code

https://claude.ai/code/session_01UZmHUePVbVXjHJWoBmABiZ

Activity

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions