Problem
The final whole-branch review of the entrypoint work (units 2-5, PRs #156/#158/#160/#161) triaged a
set of Minor findings as "defer to a follow-up issue" — none blocks merge, all share one theme:
coverage gaps and raw-source-text seams in the matchers. Collected here so they are tracked, not lost.
Scope boundary
Tests and small matcher hardening only. No schema, no Neo4j, no rules-format change.
Goals
Coverage (each is a few lines; the code paths exist and were verified by inspection or probe):
Raw-text literal decoding seam (literalOf/routeOf read source fragments, not an AST):
Handler binding:
Convention note:
Caveats and known risks
Definition of done
- Every checkbox above has a test that fails against the current code where a behaviour changes, and
passes after
bun test green; no change to rules.yml, SCHEMA_VERSION, or src/build/neo4j/**
Problem
The final whole-branch review of the entrypoint work (units 2-5, PRs #156/#158/#160/#161) triaged a
set of Minor findings as "defer to a follow-up issue" — none blocks merge, all share one theme:
coverage gaps and raw-source-text seams in the matchers. Collected here so they are tracked, not lost.
Scope boundary
Tests and small matcher hardening only. No schema, no Neo4j, no rules-format change.
Goals
Coverage (each is a few lines; the code paths exist and were verified by inspection or probe):
app/x/route.tsexportingGETand callingapp.get('/x', GET)in the same file (afiles:claim on the handler)entrypointsFromBases:transitive: falsemust not walk; emptydispatch: []yields only the class recordpackage.jsonwith UNRELATED dependencies (proves the gate keys on the name,not on manifest presence)
Raw-text literal decoding seam (
literalOf/routeOfread source fragments, not an AST):literalOfsplits a[…]list on bare,, so['a,b']loses the elementrouteOfsetsroutefrom an array-valued positional viafirstString()(spec wording says "a string")isSignature(unresolved counter) classifies a lowercase-headed dotted spelling (ns.Thing,nsnotimported) as an in-project signature, so it escapes the counter
Handler binding:
resolveHandlerbinds a bare identifier to the first callable of that name across the whole module —including class methods — so
app.get('/p', handler)can bind to a method namedhandlerdeclaredearlier. Prefer
mod.functions(free functions) before any other callable.Convention note:
routeFromFileKey("pages/api/index.ts")→/api/indexwhere Next serves/api; decide whetherindex files collapse, and pin it either way
Caveats and known risks
literalOfis documented as deliberately narrow; widening it toward AST-grade decoding is out of scope —the fix is to fail visibly (count or
undefined), not to parse morefiles:tier, which lands with feat(entrypoints): file-convention and manifest matchers, level invariance, closeout (unit 5) #161Definition of done
passes after
bun testgreen; no change torules.yml,SCHEMA_VERSION, orsrc/build/neo4j/**