docs(claims): count the AMI surface by type, and correct every published figure - #306
Merged
Merged
Conversation
…hed figure `README.md:45` read "148 actions, 278 events, 18 typed responses" — one type count and two file counts in the same sentence. No definition made all three true at once, which is why the claim registry could never write a guard for them and why the package README had drifted to a third set of numbers. The definition is now settled as the one the shipping source generator already implements: a class-level `[VerbaraMapping]` on a non-abstract type (`EventRegistryGenerator.cs:51,60`). Measured against the tree: **148 actions, 269 events, 17 typed responses**. Rejected, with what each would have to count as an action or an event: - By file (149 / 278 / 18) counts `Actions/IEventGeneratingAction.cs`, an interface, as an action, and `Responses/ConfigCategory.cs`, a helper record, as a typed response. - By `[VerbaraMapping]` occurrence (149 / 270 / 17) counts two property-level mappings as types: `Async` in `OriginateAction.cs:19` and `100rel` in `EndpointDetail.cs:74`, both mapping AMI field names that are not valid C# identifiers. The nine event base types carry no `[VerbaraMapping]` at all, and none is `abstract`, so a filter written on `IsAbstract` alone would not exclude them. Corrected in the same pass: `docs/README-technical.md:543-544` named `AmiAction` and `AmiEvent` in `Verbara.Sdk.Ami.Actions` / `.Events`. Neither type exists — the bases are `ManagerAction` and `ManagerEvent`, both in `Verbara.Sdk` (`src/Verbara.Sdk/IAmiConnection.cs:70,79`). Left verbatim: ADRs 0001 and 0015 and the dated files under `docs/research/` state 278. Both folders are out of the registry's scope as period-correct records, and an Accepted ADR is superseded, never edited. No guard ships here. A guard on `src/*/README.md` cannot run while `scripts/ci/classify-docs-only.sh:25` treats every `*/README.md` as docs-only and skips `Unit Tests` — the job it would live on. That carve-out moves with the remaining open ruling, and the guard goes with it. The rows stay `GAP`: the figures are right and nothing yet stops them drifting again.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The problem
README.md:45published 148 actions, 278 events, 18 typed responses. Those three numbers comefrom two different ways of counting: 148 counts types, 278 and 18 count files. No single definition
makes all three true, which is why
docs/claim-registry.mdhas carried them as an unresolved ruling— a guard cannot be written against a figure that does not come from a countable rule.
Meanwhile the same surface was published three more times, each differently:
README.md:45README.md:65docs/README-technical.md:543-544src/Verbara.Sdk.Ami/README.md:7The last one is the package's
PackageReadmeFile— published verbatim on nuget.org.The ruling
Count by type, using the definition the shipping source generator already implements: a
class-level
[VerbaraMapping]on a non-abstract type (EventRegistryGenerator.cs:51,60). Measuredagainst the tree: 148 / 269 / 17.
Two alternatives were rejected on what each would have to count as an AMI action or event:
Actions/IEventGeneratingAction.cs— an interface — as anaction, and
Responses/ConfigCategory.cs— a helperrecord— as a typed response.[VerbaraMapping]occurrence (149 / 270 / 17) counts two property-level mappings astypes:
AsyncinOriginateAction.cs:19and100relinEndpointDetail.cs:74. Both map an AMIfield name that is not a valid C# identifier, which is why the attribute is on them at all.
The nine event base types (
Events/ResponseEvent.csplus the eight underEvents/Base/) carry no[VerbaraMapping], so no definition reaches them. None isabstracteither, so a filter written onIsAbstractalone would not have excluded them.Also corrected
docs/README-technical.md:543-544named the typesAmiActionandAmiEvent, inVerbara.Sdk.Ami.Actionsand.Events. Neither type exists. The bases areManagerActionandManagerEvent, both inVerbara.Sdk(src/Verbara.Sdk/IAmiConnection.cs:70,79). Same line, sameclass of defect: a false claim about the API.
Left verbatim, deliberately
docs/decisions/0001and0015state 278 event types, and dated files underdocs/research/state278 and 111. Both folders are Out of the claim registry's scope as period-correct records, and an
Accepted ADR is superseded, never edited.
No guard ships here
A guard on
src/*/README.mdcannot run today.scripts/ci/classify-docs-only.sh:29treats every*/README.mdas docs-only, so a PR whose only change is the package README skipsUnit Tests— thejob such a guard would live on. Demonstrated rather than assumed: a throwaway commit putting
999 actions, 999 eventsinsrc/Verbara.Sdk.Ami/README.mdand nothing else classifiesdocs_only=true.The guard would therefore fire on the PRs that do not need it and stay silent on exactly the ones
that break it. The script's own comment records this as an accepted residual
(verbara-meta/ADR-0016 §6.1 risk 3), so turning it around is a CI decision of its own, not a test to
add — it moves with the registry's remaining open ruling. These rows stay
GAP: the figures areright and nothing yet stops them drifting again.
This PR itself classifies
docs_only=false(it touchesREADME.md, which the fast path excludes),so the unit lane runs.
Verification
openspec validate --all --strict— 13 passed, 0 failedTests/Verbara.Sdk.OpenTelemetry.Tests— 31 passed (the claim-guard suites:MarketingClaimsTests,StatusBlockCoherenceTests,PerformanceTableCoherenceTests)Tests/Verbara.Sdk.Governance.Tests— 129 passed🤖 Generated with Claude Code