Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
275 commits
Select commit Hold shift + click to select a range
cb7f38d
Merge origin/release/2.2.0 into docs/consolidation-release
CaffeinatedCoder Oct 15, 2026
6e630d6
Merge pull request #14 from CaffeinatedCoder/docs/consolidation-release
CaffeinatedCoder Oct 15, 2026
2918cdd
test: probes for C02 optional text and C20 ShouldHold
CaffeinatedCoder Oct 15, 2026
a849b57
test: a variant catalogue of EF keys and queries, run against the wra…
CaffeinatedCoder Oct 15, 2026
5adb342
docs: name the EF catalogue where a fix's variant step looks for its …
CaffeinatedCoder Oct 15, 2026
04bcb90
docs: a nullable record-class value object compared in a query answer…
CaffeinatedCoder Oct 15, 2026
0078733
test: probes for eight EF Core claims (E06, E07, E11-E16)
CaffeinatedCoder Oct 15, 2026
fd4a394
docs: .Value on a column with the application's own converter fails i…
CaffeinatedCoder Oct 15, 2026
0016e8c
test: probes for EF Core claims E03, E08, E09 and E10
CaffeinatedCoder Oct 15, 2026
8ee899d
fix: a probe row says how it ended, and a refused document is judged …
CaffeinatedCoder Oct 15, 2026
7a3d38c
Merge pull request #15 from CaffeinatedCoder/test/ef-translation-cata…
CaffeinatedCoder Oct 15, 2026
20b4ffe
feat: every probe is shown to fail against a seeded defect (0100)
CaffeinatedCoder Oct 15, 2026
2bbd49a
Merge pull request #16 from CaffeinatedCoder/fix/ef-nullable-record-c…
CaffeinatedCoder Oct 15, 2026
65dde05
Merge origin/release/2.2.0 into fix/probe-soft-outcomes
CaffeinatedCoder Oct 15, 2026
ffd018e
docs: title decision record 0099 with its number
CaffeinatedCoder Oct 15, 2026
ba521e6
Merge pull request #17 from CaffeinatedCoder/fix/probe-soft-outcomes
CaffeinatedCoder Oct 16, 2026
8d6da4e
Merge origin/release/2.2.0 into feat/probe-seeds
CaffeinatedCoder Oct 16, 2026
b97c7a6
fix: BuiltInConverters picks a converter with a return per arm, not a…
CaffeinatedCoder Oct 16, 2026
a69521a
Merge pull request #18 from CaffeinatedCoder/feat/probe-seeds
CaffeinatedCoder Oct 16, 2026
f57809c
Merge remote-tracking branch 'origin/release/2.2.0' into test/probe-g…
CaffeinatedCoder Oct 16, 2026
ddc9a6e
Merge pull request #19 from CaffeinatedCoder/fix/rider-conditional-chain
CaffeinatedCoder Oct 16, 2026
917a5e2
test: note keys of the EF and C20 probes are catalogue keys
CaffeinatedCoder Oct 16, 2026
87f797f
test: a seed for each of the 14 unseeded probes
CaffeinatedCoder Oct 16, 2026
769be37
test: cover the remainders of C02, C20, E01-E03, C03, C05, L01-L04
CaffeinatedCoder Oct 16, 2026
2ed6410
test: probes for the JSON family (C01, C10, L05, L06)
CaffeinatedCoder Oct 16, 2026
730276b
test: rows for the JSON family's uncovered remainder
CaffeinatedCoder Oct 16, 2026
9964d9d
test: the JSON family's third rows, Populate excluded beside a refere…
CaffeinatedCoder Oct 16, 2026
82ce7ad
test: C10's last uncovered pairs as rows
CaffeinatedCoder Oct 16, 2026
fb51c03
test: C10's row for a polymorphic property over a class
CaffeinatedCoder Oct 16, 2026
11ac445
test: probes for the build and analyzer claims C09, C11, C17, C18 and…
CaffeinatedCoder Oct 16, 2026
387300d
test: C18 runs its claim in-process too, and the build family's remai…
CaffeinatedCoder Oct 16, 2026
70305c0
test: C11's last remainder rows
CaffeinatedCoder Oct 16, 2026
50843ee
test: C11's parse shapes each have a control that parses
CaffeinatedCoder Oct 16, 2026
089f0da
test: the build family's generator scripts beside the shapes they write
CaffeinatedCoder Oct 16, 2026
d9df1b6
test: probes for the schema claims C08, C12, C13 and C16
CaffeinatedCoder Oct 16, 2026
981b365
test: probes for the fault claims C04, C06, C07, C14 and C15
CaffeinatedCoder Oct 16, 2026
00d3b8f
test: the integrated corpus's rows gzipped, and only possible pairs e…
CaffeinatedCoder Oct 16, 2026
3bc8a19
test: the shape generators leave the corpus
CaffeinatedCoder Oct 16, 2026
c56d38a
fix: a described type's parameter keeps ASP.NET's own schema in every…
CaffeinatedCoder Oct 16, 2026
8024904
Merge pull request #20 from CaffeinatedCoder/test/probe-gate-small-cl…
CaffeinatedCoder Oct 16, 2026
4b7f3f9
build: the replay runs probes in parallel, by family, with or without…
CaffeinatedCoder Oct 16, 2026
51bfff7
build: the verdict tool reads a log of its own, and the replay keeps …
CaffeinatedCoder Oct 16, 2026
13de48b
build: CI replays the probes in legs by family, every probe on a push…
CaffeinatedCoder Oct 16, 2026
f76b738
build: a replay that records a footprint runs one host at a time
CaffeinatedCoder Oct 16, 2026
cfe3379
Merge pull request #21 from CaffeinatedCoder/fix/described-parameter-…
CaffeinatedCoder Oct 16, 2026
d8b7cd7
Merge remote-tracking branch 'origin/release/2.2.0' into claude/lovin…
CaffeinatedCoder Oct 16, 2026
e32a94c
fix: a declared ProblemDetails response under application/json descri…
CaffeinatedCoder Oct 16, 2026
91f6719
build: an exclusion carries its reason, and claims.json is held to it…
CaffeinatedCoder Oct 16, 2026
df78bfa
build: decision 102, an exclusion carries its reason; the one-off mig…
CaffeinatedCoder Oct 16, 2026
d8872d8
build: a harness error is never a catch, and note keys are constants …
CaffeinatedCoder Oct 16, 2026
1a6e0e6
test: the claims tests hold on either line end
CaffeinatedCoder Oct 16, 2026
747d390
Merge pull request #22 from CaffeinatedCoder/build/ci-replay-by-footp…
CaffeinatedCoder Oct 16, 2026
03f14cf
Merge pull request #23 from CaffeinatedCoder/claude/loving-napier-535af5
CaffeinatedCoder Oct 16, 2026
7b81751
Merge remote-tracking branch 'origin/release/2.2.0' into claude/lucid…
CaffeinatedCoder Oct 16, 2026
44b3ef0
build: a pull request packs and smoke-tests only when its diff can ch…
CaffeinatedCoder Oct 16, 2026
1cf8d4c
Merge pull request #24 from CaffeinatedCoder/fix/declared-problem-jso…
CaffeinatedCoder Oct 16, 2026
0abd90e
Merge pull request #25 from CaffeinatedCoder/build/harness-error-neve…
CaffeinatedCoder Oct 16, 2026
4963019
Merge pull request #26 from CaffeinatedCoder/build/ci-replay-by-footp…
CaffeinatedCoder Oct 16, 2026
776c9f6
build: a claim lists its obligations and what it does not promise, ea…
CaffeinatedCoder Oct 16, 2026
2ae2a96
test: a claim's obligations and not-promised entries, a seed per obli…
CaffeinatedCoder Oct 16, 2026
a5f98fb
docs: decision 104, a claim states its obligations and each has a seed
CaffeinatedCoder Oct 16, 2026
6866822
fix: a nullable value object is its wrapped type at the same nullabil…
CaffeinatedCoder Oct 16, 2026
94554b3
test: BaseProbe compares like with like for a class value object at t…
CaffeinatedCoder Oct 16, 2026
5655c93
test: exempt 6866822, whose fix trailers stood outside its trailer block
CaffeinatedCoder Oct 16, 2026
f5bfc83
Merge pull request #28 from CaffeinatedCoder/claude/ecstatic-wiles-e0…
CaffeinatedCoder Oct 16, 2026
e6cdb5e
Merge pull request #27 from CaffeinatedCoder/build/obligations-per-claim
CaffeinatedCoder Oct 16, 2026
3a77476
test: C07 lists its six obligations, each with a seed in C07BlanketMa…
CaffeinatedCoder Oct 16, 2026
3f086ce
test: C03 lists its five obligations, and its probe checks the proble…
CaffeinatedCoder Oct 16, 2026
e841a94
test: C05 lists its five obligations, each with a seed in C05RuleProbe
CaffeinatedCoder Oct 16, 2026
b98aaed
test: C04 lists its four obligations, each with a seed, and cites why…
CaffeinatedCoder Oct 16, 2026
4a7941c
test: C06 lists its four obligations, and its probe checks a descript…
CaffeinatedCoder Oct 16, 2026
ac421c5
test: C07's mapping-refusal seed leaves a member of no kind refused
CaffeinatedCoder Oct 16, 2026
e1b1dc9
test: C08 lists its five obligations, each with a seed in C08SameName…
CaffeinatedCoder Oct 16, 2026
1e2fb40
test: C12 lists its four obligations, each with a seed in C12Describe…
CaffeinatedCoder Oct 16, 2026
900e909
test: the EF claims list their obligations, a seed per obligation and…
CaffeinatedCoder Oct 16, 2026
503e6b0
test: C13 lists its three obligations, each with a seed in C13PatchRe…
CaffeinatedCoder Oct 16, 2026
7dea32e
test: C14 lists its four obligations, each with a seed in C14Declared…
CaffeinatedCoder Oct 16, 2026
57c9818
test: C15 lists its three obligations, each with a seed in C15MvcFaul…
CaffeinatedCoder Oct 16, 2026
1045086
test: the library claims list their obligations, what they do not pro…
CaffeinatedCoder Oct 16, 2026
b49bb63
test: C16 lists its five obligations, each with a seed, and cites dec…
CaffeinatedCoder Oct 16, 2026
81a440a
test: FaultClaim no longer says its strict-context pairs are excluded
CaffeinatedCoder Oct 16, 2026
ebcdc57
test: C15's obligations concern every row, since http.response declar…
CaffeinatedCoder Oct 16, 2026
e63c990
test: E09's ElementAtOrNone seed skips in memory without AsQueryable,…
CaffeinatedCoder Oct 16, 2026
432d44c
build: prober new stages a probe's skeleton, and prober try runs one …
CaffeinatedCoder Oct 16, 2026
da93a2c
test: TryProbeTests reads try's output by line, under either line end
CaffeinatedCoder Oct 16, 2026
6e7fc7f
test: L04 holds a root refusal to naming the value object, and L03's …
CaffeinatedCoder Oct 16, 2026
6b9f425
Merge pull request #29 from CaffeinatedCoder/claude/obligations-ef-42…
CaffeinatedCoder Oct 16, 2026
2396e03
Merge remote-tracking branch 'origin/release/2.2.0' into claude/oblig…
CaffeinatedCoder Oct 16, 2026
139b2d4
Merge remote-tracking branch 'origin/release/2.2.0' into claude/oblig…
CaffeinatedCoder Oct 16, 2026
6797052
build: prober register --obligation writes a seed per obligation into…
CaffeinatedCoder Oct 16, 2026
c61ce25
fix: a probe's identity leaves out its seeds, as it leaves out its seed
CaffeinatedCoder Oct 16, 2026
f4ba3c4
fix: a toolchain command that cannot name the toolchain refuses inste…
CaffeinatedCoder Oct 16, 2026
6593093
build: the prober's scratch worktrees are per checkout and its round …
CaffeinatedCoder Oct 16, 2026
5ee34bd
Merge pull request #30 from CaffeinatedCoder/claude/obligations-http-…
CaffeinatedCoder Oct 16, 2026
f4b29a9
Merge pull request #31 from CaffeinatedCoder/claude/sweet-rhodes-eff8fe
CaffeinatedCoder Oct 16, 2026
1e30103
Merge remote-tracking branch 'origin/release/2.2.0' into build/regist…
CaffeinatedCoder Oct 16, 2026
efaee4a
Merge remote-tracking branch 'origin/release/2.2.0' into claude/oblig…
CaffeinatedCoder Oct 16, 2026
0ec08df
Merge pull request #33 from CaffeinatedCoder/claude/obligations-libra…
CaffeinatedCoder Oct 16, 2026
f258e42
Merge pull request #32 from CaffeinatedCoder/build/register-seed-per-…
CaffeinatedCoder Oct 16, 2026
1ff6880
build: the harness generators as file-based apps, held by a conventio…
CaffeinatedCoder Oct 16, 2026
7bd3d47
Merge origin/release/2.2.0 into build/prober-per-checkout-cache
CaffeinatedCoder Oct 16, 2026
b2b011c
Merge pull request #34 from CaffeinatedCoder/build/prober-per-checkou…
CaffeinatedCoder Oct 16, 2026
3c3ff5c
Merge remote-tracking branch 'origin/release/2.2.0' into fix/prober-t…
CaffeinatedCoder Oct 16, 2026
0fc2fb1
Merge remote-tracking branch 'origin/release/2.2.0' into claude/shape…
CaffeinatedCoder Oct 16, 2026
9c1bc55
Merge pull request #35 from CaffeinatedCoder/claude/shape-generators-…
CaffeinatedCoder Oct 16, 2026
373a860
Merge pull request #36 from CaffeinatedCoder/fix/prober-toolchain-ref…
CaffeinatedCoder Oct 16, 2026
1fab4e6
spike: a bounded Stryker.NET trial on the Serilog satellite
CaffeinatedCoder Oct 16, 2026
6ca3e88
docs: a triage skill decides what a failing probe row means, in a fix…
CaffeinatedCoder Oct 16, 2026
aee12fd
build: prober reads rows per probe, and a registry entry's watched pa…
CaffeinatedCoder Oct 16, 2026
330be16
test: the probe corpus keeps its rows per probe, deduplicated, and C1…
CaffeinatedCoder Oct 16, 2026
4312b2c
Merge pull request #38 from CaffeinatedCoder/docs/probe-triage-skill
CaffeinatedCoder Oct 16, 2026
27773a0
Merge pull request #37 from CaffeinatedCoder/spike/mutation-trial
CaffeinatedCoder Oct 16, 2026
ee818d0
Merge remote-tracking branch 'origin/build/rows-per-probe' into claud…
CaffeinatedCoder Oct 16, 2026
265309f
Merge pull request #39 from CaffeinatedCoder/build/rows-per-probe
CaffeinatedCoder Oct 16, 2026
c8c2673
build: prober credits checks, not rows, and judges a seed by the chec…
CaffeinatedCoder Oct 16, 2026
d21d60b
test: a probe row runs checks, each with its obligation, baseline and…
CaffeinatedCoder Oct 16, 2026
15aab87
test: a note the row routes into a check names no key of its own
CaffeinatedCoder Oct 16, 2026
292b4cc
docs: OpenAPI 2.0 drops a nullable component property's reference (KB…
CaffeinatedCoder Oct 16, 2026
828b6e4
test: C21, the OpenAPI schema parity of README "What you get" as a cl…
CaffeinatedCoder Oct 16, 2026
e48deb7
Merge remote-tracking branch 'origin/release/2.2.0' into claude/evide…
CaffeinatedCoder Oct 16, 2026
7901c8c
Merge remote-tracking branch 'origin/test/openapi-schema-parity-claim…
CaffeinatedCoder Oct 16, 2026
59b5702
Merge pull request #41 from CaffeinatedCoder/build/evidence-per-check
CaffeinatedCoder Oct 16, 2026
99665e0
Merge remote-tracking branch 'origin/release/2.2.0' into test/openapi…
CaffeinatedCoder Oct 16, 2026
fbd7e4b
test: C21's probe runs a check per obligation
CaffeinatedCoder Oct 16, 2026
083048c
Merge pull request #40 from CaffeinatedCoder/test/openapi-schema-pari…
CaffeinatedCoder Oct 16, 2026
af27e5d
docs: the 24 release escapes put back as seeds, and what each finder …
CaffeinatedCoder Oct 16, 2026
583ae05
test: SingleOrNone with a condition two rows match refuses them
CaffeinatedCoder Oct 16, 2026
80248ff
test: a configured precision or column type reaches a value object's …
CaffeinatedCoder Oct 16, 2026
8ffad55
fix: a nullable value object over an enum written by name lists null …
CaffeinatedCoder Oct 16, 2026
25118b8
fix: a nullable value object over an enum's component puts its null w…
CaffeinatedCoder Oct 16, 2026
9e9d9bc
test: KB-027, an enum's component is its first use; C21 notes it wher…
CaffeinatedCoder Oct 16, 2026
acd8125
test: C21's seeds over the transformer as it now reads
CaffeinatedCoder Oct 16, 2026
78d3daf
Merge remote-tracking branch 'origin/release/2.2.0' into fix/nullable…
CaffeinatedCoder Oct 16, 2026
b38db59
Merge pull request #42 from CaffeinatedCoder/docs/finder-benchmark
CaffeinatedCoder Oct 16, 2026
7c6c48f
fix: a value object with its own CompareTo is refused in Greatest, Le…
CaffeinatedCoder Oct 16, 2026
0764462
fix: .Value read through a type parameter translates to the column
CaffeinatedCoder Oct 16, 2026
d9ccfe0
fix: a Guid or string key generated on add gets the provider's generator
CaffeinatedCoder Oct 16, 2026
e53bac6
Merge remote-tracking branch 'origin/release/2.2.0' into fix/ef-pg-ga…
CaffeinatedCoder Oct 16, 2026
693860e
build: a fact's test may carry a note after its path
CaffeinatedCoder Oct 16, 2026
d8ed30e
docs: nine PostgreSQL facts, KB-028 to KB-036, each with its test
CaffeinatedCoder Oct 16, 2026
df817ea
test: NullablePositionTests holds a validated struct over an enum, C2…
CaffeinatedCoder Oct 16, 2026
c7b9dc8
Merge pull request #43 from CaffeinatedCoder/fix/hand-written-orderin…
CaffeinatedCoder Oct 16, 2026
08486f2
Merge remote-tracking branch 'origin/release/2.2.0' into fix/ef-value…
CaffeinatedCoder Oct 16, 2026
c2666b0
Merge pull request #45 from CaffeinatedCoder/fix/nullable-string-enum…
CaffeinatedCoder Oct 16, 2026
d3676dc
Merge pull request #44 from CaffeinatedCoder/fix/ef-value-through-typ…
CaffeinatedCoder Oct 16, 2026
d8cf0b2
Merge remote-tracking branch 'origin/release/2.2.0' into fix/ef-pg-ga…
CaffeinatedCoder Oct 16, 2026
86f3399
docs: four PostgreSQL facts name WS6's checks as what turns them on
CaffeinatedCoder Oct 16, 2026
70d5052
test: C22 claims the generators' refusals, with a probe and a seed pe…
CaffeinatedCoder Oct 16, 2026
36e005b
docs: the finder benchmark names C22, which detects three of the five…
CaffeinatedCoder Oct 16, 2026
41ef197
Merge pull request #46 from CaffeinatedCoder/fix/ef-pg-gaps-and-facts
CaffeinatedCoder Oct 16, 2026
4dc5a6b
Merge remote-tracking branch 'origin/test/generator-refusals-claim' i…
CaffeinatedCoder Oct 16, 2026
2ae3f7e
Merge pull request #47 from CaffeinatedCoder/test/generator-refusals-…
CaffeinatedCoder Oct 16, 2026
aa8bfcd
test: C17 and C19 cover the five refused kinds C22 added
CaffeinatedCoder Oct 16, 2026
3c6b89a
Merge remote-tracking branch 'origin/release/2.2.0' into test/refused…
CaffeinatedCoder Oct 16, 2026
badf740
build: every tool is built in the session's checkout, with a dotnet t…
CaffeinatedCoder Oct 16, 2026
e999f6e
Merge pull request #48 from CaffeinatedCoder/build/tools-ready-in-wor…
CaffeinatedCoder Oct 16, 2026
cfc9a2a
Merge pull request #49 from CaffeinatedCoder/test/refused-kinds-c17-c19
CaffeinatedCoder Oct 16, 2026
ccfcb5d
fix: a query or header array of a described type keeps its items
CaffeinatedCoder Oct 16, 2026
9ab1613
test: the build family's probes run one check per obligation
CaffeinatedCoder Oct 16, 2026
93f84b7
build: an obligation declares where it does not apply, and a pair no …
CaffeinatedCoder Oct 16, 2026
753ccdd
test: Row.Check applies its claim's declarations, and every rule of d…
CaffeinatedCoder Oct 16, 2026
0b006d0
build: the verdict names a remedy for ASP0020
CaffeinatedCoder Oct 16, 2026
66b4d62
fix: a value object over a described type is a parameter's schema out…
CaffeinatedCoder Oct 16, 2026
5a8f048
fix: a parameter's default is spelled as ASP.NET writes it without th…
CaffeinatedCoder Oct 16, 2026
b0195d3
test: the http baseline runs each comparison as a check of its own
CaffeinatedCoder Oct 16, 2026
2dbb715
test: the fault claims C04, C06, C07, C14 and C15 check each obligation
CaffeinatedCoder Oct 16, 2026
ab0057c
test: the composed claims C03 and C05 check each obligation
CaffeinatedCoder Oct 16, 2026
d15b2b4
test: the schema claims C08, C12, C13 and C16 check each obligation
CaffeinatedCoder Oct 16, 2026
4917a03
fix: a non-abstract polymorphic base's own branch is described
CaffeinatedCoder Oct 16, 2026
121f42d
Merge pull request #50 from CaffeinatedCoder/build/declared-applicabi…
CaffeinatedCoder Oct 16, 2026
0293dcd
fix: a nullable element put back keeps its null where its type is a c…
CaffeinatedCoder Oct 16, 2026
217baf7
test: the parameter catalogue names the clause it holds
CaffeinatedCoder Oct 16, 2026
8720c2a
test: C12's and C21's seeds over the transformers as they now read
CaffeinatedCoder Oct 16, 2026
732baf2
test: the two new obligations' seeds build
CaffeinatedCoder Oct 17, 2026
073f41e
Merge remote-tracking branch 'origin/release/2.2.0' into test/ws2-bui…
CaffeinatedCoder Oct 17, 2026
90918a4
test: C21's inconclusive schema check says which twin it lacks
CaffeinatedCoder Oct 17, 2026
ddd146c
test: C16's refusal judge is no check call, and the note floor follow…
CaffeinatedCoder Oct 17, 2026
a481101
Merge remote-tracking branch 'origin/release/2.2.0' into test/ws2-htt…
CaffeinatedCoder Oct 17, 2026
db7e3aa
test: C21 declares its own-converter rows inapplicable on every oblig…
CaffeinatedCoder Oct 17, 2026
d02350f
Merge pull request #51 from CaffeinatedCoder/fix/openapi-a1-a2-a3
CaffeinatedCoder Oct 17, 2026
9247406
fix: a value object over string implements ISpanParsable, as string does
CaffeinatedCoder Oct 17, 2026
34dc0d9
docs: the Generators README promises span parsing where the underlyin…
CaffeinatedCoder Oct 17, 2026
0805ac5
Merge pull request #52 from CaffeinatedCoder/fix/span-parsing-over-st…
CaffeinatedCoder Oct 17, 2026
f9ee5b2
Merge remote-tracking branch 'origin/release/2.2.0' into test/ws2-bui…
CaffeinatedCoder Oct 17, 2026
da2c291
test: C11 does not promise span parsing over a type that has none
CaffeinatedCoder Oct 17, 2026
4d01780
test: C11 excludes the span-parsing pairs no check can credit, and co…
CaffeinatedCoder Oct 17, 2026
6e6beaa
test: C11 keeps its rows and adds the six that cover what the inappli…
CaffeinatedCoder Oct 17, 2026
8c92e32
Merge remote-tracking branch 'origin/release/2.2.0' into test/ws2-htt…
CaffeinatedCoder Oct 17, 2026
6d80444
Merge pull request #54 from CaffeinatedCoder/test/ws2-build-checks
CaffeinatedCoder Oct 17, 2026
631e7c7
test: BaseProbe's 29 findings triaged, cited by KB-037 and KB-038
CaffeinatedCoder Oct 17, 2026
af6e8d6
test: KB-038's source is a plain YAML string
CaffeinatedCoder Oct 17, 2026
658d173
Merge remote-tracking branch 'origin/release/2.2.0' into test/ws2-htt…
CaffeinatedCoder Oct 17, 2026
f8993e3
Merge pull request #53 from CaffeinatedCoder/test/ws2-http-checks
CaffeinatedCoder Oct 17, 2026
66dc2d7
test: the EF family's probes run one check per obligation
CaffeinatedCoder Oct 17, 2026
04fc962
build: a cited fact is executable, and seeds run by footprint
CaffeinatedCoder Oct 17, 2026
7870851
test: a fact's measured answer is a fixture beside its test
CaffeinatedCoder Oct 17, 2026
f82f583
test: the json and text families check each obligation (WS2 step 4)
CaffeinatedCoder Oct 17, 2026
a4e0e7d
test: a JSON half the framework alone refuses is a pass, as decision …
CaffeinatedCoder Oct 17, 2026
684372c
Merge pull request #55 from CaffeinatedCoder/build/ws2b-executable-facts
CaffeinatedCoder Oct 17, 2026
2002740
test: no check of the text family notes an outcome key beside its own…
CaffeinatedCoder Oct 17, 2026
e0f9a63
docs: KB-039, EF's SQLite provider neither compares nor orders DateTi…
CaffeinatedCoder Oct 17, 2026
845e1c0
test: E02 declares the shapes SQLite cannot compare or order inapplic…
CaffeinatedCoder Oct 17, 2026
5e7884a
Merge remote-tracking branch 'origin/release/2.2.0' into test/ws2-ef-…
CaffeinatedCoder Oct 17, 2026
a67ac5a
Merge remote-tracking branch 'origin/release/2.2.0' into test/ws2-jso…
CaffeinatedCoder Oct 17, 2026
f8856e4
Merge pull request #56 from CaffeinatedCoder/test/ws2-ef-checks
CaffeinatedCoder Oct 17, 2026
f6f44f5
Merge remote-tracking branch 'origin/release/2.2.0' into test/ws2-jso…
CaffeinatedCoder Oct 17, 2026
782026f
Merge pull request #57 from CaffeinatedCoder/test/ws2-json-text-checks
CaffeinatedCoder Oct 17, 2026
9553eab
docs: KB-040, a converter's value is refused at the depth limit where…
CaffeinatedCoder Oct 17, 2026
3000d79
test: compile the facts' fixture reader into the Samples for the prob…
CaffeinatedCoder Oct 17, 2026
bf6db0b
docs: KB-041, MVC cannot write its automatic 400 under a source-gener…
CaffeinatedCoder Oct 17, 2026
9974f46
test: the three-sided differential in the http, json and text harness
CaffeinatedCoder Oct 17, 2026
abd3238
test: no probe row is decided by a message's words but a failure
CaffeinatedCoder Oct 17, 2026
e01932b
Merge pull request #58 from CaffeinatedCoder/test/ws2-three-sided
CaffeinatedCoder Oct 17, 2026
3c165fa
test: the twin at the value object's nullability, strict ProbeContext…
CaffeinatedCoder Oct 17, 2026
9e23403
build: generate the twins and one ProbeContext with the shapes
CaffeinatedCoder Oct 17, 2026
ac4c561
Merge pull request #59 from CaffeinatedCoder/test/ws2-twins-contexts
CaffeinatedCoder Oct 17, 2026
a1f170a
test: NoteKeys keeps the pass keys and framework-refuses
CaffeinatedCoder Oct 17, 2026
2d54126
build: prober fix records a finding fixed at a commit
CaffeinatedCoder Oct 17, 2026
caec533
build: the covering array never places an excluded or undeclared-want…
CaffeinatedCoder Oct 17, 2026
24961dd
build: prober gaps lists the pairs no passing check read both axes of
CaffeinatedCoder Oct 17, 2026
17ef561
test: the toolchain fallback test keeps the caller's probe state out
CaffeinatedCoder Oct 17, 2026
26e51e6
build: the covering array leaves out an axis no value of which can jo…
CaffeinatedCoder Oct 17, 2026
5c5affe
test: a document refused by ASP.NET alone is compared by type and stage
CaffeinatedCoder Oct 17, 2026
e0b776b
docs: how BLite applied the probing concept by hand, as a design note
CaffeinatedCoder Oct 17, 2026
2d0712c
docs: record 0108, WS2 closes and WS3 to WS6 are dropped
CaffeinatedCoder Oct 17, 2026
509df86
Merge pull request #60 from CaffeinatedCoder/docs/probing-without-too…
CaffeinatedCoder Oct 17, 2026
938d8f8
Merge pull request #61 from CaffeinatedCoder/build/ws2-close-out
CaffeinatedCoder Oct 17, 2026
1f1b7d1
build: a probe that runs nothing under src/ is recorded by what it wa…
CaffeinatedCoder Oct 18, 2026
76b17d2
test: the document obligations do not apply under Preserve, and rows …
CaffeinatedCoder Oct 18, 2026
9b6f58e
docs: C21 does not promise the twin's schema where a nullable value o…
CaffeinatedCoder Oct 18, 2026
7b0edf0
test: C21's schema comparison cites KB-001 for a nullable body's form…
CaffeinatedCoder Oct 18, 2026
ed1069b
test: C17's and C19's rows written again, without the refused kinds t…
CaffeinatedCoder Oct 18, 2026
dfc841a
test: L02's parsing obligations do not apply to TryFrom or formatting…
CaffeinatedCoder Oct 18, 2026
689fed9
test: E02 compares an enum with >= as C# does, excludes >= over strin…
CaffeinatedCoder Oct 18, 2026
53050b7
test: rows and exclusions for the scattered pairs of C02, C03, C05, L…
CaffeinatedCoder Oct 18, 2026
4675d2e
test: KB-042, ASP.NET refuses a char's schema under WriteAsString, an…
CaffeinatedCoder Oct 18, 2026
82756b9
docs: C21 does not promise the twin's schema for an enum component's …
CaffeinatedCoder Oct 18, 2026
2fab368
test: C21's schema comparison cites KB-026 after the null normalisati…
CaffeinatedCoder Oct 18, 2026
c8b4575
fix: a nullable value object that is a component keeps its null as a …
CaffeinatedCoder Oct 18, 2026
ed94ae6
test: C21 cites the OpenAPI 2.0 loss of a nullable component by the r…
CaffeinatedCoder Oct 18, 2026
89b310a
test: C21's nullable seed applies over the component mark
CaffeinatedCoder Oct 18, 2026
ec7a4f9
test: C21 compares schemas under the media types both bodies list whe…
CaffeinatedCoder Oct 18, 2026
7565175
test: rows for C21's last uncovered pairs, and KB-026 told where the …
CaffeinatedCoder Oct 18, 2026
562c367
test: C21's obligations do not apply to a wrapped record class under …
CaffeinatedCoder Oct 18, 2026
60de568
docs: the roadmap's 2.2.0 gate item is done
CaffeinatedCoder Oct 18, 2026
059c0a0
Merge pull request #63 from CaffeinatedCoder/fix/component-keeps-null
CaffeinatedCoder Oct 18, 2026
cfe942a
Merge branch 'release/2.2.0' into build/gate-closes
CaffeinatedCoder Oct 18, 2026
fe9227a
Merge pull request #62 from CaffeinatedCoder/build/gate-closes
CaffeinatedCoder Oct 18, 2026
cb59ec5
docs: close 2.2.0: the changelog dated, the gate's pass recorded, a d…
CaffeinatedCoder Oct 18, 2026
f17e760
Merge pull request #64 from CaffeinatedCoder/docs/release-2-2-0-closing
CaffeinatedCoder Oct 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
179 changes: 168 additions & 11 deletions .claude/probe-axes.md

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
"hooks": [
{
"type": "command",
"command": "dotnet build \"$CLAUDE_PROJECT_DIR/tools/BashGuard/BashGuard.csproj\" -c Release -nologo -v q -tl:off -clp:NoSummary",
"command": "dotnet build \"$CLAUDE_PROJECT_DIR/tools/BashGuard/BashGuard.csproj\" -c Release -nologo -v q -tl:off -clp:NoSummary >/dev/null 2>&1 || PATH=\"/usr/local/share/dotnet:$PATH\" dotnet build \"$CLAUDE_PROJECT_DIR/tools/BashGuard/BashGuard.csproj\" -c Release -nologo -v q -tl:off -clp:NoSummary || echo \"Session start: the Bash guard did not build with the dotnet on PATH, nor with the installer's in /usr/local/share/dotnet; a dotnet without the SDK global.json pins is the usual cause. Run dotnet build \\\"$CLAUDE_PROJECT_DIR/tools/BashGuard\\\" -c Release to see why: until it builds, the guard checks nothing, or refuses as stale.\"",
"timeout": 180
},
{
"type": "command",
"command": "dotnet build \"$CLAUDE_PROJECT_DIR/tools/BuildVerdict/BuildVerdict.csproj\" -c Release -nologo -v q -tl:off -clp:NoSummary",
"timeout": 180
"command": "dotnet build tools/AgentTools.slnf -c Release -nologo -v q -tl:off -clp:NoSummary >/dev/null 2>&1 || PATH=\"/usr/local/share/dotnet:$PATH\" dotnet build tools/AgentTools.slnf -c Release -nologo -v q -tl:off -clp:NoSummary || echo \"Session start: the tools in $PWD (build-verdict, prober, docs-query, consumer-smoke-test) did not build with the dotnet on PATH, nor with the installer's in /usr/local/share/dotnet; a dotnet without the SDK global.json pins is the usual cause. Run dotnet build tools/AgentTools.slnf -c Release to see why, and before using them.\"",
"timeout": 300
}
]
}
Expand Down
261 changes: 261 additions & 0 deletions .claude/skills/probe-triage/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,261 @@
---
name: probe-triage
description: Decide what one failing probe row means, by four questions in a fixed order — a harness error, a pinned framework fact, an intended difference the claim does not promise, or a finding for the code-analyst — stopping at the first that applies and recording the step where the corpus keeps it. Use for every failing row at the end of a probing round, for a `prober status` finding (`R-<probe>-<sha>`, `F<n>`), for a row a replay or `prober try` printed as failed, and whenever someone asks whether a probe failure is real.
---

# Probe triage

A failing row is a question, not a finding. Most of what the prober has cost went into answering it by
judgement, mid-round: the gate round of 2026-10-16 wrote 18 probes, found two product defects and about
ten harness traps, and left five failing rows of C07 untriaged. This skill answers the question by
lookup, in a fixed order, so two people (or a person and an agent) reach the same answer for the same
row, and the answer is written where the next replay and the next reader find it.

**The order is the rule.** Ask the four questions in turn and stop at the first that applies. Do not skip
ahead because a row "looks like" a product bug: a harness that compares unlike things produces the most
convincing product bugs there are. Every outcome names its step, `triage 1` to `triage 4`.

The writer of a probe never decides what a refusal means. The probe checks; this skill decides.

## Before the steps: get the row, and make it fail again

You start from one of these:

- **A finding id** from `prober status`: `R-<probe>-<sha>` (the replay saw a probe that passed with the
same identity fail) or `F<n>`. Its last line in the branch's `findings.jsonl` names the probe and the
commit. The state directory, `$STATE` below, is `PROBE_STATE_DIR` when set, else the main checkout's
`.claude/agent-memory-local/prober/`; the branch's directory is `branches/<branch, / as ->/`.
- **A row a run printed:** `prober try` and `prober replay` print the failed probe and how each row ended.
A replay that says "fails after a change to its corpus, axes, environment or this tool; triage the probe,
not the product" opened no finding: start at step 1 and expect to stop there.
- **A row's evidence line:** the line `Rec.Run` writes, or the probe's evidence after a replay:

```bash
jq '.rows["358"] | {category, reasons, applied}' "$STATE/branches/release-2.2.0/evidence/BaseProbe.json"
```

From it, write down: the claim, the probe, the row's index, its category (`violation`, `harness-error`,
`inconclusive`), its reasons, and the settings that applied. Then run the row at HEAD, three times:

```bash
dotnet tools/Prober/bin/Release/net10.0/prober.dll try --probe BaseProbe --rows 358
dotnet tools/Prober/bin/Release/net10.0/prober.dll try --probe BaseProbe --rows 358 --no-build # twice more
```

A row that passes at HEAD was fixed meanwhile: say so with the commit, and stop. A row that does not
fail every time is flaky, and flaky is not a finding: record it as `flaky` (a round's ledger line, or
your report) and stop. Only a
row that fails every time goes on to step 1.

## 1. Is it a harness error?

**It applies when** the row's reasons carry `harness-error`, or the failure comes from the harness rather
than from the product:

- the category is `harness-error`: a check threw (`UNEXPECTED <Exception>: ...`, which decision 103 makes
a harness error and never a violation), a check `prober new` staged and nobody wrote, or the equivalence
precondition (`inputs not equivalent: wrapped [...] vs value object [...]`), which says the two sides
were not the same shape and so were never comparable;
- a 404 on a bind route, a context type the source-generated `ProbeContext` does not list, a host that did
not start for a reason the row's settings do not explain;
- a `violation` whose whole difference lies in something the harness built or named rather than something
TypeKit wrote: a component or route name made from the twin's own type name, a twin at another
nullability, kind or position than the value object (concept H2), an input the harness placed
differently on each side. Read the two sides' answers in the reasons, or in the full log of the `try`
run, and find the first byte that differs. If it is the harness's, this step applies.

**Then** fix the harness so the row compares like with like, and run the row again. No finding is filed.
A row that now fails with a different difference starts again at step 1.

**Record:**

- the harness fix, as a `test:` commit whose body names the row and says `triage 1`: what the harness
did and what it does now (94554b3 is the model). In a round, the fix goes to the staging's `harness/`
and the round's report says it; the session that publishes commits it;
- with a finding id, a line appended to the branch's `findings.jsonl`:

```json
{"schemaVersion":1,"id":"R-BaseProbe-1a2b3c4","status":"withdrawn","reason":"triage 1 harness-error: the /schema/ endpoint had no twin at the value object's nullability; fixed in 94554b3"}
```

## 2. Does a fact at the pinned version explain it?

**It applies when** a fact in `design/knowledge/` says the framework, without TypeKit, does what the row
saw: the same refusal at the same operation, or the same document, at the version the repository pins.
A fact about the framework explains a row only where the framework alone makes the difference. A fact
that describes how the framework treats the wrapped type, while the value object differs from it, does
not explain the row; it is the evidence of step 4.

**Check with** the framework, the setting and the operation the row names:

```bash
dotnet tools/DocsQuery/bin/Release/net10.0/docs-query.dll find controller API explorer document visible --kind fact
dotnet tools/DocsQuery/bin/Release/net10.0/docs-query.dll entry KB-002
dotnet tools/DocsQuery/bin/Release/net10.0/docs-query.dll check # no fact-behind or fact-ahead for it
```

A miss of `find` proves nothing: try the setting's own name and the exception type too. Read the fact's
frontmatter. It is **executable** when its `test:` line names a test under `test/CodoMetis.TypeKit.Facts`
(`test: test/CodoMetis.TypeKit.Facts/KB002.cs`). Run that test:

```bash
dotnet tools/BuildVerdict/bin/Release/net10.0/build-verdict.dll test --project test/CodoMetis.TypeKit.Facts --filter-class "*KB002"
```

**Then:**

- **An executable fact that passes and explains the row** makes it a framework refusal. The check is
changed to cite the fact, no finding is filed.
- **A fact whose pin is stale**, or whose test fails, settles nothing until it is verified again
(decision 93). Verify it first.
- **A fact without a test** (`test: none, ...` or `prose`) that would explain the row is a research task:
measure the behaviour in `test/CodoMetis.TypeKit.Facts` as `KB<NNN>.cs`, give the fact its `test:`
line, then cite it. A fact without a test may be cited in a reason and nothing more: it never prunes a
row and never excuses one.
- **No fact, but the row's own baseline shows the framework alone doing it** (the document
`Hx.DocRefusedByAspNetAlone` refuses for ASP.NET alone too, or the wrapped type alone refuses under the
same options): that is a new framework behaviour. It becomes a new fact with its test under
`design/knowledge/` (its README, "Adding one"), never a new note key. Then cite it.
- Otherwise go to step 3.

**Record:**

- the citation, where the corpus holds one: a `not-promised` entry of the claim whose `source` is the
fact's file and whose `sentence` is quoted from it (step 3's form), an `exclude` group whose `reason`
names `KB-NNN`, or a value in the axes file's `refused` object whose text names `KB-NNN`, or the check's
own `Cite.Fact("KB-NNN")`;
- with a finding id:

```bash
dotnet tools/Prober/bin/Release/net10.0/prober.dll dismiss --id R-C03ComposedProbe-1a2b3c4 --reason "triage 2 fact KB-002: a controller without [ApiController] is missing from the document for ASP.NET alone, so the row's document part has nothing to check"
```

`dismiss` stages the line; `prober publish` puts it in `tools/probe/corpus/dismissed.jsonl`;
- in a round, a fact to measure goes in the report under "Facts to measure", with the row and the
configuration. The agent writes no test; the session that takes the report does.

## 3. Does the claim say it does not promise this?

**It applies when** a `not-promised` entry of the row's claim covers the row's settings, or a sentence of
the docs or of a decision record says the difference is intended.

**Check with** the claim's entries and narrowings, and the docs:

```bash
dotnet tools/Prober/bin/Release/net10.0/prober.dll gaps | grep 'C07-fault-responses-blanket'
jq '.[] | select(.id == "C07-fault-responses-blanket") | {narrow, "not-promised"}' tools/probe/corpus/claims.json
dotnet tools/DocsQuery/bin/Release/net10.0/docs-query.dll find nullable value object schema null --top 5
```

An entry covers the row when each of its `axes` values is among the row's applied settings. A docs
sentence counts only when it says this difference, in this place, is intended. Your sense that it "must be
on purpose" does not count, and neither does the axes file's "Intended" list alone: an item there that no
document or record states is a gap of this step, not an answer.

**Then:**

- **An entry covers it:** the difference is intended. The row's check cites the entry by its id, no
finding is filed.
- **A document or record says so, but the claim has no entry:** that is a docs or claims gap, filed as
`docs:` work, no finding. Add the entry; if the consumer docs do not say it plainly, add the sentence
first (the `plain-docs` skill), then quote it.
- **Two documents disagree,** or a record calls intended what a consumer page promises: not this step's
to settle. It goes to the code-analyst as a question (step 4's hand-off, "a contradiction").
- Otherwise go to step 4.

**Record:**

- the entry, in `claims.json` (in a round, the staging's `claims.json`), in the form of
`tools/Prober/Schemas/claims.schema.json`. `universe` refuses a sentence its `source` does not hold:

```json
"not-promised": [
{
"id": "invariant-globalization-refuses-as-text",
"source": "docs/text.md#globalization-invariant-mode",
"sentence": "So `AsText()` throws `PlatformNotSupportedException` there, on its first call, whatever the string.",
"axes": { "text.culture": ["globalization-invariant"], "entry": ["AsText", "AsOptionalText"] }
}
]
```

committed as `docs:` with the sentence it quotes, beside any docs change;
- with a finding id:

```bash
dotnet tools/Prober/bin/Release/net10.0/prober.dll dismiss --id R-C02OptionalTextProbe-1a2b3c4 --reason "triage 3 not-promised C02-optional-text/invariant-globalization-refuses-as-text"
```

and for a gap, `--reason "triage 3 docs-gap: <the sentence or record>; entry <id> to add"`.

## 4. A finding: hand it to the code-analyst

Only a row that none of steps 1 to 3 explains gets here. It is still not a finding until the
`code-analyst` agent, which reads the product path and seeds the defect in a scratch copy, confirms it.

**Prepare the hand-off:**

- **The row**: claim, probe, index, commit, category, the reasons, the settings that applied.
- **The shrunk row**, from the harness's `Shrinker`. There is no prober command for it yet. Run it in the
replay's worktree, which the `try` above has just built with the corpus overlaid:

```bash
WT=$(dotnet tools/Prober/bin/Release/net10.0/prober.dll replay --where | awk '/^replay:/ {print $2}')
cd "$WT" && PROBE_SHRINK="C07-fault-responses-blanket:358:baseline" \
dotnet "$OLDPWD/tools/BuildVerdict/bin/Release/net10.0/build-verdict.dll" test --no-build \
--project test/CodoMetis.TypeKit.Samples --filter-class "Probes.ShrinkProbe"
cat /tmp/shrink.txt
```

`PROBE_SHRINK` is `<rows>:<index,...>:<check>`: the rows file the probe reads (`Rows.Data("...")` in the
probe), the rows, and the check, `baseline` for the HTTP calibration or a name registered in
`ShrinkChecks.All` (C03, C05, L02, L03, L04). A check with no name there is handed over unshrunk, and
the hand-off says so.
- **The obligation** the failing check serves: its id and sentence from the claim's `obligations` (the
probe's header quotes them). When the check serves none of the claim's obligations, say so: "none
listed; the check holds <document#heading>: <sentence>". That is itself something for the analyst to
report (below).
- **Each side's answer**: the wrapped twin's with TypeKit, the value object's with TypeKit, and the
framework alone where the row ran it, each as the reasons or the log give it.
- **Why steps 1 to 3 did not apply**, one line each, with the facts and entries you looked at.

**Hand it over** with the Agent tool, `subagent_type: code-analyst`, and a prompt that starts
`Target: triage hand-off` and carries the five items above. The analyst reads the path the row exercised,
reproduces it outside the probe, seeds the defect, and answers Confirmed, Likely or Question. Where you
cannot start an agent (the `prober` agent started as a subagent), put the hand-off in your report under
"For code-analyst", marked "awaiting confirmation", file nothing, and let the caller hand it over.

**Then:**

- **Confirmed:** file `F<n>`, the next number not used in the branch's `findings.jsonl` or the corpus's
`dismissed.jsonl`. The fix is a `fix:` commit with the regression test the analyst named (the
`verify-the-guard` skill: revert it, then the variants), ending with `Defect-Class:` and
`Found-By: PR`, and its body names the analyst's confirmation. 6866822 is the model.
- **Likely or Question:** no `F<n>`. The row stays failing, and the question goes to the maintainer in
the round's report under "For code-analyst", with the analyst's answer.
- **A missing obligation** the analyst reports (a check that holds a promise no claim lists): it is filed
as claims work, the obligation added to the claim whose source states it, or a new claim, with its seed
(decision 104).

**Record**, only after the analyst confirms, a line appended to the branch's `findings.jsonl`, with the
shrunk probe kept in the memory's `open/`:

```json
{"schemaVersion":1,"id":"F3","claim":"C07-fault-responses-blanket","status":"open","commit":"00d3b8f6...","probe":"open/F3NullableBodySchemaProbe.cs","reason":"triage 4 finding: an MVC [FromBody] VO? over ulong writes oneOf[null, {type:[integer,string]}] where ulong? writes [null,integer,string]; confirmed by code-analyst 2026-10-16"}
```

An `R-` finding that became `F<n>` gets a `withdrawn` line whose reason is `triage 4 finding: filed as F<n>`,
so one defect is open once.

## What each step leaves behind

| Step | Finding | Change | Commit |
|---|---|---|---|
| 1 harness error | `withdrawn`, `triage 1 harness-error: ...` | the harness | `test:` |
| 2 fact | `prober dismiss`, `triage 2 fact KB-NNN: ...` | the check cites the fact; a new fact gets its test first | `test:` for the citation, `docs:` or `test:` for the fact |
| 3 not promised | `prober dismiss`, `triage 3 not-promised <claim>/<entry>` or `triage 3 docs-gap: ...` | the `not-promised` entry, the docs sentence | `docs:` |
| 4 finding | `F<n>` open, `triage 4 finding: ...; confirmed by code-analyst` | the fix and its test | `fix:` with `Found-By: PR` |

A row without a finding id leaves the change and the commit alone. Every reason starts with
`triage <step>`, so `grep '"triage [123]' findings.jsonl dismissed.jsonl` counts what the rounds cost
and what they found.
Loading
Loading