|
1 | 1 | { |
2 | 2 | "schema": "p037-fact-shape/1", |
3 | 3 | "shape": "extension-receiver", |
4 | | - "status": "pending_a2", |
| 4 | + "status": "anchored", |
5 | 5 | "why": "A reduced extension method. Roslyn's reduced symbol drops `this` from Parameters while the summary lives on the UNREDUCED declaration, where the receiver is parameter 0.\n\nTwo things measured here, and the second was a surprise. (1) `CallReleasesReceiver` — the `ConsumesParam` consumer that handles this shape — is reached ONLY from two sites gated on `ThisFieldName(...)`: it is part of the FIELD disposal detector and never runs on a local. (2) Consequently `var s = ...; s.WaitForDispose(5);` is charged OWN001 even when the extension disposes its receiver UNCONDITIONALLY — verified with an unguarded probe, so it is not the guard doing it. That is a pre-existing false positive of exactly the family P-037 addresses (a first-party callee that releases, unrecognised), arriving through the RECEIVER rather than the argument. It is not A1's to fix and is recorded here so it is not mistaken for something A1 caused.", |
6 | 6 | "a2_contract": "a2 synthesises the receiver binding against the UNREDUCED declaration: receiver -> declared parameter 0, `timeout` -> declared parameter 1. Without it `CallReleasesReceiver` can never be honestly retired — the guarded summaries would be complete except for one old tunnel under the fence, on the field path where nobody is looking.", |
| 7 | + "a2_landed": "A2.1 landed the guarded-fact SIDECAR (`guarded_facts`, spec/OwnIR.md §5.2), not a body op: the legacy `body` stays authoritative through A2 and C+ canonicalizes the two views (docs/notes/p037-formal-kernel.md §10.3/§10.5). The `a2_expect` entries are this shape's contract, checked by name; `facts` pins the whole record byte for byte.", |
| 8 | + "a2_expect": [ |
| 9 | + { |
| 10 | + "function": "ShapeExtensionReceiver.Caller", |
| 11 | + "call": { |
| 12 | + "site": { |
| 13 | + "line": 23 |
| 14 | + }, |
| 15 | + "callee": "ShapeExtensionReceiver.WaitForDispose", |
| 16 | + "sig": "System.IO.Stream,System.Int32", |
| 17 | + "args": [ |
| 18 | + { |
| 19 | + "param": 0, |
| 20 | + "kind": "var", |
| 21 | + "name": "s" |
| 22 | + }, |
| 23 | + { |
| 24 | + "param": 1, |
| 25 | + "kind": "opaque" |
| 26 | + } |
| 27 | + ] |
| 28 | + } |
| 29 | + }, |
| 30 | + { |
| 31 | + "function": "ShapeExtensionReceiver.WaitForDispose", |
| 32 | + "guarded_facts": "absent" |
| 33 | + } |
| 34 | + ], |
7 | 35 | "measured_at": "464308b", |
8 | 36 | "facts": { |
9 | 37 | "ShapeExtensionReceiver.WaitForDispose": { |
|
16 | 44 | "body": [ |
17 | 45 | "if:None@14", |
18 | 46 | "then:release:self@16" |
19 | | - ] |
| 47 | + ], |
| 48 | + "guarded_facts": null |
20 | 49 | }, |
21 | 50 | "ShapeExtensionReceiver.Caller": { |
22 | 51 | "params": null, |
23 | 52 | "body": [ |
24 | 53 | "acquire:s@22", |
25 | 54 | "use:s@23" |
26 | | - ] |
| 55 | + ], |
| 56 | + "guarded_facts": { |
| 57 | + "version": 1, |
| 58 | + "calls": [ |
| 59 | + { |
| 60 | + "site": { |
| 61 | + "line": 23, |
| 62 | + "column": 9 |
| 63 | + }, |
| 64 | + "statement_line": 23, |
| 65 | + "form": "statement", |
| 66 | + "callee": "ShapeExtensionReceiver.WaitForDispose", |
| 67 | + "sig": "System.IO.Stream,System.Int32", |
| 68 | + "first_party": true, |
| 69 | + "args": [ |
| 70 | + { |
| 71 | + "param": 0, |
| 72 | + "kind": "var", |
| 73 | + "name": "s" |
| 74 | + }, |
| 75 | + { |
| 76 | + "param": 1, |
| 77 | + "kind": "opaque" |
| 78 | + } |
| 79 | + ] |
| 80 | + } |
| 81 | + ], |
| 82 | + "guards": [] |
| 83 | + } |
27 | 84 | } |
28 | 85 | }, |
29 | 86 | "verdict": { |
|
33 | 90 | "python": [ |
34 | 91 | "OWN001:warning@22" |
35 | 92 | ] |
36 | | - } |
| 93 | + }, |
| 94 | + "status_history": [ |
| 95 | + "pending_a2 (recorded at 464308b)", |
| 96 | + "anchored (A2.1 sidecar)" |
| 97 | + ] |
37 | 98 | } |
0 commit comments