Skip to content

docs(corpus): add test-strategy corpus template - #1550

Merged
tucktuck101 merged 1 commit into
launchpadfrom
task/1350-corpus-template-test-strategy
Aug 28, 2026
Merged

docs(corpus): add test-strategy corpus template#1550
tucktuck101 merged 1 commit into
launchpadfrom
task/1350-corpus-template-test-strategy

Conversation

@serina-mcfall

Copy link
Copy Markdown

Summary

Adds launchpad/docs/corpus/templates/test-strategy.md, the template governing how a corpus node documents a system or component's overall multi-tier testing approach. Grounded in this repository's own ADR-0020 and TESTING.md rather than importing an industry model wholesale, with an explicit boundary against #1349/test-contract and #1325/test-references.

Related issue

Closes #1350

Issue type

Task


Agent provenance

Field Value
Harness / provider Claude Code
Model claude-sonnet-5
Session reference N/A - harness does not expose a run id/URL for this session
Initiating human @serina-mcfall

Objective

Create launchpad/docs/corpus/templates/test-strategy.md as the corpus template for a test-strategy-shaped node (a system or component's overall, multi-tier testing approach).

Impacted components

  • launchpad/docs/corpus/templates/test-strategy.md

Approach and rejected alternatives

Issue #1350's Definition of Done is the same standards-track policy boilerplate copied across #1326-#1351 (MUST/SHOULD, enforcement/escalation, "single canonical policy node"). Per the batch brief and #605's real acceptance criterion ("every template states its purpose, required sections, evidence expectations and the industry model/standard it adapts"), I built this as a template, not a policy, and named the mismatch explicitly in the document's own "Note on this document's structure" section — the same move templates/test-contract.md and templates/capability.md (already-drafted siblings) made for the identical boilerplate.

Two industry models were considered: ISTQB's test strategy glossary definition (levels + what happens within them) and Google's test size framework (small/medium/large, classified by infrastructure footprint, from Software Engineering at Google). Neither was imported wholesale. This repository already has a real, accepted, whole-repository test strategy — ADR-0020 (adopt-upstream-testing-methodology) — with five levels separated by the infrastructure they need, an #[ignore] convention, and an honest finding that required_status_checks on launchpad returns 404 (not currently enforced). The template adapts ADR-0020's own shape (level, infrastructure, command, gating status) rather than either industry model's full taxonomy, while citing both models as the vocabulary a reader would recognize.

Rejected alternative: importing ISTQB's full strategy-type taxonomy (analytical/methodical/process-compliant/etc.) as required template content. Rejected because this repository's own real precedent (ADR-0020) does not organize itself around those types, and forcing an unused vocabulary onto the template would misdescribe the one worked example the corpus actually has.

Boundary against #1349 (test-contract, unmerged PR #1540) and #1325 (test-references, unmerged PR #1524): both diffs were read directly (git show origin/task/1349-...:...test-contract.md and origin/task/1325-...:...test-references.md) before drafting. test-contract is the corpus's smallest verification unit — one testable obligation plus its verifying test. test-references is a corpus-wide citation-mechanics standard, not a node type. test-strategy is neither: it is the map across levels that a test-contract node would eventually instantiate one obligation of, stated explicitly in this document's "Boundary against neighboring corpus content" section.

Verification

Command run:

python3 launchpad/project-intelligence/corpus/validate.py

Raw output:

UNVERIFIED  corpus-agents: evidence entry 1, citation 1: is a commit reference, which names no openable file
UNVERIFIED  corpus-agents: evidence entry 20, citation 1: is a graph-edge or tool-result citation, which names no openable file
UNVERIFIED  corpus-readme: evidence entry 1, citation 1: is a commit reference, which names no openable file
UNVERIFIED  corpus-standard-confidence: evidence entry 1, citation 1: is a commit reference, which names no openable file
UNVERIFIED  corpus-standard-decision-references: evidence entry 1, citation 1: is a commit reference, which names no openable file
UNVERIFIED  corpus-template-test-strategy: evidence entry 1, citation 1: is a commit reference, which names no openable file
UNVERIFIED  corpus-template-test-strategy: evidence entry 4, citation 1: is a graph-edge or tool-result citation, which names no openable file
UNVERIFIED  corpus-template-test-strategy: evidence entry 11, citation 1: is an external URL this validator can neither pin nor open
UNVERIFIED  corpus-template-test-strategy: evidence entry 12, citation 1: is an external URL this validator can neither pin nor open
UNVERIFIED  corpus-template-test-strategy: evidence entry 13, citation 1: is an external URL this validator can neither pin nor open
UNVERIFIED  corpus-template-test-strategy: evidence entry 14, citation 2: is an external URL this validator can neither pin nor open
UNVERIFIED  corpus-template-test-strategy: evidence entry 15, citation 1: is a graph-edge or tool-result citation, which names no openable file
UNVERIFIED  corpus-template-test-strategy: evidence entry 16, citation 1: is a graph-edge or tool-result citation, which names no openable file
PASS  corpus validation found no errors; 13 item(s) reported unverified

Command run:

python3 -m unittest discover -s launchpad/docs/corpus/schema/tests -p "test_*.py" -v

Raw output:

test_duplicate_audiences_rejected (test_schema.InvalidFixtureTest.test_duplicate_audiences_rejected) ... ok
test_fact_with_forbidden_fields_rejected (test_schema.InvalidFixtureTest.test_fact_with_forbidden_fields_rejected) ... ok
test_inference_missing_confidence_rejected (test_schema.InvalidFixtureTest.test_inference_missing_confidence_rejected) ... ok
test_malformed_id_rejected (test_schema.InvalidFixtureTest.test_malformed_id_rejected) ... ok
test_missing_audiences_rejected (test_schema.InvalidFixtureTest.test_missing_audiences_rejected) ... ok
test_missing_evidence_field_rejected (test_schema.InvalidFixtureTest.test_missing_evidence_field_rejected) ... ok
test_missing_evidence_for_fact_rejected (test_schema.InvalidFixtureTest.test_missing_evidence_for_fact_rejected) ... ok
test_missing_evidence_for_inference_rejected (test_schema.InvalidFixtureTest.test_missing_evidence_for_inference_rejected) ... ok
test_missing_identity_rejected (test_schema.InvalidFixtureTest.test_missing_identity_rejected) ... ok
test_missing_origin_rejected (test_schema.InvalidFixtureTest.test_missing_origin_rejected) ... ok
test_missing_status_rejected (test_schema.InvalidFixtureTest.test_missing_status_rejected) ... ok
test_missing_type_rejected (test_schema.InvalidFixtureTest.test_missing_type_rejected) ... ok
test_team_knowledge_missing_provided_by_rejected (test_schema.InvalidFixtureTest.test_team_knowledge_missing_provided_by_rejected) ... ok
test_unknown_audience_value_rejected (test_schema.InvalidFixtureTest.test_unknown_audience_value_rejected) ... ok
test_unknown_origin_rejected (test_schema.InvalidFixtureTest.test_unknown_origin_rejected) ... ok
test_unknown_relationship_type_rejected (test_schema.InvalidFixtureTest.test_unknown_relationship_type_rejected) ... ok
test_unknown_status_rejected (test_schema.InvalidFixtureTest.test_unknown_status_rejected) ... ok
test_unknown_type_rejected (test_schema.InvalidFixtureTest.test_unknown_type_rejected) ... ok
test_unrecognized_field_rejected (test_schema.InvalidFixtureTest.test_unrecognized_field_rejected) ... ok
test_wrong_direction_relationship_rejected (test_schema.InvalidFixtureTest.test_wrong_direction_relationship_rejected) ... ok
test_every_enum_member_has_metadata (test_schema.RelationshipEnumMetadataTest.test_every_enum_member_has_metadata) ... ok
test_every_metadata_entry_has_directionality_and_inverse (test_schema.RelationshipEnumMetadataTest.test_every_metadata_entry_has_directionality_and_inverse) ... ok
test_relationship_enum_matches_node_schemas_inlined_copy (test_schema.RelationshipEnumMetadataTest.test_relationship_enum_matches_node_schemas_inlined_copy) ... ok
test_node_schema_is_valid_json_schema (test_schema.SchemaMetaValidityTest.test_node_schema_is_valid_json_schema) ... ok
test_relationships_schema_is_valid_json_schema (test_schema.SchemaMetaValidityTest.test_relationships_schema_is_valid_json_schema) ... ok
test_full_fixture_passes (test_schema.ValidFixtureTest.test_full_fixture_passes) ... ok
test_minimal_fixture_passes (test_schema.ValidFixtureTest.test_minimal_fixture_passes) ... ok

----------------------------------------------------------------------
Ran 27 tests in 0.079s

OK
  • Tests or checks were run and the raw output is pasted above
  • The diff is confined to the scope of the linked issue
  • No secrets, keys, tokens or hostnames were added to tracked files

Not verified

  • No real test-strategy node has been built from this template yet, so whether the required-sections list holds up for a component much smaller (a single crate) or much larger (the whole repository, ADR-0020's own scale) than the worked example is untested.
  • The official ISTQB Glossary site (glossary.istqb.org) returned no readable content when fetched directly for this task; the ISTQB definition cited in the node was read via a mirror (istqb-glossary.page) that attributes it to ISTQB, not cross-checked against the original site directly.
  • Google's test-size framework was read from Software Engineering at Google (abseil.io), not from Google's original 2010 Testing Blog post, which returned only its title and comment thread when fetched — the two were not diffed against each other for wording drift.
  • The inference that ADR-0020's five levels align one-to-one with Google's small/medium/large axis was reasoned from each document's stated infrastructure needs, not from running and classifying any actual test; it is recorded in the node's evidence ledger as an INFERENCE with confidence 0.75, not a FACT.
  • Codex is down (task: the mandatory cross-model review gate has a single provider, and it is unavailable #1467); same-model (Claude) adversarial self-review substituted for cross-model review in the pipeline for this PR.

Security implications

None. This is a documentation-only change adding one Markdown file under launchpad/docs/corpus/templates/; it changes no runtime code, no CI configuration, and no access control.

Escalations

None. No blocking or deferred findings surfaced while drafting this node — it is a straightforward template with no code, no schema change, and no relationship targets available yet (the two most relevant future edges, to #1349/test-contract and #1325/test-references, both name unmerged nodes and are recorded as future work directly in the document's own Relationships section rather than filed as separate issues).

Add launchpad/docs/corpus/templates/test-strategy.md, defining the shape
of a corpus node documenting a system or component's overall multi-tier
testing approach. Grounded in this repository's own ADR-0020 (adopted
testing methodology) and TESTING.md, cross-referenced against ISTQB's
test-strategy definition and Google's test-size framework, with an
explicit boundary against #1349/test-contract (one obligation) and
#1325/test-references (citation mechanics).

Closes #1350

Signed-off-by: Serina Mcfall <serina.mcfall@gmail.com>
@serina-mcfall serina-mcfall added the by:agent Filed or authored by an AI agent, not a human label Aug 27, 2026
@serina-mcfall
serina-mcfall marked this pull request as ready for review August 27, 2026 06:18
@tucktuck101 tucktuck101 self-assigned this Aug 27, 2026

@tucktuck101 tucktuck101 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review — test-strategy corpus template

Unusually well-cited: this template uses this repository's own test-level vocabulary rather
than inventing a parallel taxonomy, and its ADR-0020 quotations, TESTING.md references and
ISTQB definitions check out. One false universal in the ledger.

High — a FACT asserts a universal its own counterexample refutes

The evidence entry states: "Every existing corpus node about how to author corpus content,
rather than about a piece of verification/architecture/capability content itself, uses
type: governance (README.md, standards/confidence.md, standards/decision-references.md, and
the already-drafted templates/test-contract.md, templates/capability.md)."

launchpad/docs/corpus/AGENTS.md — id corpus-agents, the node whose entire subject is the
procedure for creating, updating and retiring corpus content — carries type: agent. Verified
in its frontmatter on launchpad.

The enumerated list is entirely correct; only the universal quantifier fails. And no validator
can catch it, because the entry's evidence array lists only the three governance nodes — the
counterexample is excluded from the citation. Your own siblings in this wave state the correct
disjunctive form: test-contract.md:14-20 ("...or type: agent (AGENTS.md, the one node that
is itself an agent-facing procedure)") and invariant.md:22-28. Adopt that wording; the
template's conclusion that governance is right for a template document is unaffected.

Medium — the required sections omit ADR-0020's retry and flakiness machinery

The levels table asks for purpose, infrastructure, invoking command and gating status, and
section 3 asks for enforcement status. Nothing asks about ADR-0020 items 5-6: the retry policy
(retries: process.env.CI ? 2 : 0 — zero locally so a developer feels their own flakiness, two
in CI so pass-on-retry is measurable) or flakiness visibility
(desktop/scripts/summarize-flaky-tests.mjs surfacing anything that passed on retry). Grepping
the template for just ci|retries|flaky|shard returns nothing outside one quoted sentence.

That matters given the template's own stated purpose — that a node "claim[ing] enforcement it
does not have would repeat exactly the gap ADR-0020 was written to make visible". Retry-masked
greenness is that failure mode, and the template never asks about it. just ci as the
repository-level contract command is also missing.

Low — the body says five levels and lists four

"five levels separated by the infrastructure they need" is followed by four groupings, with
desktop E2E smoke and desktop E2E integration collapsed. The ledger enumerates all five
correctly, so this is body-level compression — but a reader counting finds four against a
stated five, in the section whose job is to state the taxonomy precisely.

Low — one FACT bundles three ISTQB definitions behind one URL

https://istqb-glossary.page/test-strategy/ carries only the first of the three definitions
cited; analytical and methodical test strategy live at their own URLs. Both of those support the
template's wording, so the substance is sound and the citation is one page too shallow. The
gloss "analyzes the test basis (e.g. product risk)" also adds a parenthetical ISTQB's
definition does not contain.

Not findings, ruled out on evidence

  • Index registration: the corpus AGENTS.md forbids a hand-authored node index, so not
    modifying it is correct.
  • Test-level vocabulary: checked against ADR-0020 and TESTING.md — this template uses the
    repo's own names, no parallel taxonomy.
  • CI green at head (latest run per check); node validates clean.

Reviewed by tucktuck101's review lane. Every failing claim reported above was reproduced by me against this PR head before posting.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

by:agent Filed or authored by an AI agent, not a human

Projects

None yet

Development

Successfully merging this pull request may close these issues.

task: define the test strategy corpus template

2 participants