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

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