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:
- 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.
- 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
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::ActionInvocationandlower_screen_jump(&KlickwegEdge) -> NavWitness. A 5+3 council + alayer-boundary-wardenpass (verdict: COMPILE-TIME-CLEAN) explicitly held that a2ui-rs must NOT mint its ownnav_witnessedpredicate string constant, and must not stamp an SPO triple, because: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.ogar-emitter::emit_action_invocation(crates/ogar-emitter/src/lib.rs:774).So a2ui-rs's
lower_screen_jumpreturns a plainNavWitnessvalue ({ from_concept, predicate, seq }), derived purely from the edge — no const, no triple.The ask (OGAR-side, small)
Define one canonical
nav_witnessedvocabulary term in OGAR so both ends of the Klickwege navigation-witness plane reference a single source of truth:pub const NAV_WITNESSED: &strinogar-vocabor the appropriateogar-emittervocabulary home) — the string an SPO framing of a witnessed navigation would use.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
nav_witnessedfollow-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