Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions dag/gunbc/floor_memory_instrumentation_seed_growth.dag
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,20 @@ data floor_memory_instrumentation_seed_growth_justification: SeedGrowthJustifica
DeclarationRef { module_path: "v1_compiler.cli_run.floor_memory_supervisor", decl_name: "beat_field", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.cli_run.floor_memory_supervisor", decl_name: "transcribe_floor_beats", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.target_invocation_host", decl_name: "floor_phase_attribution_rendered", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.cli_run.required_floor_runner", decl_name: "WarmFrameSlot", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.cli_run.required_floor_runner", decl_name: "order_warm_modules", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.cli_run.required_floor_runner", decl_name: "floor_warm_row_identity", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.v1_interpreter", decl_name: "CROSS_CLAIM_LAST_STORE_DIGEST", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.v1_interpreter", decl_name: "take_cross_claim_store_digest", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.cli_run.entry_resolve", decl_name: "TypedModuleClass", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.cli_run.entry_resolve", decl_name: "ExclusiveBytesReading", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.cli_run.entry_resolve", decl_name: "typed_module_class_exclusive_bytes", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.target_invocation_host", decl_name: "run_typed_graph_exclusive_bytes", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.target_invocation_host", decl_name: "run_typed_graph_exclusive_bytes_floor_subject", field: WholeDeclaration },
DeclarationRef { module_path: "v1_compiler.target_invocation_host", decl_name: "typed_graph_exclusive_bytes_over", field: WholeDeclaration }
],
reason: "WHY RUST: the subjects are host objects the modeled substrate cannot hold. The census and the byte attribution read the resolver's typed graph -- TypedModule, TypeEnv and their Rc identity -- which exists only as host values while the v1 seed typechecks; no .dag carrier names a TypedModule or an allocation, and the allocator's live bytes (glibc mallinfo2) are a host reading with no modeled observation. The beat transcription reads a child's stderr and lifts decimal text to integers, which the interpreter cannot do (it registers string_contains and string_length only, gunbc.observation_emit_census). WHAT IS IN .dag: every judgment the instrumentation makes -- which seam a token is, what the held set is, where a phase begins, what a reading refuses on -- is gunbc.floor_demand floor_phase_attribution; the Rust reads and transcribes. prepared_graph_without_typecheck_caches is the one change that is not instrumentation: it ends a typecheck cache's lifetime at the strict resolve's return, a §2 lifetime fix on the floor's route. WHY ADMITTED AGAINST THE v1 FREEZE (gunbc.v1_maintenance_standing v1_seed_standing): by PURPOSE -- it measures and trims the required floor's memory on the v2 self-host path. It adds no language behaviour, no compatibility obligation, no escape hatch or admission row, and no capability the seed lacked; the floor's verdicts are unchanged, and the instrumentation only reads and frees what the floor frees anyway.",
reason: "WHY RUST: the subjects are host objects the modeled substrate cannot hold. The census and the byte attribution read the resolver's typed graph -- TypedModule, TypeEnv and their Rc identity -- which exists only as host values while the v1 seed typechecks; no .dag carrier names a TypedModule or an allocation, and the allocator's live bytes (glibc mallinfo2) are a host reading with no modeled observation. The beat transcription reads a child's stderr and lifts decimal text to integers, which the interpreter cannot do (it registers string_contains and string_length only, gunbc.observation_emit_census). WHAT IS IN .dag: every judgment the instrumentation makes -- which seam a token is, what the held set is, where a phase begins, what a reading refuses on -- is gunbc.floor_demand floor_phase_attribution; the Rust reads and transcribes. WarmFrameSlot is a lifetime change on the same route: the pure-producer warm holds one module frame at a time instead of every producer module frame at once, so freed frames stop growing the allocator arena that set the floor peak; floor_warm_row_identity and the store digest it reads (CROSS_CLAIM_LAST_STORE_DIGEST, take_cross_claim_store_digest) print one (producer, portable digest) line per warmed producer, the producer-grain differential between floor runs. prepared_graph_without_typecheck_caches is the one change that is not instrumentation: it ends a typecheck cache's lifetime at the strict resolve's return, a §2 lifetime fix on the floor's route. WHY ADMITTED AGAINST THE v1 FREEZE (gunbc.v1_maintenance_standing v1_seed_standing): by PURPOSE -- it measures and trims the required floor's memory on the v2 self-host path. It adds no language behaviour, no compatibility obligation, no escape hatch or admission row, and no capability the seed lacked; the floor's verdicts are unchanged, and the instrumentation only reads and frees what the floor frees anyway.",
owning_dissolution_lane: "v1-hand-queue-drain" as RoadmapNodeId,
trigger: "Two capabilities, each retiring its half. (1) The census and byte-attribution half (entry_resolve and required_floor_runner declarations) deletes when the typed graph the floor prepares is a VALUE a .dag fold holds -- the v2 self-hosted typecheck producing its typed modules in the substrate -- together with a modeled allocator observation (a live-bytes reading bound to its host realization), so that the census and attribution become folds over that value and the allocator reading becomes an observation, not a host call. A rewrite that keeps the walk in Rust behind a .dag wrapper does not satisfy it. The leave-one-out half (TypedModuleClass, ExclusiveBytesReading, typed_module_class_exclusive_bytes and the two typed-graph-exclusive-bytes host producers) retires with (1): its meaning is already gunbc.typed_graph_exclusive_bytes, and the host part is the same drop-and-read over the same host value. (2) The transcription half (floor_memory_supervisor FloorBeatLine through transcribe_floor_beats, and floor_phase_attribution_rendered) deletes on the trigger already declared at gunbc.floor_demand floor_beat_reading_primitive_boundary: the interpreter's argument surface admitting a constructed std.measure value, plus string parsing sufficient to read a beat line, so the fold reads the heartbeat directly. prepared_graph_without_typecheck_caches dissolves when the typed module no longer carries a typecheck-time cache past its importers' typecheck, which is a representation fact the per-module TypeEnv design owns.",
current_boundary: "src/v1/stage0/src/cli_run/entry_resolve.rs (floor_retention_census, wiring_identity, process_resolve_store_graphs, the byte attribution and its arming); src/v1/stage0/src/cli_run/required_floor_runner.rs (floor_retained_census, its seam calls, the parse-index handover and the fold's last-scope drop); src/v1/stage0/src/cli_run.rs (prepared_graph_without_typecheck_caches); src/v1/stage0/src/cli_run/floor_memory_supervisor.rs (stderr tee and beat transcription); src/v1/stage0/src/target_invocation_host.rs (floor_phase_attribution_rendered); dag/gunbc/floor_memory_instrumentation_seed_growth.dag"
trigger: "Two capabilities, each retiring its half. (1) The census and byte-attribution half (entry_resolve and required_floor_runner declarations) deletes when the typed graph the floor prepares is a VALUE a .dag fold holds -- the v2 self-hosted typecheck producing its typed modules in the substrate -- together with a modeled allocator observation (a live-bytes reading bound to its host realization), so that the census and attribution become folds over that value and the allocator reading becomes an observation, not a host call. A rewrite that keeps the walk in Rust behind a .dag wrapper does not satisfy it. The leave-one-out half (TypedModuleClass, ExclusiveBytesReading, typed_module_class_exclusive_bytes and the two typed-graph-exclusive-bytes host producers) retires with (1): its meaning is already gunbc.typed_graph_exclusive_bytes, and the host part is the same drop-and-read over the same host value. (2) The transcription half (floor_memory_supervisor FloorBeatLine through transcribe_floor_beats, and floor_phase_attribution_rendered) deletes on the trigger already declared at gunbc.floor_demand floor_beat_reading_primitive_boundary: the interpreter's argument surface admitting a constructed std.measure value, plus string parsing sufficient to read a beat line, so the fold reads the heartbeat directly. WarmFrameSlot dissolves on its frontier row in gunbc.resolver_cost_frontier (the demand-sized frame consuming the declarer pool of PR-2); the warm-row digest line dissolves with the census half above. prepared_graph_without_typecheck_caches dissolves when the typed module no longer carries a typecheck-time cache past its importers' typecheck, which is a representation fact the per-module TypeEnv design owns.",
current_boundary: "src/v1/stage0/src/cli_run/entry_resolve.rs (floor_retention_census, wiring_identity, process_resolve_store_graphs, the byte attribution and its arming); src/v1/stage0/src/cli_run/required_floor_runner.rs (floor_retained_census, its seam calls, the parse-index handover and the fold's last-scope drop); src/v1/stage0/src/cli_run.rs (prepared_graph_without_typecheck_caches); src/v1/stage0/src/cli_run/floor_memory_supervisor.rs (stderr tee and beat transcription); src/v1/stage0/src/target_invocation_host.rs (floor_phase_attribution_rendered); src/v1/stage0/src/v1_interpreter.rs (CROSS_CLAIM_LAST_STORE_DIGEST, take_cross_claim_store_digest); src/v1/stage0/src/cli_run/required_floor_runner.rs (WarmFrameSlot, order_warm_modules, floor_warm_row_identity); dag/gunbc/floor_memory_instrumentation_seed_growth.dag"
}
5 changes: 5 additions & 0 deletions dag/gunbc/resolver_cost_frontier.dag
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ data resolver_cost_frontier_rows: List<FrontierRow> = [
reason: "every gunbc run demands the full heads reading (tokenize plus heads parse) of every pool file: the module path index is its first demander and pool_parse projects the same memoized reading for the pool name set, the closure name census and the tree bare census. Narrowing the index to module declarations alone would move this cost to pool_census_parse, not remove it, while those whole-pool consumers stay eager. Measured by the gunbc run pre-entry rows graph_facts_import_edges and pool_census_parse (gunbc#12864). For whoever takes M1: the index also refuses a malformed item head anywhere in the pool, a second authority for what run_dag_parse_sweep owns in required CI, but the CLI and local routes do not run the sweep, so retiring that refusal is an authority question to settle per route, not a cost one",
dissolution: unbound_dissolution(description: "demand identity for 'this name, in this closure' exists as a carrier (docs/plans/demand-engine-program.md M1), so no consumer of a closure run demands a whole-pool heads reading and the module path index can read module declarations alone"),
),
frontier_row_path(
path: "src/v1/stage0/src/cli_run/required_floor_runner.rs",
reason: "the pure-producer warm builds and drops one WHOLE-CLOSURE evaluation frame per producer module (WarmFrameSlot), held one at a time so the freed frames no longer grow the allocator arena, while a warm reads only a small share of the frame index (the frame-demand reading on gunbc#12890). Holding them one at a time moved their drop into the warm and costs more per frame than holding them together: a CPU residual on the floor accepted as a stated trade against the peak saving (gunbc#12890, lane manager selection of 2026-10-01)",
dissolution: unbound_dissolution(description: "the demand-sized frame consumes the (name, namespace) declarer pool of PR-2 (docs/plans/type-env-single-authority-design.md): a runtime scope resolves each demanded name from the pool-level declarer index that surface_pool_admit admits in the runtime-item namespace, so no frame materializes the indexes of its whole closure"),
),
frontier_row_path(
path: "src/v1/stage0/src/cli_run/pool_acquire.rs",
reason: "HeadsReading.module is retained for the process: every MultiEntryIndex whose pool contains the file projects it, and a run builds its indexes on demand by phase routing, so no release point is known when the first census projects it (gunbc#12768)",
Expand Down
Loading