|
| 1 | +H-28-CMD: the DbCommand half of the `DataTable.Load(reader)` family. |
| 2 | + |
| 3 | +STATUS |
| 4 | + Final verdict: H28-PROVIDER-SPECIFIC, narrowly bounded to Npgsql 10.0.3/PostgreSQL 16 and |
| 5 | + Microsoft.Data.Sqlite 10.0.12. Required G1-G3 passed in PR workflow run #38048287923; its |
| 6 | + `h28-command-falsifier` artifact contains runtime logs, OwnIR facts, summaries and SARIF. This |
| 7 | + does not label OWN001 a false positive or establish a universal provider rule. Read |
| 8 | + docs/notes/h28-npgsql-command-resolution.md before interpreting any artifact. |
| 9 | + |
| 10 | + The original H-28 (research/ownership-semantics-lab-v1@298b305, not on main) settled |
| 11 | + `DataTable.Load(reader)` for a one-result reader: it IS closed (`RELEASE_IF_LAST_RESULT_SET`, |
| 12 | + not BORROW). That same record wrote down one sentence and never classified it: |
| 13 | + |
| 14 | + "what remains is the never-disposed DbCommand `cmd` (an object leak without a |
| 15 | + protocol consequence)" |
| 16 | + -- h28/scripts/h28_anchors_record.py, consequence_for_the_demanding_instance |
| 17 | + |
| 18 | + This directory records falsifiable source and runtime checks. It does not call OWN001 a false |
| 19 | + positive, claim a native leak on Npgsql, or propose a universal rule from these provider runs. |
| 20 | + |
| 21 | +LAYOUT |
| 22 | + fx/CommandDispose.cs nine C# methods (A/B/C/D + controls), using abstract ADO.NET types. |
| 23 | + G3 confirmed the expected finding anchors in workflow run #38048287923. |
| 24 | + fx/CommandDispose.own engine-only manual reduction. This is not C# extraction evidence. |
| 25 | + falsifier/Program.cs P1-P5 and G2/P6. P4 is isolated from P1-P3; P6 counts live SQLite |
| 26 | + statements via sqlite3_next_stmt, not RSS or forced GC. |
| 27 | + falsifier/h28cmd.csproj net8.0, Npgsql 10.0.3, Microsoft.Data.Sqlite 10.0.12; compiles |
| 28 | + both the falsifier and fx/CommandDispose.cs. |
| 29 | + falsifier/run_with_pgserver.py |
| 30 | + keeps the temporary pgserver alive while the .NET test runs. |
| 31 | + scripts/verify_g3.py production Roslyn -> OwnIR -> summaries -> core SARIF; exact expected |
| 32 | + finding anchors are checked, and all intermediate artifacts saved. |
| 33 | + scripts/derive_source_evidence.py |
| 34 | + re-fetches 44 upstream excerpts plus the Npgsql finalizer negative |
| 35 | + scan. Includes the SQLitePCLRaw opt-in required by sqlite3_next_stmt; |
| 36 | + TFM evidence confirms Npgsql 10.0.3 targets net8.0 and |
| 37 | + Microsoft.Data.Sqlite 10.0.12 has a netstandard2.0 asset usable by |
| 38 | + this net8.0 falsifier. Non-zero = drift. |
| 39 | + run.sh PASS/FAIL/SKIP driver. `all-required` fails on any SKIP. |
| 40 | + evidence/*.txt source excerpts with repository/ref/path/git blob sha/file sha256/ |
| 41 | + line range. Local engine output is saved. G3/runtime artifacts are |
| 42 | + produced in CI and attached to workflow run #38048287923. |
| 43 | + .github/workflows/h28-command-falsifier.yml |
| 44 | + runs `all-required` on the PR and preserves results as an artifact. |
| 45 | + |
| 46 | +GATES |
| 47 | + ./corpus/ownership-lab/h28-command/run.sh engine # Python only; current manual core pass |
| 48 | + ./corpus/ownership-lab/h28-command/run.sh g3-required # production extractor and core |
| 49 | + ./corpus/ownership-lab/h28-command/run.sh runtime-required # compile + provider runtime |
| 50 | + ./corpus/ownership-lab/h28-command/run.sh all-required # mandatory; SKIP is non-zero |
| 51 | + python3 corpus/ownership-lab/h28-command/scripts/derive_source_evidence.py |
| 52 | + |
| 53 | + Runtime dependencies: .NET 8 SDK, packages available from NuGet or already restored in cache, |
| 54 | + and PostgreSQL 16. The workflow installs pinned pgserver 0.1.4 from PyPI; locally either |
| 55 | + `pip install pgserver==0.1.4` or set H28_PG_DSN. There is no curl-only NuGet gate: the script attempts restore with |
| 56 | + `--ignore-failed-sources`, so a warm package cache can work offline. |
| 57 | + |
| 58 | +WHAT HAS RUN IN THE PRODUCING SANDBOX |
| 59 | + PASS: Python engine reduction, matching three manual OWN001 expectations; 33/33 real-world |
| 60 | + corpus cases; whole-tree Ruff; mypy (60 source files); 44 source excerpts + finalizer scan; |
| 61 | + Python/shell syntax checks, C# grammar parse (not compilation), and pgserver supervisor |
| 62 | + API/Unix-socket DSN preflight (not a .NET/provider falsifier). |
| 63 | + PASS IN CI: G1 build/P4, G2 native SQLite statement checks, P5 PostgreSQL prepared-state check, |
| 64 | + and G3 production C# extraction all passed in workflow run #38048287923. The exact |
| 65 | + artifact is attached to that run; local status metadata is evidence/ci-run-38048287923.txt. |
| 66 | + BLOCKED LOCALLY: this sandbox has no .NET SDK, so its `all-required` run returned 1 on G1/G2/G3 |
| 67 | + SKIPs; see evidence/required-gates-local.txt. |
| 68 | + INCOMPLETE: `python tests/run_tests.py` passed its early analysis/codegen checks, then stopped at |
| 69 | + checkpoint validation because this checkout is shallow and `cargo` is absent. It is |
| 70 | + not counted as a green full-suite run. See evidence/local-validation.txt. |
| 71 | + |
| 72 | +SCOPE |
| 73 | + No production analyzer code, OwnIR vocabulary, ownership semantics, or diagnostics are changed. |
| 74 | + The normal real-world corpus suite does not glob `corpus/ownership-lab/`; these are experiment |
| 75 | + fixtures. G3 now confirms the predicted extraction loss on this exact fixture. Any architecture |
| 76 | + follow-up, including #382, remains separate and is not proposed or implemented in this PR. |
0 commit comments