diff --git a/dag/gunbc/recurring_failure_mode/service_operation_declared_twice.dag b/dag/gunbc/recurring_failure_mode/service_operation_declared_twice.dag new file mode 100644 index 00000000000..a115188854e --- /dev/null +++ b/dag/gunbc/recurring_failure_mode/service_operation_declared_twice.dag @@ -0,0 +1,20 @@ +module gunbc.recurring_failure_mode.service_operation_declared_twice + +import std.types { NonEmptyStr } +import std.decl_ref { DeclarationRef, WholeDeclaration } +import gunbc.recurring_failure_mode { RecurringFailureMode } + +data service_operation_declared_twice: RecurringFailureMode = RecurringFailureMode { + identity: "service_operation_declared_twice" as NonEmptyStr, + + receipts: [ + "INVALID STATE: one `service` declares two operations with the same name. v1 accepts it silently and keeps the later declaration, so the earlier operation is unreachable by name and one spelling carries two contracts -- a DESIGN section 3 meaning fork, not a style issue.", + "SPECIMEN: `dag/extdeps/bmc/http.dag` `redfish.Http` declared `GetManager` twice: a `/redfish/v1/Managers/{manager_id}` read added for the Mt. Jade first contact (gunbc#11758), and a fixed `/redfish/v1/Managers/bmc` read that `gunbc.fleet.fleet_health_observe` calls (gunbc#11681). v1 kept the later declaration, so the id form was dead by name from the day it landed. The source repair (still-swift-387's gen-two residue PR) deletes the fixed form and has its one consumer pass `manager_id: bmc`, leaving one operation with the id as a parameter.", + "FOUND BY: the first full gen-two census (srv1, gen-one `emit --entry v2.compiler.compile` over a combine including gunbc#12277), where v2's declaration-grade service lowering produced two identically labelled operation edges and the module refused. gunbc#12277 makes that refusal located at the second declaration under its own cause, `body_lowering_reason_service_operation_repeated`.", + "RUNG FOUND AT: mitigated on the v2 route (a located census refusal); SILENT on the v1 route, which is the harm. CEILING: structurally guaranteed -- no accepted program declares an operation name twice in one service. NEXT-RUNG TRIGGER, NAMING THE CAPABILITY: v1 refuses a service that declares an operation name twice, OR the v1 seed is retired so the v2 route is the only one that accepts service declarations; either makes every accepted service's operation names unique.", + ], + + evidence: [ + DeclarationRef { module_path: "v2.test.claim.normalize.service_declaration_lowering", decl_name: "a_repeated_operation_name_refuses_located_RED", field: WholeDeclaration }, + ], +}