Repository navigation
v2: a service operation call resolves to the operation's declaration path; no implicit prefix or parent scope (D13 b-pre) - #12961
Conversation
…ne; graft merges same-named marked bodies
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… could not type the matched edge) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…no implicit scope from a prefix or a parent module (D13 b-pre) Controls on source text through the real ingest, normalize and resolve: an importing module's s.F.Run() and s.E.Get() resolve to t.svc.s.F.Run and t.svc.s.E.Get; a call to an operation the service does not declare refuses; a module that does not import the service, and one nested under the service module's own path, cannot call it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…en dropped it as parse machinery); spine facts are warm-shared producers Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…inear), not a quadratic scan-and-rebuild Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ed parameter (emitter: no field 'target' on T) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…13-service-spine # Conflicts: # src/v2/compiler/body_lowering_fold.dag
…5-service-call-resolve # Conflicts: # src/v2/compiler/body_lowering_fold.dag
…tree's binding source Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… (linear); stale repeated_name_edges citations updated Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…se (import form resolves; absolute form resolves; reference carried) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… FreeMonoid branch) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ntyped and typed; a typed operation call) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…he per-Edge reverse/prepend copies; the member step is written over FreeMonoid<Edge> and reversed with list_reverse; specimen on carrier_alias_refuses_its_own_carriers_constructor Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… specimen (gunbc#12949) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ape (v2.std.logic, typed fns, full language model) plus a harness control; probes folded back Every probe, including an ordinary absolute fn call, failed: the harness, not the route, was wrong (empty-prelude model, untyped fns). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…13-service-spine # Conflicts: # src/v2/compiler/body_lowering_fold.dag # src/v2/workflow/floor_pure_producer_share.dag
…e corpus's form); empty-prelude model now that Bool comes from the fixture's logic module Run 36955283415: a fully qualified operation call resolves to the op path through the existing door (no new arm), and the harness control passes; the brace import of a namespace body did not bind, and the full language model put each claim near 360k steps. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…5-service-call-resolve
…ucer read by its claims (floor new-witness budget) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…esolve_node over an index symbol_index_fill builds from a spine-shaped root) The whole-module source resolve needs the full language model (the empty prelude fails even the ordinary-fn control) and costs ~360k eval steps per claim. The call form reaching the qualified door is already held end to end by reference_closure, and spine indexing by service_spine; these hold the door on an operation path and the scope bans: an op path resolves, two services under one prefix reach distinct ops, an undeclared op refuses, and neither an unimporting sibling nor a module nested under the service module reaches s.F.Run. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…R2c-ii lowered the io default Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…lified walk (side-chat P1, the nesting ban) symbol_index_fill marks each path that binds a marked namespace body (a service prefix; the module's own body is the fill's root, never a member) in SymbolIndex.namespace_bodies. symbol_index_lexical_collect collects no candidates at such a position and never answers with one, and still ascends to the module. Qualified paths stay indexed. Controls: bare sibling E and bare prefix s refuse from inside s.F.Run, qualified s.E and s resolve, module k still binds bare, and the recursive s.a.x / s.a.y case. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…5-service-call-resolve # Conflicts: # src/v2/test/claim/normalize/service_declaration_lowering_test.dag # src/v2/workflow/floor_pure_producer_share.dag
…-root fill (s -> t.svc.s import row), paired with the same caller without the row Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…an import binds the module: svc -> t.svc, call svc.s.F.Run) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…a service bare); rename the bare-prefix REDs so they claim nothing about import gating Per the lane owner: the only real route today is the qualified op path, and an absolute qualified path resolves with or without an import (pre-existing, being recorded as an RFM row). The two REDs are about the BARE prefix only, and are now named so. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…5-service-call-resolve
…machine intake) These 22 sites landed after the last roster-maintenance commit and were never rostered, so the corpus-read ratchet (nfr_roster_receipt, which runs on no CI path) never saw them. Totalling them here rather than rostering them. Skipped (mid-flight in open PRs, listed for follow-up): - src/v2/extdeps/languages/swift/rows.dag: swl_decl_has_body, swl_decl_is_import, swl_stmt_has_block (PRs #12942, #12799) - src/v2/extdeps/languages/dag.dag::dag_emit_text_step (PRs #12961, #12942, #12799) - src/v2/compiler/00_compile.dag: native_demand_collect_rows, native_demand_settled_label (PRs #12942, #12799) - dag/gunbc/approve_ios_swift_wire.dag::aw_sum (PR #12951) - dag/gunbc/bmc_megarac_web_transport.dag::megarac_web_transport_readiness (PRs #12951, #12691) - dag/gunbc/bmc_model.dag::bmc_event_eq (PR #12951)
|
This conflict comes from #12949. #12961 stacks on #12949's service-spine changes, and every conflicted file is one #12949 touches. #12949 itself conflicts with main in the same files. Once #12949 is updated against main, I'll merge its head and then main into this branch. #12961's own diff is the single claim module — sent from sleek-boar-665 |
…ms' hand root follows the EdgeLabel cut (Authored names, structural header edges) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
briansrls
left a comment
There was a problem hiding this comment.
APPROVE-MERGE at exact head 2d2302eefbea05e57370e7a7b7551812b401faeb.
No findings.
The one-file claim module is an adequate boundary proof for D13 b-pre; no resolver change is needed.
- The supplied declaration root reuses the production authorities that matter:
dag_surface_edgefor the post-EdgeLabel module metadata,namespace_graft_namespace_body_nodefor the marked service prefix,declared_signaturefor each operation Arrow, and the realsymbol_index_fill_module_root. Its indexed shape is thereforet.svc.s.F.Run/t.svc.s.E.Get, not a parallel dotted-label representation. soc_resolvesexecutes the realresolve_nodequalified-reference door. A unique exact-path candidate cannot merely be tolerated:try_resolve_qualified_name_nodesends the candidate's declaring path throughresolve_atom_bound, whose one producer mints a declaration-reference node at that path. Thet.svc.s.F.GetRED differs only by the absent operation and prevents a general accept/pass-through answer.- The compositional boundary is honest.
v2.test.claim.reference_closurealready executes a dotted call head end to end through parse, lowering and resolution; #12949 executes the real service-spine lowering/graft/index route; this module joins the existing qualified-reference door to an operation-shaped Arrow at the resulting path. Since functions and operations arrive at that door as the same declaration target shape, a second operation-call resolver or another 360k-step whole-module witness would be redundant. - The two shared-prefix positives and missing-operation RED distinguish the exact operation identity. The sibling/nested bare-prefix REDs preserve the operator's no implicit service-prefix or parent scope ruling without claiming import-gated absolute resolution; the existing
absolute_path_resolves_without_an_importRFM remains the correct owner of that separate defect.
Exact-head floor, generated, emit-build, and witnesses are green. Merge-queue landing only; the composed merge_group candidate must pass against then-current main. No direct merge or check bypass.
Stacked on #12949 (eager-heron-413's service spine). Until it lands this diff contains its commits.
Why
D13 step (b) derives a function's demand from the operations it calls, reading each callee operation's
^arrow_resource_requirements_edge. That needs a call to resolve to the operation's declaration. The key agreed with eager-heron-413 and approved by the lane owner is the per-segment spine<module>.<service segments...>.<Op>, which #12949 lands. This PR holds the call route against that key and retires the "v2 resolving service CALLS" trigger the spine named.What
No new resolver arm is needed, measured. On CI run 36955283415 (full language model), a fully qualified operation call
t.svc.s.F.Run()resolved end to end through ingest, normalize and resolve to the operation's declaration path, with a harness control (an ordinary absolute fn call) passing beside it. A call reaches the existing qualified-reference door with the op path; there is no second resolver. That run is the evidence, but it cannot be the enrolled claim: a whole-module source resolve costs about 360,000 eval steps per claim (the empty-prelude model fails even the control), five times the new-witness budget.So the enrolled claims sit at the resolve boundary, and each part of the route runs for real somewhere:
v2.test.claim.reference_closureresolvesv2.test.rc_dotted.rc_dotted_fn(p: p)end to end;v2.test.claim.normalize.service_spine(v2: a service lowers as a namespace spine; graft merges same-named namespace bodies (op path <module>.<service segments>.<Op>) #12949);v2.test.claim.resolve.service_operation_call, through the realresolve_nodeover an index that the realsymbol_index_fillbuilds from a module root of the spine's shape.Controls (
v2.test.claim.resolve.service_operation_call)t.svc.s.F.Runresolves, andt.svc.s.E.Getresolves: two services under one prefix reach distinct operations.t.svc.s.F.Get(an operation the service does not declare) refuses.s.F.Runresolves neither from a sibling module nor from a module nested under the service module's own path (t.svc.inner). Neither a merged namespace body nor a parent module path grants scope.What these claims do NOT say. Nothing here gates reaching an operation on an import. A fully qualified path resolves from any module, with or without an import; that is pre-existing qualified-path behaviour, which the lane owner is recording as its own RFM row. Imports never bind a service bare: a whole-module import binds only the module, qualified, and a brace import of a service refuses. So the only real route today is the qualified op path, which the claims above cover.
Not pursued: a brace import of a merged namespace body (
import t.svc { s }) does not bind. The corpus never writes that form; it writes whole-module imports, e.g.import extdeps.bmc.httpfollowed byredfish.Http.GetSystem(..).🤖 Generated with Claude Code