Is your feature request related to a problem? Please describe.
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.
Describe the solution you'd like
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:
Describe alternatives you've considered
Not stated in the original issue.
Additional context
Scope boundary
Tests and small matcher hardening only. No schema, no Neo4j, no rules-format change.
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/**
Is your feature request related to a problem? Please describe.
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.
Describe the solution you'd like
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,nsnot imported) as an in-project signature, so it escapes the counterHandler binding:
resolveHandlerbinds a bare identifier to the first callable of that name across the whole module — including class methods — soapp.get('/p', handler)can bind to a method namedhandlerdeclared earlier. Prefermod.functions(free functions) before any other callable.Convention note:
routeFromFileKey("pages/api/index.ts")→/api/indexwhere Next serves/api; decide whether index files collapse, and pin it either wayDescribe alternatives you've considered
Not stated in the original issue.
Additional context
Scope boundary
Tests and small matcher hardening only. No schema, no Neo4j, no rules-format change.
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 orundefined), not to parse morefiles:tier, which lands with feat(entrypoints): file-convention and manifest matchers, level invariance, closeout (unit 5) #161Definition of done
bun testgreen; no change torules.yml,SCHEMA_VERSION, orsrc/build/neo4j/**