Skip to content

Entrypoint pass detects zero entrypoints in Odoo; PyEntrypointReport is not projected to Neo4j #177

Description

@rahlk

Found while validating the CLDK python-sdk 2.0 Python leg against a live Neo4j projection of odoo-slim-19.0.0 (2,364 files) emitted by codeanalyzer-python 1.4.0.

Observation

The entrypoint pass detects nothing on Odoo:

MATCH (c:PyCallable) RETURN c.is_entrypoint, count(*)
FALSE  15549

MATCH (c:PyClass) RETURN c.is_entrypoint, count(*)
FALSE  1656

Zero entrypoints across 15,549 callables and 1,656 classes, in a framework whose entire public surface is HTTP routes. Odoo controllers are @http.route-decorated methods on classes deriving from http.Controller — for example addons/account_payment/controllers/payment.py::PaymentPortal.invoice_transaction.

Possibly related: only 81 :PyDecorator nodes exist for those 15,549 callables, which also looks low for a codebase using @api.model, @api.depends and @http.route pervasively.

Why this matters more than a missing convenience

Entrypoints are the source set for reachability. A consumer walking forward from sources to sinks treats an undetected entrypoint as a source that does not exist — so every sink reachable only from it is reported unreachable, and a real finding is dismissed as a false positive. The failure is silent and directional: an omission produces no error, just a smaller cone.

PyEntrypointReport's own docstring anticipates exactly this: "The pass under-approximates by design, so silence is its failure mode… What makes a gap visible instead of indistinguishable from 'this project has no entrypoints'." On this application, silence is the whole output.

Two asks, in priority order

  1. Project PyEntrypointReport into the Neo4j graph. It is emitted in the JSON path but no :PyApplication property or node carries it, so a Neo4j consumer cannot distinguish "no entrypoints" from "the pass found nothing". The SDK now returns an entrypoint_report_unavailable diagnostic over Neo4j for precisely this reason — it can only say "I cannot tell you".
  2. Detect Odoo-style controllers, or record in the report why they were skipped. Related: Framework-independent entrypoint detection (JackEE-style finders) #27 (framework-independent entrypoint finders).

Even without (2), (1) turns a silent wrong answer into a visible gap — which is the distinction the report was designed to draw.

Reproduction

canpy -i odoo-slim-19.0.0 --emit neo4j --neo4j-uri bolt://… --app-name odoo-slim-19 --skip-tests --no-venv

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions