Skip to content

test: the build family's probes run one check per obligation - #54

Merged
CaffeinatedCoder merged 7 commits into
release/2.2.0from
test/ws2-build-checks
Oct 17, 2026
Merged

CaffeinatedCoder merged 7 commits into
release/2.2.0from
test/ws2-build-checks

Conversation

@CaffeinatedCoder

Copy link
Copy Markdown
Owner

What

C11, C17, C18 and C19 ran as one check named claim. So no listed obligation of theirs earned credit, and PR #49 reported every per-obligation seed of C17 and C19 missed (C18's and C11's were the same). Each probe now runs one Row.Check per obligation its row's axes select, named by the claim's obligation id and with its baseline, following C22 (#47).

Probe Checks per row Baseline
C17 (FaultKind)9: a-cast-naming-no-member, reported-where-written, plus constructor-accessibility-too at site=attribute-argument. default: default-and-zero, reported-where-written. valid: a-member-is-silent (new, below) Docs(src/CodoMetis.TypeKit.Analyzers/README.md#cmtk0014)
C18 names-each-base-member, a-warning-and-generated, generated-equality-never-calls-the-base, on every row Docs(Generators README#equality), Docs(…#build-errors), Twin (the wrapped ints' own equality)
C19 the attribute's obligation (interface-and-unsealed, value-object-and-closed-set, flags-enum-and-read-only-struct, a-pair-once-at-the-later-argument), plus methods-the-compiler-calls where the site is not call Docs(docs/type-constraints.md#the-kind-of-a-type-argument) or #two-parameters-apart; #constrain-a-type-parameter for the methods
C11 the parse shape's obligation (implicit-result, ref-text, abstract-string-constructor), or parsing-where-it-can-be-parsed (new, below) for ordinary Docs(CHANGELOG.md#2.1.0-fixed); Twin (the catalogue's top-level value object of the same kind and wrapped type)

How each check is kept to its own obligation:

  • C17. There is one compilation per row, and each check judges only its share of it:
    • the FaultKind places (a-cast…, default-and-zero);
    • RequireParameterlessConstructor's argument (constructor-accessibility-too; under default-and-zero, default there is Public and must stay silent).
    • A value counts as reported if a report sits at it or at the syntax around it (Rz.Reported). Where the report sits is reported-where-written's question alone (Rz.WhereWritten: at the value's own span, and nothing outside every place).
  • C18. The two consumer checks mark the row's shape axes themselves. The equality check runs this project's own in-process twins, so it reads base-member alone and is credited with no shape pairs it never ran. The row is read from the rows file's copy, as Decls.Key does.
  • C19. Every argument, from the catalogue and from the row's shapes, is now also used at a written call and at an inferred call.
    • The attribute's check judges the calls. It reads site only where the site is call, so in a foreach row it is not credited with site=foreach.
    • methods-the-compiler-calls judges each use at the row's site against the same argument's inferred call in the same compilation.
    • So a misjudged kind fails the attribute's check alone, and an unchecked site fails the methods' check alone (see the seeds).
    • BuildRoslyn.cs gains Agree over a subset of marks, At, Around, Outside, Reported and WhereWritten. The old Agree delegates to the new one.

Obligation decisions

  • C17, valid values: the new obligation a-member-is-silent.
    • Sentence, quoted from the README's CMTK0014 example: public static readonly ImportFault Duplicate = new(FaultKind.Conflict);, the member written beside the reported new(default). Axes value=[valid].
    • Why not fold it into a-cast-naming-no-member: a valid value's silence is evidence for neither the cast obligation nor the default one. A rule that reports every value, members included, would pass both. No seed had ever shown the 86 valid rows could fail.
    • Its seed: CMTK0014 judges an explicit cast by its form, not by the value it names, so (FaultKind)2 is reported.
    • The first seed (members compared by name) failed the seeded build, because the shipping code's own constants were then reported.
  • C11, ordinary: the new obligation parsing-where-it-can-be-parsed.
    • 169 of C11's 241 rows have parse-shape=ordinary, which none of the three obligations selects. Leaving them as claim would have kept half the probe unconverted. Making them inapplicable would have uncovered every ordinary pair.
    • Sentence, from the same file's 2.0.0 Generators entry (what the 2.1.0 fix must leave to a type that parses): `IParsable`/`ISpanParsable`/`IUtf8SpanParsable`, formatting in the invariant culture. Axes parse-shape=[ordinary].
    • Its seed: the generated [TypeConverter] is attached to a top-level value object only.
    • The first seed (an enum given no parsing) failed the seeded build, since code elsewhere parses an enum value object.
  • Inapplicability declared in claims.json (build: declared applicability: an obligation says where it does not apply, read by the universe, the covering generator, the gate and Row.Check #50): one, for parsing-where-it-can-be-parsed: shape.wrapped ∈ {Uri, enum, flags-enum, NodaTime.Instant} and text.entry=ISpanParsable, cited not-promised:no-span-parsing-without-the-underlying-types (the Finding, below). Row.Check applies it, and it stays out of code because it depends on the axes alone. No other converted check decides inapplicability, so nothing else moved into the claims.

Outcome note keys and uncited excuses

  • Note keys. Neither the four probes nor the build harness (BuildConsumer, BuildDecls, BuildSource, BuildRoslyn) called an inapplicable, expected-refusal or inconclusive key. None was converted, and no NoteKeys member was touched. Pass keys stay c.Note(NoteKeys.Compared, …).
  • Not-promised entries added: one. C11's no-span-parsing-without-the-underlying-types, from src/CodoMetis.TypeKit.Generators/README.md#what-is-generated: "A Uri, an enum and a NodaTime type have neither." Its axes are the four wrapped types and text.entry=ISpanParsable. The sentence comes from fix: a value object over string implements ISpanParsable, as string does #52's narrowed README.
  • Uncited excuses: one.
    • C11's ordinary check let a value object over a type that parses lack ISpanParsable (entry is not "ISpanParsable"), citing nothing.
    • The Generators README's "What is generated" table promises IParsable, ISpanParsable and IUtf8SpanParsable "when the underlying type can be parsed". No record or fact narrows that.
    • The exemption is gone, and the check runs. It failed 5 rows: see "Finding" below, where the fix (fix: a value object over string implements ISpanParsable, as string does #52) and the not-promised entry settle them.

Finding: value objects over a parseable type lack ISpanParsable (C11)

The rows. Probe C11ParseShapesBuildProbe, check parsing-where-it-can-be-parsed (Baseline.Twin), category violation. All five have parse-shape=ordinary and text.entry=ISpanParsable:

Row shape.wrapped shape.kind shape.site shape.inheritance process.converter-lookup text.culture
#174 Uri validated-class nested-in-class base-depth-3 wrapped-type-converter-looked-up-first invariant
#180 enum record-struct nested-two-levels explicit-interface-member wrapped-type-converter-looked-up-first globalization-invariant
#183 flags-enum validated-class nested-in-struct base-depth-3 none invariant
#189 NodaTime.Instant validated-class nested-two-levels explicit-interface-member none invariant
#205 string sealed-record-class nested-in-struct base-depth-1 wrapped-type-converter-looked-up-first tr-TR

The failure, for #205: violation:ISpanParsable: the value object over string, which parses, has no ISpanParsable. The other four read the same, with their wrapped type. Each row fails 3 of 3 times at HEAD (prober try --rows 174,180,183,189,205).

Why now. The ordinary check's presence test exempted ISpanParsable (entry is not "ISpanParsable") and cited nothing. Rule 2 makes that an uncited excuse: it is gone, and the check runs. The comparison with the catalogue still agrees, since both sides lack it; only the presence test fails.

Triage (.claude/skills/probe-triage):

  1. A harness error? No. The check reads the value object's own interfaces by reflection (TextOps.Implements(ISpanParsable<>, Vo)). The catalogue's top-level value object over the same type lacks it too, so it is no artefact of the row's shape.
  2. A fact? No. docs-query find ISpanParsable --kind fact finds nothing, and this is TypeKit's own generation, not a framework's.
  3. Not promised? No. C11 has no not-promised entry. The only docs sentence is the Generators README's "What is generated" row, which promises it: "IParsable, ISpanParsable, IUtf8SpanParsable | when the underlying type can be parsed". design/aspects.md explains only the enum strategy, and no record narrows it.
  4. A finding. ValueObjectParsableAspect.ResolveStrategy gives ISpanParsable only to its SpanParsable strategy.
    • string returns its own String strategy first, although string is ISpanParsable<string>. That breaks even the aspect's doc comment ("where the wrapped type has them").
    • Uri, the enums and NodaTime.Instant take the Uri, Enum and TypeConverter strategies, which generate IParsable alone.
    • No code-analyst agent was available on the host, so nothing was filed and no Skip was written.

The two sides, as the row's value object / the catalogue's / the wrapped type:

Wrapped type Row's value object Catalogue's value object Wrapped type itself
string no ISpanParsable no ISpanParsable is ISpanParsable<string>
Uri, enum, flags-enum, NodaTime.Instant no ISpanParsable no ISpanParsable not ISpanParsable

Every one of them gets IParsable.

The fix landed as #52 (decision (a), a fix: with Found-By: PR), merged into release/2.2.0 at 0805ac5 and into this branch at f9ee5b2:

  • a value object over string implements ISpanParsable;
  • the Generators README's "What is generated" row is split: ISpanParsable and IUtf8SpanParsable are generated "where the underlying type has them", and the note says "A Uri, an enum and a NodaTime type have neither.";
  • the Generators tests come with it (SpanParsingTests).

How C11 cites it (da2c291):

  • C11 gains the not-promised entry no-span-parsing-without-the-underlying-types, quoting that sentence verbatim from src/CodoMetis.TypeKit.Generators/README.md#what-is-generated. Its axes are shape.wrapped ∈ {Uri, enum, flags-enum, NodaTime.Instant} and text.entry=ISpanParsable. universe (Axes.Build) accepts the quote.
  • parsing-where-it-can-be-parsed declares itself inapplicable there (build: declared applicability: an obligation says where it does not apply, read by the universe, the covering generator, the gate and Row.Check #50's inapplicable, with the same axes and cite: not-promised:no-span-parsing-without-the-underlying-types), so Row.Check records those rows inapplicable before the body runs.
  • The declaration includes text.entry, so the same types' Parse, TryParse, IParsable and type converter checks still run. string is not in it: its row now passes on the fix, not on an excuse.

Rows #174, #180, #183 and #189 are inapplicable, and #205 passes. The recorded reason, for #174: inapplicable:not-promised:no-span-parsing-without-the-underlying-types(declared shape.wrapped=Uri text.entry=ISpanParsable). C11 ended at inapplicable 4, pass 237, no violation, in prober try and in replay --family text at da2c291.

The exclusion and the rows (4d01780, 6e6beaa):

  • With the entry alone, 11 of C11's 1048 pairs were uncovered (1037/1048).
    • 4 were the declared pairs, each of the four types × text.entry=ISpanParsable. They still counted as wanted, because C11's three parse-shape obligations want every pair they do not declare, though they never read shape.wrapped.
    • 7 were covered only by the 4 rows now inapplicable.
  • The 4 pairs are excluded in claims.json (decision 102's form). The reason: "A Uri, an enum and a NodaTime type have neither (Generators README, What is generated: no ISpanParsable or IUtf8SpanParsable where the underlying type has none, not-promised no-span-parsing-without-the-underlying-types), so parsing-where-it-can-be-parsed is inapplicable there and no check that reads shape.wrapped can credit them." The universe goes from 1048 to 1044 pairs (242179 to 242175 in all).
  • The rows: the 241 of da2c291 plus 6. I did not regenerate them whole:
    • prober rows --probe regenerated C11's rows whole as 157 rows (4d01780), which covered only 888 of 1044. The covering array puts a shape.wrapped value on a parse-shape row, which never reads it, and counts that row's wrapped pairs as covered. Where an axis has no unblocked value, it places an excluded pair anyway.
    • So C11 keeps its 241 rows, and gains the arrays prober rows --claim printed over the pairs those left: --seed 4, five ordinary rows over the 7, then --seed 1, one more. Row 243 of the first array was a record-struct with base-depth-3, which C11's declarations substitute, so it missed (base-depth-3, Uri).
    • The 247 rows were staged as one file and published.
    • C11Shapes.g.cs was generated again with decls.cs (GeneratedHarnessTests passes).
  • C11's pairs: before 1048/1048. With the entry alone: 1037/1048. Now: 1044/1044, the 4 excluded pairs left out. C11 ends at inapplicable 4, pass 243, no violation.
  • The prober side (an obligation's own axes narrowing the pairs it wants, and a covering array that never places an excluded pair) is for WS2's closing record, not this branch.

Before and after

Probe before: rows before: checks after: rows after: checks after: checks by obligation
C11ParseShapesBuildProbe pass 241 pass 241 inapplicable 4, pass 243 inapplicable 4, pass 243 abstract-string-constructor pass 22; implicit-result pass 28; parsing-where-it-can-be-parsed inapplicable 4, pass 171; ref-text pass 22
C17Cmtk0014Probe pass 283 pass 283 pass 283 pass 512 a-cast-naming-no-member pass 75; a-member-is-silent pass 86; constructor-accessibility-too pass 32; default-and-zero pass 122; reported-where-written pass 197
C18Cmtk1023Probe pass 280 pass 280 pass 280 pass 840 a-warning-and-generated pass 280; generated-equality-never-calls-the-base pass 280; names-each-base-member pass 280
C19Cmtk0010KindsProbe pass 282 pass 282 pass 282 pass 508 a-pair-once-at-the-later-argument pass 80; flags-enum-and-read-only-struct pass 72; interface-and-unsealed pass 66; methods-the-compiler-calls pass 226; value-object-and-closed-set pass 64
C22GeneratorRefusalsProbe pass 144 pass 432 pass 144 pass 432 abstract pass 20; closed-set-named-as-generated-member pass 4; equality-operator pass 20; every-error-links-the-table pass 144; generic-wrapped pass 24; named-as-generated-member pass 22; no-type-half-generated pass 144; over-object pass 6; over-system-enum pass 7; over-value-object pass 20; unsealed-record-class pass 21
C09BaseRecordEqualityProbe pass 101 pass 101 pass 101 pass 101 claim pass 101
C20ShouldHoldProbe pass 261 pass 261 pass 261 pass 261 claim pass 261
L05EqualityProbe pass 309 pass 309 pass 309 pass 309 claim pass 309
C02OptionalTextProbe pass 46 pass 46 pass 46 pass 46 claim pass 46
L03OneRuleProbe expected-refusal 5, inapplicable 13, pass 568 expected-refusal 5, inapplicable 13, pass 568 expected-refusal 5, inapplicable 13, pass 568 expected-refusal 5, inapplicable 13, pass 568 claim expected-refusal 5, inapplicable 13, pass 568
L04RoundTripProbe expected-refusal 78, inapplicable 127, pass 381 expected-refusal 78, inapplicable 127, pass 381 expected-refusal 78, inapplicable 127, pass 381 expected-refusal 78, inapplicable 127, pass 381 claim expected-refusal 78, inapplicable 127, pass 381
  • Build family: 7 passed, 0 failed. Text family: 4 passed, 0 failed at 6e6beaa (and at da2c291). Before the fix it was 3 passed, 1 failed (C11, the 5 rows of the finding).
  • No row that passed before fails, apart from those 5. No new violation elsewhere. C17, C18 and C19 end every row as before (pass 283, 280 and 282), now with 512, 840 and 508 passing checks.

prober status (after universe; 44 claims, 242179 pairs before, 242175 after C11's exclusion):

Claim before after
C11-parse-shapes-build 1048/1048, obligations 3, 3 uncredited 1044/1044 (4 pairs excluded, see the Finding), obligations 4, each seeded, 0 uncredited
C17-cmtk0014 1791/1832, obligations 4, 4 uncredited 1791/1832, obligations 5, each seeded, 0 uncredited
C18-cmtk1023 1067/1067, obligations 3, 3 uncredited 1067/1067, 0 uncredited
C19-cmtk0010-kinds 2242/2292, obligations 5, 5 uncredited 2242/2292, 0 uncredited
C22-generator-refusals 0/621, 0 uncredited 0/621, 0 uncredited

C19 keeps every pair, although its attribute checks no longer read a non-call site, because its methods' checks earn those pairs.

Seeds

prober seeds --probe P for the four probes and C22 as the control, one at a time, after the merge. 28 of 28 are caught, each by the check of its own obligation, named in the detail:

prober seeds: test/ws2-build-checks at 073f41e: 5 seeds of 1 probes
  C17Cmtk0014Probe/a-cast-naming-no-member (C17-cmtk0014): caught, 75 of 283 rows violate; e.g. #4 a-cast-naming-no-member: violation:p0 '(FaultKind)9': reported 0 times, expected once; p1 '(FaultKind)9': reported 0 times, expected once; p2 '(F…
  C17Cmtk0014Probe/default-and-zero (C17-cmtk0014): caught, 122 of 283 rows violate; e.g. #0 default-and-zero: violation:p0 '(FaultKind)0': reported 0 times, expected once; p1 '(FaultKind)0': reported 0 times, expected once; p2 '(F…
  C17Cmtk0014Probe/constructor-accessibility-too (C17-cmtk0014): caught, 32 of 283 rows violate; e.g. #4 constructor-accessibility-too: violation:ca3 '(ConstructorAccessibility)9': reported 0 times, expected once…
  C17Cmtk0014Probe/reported-where-written (C17-cmtk0014): caught, 139 of 283 rows violate; e.g. #0 reported-where-written: violation:p0 '(FaultKind)0': reported at Row0.cs:[625..640) '=> (FaultKind)0', not at the value; p1 '(FaultKind)0': repo…
  C17Cmtk0014Probe/a-member-is-silent (C17-cmtk0014): caught, 43 of 283 rows violate; e.g. #3 a-member-is-silent: violation:p0 '(FaultKind)2': reported, expected silent ((FaultKind)2 names no member of FaultKind: a host refuses a faul…
prober seeds: 5 caught, 374.9 s in all
prober seeds: test/ws2-build-checks at 073f41e: 3 seeds of 1 probes
  C18Cmtk1023Probe/names-each-base-member (C18-cmtk1023): caught, 130 of 280 rows violate; e.g. #0 names-each-base-member: violation:CMTK1023 reported 0 times in R0.cs, expected once…
  C18Cmtk1023Probe/a-warning-and-generated (C18-cmtk1023): caught, 280 of 280 rows violate; e.g. #0 a-warning-and-generated: violation:no CMTK1023 warning: the build reports none for the value object…
  C18Cmtk1023Probe/generated-equality-never-calls-the-base (C18-cmtk1023): caught, 83 of 280 rows violate; e.g. #4 generated-equality-never-calls-the-base: violation:over a base declaring GetHashCode by reference, two value objects holding 42 are unequal or hash apart: the ge…
prober seeds: 3 caught, 237.9 s in all
prober seeds: test/ws2-build-checks at 073f41e: 5 seeds of 1 probes
  C19Cmtk0010KindsProbe/methods-the-compiler-calls (C19-cmtk0010-kinds): caught, 59 of 282 rows violate; e.g. #6 methods-the-compiler-calls: violation:u7 '[x]': reported 0 times, expected once; u19 '[x]': reported 0 times, expected once; u35 '[x]': reported 0 t…
  C19Cmtk0010KindsProbe/interface-and-unsealed (C19-cmtk0010-kinds): caught, 32 of 282 rows violate; e.g. #1 interface-and-unsealed: violation:u0 'OrderHandler': reported 0 times, expected once; u1 'Runner.Run(a)': reported 0 times, expected once; u7 'D…
  C19Cmtk0010KindsProbe/value-object-and-closed-set (C19-cmtk0010-kinds): caught, 28 of 282 rows violate; e.g. #0 value-object-and-closed-set: violation:u0 'Guid': reported 0 times, expected once; u1 'Runner.Run(a)': reported 0 times, expected once; u19 'System.U…
  C19Cmtk0010KindsProbe/flags-enum-and-read-only-struct (C19-cmtk0010-kinds): caught, 33 of 282 rows violate; e.g. #2 flags-enum-and-read-only-struct: violation:u0 'Mutable': reported 0 times, expected once; u1 'Runner.Run(a)': reported 0 times, expected once…
  C19Cmtk0010KindsProbe/a-pair-once-at-the-later-argument (C19-cmtk0010-kinds): caught, 80 of 282 rows violate; e.g. #6 a-pair-once-at-the-later-argument: violation:u4 'Placed': reported 0 times, expected once; u13 'D6': reported 0 times, expected once; u29 'R6': reported 0 …
prober seeds: 5 caught, 487.0 s in all
prober seeds: test/ws2-build-checks at 4d01780: 4 seeds of 1 probes
  C11ParseShapesBuildProbe/implicit-result (C11-parse-shapes-build): caught, 28 of 247 rows violate; e.g. #2 implicit-result: violation:the value object over a implicit-result type has parsing: Parse, TryParse, IParsable, a type converter from st…
  C11ParseShapesBuildProbe/ref-text (C11-parse-shapes-build): caught, 22 of 247 rows violate; e.g. #4 ref-text: violation:the value object over a ref-text type has parsing: Parse, TryParse, IParsable, a type converter from string…
  C11ParseShapesBuildProbe/abstract-string-constructor (C11-parse-shapes-build): caught, 22 of 247 rows violate; e.g. #3 abstract-string-constructor: violation:the value object over a abstract-string-ctor type has parsing: Parse, TryParse, IParsable, a type converter fr…
  C11ParseShapesBuildProbe/parsing-where-it-can-be-parsed (C11-parse-shapes-build): caught, 16 of 247 rows violate; e.g. #37 parsing-where-it-can-be-parsed: violation:type-converter: the value object over char, which parses, has no type-converter…
prober seeds: 4 caught, 236.3 s in all
prober seeds: test/ws2-build-checks at 073f41e: 11 seeds of 1 probes
  unseeded build: 114.9 s, BUILD OK: 9 projects, 00:01:53.27
    C22GeneratorRefusalsProbe: 144 rows, 0 violations unseeded
  C22GeneratorRefusalsProbe/every-error-links-the-table (C22-generator-refusals): caught, 79 of 144 rows violate; e.g. #1 every-error-links-the-table: violation:these errors do not end with the link to the Build errors table: R1.cs CMTK1005 'O1.V1' cannot be generated as…
  C22GeneratorRefusalsProbe/unsealed-record-class (C22-generator-refusals): caught, 21 of 144 rows violate; e.g. #5 unsealed-record-class: violation:O5.V5 (unsealed-record-class (CMTK1006)) is not refused with CMTK1006 by name: its file reports no error…
  C22GeneratorRefusalsProbe/over-value-object (C22-generator-refusals): caught, 20 of 144 rows violate; e.g. #1 over-value-object: violation:O1.V1 (over-value-object (CMTK1005)) is not refused with CMTK1005 by name: its file reports no error…
  C22GeneratorRefusalsProbe/generic-wrapped (C22-generator-refusals): caught, 24 of 144 rows violate; e.g. #3 generic-wrapped: violation:O3.P3.V3 (generic-wrapped (CMTK1005)) is not refused with CMTK1005 by name: R3.cs LAMA0611 Error CS0305 in cod…
  C22GeneratorRefusalsProbe/abstract (C22-generator-refusals): caught, 20 of 144 rows violate; e.g. #4 abstract: violation:O4.P4.V4 (abstract (CMTK1005)) is not refused with CMTK1022 by name: its file reports no error…
  C22GeneratorRefusalsProbe/over-system-enum (C22-generator-refusals): caught, 7 of 144 rows violate; e.g. #8 over-system-enum: violation:V8 (over-System.Enum (CMTK1005)) is not refused with CMTK1005 by name: its file reports no error…
  C22GeneratorRefusalsProbe/named-as-generated-member (C22-generator-refusals): caught, 20 of 144 rows violate; e.g. #2 named-as-generated-member: violation:O2.TryFrom (named-as-generated-member (CMTK1005)) is not refused with CMTK1005 by name: R2.cs LAMA0611 Error C…
  C22GeneratorRefusalsProbe/closed-set-named-as-generated-member (C22-generator-refusals): caught, 4 of 144 rows violate; e.g. #11 closed-set-named-as-generated-member: violation:O11.P11.TryParse (closed-set-named-as-generated-member (CMTK1021)) is not refused with CMTK1021 by name: R11.c…
  C22GeneratorRefusalsProbe/equality-operator (C22-generator-refusals): caught, 20 of 144 rows violate; e.g. #0 equality-operator: violation:V0 (equality-operator (CMTK1011)) is not refused with CMTK1011 by name: R0.cs CS0111 Type 'V0' already defines…
  C22GeneratorRefusalsProbe/no-type-half-generated (C22-generator-refusals): caught, 79 of 144 rows violate; e.g. #1 no-type-half-generated: violation:O1.V1 (over-value-object (CMTK1005)) compiles: its file reports no error…
  C22GeneratorRefusalsProbe/over-object (C22-generator-refusals): caught, 6 of 144 rows violate; e.g. #15 over-object: violation:V15 (over-object (CMTK1005)) is not refused with CMTK1005 by name: its file reports no error…
prober seeds: 11 caught, 1355.0 s in all
  • C11's run is at 4d01780 with the 247 rows of 6e6beaa in the checkout (the same run passes at da2c291 with 241 rows); the other four are at 073f41e.
  • Before the merge (at 9ab1613), the same runs caught 26 of 28, each by its own check. The two first-draft seeds of the new obligations failed their seeded builds, and were replaced in 732baf2.
  • In C19, the kind seeds fail the attribute's check, and the builder seed fails methods-the-compiler-calls.

Verdicts

Through build-verdict, at 6e6beaa:

  • test --project test/CodoMetis.TypeKit.Prober.Tests: TESTS OK: 245 passed, 0 skipped.
  • test --project test/CodoMetis.TypeKit.Conventions.Tests: TESTS OK: 1475 passed, 0 skipped, ProbeCiteTests and ProbeNoteKeyTests among them.
  • prober register and publish ran SourceLint on each seed's registration.

Noticed on the way, not changed here

  • C22 credits 0 of its 621 pairs. Its replay refuses an empty footprint ("the coverage report shows no executed file under src"), since the probe builds in a child process. C18 has watched paths for the same reason; C22 has none.
  • C17's and C19's stored rows leave 41 and 50 pairs uncovered at replay (1791/1832, 2242/2292). test: C17 and C19 cover the five refused kinds C22 added #49 counted 0 from the stored rows: the replayed substitutions of excluded pairs credit other values.

Commits

🤖 Generated with Claude Code

CaffeinatedCoder and others added 7 commits October 17, 2026 01:15
C11, C17, C18 and C19 ran as one check named `claim`, so no listed obligation earned credit and
every per-obligation seed was reported missed (PR #49). Each now runs one Row.Check per obligation
its row's axes select, against the baseline its source names:

- C17: a cast, a default and RequireParameterlessConstructor's argument each judged on the places
  of their own enum, reported at or around the value; where the reports sit is reported-where-written's.
  A valid value names no obligation, so the claim gains a-member-is-silent, quoted from the README's
  example beside the reported default, with a seed.
- C18: the consumer's report and generation judged per obligation; the equality twin check reads
  base-member alone, since the row's shape is not what it runs.
- C19: every argument is also used at a written and an inferred call; the attribute's obligation is
  judged at the calls, methods-the-compiler-calls at the row's site against each argument's inferred
  call, so a misjudged kind and an unchecked site fail apart.
- C11: a parse shape's obligation against the CHANGELOG's sentence; the ordinary shape, which no
  obligation selected, gains parsing-where-it-can-be-parsed, quoted from the 2.0.0 entry, with a seed.
  Its exemption of ISpanParsable cited nothing and is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first seeds of a-member-is-silent and parsing-where-it-can-be-parsed failed the seeded build:
CMTK0014 reading member names reported the shipping code's own constants, and an enum without
parsing broke code that parses one. The seeds now make CMTK0014 judge an explicit cast by its
form, and attach the generated [TypeConverter] to a top-level value object only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The ordinary shape's check failed on ISpanParsable for a value object over string, Uri, an enum and
NodaTime.Instant once its uncited exemption was gone. #52 gave the string one ISpanParsable and
narrowed the Generators README: "A `Uri`, an enum and a NodaTime type have neither." C11 quotes that
as the not-promised entry no-span-parsing-without-the-underlying-types, for those wrapped types and
text.entry ISpanParsable, and parsing-where-it-can-be-parsed declares it inapplicable there (#50),
so Row.Check records those rows inapplicable with the citation. string keeps no exemption.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…vers the rest again

The four pairs of Uri, an enum, a [Flags] enum and NodaTime.Instant with text.entry ISpanParsable
are not promised ("A `Uri`, an enum and a NodaTime type have neither."), and still counted as
wanted, by the parse-shape obligations, which never read shape.wrapped. They are excluded with
that reason (decision 102). The rows are regenerated (`prober rows --probe`), so the seven pairs
the four now-inapplicable rows carried are covered again, and C11Shapes.g.cs with them (decls.cs).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cable four carried

Regenerated whole (`prober rows --probe`, 4d01780), C11's 157 rows covered 888 of its 1044 pairs:
the covering array puts a shape.wrapped value on a parse-shape row, which never reads it, and counts
the row's wrapped pairs covered; where an axis has no unblocked value it places an excluded pair
anyway. So C11 keeps its 241 rows of da2c291 and adds the arrays `prober rows --claim` printed over
the pairs those left uncovered (`--seed 4`, five rows, then `--seed 1`, one), each an ordinary row,
staged with them and published. C11Shapes.g.cs is generated again from the 247 rows (decls.cs).
C11 covers 1044 of 1044 pairs, the four excluded ones left out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant