Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ Per-row tagging is a scheduled follow-up sweep — **trigger:** post-merge of th
### P1 — fabrication / fail-open boundaries

- **http_path.dag `None => ""` fabrications**: `dsl/std/http_path.dag:37-69` silently normalizes malformed `{...}` segments to empty strings. Dissolution: parser returns `Option` / `Result`, caller handles.
- **effects.dag reconstructs `HttpMethod` and `PathTemplate` from strings**: `dsl/std/effects.dag:214-223, 270-287` reparses already-modeled structures. Dissolution: `derive_op_effect` parameterized by the typed transport declaration, not `(method_str, path_str)`.
- **effects.dag reconstructs `HttpMethod` and `PathTemplate` from strings**: ~~`dsl/std/effects.dag:214-223, 270-287` reparses already-modeled structures. Dissolution: `derive_op_effect` parameterized by the typed transport declaration, not `(method_str, path_str)`.~~ **Dissolved (gunbc#2470):** `derive_op_effect(operation_name, HttpMethod, PathTemplate)` is structural; `derive_op_effect_from_strings` parses once at the HTTP-string boundary.
- **`ResourceHandle` forgeable despite opacity claim**: `dsl/std/resources.dag:18-25` documents "only compiler's acquire nodes can mint these" but carries plain-record fields (user code can construct arbitrary handles). Dissolution: witness-carrier + private constructor, or typed opaque handle per Track 9 pattern.

### P2 — structural compression (biggest ROI)
Expand Down
2 changes: 1 addition & 1 deletion docs/audit/r3-debt-sweep-2026-05-06.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ Rust mirrors of `.dag` typed carriers that should dissolve when v3 evaluator aut
| CallGraph forward-only authority (illegal-state-representable in product) | C | brief: `r3-bug-callgraph-forward-only-authority-worker.md` | dispatch worker | YELLOW | brief #2373 | Substrate |
| `MissingEmissionPath` stringifies typed axes (connective/behavior/target as String) | C | gpt-5-5-pro Finding 1 | typed-carrier diagnostic boundary | YELLOW | PR #2358 | Substrate |
| `ComposedEffect { idempotent, breaking_operation }` illegal product | C | gpt-5-5-pro Finding 5 | sum-typed effect-composition carrier | YELLOW | PR #2358 | Substrate |
| `derive_op_effect(method_str, path_str)` string parser at structural boundary | C | gpt-5-5-pro Finding 6 | typed dispatch over Method × Path carriers | YELLOW | PR #2358 | Substrate |
| `derive_op_effect(method_str, path_str)` string parser at structural boundary | C | gpt-5-5-pro Finding 6 | typed `derive_op_effect(HttpMethod, PathTemplate)` + `derive_op_effect_from_strings` at HTTP boundary | GREEN (typed core + string bridge) | PR #2470 | Substrate |
| `EmitModelVariants` manually-enumerated cache (label-string mirror) | C | `dag.rs` EmitModelVariants | generate from `emit_model.dag` OR exhaustiveness ratchet | YELLOW | pre-R3 | Substrate |
| `EmissionDiagnostic` Rust mirror | C | `src/v3/compiler/src/diagnostics.rs` | v3 evaluator authoritative on diagnostic emission | YELLOW | pre-R3 | Substrate |
| `Value` Rust mirror | C | `src/v3/compiler/src/value.rs` | v3 evaluator value-domain authority | YELLOW | pre-R3 | Substrate |
Expand Down
2 changes: 1 addition & 1 deletion docs/audit/v3-comprehensive-debt-audit-2026-05-09.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ From PR #2358 §8 meta-finding cycle (3 sha windows: b09e0c8 / 1211e453 / cf1d52
| 3 | `Map<String, Bool>` as set across graph/syntax/node files (`set_has` ignores stored bool) | Class F — missed algebraic structure (Set<A> declared in std but bypassed) |
| 4 | `PartitionResult` bypassed by anonymous return type | Class G — small duplicate-authority cleanup |
| 5 | `ComposedEffect { idempotent, breaking_operation }` illegal product | Class C — illegal-state-representable |
| 6 | `derive_op_effect(method_str, path_str)` string parser at structural boundary | Class C — string-keyed dispatch over typed carriers |
| 6 | ~~`derive_op_effect(method_str, path_str)` string parser at structural boundary~~ — **resolved:** typed `derive_op_effect` + `derive_op_effect_from_strings` (gunbc#2470) | Class C — string-keyed dispatch over typed carriers |

### Source 5: 4 dispatched bug-fix briefs (PR #2373 merged; durable in docs/briefs/)

Expand Down
2 changes: 1 addition & 1 deletion docs/debt/r3-debt-paydown-ledger-2026-05-02.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ The highest concentration is in Substrate-adjacent rows: operator authority, val
| REST_OPS `CreateComment` test-table drift | 2026-04 | Grounding GitHub extdeps | Retired | Dissolved: extdep authority via `all_parsed_extdep_rest_ops()` consumed at `src/v2/tests/src/effects.rs:255`; ratchet at `effects.rs:524 create_comment_rest_path_matches_github_issues_comments_api` enforces `/issues/{issue_number}` path. ROADMAP P0 row removed. |
| `__BUG_NO_PROFILE_...` sentinel | 2026-04 | PB / fail-closed | Retired | Dissolved: `container_param_name_required` removed; `container_param_name` returns `String?` at `dsl/std/types.dag:103`; callers `match` the Option; sentinel literal absent from src/+dsl/; ratchet at `src/v2/tests/src/bug_sentinel_ratchet.rs`. ROADMAP P0 row removed. |
| `http_path.dag` `None => ""` | 2026-04 | Grounding / fail-closed | Open | Parser returns `Option` / `Result`. |
| `effects.dag` reparses typed transport from strings | 2026-04 | Grounding / effects | Open | `derive_op_effect` consumes typed transport declaration. |
| `effects.dag` reparses typed transport from strings | 2026-04 | Grounding / effects | Closed | gunbc#2470 — typed `derive_op_effect(HttpMethod, PathTemplate)`; strings only via `derive_op_effect_from_strings`. |
| Forgeable `ResourceHandle` | 2026-04 | Substrate resources | Open | Opaque/private constructor or witness-carrier handle. |
| Hand-rolled lattice instances | 2026-04 | Substrate + Verification | Open | Declare real algebra inhabitants or weaken claims; law witnesses close. |
| `languages.dag` vs per-target emit tables | 2026-04 | Grounding LanguageSpec | Open | Emit consumes `languages.dag`; per-target duplicates dissolve. |
Expand Down
42 changes: 25 additions & 17 deletions dsl/std/effects.dag
Original file line number Diff line number Diff line change
Expand Up @@ -232,14 +232,9 @@ type DerivedOpEffect {
shape: EffectShape
}

// 🟡 SCAFFOLD. This coproduct keeps the derivation boundary fail-closed while
// the caller surface still uses string inputs and has not yet been rewired to
// a shared typed compiler diagnostic/result boundary. Richer source exists:
// unknown-method and malformed-path failures should eventually surface through
// that single boundary-owned channel instead of through a local derivation enum.
// Dissolution trigger: the effect-derivation entrypoint stops returning local
// stringly boundary errors because callers consume typed transport facts and
// report failures through the shared compiler diagnostic/result carrier.
// Result of `derive_op_effect_from_strings` — HTTP surface parses strings once,
// then delegates to typed `derive_op_effect`. Unknown method / malformed path
// are transport-parse failures, not effect-shape derivation failures.
type DeriveOpEffectResult
= DerivedEffect { effect: DerivedOpEffect }
| UnknownHttpMethodInput { operation_name: String, method_str: String }
Expand Down Expand Up @@ -290,6 +285,20 @@ fn derive_effect_shape(
}

fn derive_op_effect(
operation_name: String,
method: HttpMethod,
path: PathTemplate
) -> DerivedOpEffect {
let shape = derive_effect_shape(method: method, path: path)
DerivedOpEffect {
operation_name: operation_name,
method: method,
path_template: path,
shape: shape
}
}

fn derive_op_effect_from_strings(
operation_name: String,
method_str: String,
path_str: String
Expand All @@ -302,15 +311,14 @@ fn derive_op_effect(
}
Some { value: method } => {
match parse_path_template(raw: path_str) {
ParsedPathTemplate { template: path } => {
let shape = derive_effect_shape(method: method, path: path)
DerivedEffect { effect: DerivedOpEffect {
operation_name: operation_name,
method: method,
path_template: path,
shape: shape
} }
}
ParsedPathTemplate { template: path } =>
DerivedEffect {
effect: derive_op_effect(
operation_name: operation_name,
method: method,
path: path
)
}
MalformedPathTemplate { raw: raw_path, segment: segment, reason: reason } =>
MalformedPathInput {
operation_name: operation_name,
Expand Down
3 changes: 2 additions & 1 deletion src/v2/effect_derivation.dag
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import std.effects {
parse_http_method,
derive_effect_shape,
derive_op_effect,
derive_op_effect_from_strings,
check_modifier_vs_derivation,
generate_idempotency_obligations,
is_idempotent_effect,
Expand All @@ -38,7 +39,7 @@ fn re_export_derive_op_effect(
method_str: String,
path_str: String
) -> DeriveOpEffectResult {
derive_op_effect(
derive_op_effect_from_strings(
operation_name: operation_name,
method_str: method_str,
path_str: path_str
Expand Down
Loading