From 7804f1e87de4e659af073296ad83ab40b2b0c920 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 1 Sep 2026 14:16:41 +0000 Subject: [PATCH] map(test): classify chaos/diod HEAD and open issues vs XFAIL Pin diod-regression to chaos/diod de51d1ee (still master HEAD) and record every open upstream issue/PR against the harness known-fail allow-list. None of those items currently require a new machine-parsed XFAIL FAIL line; t0011/t0013 remain v9fs/test#28. Include an offline inventory checker and a comment-only product patch for later landing on v9fs/test. Co-authored-by: Eric Van Hensbergen --- docs/ledgers/README.md | 1 + docs/ledgers/diod-upstream-open-issues.json | 139 ++++++++++++++++++ docs/ledgers/diod-upstream.md | 93 ++++++++++++ docs/ledgers/diod-xfail-snapshot.txt | 19 +++ docs/ledgers/experiment-log.md | 2 +- docs/ledgers/risk-ledger.md | 1 + .../patches/v9fs-test-diod-upstream/README.md | 9 ++ .../patches/v9fs-test-diod-upstream/xfail.txt | 56 +++++++ docs/plans/diod-upstream-known-fail.md | 100 +++++++++++++ docs/reports/README.md | 1 + docs/reports/diod-upstream-known-fail.md | 59 ++++++++ scripts/check-diod-upstream-inventory.sh | 131 +++++++++++++++++ 12 files changed, 610 insertions(+), 1 deletion(-) create mode 100644 docs/ledgers/diod-upstream-open-issues.json create mode 100644 docs/ledgers/diod-upstream.md create mode 100644 docs/ledgers/diod-xfail-snapshot.txt create mode 100644 docs/patches/v9fs-test-diod-upstream/README.md create mode 100644 docs/patches/v9fs-test-diod-upstream/xfail.txt create mode 100644 docs/plans/diod-upstream-known-fail.md create mode 100644 docs/reports/diod-upstream-known-fail.md create mode 100755 scripts/check-diod-upstream-inventory.sh diff --git a/docs/ledgers/README.md b/docs/ledgers/README.md index b45b050..dfff9e6 100644 --- a/docs/ledgers/README.md +++ b/docs/ledgers/README.md @@ -15,6 +15,7 @@ Keep only the records that answer a real project question: | `experiment-log.md` | Which hypothesis was tested, what happened, and when should it rerun? | | `risk-ledger.md` | Which trigger could harm the project, and what evidence closes it? | | `methodology-ledger.md` | Which operating-method review occurred, what changed, and what triggers the next one? | +| `diod-upstream.md` | Is harness diod current, and are open chaos/diod issues classified against `diod/xfail.txt`? | Do not duplicate assignees, issue state, PR state, or labels without an explicit synchronization reason and authority rule. diff --git a/docs/ledgers/diod-upstream-open-issues.json b/docs/ledgers/diod-upstream-open-issues.json new file mode 100644 index 0000000..857a179 --- /dev/null +++ b/docs/ledgers/diod-upstream-open-issues.json @@ -0,0 +1,139 @@ +{ + "captured_at": "2026-09-01T14:20:00Z", + "diod_repo": "https://github.com/chaos/diod", + "diod_head": "de51d1ee1bd5ccf1d8c16b96227c8bb03ec50106", + "diod_head_date": "2026-06-23T21:18:16Z", + "diod_head_subject": "Merge pull request #173 from erentar/fix-gcc15", + "harness_repo": "https://github.com/v9fs/test", + "harness_sha": "e896a9b2db1e87dfeaaa1bb0208568469c8172c3", + "harness_run": 33511542559, + "harness_run_url": "https://github.com/v9fs/test/actions/runs/33511542559", + "harness_subset": [ + "t0010-v9fs-runasuser.t", + "t0011-v9fs-allsquash.t", + "t0012-v9fs-multiuser.t", + "t0013-v9fs-acl.t", + "t0020-dbench.t", + "t0021-postmark.t" + ], + "eval": { + "fail_lines": 16, + "xfail_baseline": 16, + "unexpected": 0 + }, + "note": "GitHub issues list/search for chaos/diod returns only open PRs. Enumerate by number. Do not treat search completeness as coverage.", + "open_items": [ + { + "number": 31, + "kind": "pull", + "title": "use read() for sequential reads on fd", + "html_url": "https://github.com/chaos/diod/pull/31", + "updated_at": "2016-11-22T07:36:19Z", + "disposition": "feature-stale-pr" + }, + { + "number": 35, + "kind": "issue", + "title": "RLERROR doesn't work across architectures", + "html_url": "https://github.com/chaos/diod/issues/35", + "updated_at": "2022-06-02T04:57:33Z", + "disposition": "not-exercised-arch" + }, + { + "number": 53, + "kind": "issue", + "title": "Very slow over SSH port forwarding", + "html_url": "https://github.com/chaos/diod/issues/53", + "updated_at": "2019-04-05T15:42:19Z", + "disposition": "operational" + }, + { + "number": 59, + "kind": "issue", + "title": "[Question] Performance bottleneck for large files", + "html_url": "https://github.com/chaos/diod/issues/59", + "updated_at": "2021-10-09T09:01:57Z", + "disposition": "operational" + }, + { + "number": 90, + "kind": "issue", + "title": "Support OFD locks?", + "html_url": "https://github.com/chaos/diod/issues/90", + "updated_at": "2022-06-15T01:41:10Z", + "disposition": "feature" + }, + { + "number": 91, + "kind": "pull", + "title": "Implement locking with OFD locks when present.", + "html_url": "https://github.com/chaos/diod/pull/91", + "updated_at": "2022-06-15T09:40:46Z", + "disposition": "feature-stale-pr" + }, + { + "number": 138, + "kind": "issue", + "title": "add tests for Tremove/Trename", + "html_url": "https://github.com/chaos/diod/issues/138", + "updated_at": "2025-05-02T21:15:38Z", + "disposition": "coverage-gap" + }, + { + "number": 140, + "kind": "issue", + "title": "Performance factors (and how to debug low throughput)", + "html_url": "https://github.com/chaos/diod/issues/140", + "updated_at": "2025-05-19T16:21:51Z", + "disposition": "operational" + }, + { + "number": 148, + "kind": "issue", + "title": "vsock support", + "html_url": "https://github.com/chaos/diod/issues/148", + "updated_at": "2025-10-26T23:51:10Z", + "disposition": "feature" + }, + { + "number": 162, + "kind": "issue", + "title": "possible memory leak", + "html_url": "https://github.com/chaos/diod/issues/162", + "updated_at": "2025-11-25T17:15:52Z", + "disposition": "operational" + }, + { + "number": 163, + "kind": "issue", + "title": "diod_getlock: user@host:/path: Invalid argument", + "html_url": "https://github.com/chaos/diod/issues/163", + "updated_at": "2025-11-25T18:15:49Z", + "disposition": "coverage-gap" + }, + { + "number": 164, + "kind": "issue", + "title": "diod server: infinite loop", + "html_url": "https://github.com/chaos/diod/issues/164", + "updated_at": "2025-12-15T16:22:43Z", + "disposition": "not-exercised-arch" + }, + { + "number": 165, + "kind": "pull", + "title": "WIP libdiod: fix readdir problem on 32 bit server", + "html_url": "https://github.com/chaos/diod/pull/165", + "updated_at": "2025-12-03T16:35:15Z", + "disposition": "not-exercised-arch" + }, + { + "number": 166, + "kind": "issue", + "title": "t0001-basic-runasuser.t tries to execute from source tree as nobody", + "html_url": "https://github.com/chaos/diod/issues/166", + "updated_at": "2025-12-12T16:30:59Z", + "disposition": "not-in-subset" + } + ] +} diff --git a/docs/ledgers/diod-upstream.md b/docs/ledgers/diod-upstream.md new file mode 100644 index 0000000..8b13580 --- /dev/null +++ b/docs/ledgers/diod-upstream.md @@ -0,0 +1,93 @@ +# diod upstream vs known-fail + +Disjoint ledger for the diod-currency / known-fail inventory (this slice). +Do not edit `evidence-map.md` or `proof-ledger.md` here: PR +[#2](https://github.com/v9fs/agent-team/pull/2) owns E0003–E0006 on +`scaffold/1-map-tip-xfails`. After that lands, copy E0007 / P0003 into the +main tables. + +## Evidence + +| ID | Domain | Evidence source | Version | Relevant boundary | Constraints | Audit state | Next action | +| --- | --- | --- | --- | --- | --- | --- | --- | +| E0007 | diod upstream | https://github.com/chaos/diod | HEAD `de51d1ee1bd5ccf1d8c16b96227c8bb03ec50106` (2026-06-23, still HEAD 2026-09-01) | Open issues/PRs vs `v9fs/test` `diod/xfail.txt` and harness subset | GitHub list/search omits non-PR issues; enumerate by number. Harness clones `DIOD_REF=master` `--depth 1`. | Mapped | Re-pin when HEAD moves or `open_items` change | +| E0008 | harness known-fail | https://github.com/v9fs/test `diod/xfail.txt` + run [33511542559](https://github.com/v9fs/test/actions/runs/33511542559) | harness `e896a9b2db1e87dfeaaa1bb0208568469c8172c3`; eval `unexpected: 0` (16/16) | TESTS= t0010 t0011 t0012 t0013 t0020 t0021 | XFAIL rows are t0011/t0013 (`v9fs/test#28`), not chaos/diod issues. Comments in `xfail.txt` are ignored by eval. | Mapped | Land comment inventory on `v9fs/test` when that write scope is free | + +## Proof + +| ID | Claim | Evidence | Level | Exact proof | Non-claims | Next gap | +| --- | --- | --- | --- | --- | --- | --- | +| P0003 | diod-regression already builds chaos/diod HEAD; every open chaos/diod issue/PR is classified against the harness known-fail surface; none currently require a new machine-parsed XFAIL FAIL line | E0007, E0008 | Mapped + Static | `scripts/check-diod-upstream-inventory.sh`; run 33511542559 `unexpected: 0` | No diod or kernel fix; no new FAIL rows; Debian `apt` diod (`diod-9p2000.L`) is not in CI; floating `DIOD_REF=master` is not a SHA pin | Product PR on `v9fs/test` to copy comments into `diod/xfail.txt`; optional `DIOD_REF` SHA pin | + +## Currency (2026-09-01) + +- chaos/diod last push: 2026-06-23 (~70 days). Nothing newer to bump. +- Latest tag: `v1.1.0` (2025-11-02). `master` is ahead (gcc 15 fix #173). +- Harness CI built `/workspaces/tmp/diod-build-de51d1e-mount-helper-v12` on run 33511542559. +- Unused fork `v9fs/diod` last push 2022-12-04. Not used by prepare. + +`scripts/v9fs-prepare-diod-regression` clones `https://github.com/chaos/diod` +`DIOD_REF=master`. That is current, but it is a floating ref, not a recorded SHA. + +## Known-fail surface + +`v9fs-diod-regression-eval` treats `diod/xfail.txt` as the set of allowed +FAIL/ERROR strings. Comments (`#`) are dropped. Adding synthetic FAIL rows for +issues that do not fail the subset would hide a real regression or never match. + +Harness `TESTS=` subset (from `scripts/v9fs-build-initrd`): + +```text +t0010-v9fs-runasuser.t +t0011-v9fs-allsquash.t +t0012-v9fs-multiuser.t +t0013-v9fs-acl.t +t0020-dbench.t +t0021-postmark.t +``` + +t0001–t0006, t0022–t0025, t1000 are **not** run. Current XFAIL FAIL lines are +only t0011 allsquash and t0013 ACL (`v9fs/test#28`). + +## Disposition vocabulary + +| Token | Meaning | +| --- | --- | +| `xfail-fail-line` | Produces a FAIL/ERROR string in the subset that belongs in `xfail.txt` | +| `subset-pass` | Exercised by the subset and PASSed on the pinned run | +| `not-in-subset` | diod has a test, harness `TESTS=` does not run it | +| `not-exercised-arch` | Needs a 32-bit server or mixed-arch errno; CI is arm64/arm64 | +| `coverage-gap` | Real report, no matching subset assertion | +| `operational` | Perf/leak/throughput; no FAIL assertion | +| `feature` / `feature-stale-pr` | Enhancement or unmerged PR, not a current FAIL | + +Zero open items are `xfail-fail-line`. + +## Open chaos/diod items (14) + +| ID | Kind | Title | Disposition | Why the harness known-fail list does not grow | +| --- | --- | --- | --- | --- | +| [31](https://github.com/chaos/diod/pull/31) | PR | use read() for sequential reads on fd | feature-stale-pr | 2016 pread-vs-read workaround for special files. No subset FAIL. | +| [35](https://github.com/chaos/diod/issues/35) | issue | RLERROR doesn't work across architectures | not-exercised-arch | Guest and diod are both arm64. t0013 EOPNOTSUPP 95 is same-arch (`v9fs/test#28`), not this bug. | +| [53](https://github.com/chaos/diod/issues/53) | issue | Very slow over SSH port forwarding | operational | Suite uses unix sockets in-guest, not SSH. | +| [59](https://github.com/chaos/diod/issues/59) | issue | Performance bottleneck for large files | operational | No throughput gate in diod-regression. | +| [90](https://github.com/chaos/diod/issues/90) | issue | Support OFD locks? | feature | Protocol/feature request. t0010 flock PASSed (steps 21–24) on run 33511542559. | +| [91](https://github.com/chaos/diod/pull/91) | PR | Implement locking with OFD locks | feature-stale-pr | Unmerged 2022. Same as #90. | +| [138](https://github.com/chaos/diod/issues/138) | issue | add tests for Tremove/Trename | coverage-gap | Kernel prefers Tunlinkat/Trenameat. Missing diod tests, not a harness FAIL. | +| [140](https://github.com/chaos/diod/issues/140) | issue | Performance factors / low throughput | operational | No perf assertion. | +| [148](https://github.com/chaos/diod/issues/148) | issue | vsock support | feature | Harness uses virtio-9p hostshare + unix diod. | +| [162](https://github.com/chaos/diod/issues/162) | issue | possible memory leak | operational | No RSS measurement. | +| [163](https://github.com/chaos/diod/issues/163) | issue | diod_getlock EINVAL (sqlite) | coverage-gap | t0010 flock PASSed; sqlite `getlock` is a different path, not in `TESTS=`. Do not XFAIL flock. | +| [164](https://github.com/chaos/diod/issues/164) | issue | diod server: infinite loop | not-exercised-arch | 32-bit `long` truncates readdir `d_off`. CI server is arm64. | +| [165](https://github.com/chaos/diod/pull/165) | PR | WIP fix readdir on 32-bit server | not-exercised-arch | Proposed fix for #164; unmerged. Not a 64-bit FAIL. | +| [166](https://github.com/chaos/diod/issues/166) | issue | t0001 nobody exec from source tree | not-in-subset | t0001 is not in harness `TESTS=`. | + +Pinned snapshot: `docs/ledgers/diod-upstream-open-issues.json`. +FAIL-line snapshot: `docs/ledgers/diod-xfail-snapshot.txt`. + +## Product follow-up (v9fs/test) + +This forge cannot push `v9fs/test`. Ready copy is +`docs/patches/v9fs-test-diod-upstream/`. Land comments only; do not add FAIL +rows. Optional later: pin `DIOD_REF` to `de51d1ee1bd5ccf1d8c16b96227c8bb03ec50106` +instead of floating `master`. diff --git a/docs/ledgers/diod-xfail-snapshot.txt b/docs/ledgers/diod-xfail-snapshot.txt new file mode 100644 index 0000000..5678a58 --- /dev/null +++ b/docs/ledgers/diod-xfail-snapshot.txt @@ -0,0 +1,19 @@ +# Snapshot of v9fs/test diod/xfail.txt at harness +# e896a9b2db1e87dfeaaa1bb0208568469c8172c3 (2026-09-01). +# Machine-parsed FAIL lines only (comments dropped by v9fs-diod-regression-eval). +t0011-v9fs-allsquash.t :: root can create a directory, mode 755 +t0011-v9fs-allsquash.t :: nobody can create a directory, mode 755 +t0011-v9fs-allsquash.t :: nobody cannot create a file in nobody directory +t0011-v9fs-allsquash.t :: user can create a file in rootdir +t0011-v9fs-allsquash.t :: user can create a file in nobodydir +t0011-v9fs-allsquash.t :: user can chmod 777 nobody directory +t0011-v9fs-allsquash.t :: exited with status 1 +t0011-v9fs-allsquash :: automake error/timeout +t0013-v9fs-acl.t :: create a test file and setfacl -m u:root:r +t0013-v9fs-acl.t :: getfacl confirms ACL is set +t0013-v9fs-acl.t :: it is set on the server too +t0013-v9fs-acl.t :: getfacl confirms ACL is unset +t0013-v9fs-acl.t :: it is unset on the server too +t0013-v9fs-acl.t :: create a test directory and setfacl -d -m u:root:r +t0013-v9fs-acl.t :: exited with status 1 +t0013-v9fs-acl :: automake error/timeout diff --git a/docs/ledgers/experiment-log.md b/docs/ledgers/experiment-log.md index a509d26..00c8be9 100644 --- a/docs/ledgers/experiment-log.md +++ b/docs/ledgers/experiment-log.md @@ -2,7 +2,7 @@ | ID | Date | Hypothesis | Method | Result | Artifact | Decision/claim affected | Rerun trigger | GitHub issue/PR | | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| X0001 | | | | Planned | | | | | +| X0001 | 2026-09-01 | GitHub issue list/search for chaos/diod returns the full outstanding set | `issues?state=open`, `search/issues?q=repo:chaos/diod+is:open`, then GET issues 1–173 | Search/list showed 3 open PRs only; numbered GET found 14 open items (11 issues + 3 PRs). Highest-risk misses: #163, #164, #166 | `docs/ledgers/diod-upstream-open-issues.json` | P0003 inventory must not trust search completeness | chaos/diod `open_issues_count` changes or HEAD moves | this PR | Record rejected ideas and failed experiments when they prevent a later agent from repeating the same work without new evidence. diff --git a/docs/ledgers/risk-ledger.md b/docs/ledgers/risk-ledger.md index f613aa9..62f7f98 100644 --- a/docs/ledgers/risk-ledger.md +++ b/docs/ledgers/risk-ledger.md @@ -4,6 +4,7 @@ | --- | --- | --- | --- | --- | --- | --- | --- | --- | | R0001 | GitHub labels from one family stack instead of replacing | Issue or PR carries two `status:*`, `proof:*`, or `review:*` values | Workflow state is ambiguous; closeout lies | Agents replace family values; HOST.md forbids exclusivity bots in this edition | Orchestrator | Open | Option C exclusivity helper after the named trigger, or zero collisions across five landed slices | | | R0002 | GitHub-native enforcement lands inside an unrelated slice | CODEOWNERS, YAML issue forms, rulesets, or native reviews become process authority without a B/C issue | Dual-host split (B) requires ripping host policy out of the process core | HOST.md non-claims; D0001 revisit triggers | Orchestrator | Open | B or C opened as its own methodology/scaffold issue, or explicit keep after review | | +| R0003 | Floating `DIOD_REF=master` changes diod-regression without a harness pin | chaos/diod `master` moves, or a new open issue FAILS the TESTS= subset | Silent XFAIL drift or an unexpected FAIL attributed to v9fs | Inventory in `docs/ledgers/diod-upstream.md`; comment-only product patch; optional SHA pin | CI/proof owner | Open | Product PR pins SHA or inventory re-run when HEAD or open issue count changes | this PR | Do not use this as a generic concern list. Each open risk needs a trigger, mitigation owner, and evidence that would close or downgrade it. diff --git a/docs/patches/v9fs-test-diod-upstream/README.md b/docs/patches/v9fs-test-diod-upstream/README.md new file mode 100644 index 0000000..097c645 --- /dev/null +++ b/docs/patches/v9fs-test-diod-upstream/README.md @@ -0,0 +1,9 @@ +# Proposed v9fs/test patch: diod upstream vs known-fail + +Copy `xfail.txt` over `diod/xfail.txt` on `v9fs/test`. Comments only; FAIL +rows are unchanged so `v9fs-diod-regression-eval` stays `unexpected: 0`. + +Do not merge this from `v9fs/agent-team`. Open a product PR when that write +scope is free. Optional follow-up in the same product PR: set +`DIOD_REF=de51d1ee1bd5ccf1d8c16b96227c8bb03ec50106` in +`scripts/v9fs-prepare-diod-regression` instead of floating `master`. diff --git a/docs/patches/v9fs-test-diod-upstream/xfail.txt b/docs/patches/v9fs-test-diod-upstream/xfail.txt new file mode 100644 index 0000000..b7bcff0 --- /dev/null +++ b/docs/patches/v9fs-test-diod-upstream/xfail.txt @@ -0,0 +1,56 @@ +# Known failures (XFAIL) for diod sharness suite when running under the +# v9fs/test guest-direct QEMU harness (virtio hostshare mount). +# +# Format: one entry per line, matching the strings parsed from diod's +# t/test-suite.log: +# +# :: +# +# Keep this list minimal and update it intentionally when behavior changes. +# Comment lines are ignored by scripts/v9fs-diod-regression-eval. +# +# t0010 runasuser ACCESS_SINGLE / root-negative assertions are expected to PASS +# when the suite runs as non-root `v9fs` with v9fs-mount-9p. +# +# Currency: diod-regression clones chaos/diod DIOD_REF=master. Pinned HEAD +# de51d1ee1bd5ccf1d8c16b96227c8bb03ec50106 (2026-06-23 gcc15 #173; still tip +# 2026-09-01). Harness TESTS= subset is t0010 t0011 t0012 t0013 t0020 t0021. +# +# Open chaos/diod items vs this allow-list (none currently add FAIL rows): +# #31 PR sequential read() for special files — feature-stale-pr, not in subset +# #35 RLERROR errno across architectures — not-exercised-arch (CI is arm64/arm64) +# #53 slow over SSH port forward — operational; suite uses unix sockets +# #59 large-file throughput question — operational +# #90 OFD locks feature — t0010 flock PASSed; OFD is unimplemented enhancement +# #91 PR OFD locks — feature-stale-pr (2022) +# #138 add Tremove/Trename tests — coverage-gap in diod; kernel uses unlinkat +# #140 low throughput debug — operational +# #148 vsock support — feature; harness is virtio-9p + unix diod +# #162 possible memory leak — operational; no RSS gate +# #163 diod_getlock EINVAL (sqlite) — coverage-gap; t0010 flock is not this path +# #164 infinite readdir loop — not-exercised-arch (32-bit server d_off truncation) +# #165 WIP PR fix for #164 — not-exercised-arch +# #166 t0001 nobody exec from source tree — not-in-subset (t0001 not in TESTS=) +# Full inventory: v9fs/agent-team docs/ledgers/diod-upstream.md +# Revisit when chaos/diod HEAD moves or open issue count changes. + +# allsquash identity mapping gaps under guest harness (v9fs/test#28, not a +# chaos/diod issue) +t0011-v9fs-allsquash.t :: root can create a directory, mode 755 +t0011-v9fs-allsquash.t :: nobody can create a directory, mode 755 +t0011-v9fs-allsquash.t :: nobody cannot create a file in nobody directory +t0011-v9fs-allsquash.t :: user can create a file in rootdir +t0011-v9fs-allsquash.t :: user can create a file in nobodydir +t0011-v9fs-allsquash.t :: user can chmod 777 nobody directory +t0011-v9fs-allsquash.t :: exited with status 1 +t0011-v9fs-allsquash :: automake error/timeout + +# posixacl / setfacl residuals on tip (v9fs/test#28, not a chaos/diod issue) +t0013-v9fs-acl.t :: create a test file and setfacl -m u:root:r +t0013-v9fs-acl.t :: getfacl confirms ACL is set +t0013-v9fs-acl.t :: it is set on the server too +t0013-v9fs-acl.t :: getfacl confirms ACL is unset +t0013-v9fs-acl.t :: it is unset on the server too +t0013-v9fs-acl.t :: create a test directory and setfacl -d -m u:root:r +t0013-v9fs-acl.t :: exited with status 1 +t0013-v9fs-acl :: automake error/timeout diff --git a/docs/plans/diod-upstream-known-fail.md b/docs/plans/diod-upstream-known-fail.md new file mode 100644 index 0000000..29d0157 --- /dev/null +++ b/docs/plans/diod-upstream-known-fail.md @@ -0,0 +1,100 @@ +# Work Slice Plan + +## Summary + +- Slice: Pin chaos/diod HEAD used by `v9fs/test` diod-regression and classify + every open chaos/diod issue/PR against the harness known-fail list +- Human outcome: an engineer can see that our diod is current `master` HEAD + and that outstanding diod bugs are either already outside XFAIL FAIL lines + or explicitly not exercised +- Evidence version: chaos/diod `de51d1ee1bd5ccf1d8c16b96227c8bb03ec50106` + (2026-06-23, still HEAD 2026-09-01); harness + `e896a9b2db1e87dfeaaa1bb0208568469c8172c3`; Actions + [33511542559](https://github.com/v9fs/test/actions/runs/33511542559) +- Target component/API/artifact: this forge's diod-upstream ledger + inventory + checker; proposed comment patch for `v9fs/test` `diod/xfail.txt` +- GitHub milestone: M0 - Bootstrap (parallel to #1; does not implement t0011/t0013) +- GitHub issue: not created (token cannot POST issues); this PR is the slice +- GitHub PR: this branch +- Branch: `cursor/diod-upstream-known-fail-c9a7` +- Authority level/exceptions: A2; no merge to `v9fs/linux`; no write to + `v9fs/test` (no push); do not edit files owned by PR #2 +- Owner: evidence mapper / implementer (this slice) +- Independent reviewer: distinct from creator +- Date: 2026-09-01 + +## Scope + +- In scope: pin diod SHA vs floating `master`; enumerate all 14 open + chaos/diod issues/PRs; classify each vs `diod/xfail.txt` and the harness + `TESTS=` subset; add an offline inventory checker; ship a comment-only + product patch for later landing +- Explicit non-claims: no chaos/diod, kernel, or harness behavior change; no + new XFAIL FAIL rows; t0011/t0013 remain `v9fs/test#28` (PR #2); Debian + packaged diod is not in the CI matrix; `diod-9p2000.L` not claimed +- Required dependencies: public chaos/diod + v9fs/test; run 33511542559 logs +- Deferred dependencies: product PR on `v9fs/test`; copy E0007/P0003 into + main ledgers after PR #2 lands; optional `DIOD_REF` SHA pin + +## Backlog Context + +| Rank | GitHub issue | Outcome | Dependency/proof boundary | Why next | Stop/defer rule | +| --- | --- | --- | --- | --- | --- | +| 1 | agent-team#1 / PR #2 | Map t0011 vs t0013 | Unmapped → Mapped | M0 first vertical | Do not implement | +| parallel | this PR | diod HEAD + upstream issues vs XFAIL | Mapped + Static | User request; disjoint from #1 files | Stop if an open diod issue actually FAILS the subset and is missing from xfail | +| later | v9fs/test product PR | Comment inventory in `diod/xfail.txt` | Static on test repo | Needs test-repo write | Do not add FAIL rows | + +## Evidence Map + +| Source/spec/runtime/data | Version | Purpose | Constraint | Target | +| --- | --- | --- | --- | --- | +| chaos/diod `master` | `de51d1ee1bd5ccf1d8c16b96227c8bb03ec50106` | Server + sharness source | Floating `DIOD_REF=master` | E0007 | +| Open chaos/diod issues/PRs | 14 items, numbered GET 1–173 | Outstanding upstream | Search/list APIs omit non-PR issues | E0007 | +| v9fs/test xfail + subset | `e896a9b2`; run 33511542559 | Known-fail machine list | Eval ignores `#` comments | E0008 | + +## Design + +- Public interface: `docs/ledgers/diod-upstream.md` + JSON snapshot + checker +- Ownership/state boundaries: do not touch PR #2 paths; do not push `v9fs/test` +- Invariants: FAIL-line snapshot matches current `xfail.txt` parsed rows; every + open issue ID is named in the ledger +- Failure and rollback handling: inventory is documentation; eval behavior unchanged +- Compatibility/migration behavior: comment-only product patch is additive +- Observability: checker fails if an open ID is dropped from the ledger + +## Proof Plan + +| Level | Command or artifact | Expected discriminating result | +| --- | --- | --- | +| Static | `scripts/check-scaffold.sh` | Scaffold still valid | +| Static | `scripts/check-diod-upstream-inventory.sh` | All 14 IDs present; none marked `xfail-fail-line`; FAIL snapshot has 16 t0011/t0013 rows only | +| Mapped | `docs/ledgers/diod-upstream.md` | Another agent can restate currency + dispositions without chat | +| Integration | not in this slice | Product landing on v9fs/test later | + +Plausible wrong mechanism and the observation that rejects it: + +> The inventory would fail if we treated GitHub search (3 open PRs) as the +> full outstanding set, because numbered GET finds 11 more open issues +> including #163 and #164. It would also fail if we added those issues as +> XFAIL FAIL lines: run 33511542559 has `unexpected: 0` with only t0011/t0013 +> strings, and t0010 flock steps 21–24 PASS. + +## Team Orchestration + +| Role | Agent/thread | GitHub issue | Read scope | Write scope | Required output | Integration order | +| --- | --- | --- | --- | --- | --- | --- | +| Orchestrator | ericvh | this PR | both product repos | workflow state | keep disjoint from PR #2 | first/last | +| Evidence mapper | this slice | this PR | chaos/diod, v9fs/test, CI | this forge diod-upstream files | inventory + checker | before product PR | +| Implementer | this slice | this PR | | this forge only | commit + verification | | +| Independent reviewer | distinct | this PR | full PR | review note only | decision/findings | after coherent PR | +| CI/proof owner | v9fs/test | run 33511542559 | pipeline | none this slice | `unexpected: 0` | already landed | +| State closer | after review | this PR | GitHub + records | state rows | landed reconciliation | last | + +## Exit Criteria + +- [x] Evidence, authority, dependencies, and write scopes are explicit. +- [x] Target behavior and non-claims are bounded. +- [x] Proof rejects search-only enumeration and synthetic XFAIL rows. +- [ ] Required review and approval are complete. +- [x] Follow-ups have bounded dispositions (product comment PR; ledger merge after #1). +- [ ] GitHub and durable evidence agree after landing. diff --git a/docs/reports/README.md b/docs/reports/README.md index fcac9ff..363d974 100644 --- a/docs/reports/README.md +++ b/docs/reports/README.md @@ -6,6 +6,7 @@ surface harder to read. - `agent-loops/`: optional PR-local agent, steering, context-boundary, or cost reports tied to a named measurement question. - `methodology/`: evidence matrices and appendices for operating-method reviews. +- `diod-upstream-known-fail.md`: chaos/diod HEAD pin and open-issue vs XFAIL classification. Do not store credentials, tokens, cookies, secret-bearing session URLs, or raw reasoning. Prefer compact, reproducible evidence and link it once from GitHub. diff --git a/docs/reports/diod-upstream-known-fail.md b/docs/reports/diod-upstream-known-fail.md new file mode 100644 index 0000000..a12be02 --- /dev/null +++ b/docs/reports/diod-upstream-known-fail.md @@ -0,0 +1,59 @@ +# Report: diod currency and known-fail coverage + +Human appendix for the diod-upstream inventory. Live claim: +`docs/ledgers/diod-upstream.md`. + +## What we checked + +1. Is `v9fs/test` diod-regression on a reasonably current chaos/diod? +2. Are outstanding chaos/diod issues visible to the harness known-fail list? + +## Currency + +`scripts/v9fs-prepare-diod-regression` clones `https://github.com/chaos/diod` +at `DIOD_REF=master` (depth 1) and builds it. Harness CI run +[33511542559](https://github.com/v9fs/test/actions/runs/33511542559) +(2026-09-01) produced `diod-build-de51d1e-mount-helper-v12`. + +That SHA is chaos/diod HEAD: + +- `de51d1ee1bd5ccf1d8c16b96227c8bb03ec50106` 2026-06-23 "Merge pull request #173 from erentar/fix-gcc15" +- No newer commits on `master` as of 2026-09-01 +- Tag `v1.1.0` is 2025-11-02; `master` is ahead of the tag +- Fork `v9fs/diod` (2022) is not used + +There is nothing to bump. The remaining gap is that `master` is floating: a +later chaos/diod push would change CI without a harness pin. + +`diod-9p2000.L` installs distro `apt` diod. That suite is **not** in Harness CI +(`ci.yml` matrix is smoke/fsx/postmark/dbench/diod-regression/qemu-9p2000.L). + +## Known-fail vs upstream issues + +`diod/xfail.txt` is a machine-parsed allow-list of FAIL/ERROR strings from the +guest `make check` subset. Comments are ignored. + +On run 33511542559: + +- `# TOTAL: 122` `# PASS: 98` `# SKIP: 6` `# FAIL: 16` `# ERROR: 2` +- `diod-regression-eval: unexpected: 0` (16 FAIL lines, 16 XFAIL rows) +- All FAIL/ERROR strings are t0011 allsquash or t0013 ACL (`v9fs/test#28`) +- t0010 including flock steps 21–24 PASS; t0012 PASS (xattr SKIP); t0020/t0021 PASS + +GitHub `issues?state=open` and issue search for chaos/diod return only the +three open PRs (#31, #91, #165). Numbered GET of 1–173 finds 11 additional +open issues. The inventory uses the numbered set (14 items). None of those 14 +are `xfail-fail-line`. Highest-risk misses if we had trusted search: #163 +(getlock/sqlite) and #164 (32-bit readdir loop). + +## Product patch (not landed) + +`docs/patches/v9fs-test-diod-upstream/` is a comment-only update for +`v9fs/test`. This agent cannot push that repo. Do not add FAIL rows. + +## Commands + +```bash +scripts/check-diod-upstream-inventory.sh +scripts/check-scaffold.sh +``` diff --git a/scripts/check-diod-upstream-inventory.sh b/scripts/check-diod-upstream-inventory.sh new file mode 100755 index 0000000..8c173a8 --- /dev/null +++ b/scripts/check-diod-upstream-inventory.sh @@ -0,0 +1,131 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Offline check that the diod-upstream inventory names every pinned open +# chaos/diod issue/PR, that none are classified as machine-parsed XFAIL FAIL +# lines, and that the xfail snapshot is only t0011/t0013 strings. +# +# The proof would fail if the catalog omitted an open ID from +# diod-upstream-open-issues.json, or if it claimed those IDs were already +# xfail-fail-line while the FAIL snapshot contains only v9fs/test#28 rows. + +root="$(cd "$(dirname "$0")/.." && pwd)" +cd "$root" + +json="docs/ledgers/diod-upstream-open-issues.json" +ledger="docs/ledgers/diod-upstream.md" +patch="docs/patches/v9fs-test-diod-upstream/xfail.txt" +snapshot="docs/ledgers/diod-xfail-snapshot.txt" + +failures=0 + +need() { + local path="$1" + if [[ ! -s "$path" ]]; then + echo "missing or empty: $path" >&2 + failures=$((failures + 1)) + return 1 + fi +} + +need "$json" || true +need "$ledger" || true +need "$patch" || true +need "$snapshot" || true +if (( failures > 0 )); then + echo "diod-upstream inventory check failed: $failures problem(s)" >&2 + exit 1 +fi + +python3 - "$json" "$ledger" "$patch" "$snapshot" <<'PY' +import json, re, sys +from pathlib import Path + +json_path, ledger_path, patch_path, snapshot_path = sys.argv[1:] +data = json.loads(Path(json_path).read_text()) +ledger = Path(ledger_path).read_text() +patch = Path(patch_path).read_text() +snapshot = Path(snapshot_path).read_text() +errors = [] + +items = data.get("open_items") or [] +if len(items) < 14: + errors.append(f"expected at least 14 open_items, got {len(items)}") + +numbers = [] +for item in items: + n = item.get("number") + disp = item.get("disposition") + numbers.append(n) + if disp == "xfail-fail-line": + errors.append( + f"chaos/diod#{n} marked xfail-fail-line; subset FAIL lines are " + "t0011/t0013 only (v9fs/test#28)" + ) + token = f"chaos/diod#{n}" + alt = f"[{n}](" + if token not in ledger and alt not in ledger: + errors.append(f"{ledger_path} does not name chaos/diod#{n}") + if f"#{n}" not in patch: + errors.append(f"{patch_path} comments do not name #{n}") + +if len(numbers) != len(set(numbers)): + errors.append("duplicate issue numbers in snapshot JSON") + +fail_lines = [] +for line in snapshot.splitlines(): + s = line.strip() + if not s or s.startswith("#"): + continue + fail_lines.append(s) + +if len(fail_lines) != 16: + errors.append(f"xfail snapshot should have 16 FAIL lines, got {len(fail_lines)}") + +for line in fail_lines: + if not (line.startswith("t0011-") or line.startswith("t0013-")): + errors.append(f"xfail snapshot has non-t0011/t0013 FAIL line: {line}") + +# Patch must not introduce new machine-parsed FAIL rows. +def parsed_fail_rows(text: str) -> list[str]: + rows = [] + for line in text.splitlines(): + s = re.sub(r"\s+", " ", line).strip() + if not s or s.startswith("#"): + continue + rows.append(s) + return rows + +snap_rows = parsed_fail_rows(snapshot) +patch_rows = parsed_fail_rows(patch) +if patch_rows != snap_rows: + errors.append( + "product patch FAIL rows differ from snapshot; comments-only patch required" + ) + +# Discriminating negative: GitHub search-only set is not sufficient. +search_only = {31, 91, 165} +pinned = set(numbers) +if not (pinned - search_only): + errors.append("snapshot contains only search-visible PRs; numbered issues missing") +for must in (163, 164, 166): + if must not in pinned: + errors.append(f"required coverage-gap/arch issue #{must} missing from snapshot") + +expected_head = "de51d1ee1bd5ccf1d8c16b96227c8bb03ec50106" +if data.get("diod_head") != expected_head: + errors.append(f"diod_head is {data.get('diod_head')}, expected {expected_head}") +if expected_head[:12] not in ledger: + errors.append("ledger does not pin diod HEAD SHA") + +if errors: + print("diod-upstream inventory check failed:", file=sys.stderr) + for e in errors: + print(f" {e}", file=sys.stderr) + sys.exit(1) + +print( + f"diod-upstream inventory check passed: {len(items)} open items, " + f"{len(fail_lines)} XFAIL FAIL lines, diod {expected_head[:12]}" +) +PY