Skip to content

nav: finalize Klickweg structure parity — menu-rooted connectivity (Odoo #66 parity) + ERB↔Odoo synergy/drift finding#94

Merged
AdaWorldAPI merged 1 commit into
mainfrom
claude/klickweg-menu-root-parity
Jul 8, 2026
Merged

nav: finalize Klickweg structure parity — menu-rooted connectivity (Odoo #66 parity) + ERB↔Odoo synergy/drift finding#94
AdaWorldAPI merged 1 commit into
mainfrom
claude/klickweg-menu-root-parity

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

Cross-frontend Klickweg parity

ruff #66 gave Odoo a two-shape navigates_to whose data-side <menuitem> records emit a synthetic menu rootmenu → res_model edges that give nav_is_fully_connected its entry points, so "connected" means every screen is reachable from the menu. op-nexgen's top nav (nav::menu) is the identical structure but wasn't wired into the connectivity graph (NAV_ROOT was a screen, ProjectWorkItem). This brings op to parity.

Menu-rooted connectivity (the render-side twin of Odoo's menuitem roots)

  • MENU_UNIVERSE (synthetic Menu node + served screens), MENU_ROOT, MENU_NAV_EDGES (Menu → each tab-target + the inter-screen NAV_EDGES lifted +1), menu_screens_mask, menu_target_concept (inverse of route_for for menu hrefs), menu_klickweg_is_connected().
  • Strictly stronger than the screen-only check: it catches a menu-orphan screen — one that exists and is inter-linked but has no top-nav click-path — which klickweg_is_connected() would pass. Same Core brick (nav_is_fully_connected), same "menu gives entry points" shape as Odoo.
  • menu_nav_edges_match_derived pins MENU_NAV_EDGES against menu() + NAV_EDGES (no drift); menu_klickweg_is_fully_connected proves reachability; boot affirms both layers and resolves every menu tab to a served screen.
  • The render-side screen graph (SCREEN_UNIVERSE / NAV_EDGES / render masks) is unchanged — the menu universe is a separate connectivity graph, so the synthetic node never pollutes a render-mask position.

ERB ↔ Odoo synergy/drift finding

.claude/findings/2026-07-08-erb-vs-odoo-klickweg-synergy-drift.md maps the ERB (Ruby, the arms op consumes) vs Odoo (Python) harvests:

  • 6 synergies: one Predicate::NavigatesTo; one ViewFieldSet/ViewTarget type (odoo_views literally use crate::templates::… — the same types); one from_universe_present mask mint (ERB/askama/Jinja/OdooXML = four renderers, one brick); two-shape nav; honest denominator; menu roots.
  • 6 principled divergences: receiver- vs record-scoping · plural-tolerant vs exact match · per-file vs cross-file join · framework nav idiom · the C#-only selects_view plane · Odoo's meta/arch split.
  • op-relevant lesson (D3): op's harvest is per-file; the cross-file menu join is what it'll need when the real OpenProject corpus lands (the deferred real-corpus arc — also the trigger to regenerate NAV_EDGES from harvest).

Also

Rebases the ruff pins to main b5fde66 (#67 odoo_views relation-hop + tokenizer fixes — ruff_python_spo-only, behavior-inert for op, bumped for consistency).

Tests

op-server nav:: 9/9 (2 new menu-rooted); full op-server + op-codegen-pipeline + ruff_openproject 79/79. New code clippy-clean.

🤖 Generated with Claude Code


Generated by Claude Code

…doo #66 parity) + ERB↔Odoo synergy/drift finding + ruff #67 rebase

Cross-frontend parity. ruff #66 gave Odoo a two-shape navigates_to whose
data-side <menuitem> records emit a SYNTHETIC MENU ROOT — menu → res_model
edges that give nav_is_fully_connected its entry points, so "connected"
means every screen is reachable FROM THE MENU. op-nexgen's top nav
(nav::menu) is the identical structure but was not wired into the
connectivity graph; NAV_ROOT was a screen (ProjectWorkItem). This brings
op to parity:

- MENU_UNIVERSE (synthetic `Menu` node + served screens), MENU_ROOT,
  MENU_NAV_EDGES (Menu → each tab-target, + the inter-screen NAV_EDGES
  lifted +1), menu_screens_mask, menu_target_concept (inverse of
  route_for for menu hrefs), menu_klickweg_is_connected().
- The menu-rooted check is STRONGER than the screen-only one: it catches
  a menu-orphan screen (exists + inter-linked but no top-nav click-path)
  that klickweg_is_connected() would pass. Same Core brick
  (nav_is_fully_connected), same "menu gives entry points" shape as
  Odoo's menuitem roots.
- menu_nav_edges_match_derived pins MENU_NAV_EDGES against menu() +
  NAV_EDGES (no drift); menu_klickweg_is_fully_connected proves
  reachability. Boot affirms BOTH layers + resolves every menu tab to a
  served screen.

The render-side screen graph (SCREEN_UNIVERSE / NAV_EDGES / render masks)
is UNCHANGED — the menu universe is a separate connectivity graph so the
synthetic node never pollutes a render-mask position.

Finding: .claude/findings/2026-07-08-erb-vs-odoo-klickweg-synergy-drift.md
maps the ERB (Ruby, consumed by op) vs Odoo (Python) arms — 6 synergies
(one predicate, one ViewFieldSet type literally shared, one mask mint,
two-shape nav, honest denominator, menu roots) and 6 principled
divergences (receiver- vs record-scoping, plural-tolerant vs exact match,
per-file vs cross-file join, framework nav idiom, selects_view plane,
meta/arch split). op-relevant lesson: D3 cross-file join, needed when the
real OpenProject corpus enters the harvest.

Also rebases the ruff pins to main b5fde66 (#67 odoo_views relation-hop +
tokenizer fixes — ruff_python_spo-only, behavior-inert for op, bumped for
consistency).

Tests: op-server nav:: 9/9 (2 new menu-rooted), full op-server + pipeline
+ ruff_openproject 79/79. New code clippy-clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U9t3fRwXmPC6tCpMtnfTrM
@AdaWorldAPI AdaWorldAPI merged commit 2f06876 into main Jul 8, 2026
@cursor

cursor Bot commented Jul 8, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_b0af6b0c-c595-44fd-ab7d-a206152ae8ec)

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.

2 participants