Repository navigation
Add root-tags orphan detection with ReqStream 1.11.0 - #97
Conversation
Upgrade demaconsulting.reqstream 1.10.0 -> 1.11.0 and adopt the root-tags
orphan-detection feature to guarantee every requirement traces to either a
product-facing system requirement or a documented quality/process outcome.
- Tag all 23 ReviewMark-System-* requirements with [system].
- Add docs/reqstream/quality.yaml (8 categories: build integrity, traceable
versions, static analysis, peer review, documentation generation, test
infrastructure, requirements traceability, architecture traceability)
tagged [quality], covering the process/tooling OTS dependencies (xUnit,
VersionMark, SarifMark, SonarMark, Pandoc, WeasyPrint, FileAssert,
ReqStream, SysML2Tools, BuildMark) and the self-dogfooded
ReviewMark-OTS-ReviewMark-* requirements.
- Set root-tags: [system, quality] in requirements.yaml.
- Link genuine production-code OTS dependencies (YamlDotNet, PDFsharp,
Microsoft.Extensions.FileSystemGlobbing, DemaConsulting.TestResults) to the
specific unit that consumes them, confirmed via using statements in src/,
rather than the quality tier, since they implement product functionality
rather than process/tooling concerns.
- Close remaining traced orphan gaps:
- ReviewMark-PathHelpers-TraversalRejection was missing from
Indexing-SafePathCombine's children (genuine omission).
- ReviewMark-Indexing-CreateEvidence (the none evidence-source path) was
never linked up to any System requirement; added as a child of
System-ReviewReport alongside Indexing-LoadEvidence.
- ReviewMark-Program-ExecuteOperation was never linked; added alongside
Program-Dispatch under System-Version (same dispatch concept).
- ReviewMark-Cmd-LintSilence was never linked; added to
System-LintSilenceOnSuccess alongside Cmd-Lint/Program-LintVerbosity.
- The documented context: (reference-material) feature and the
needs-review-constrained review-set resolution feature had full unit-level
requirement coverage (Config-Context*, Config-*Constrained*) but were never
wired up through the Configuration subsystem layer to any System
requirement, despite being real, README-documented, shipped functionality.
Linked each to the Configuration-* node matching its actual behavior
(NeedsReview for coverage/constraint semantics, Fingerprinting for
fingerprint exclusion, Elaboration for context display), based on which
existing tests each requirement's own tests overlap with.
Result: dotnet reqstream --requirements requirements.yaml reports 0 orphans.
Full build, all 867 tests (net8.0/net9.0/net10.0), lint.ps1, and
reviewmark --lint all pass.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🟡 Changes recommended
docs/reqstream/quality.yaml contains contradictory/misleading justification wording that should be corrected to avoid audit/traceability confusion.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR updates the repository’s ReqStream configuration to use the new root-tag orphan detection (via ReqStream 1.11.0), ensuring every requirement traces up to an explicitly tagged root requirement in either the product-facing system tier ([system]) or the repository/process quality tier ([quality]).
Changes:
- Upgraded
demaconsulting.reqstreamfrom 1.10.0 to 1.11.0 and enabledroot-tags: [system, quality]. - Tagged all
ReviewMark-System-*root requirements with[system]and introduced a new[quality]root requirements file for process/repository outcomes. - Tightened trace links by adding missing children and linking specific OTS dependencies to the units that actually consume them.
File summaries
| File | Description |
|---|---|
requirements.yaml |
Enables root-tag orphan detection and includes the new quality requirements file. |
docs/reqstream/quality.yaml |
Adds [quality] root requirements covering CI/process outcomes and links to tool/OTS children. |
docs/reqstream/review-mark.yaml |
Tags system-level roots with [system] and fills a few missing child links under system requirements. |
docs/reqstream/review-mark/configuration.yaml |
Wires previously-orphaned configuration behaviors (context + constrained resolution) into the system tree. |
docs/reqstream/review-mark/configuration/review-mark-configuration.yaml |
Links configuration parsing behavior to the specific OTS YAML library requirements. |
docs/reqstream/review-mark/configuration/glob-matcher.yaml |
Links glob-matching behavior to the specific OTS globbing library requirements. |
docs/reqstream/review-mark/indexing.yaml |
Adds the missing traversal-rejection requirement under safe path combining. |
docs/reqstream/review-mark/indexing/review-index.yaml |
Links PDF metadata parsing to the PDF library OTS requirement. |
docs/reqstream/review-mark/self-test/validation.yaml |
Links results-file serialization behavior to the TestResults OTS requirements. |
.config/dotnet-tools.json |
Bumps demaconsulting.reqstream tool version to 1.11.0. |
Review details
Suppressed comments (7)
docs/reqstream/quality.yaml:45
- The justification calls this a "non-requirement grouping node", but it is still a requirement entry in the ReqStream model. This wording is self-contradictory and can confuse traceability/audit readers; consider describing it as a non-atomic (grouping) requirement instead.
This requirement is satisfied by its children: it is a non-requirement grouping
node, and verification evidence is carried by each atomic child requirement's tests.
docs/reqstream/quality.yaml:63
- The justification calls this a "non-requirement grouping node", but it is still a requirement entry in the ReqStream model. This wording is self-contradictory and can confuse traceability/audit readers; consider describing it as a non-atomic (grouping) requirement instead.
This requirement is satisfied by its children: it is a non-requirement grouping
node, and verification evidence is carried by each atomic child requirement's tests.
docs/reqstream/quality.yaml:85
- The justification calls this a "non-requirement grouping node", but it is still a requirement entry in the ReqStream model. This wording is self-contradictory and can confuse traceability/audit readers; consider describing it as a non-atomic (grouping) requirement instead.
This requirement is satisfied by its children: it is a non-requirement grouping
node, and verification evidence is carried by each atomic child requirement's tests.
docs/reqstream/quality.yaml:106
- The justification calls this a "non-requirement grouping node", but it is still a requirement entry in the ReqStream model. This wording is self-contradictory and can confuse traceability/audit readers; consider describing it as a non-atomic (grouping) requirement instead.
This requirement is satisfied by its children: it is a non-requirement grouping
node, and verification evidence is carried by each atomic child requirement's tests.
docs/reqstream/quality.yaml:123
- The justification calls this a "non-requirement grouping node", but it is still a requirement entry in the ReqStream model. This wording is self-contradictory and can confuse traceability/audit readers; consider describing it as a non-atomic (grouping) requirement instead.
This requirement is satisfied by its children: it is a non-requirement grouping
node, and verification evidence is carried by each atomic child requirement's tests.
docs/reqstream/quality.yaml:140
- The justification calls this a "non-requirement grouping node", but it is still a requirement entry in the ReqStream model. This wording is self-contradictory and can confuse traceability/audit readers; consider describing it as a non-atomic (grouping) requirement instead.
This requirement is satisfied by its children: it is a non-requirement grouping
node, and verification evidence is carried by the atomic child requirement's tests.
docs/reqstream/quality.yaml:158
- The justification calls this a "non-requirement grouping node", but it is still a requirement entry in the ReqStream model. This wording is self-contradictory and can confuse traceability/audit readers; consider describing it as a non-atomic (grouping) requirement instead.
This requirement is satisfied by its children: it is a non-requirement grouping
node, and verification evidence is carried by each atomic child requirement's tests.
- Files reviewed: 10/10 changed files
- Comments generated: 2
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Address Copilot review feedback on PR #97: the justification text described non-atomic requirements as "non-requirement grouping nodes", which is self-contradictory since they are still requirement entries in the ReqStream model. Reworded to "non-atomic (grouping) requirement" to avoid confusing traceability/audit readers. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🟢 Approval recommended
The changes are consistent, well-formed, and limited to traceability/configuration updates (plus the tool bump) with no functional product code modifications.
Review details
- Files reviewed: 10/10 changed files
- Comments generated: 0 new
- Review effort level: Lite
Summary
Upgrades
demaconsulting.reqstream1.10.0 -> 1.11.0 and adopts the root-tagsorphan-detection feature (same playbook as ReqStream #211/#212, DictionaryMark
#39, and FileAssert #75) to guarantee every requirement traces up to either a
product-facing System requirement or a documented Quality/process outcome.
Changes
ReviewMark-System-*requirements with[system].docs/reqstream/quality.yaml-- 8 quality-outcome categories (buildintegrity, traceable versions, static analysis, peer review, documentation
generation, test infrastructure, requirements traceability, architecture
traceability), tagged
[quality], covering all process/tooling OTSdependencies and the self-dogfooded
ReviewMark-OTS-ReviewMark-*set.root-tags: [system, quality]inrequirements.yaml.Microsoft.Extensions.FileSystemGlobbing, DemaConsulting.TestResults) to the
specific unit that consumes them (confirmed via
usingstatements insrc/), rather than the quality tier, since they implement productfunctionality rather than process/tooling concerns.
Notable finding: real, shipped features that were never wired up
Tracing orphans found two genuinely user-facing, README-documented features
whose unit-level requirements existed and had passing tests, but were never
connected through the Configuration subsystem layer to any System
requirement:
context:(reference-material) feature --context:entries areparsed, excluded from fingerprinting and coverage, shown during
--elaborate, deduplicated againstpaths:, and support per-review-setexclusion patterns.
file resolution and fingerprinting are constrained to the declared
needs-review set when present.
Both were fully implemented and tested at the unit level (
ReviewMark-Config-Context*,ReviewMark-Config-*Constrained*) but had no path back to a Systemrequirement -- exactly the class of "good in isolation, no user" gap
root-tags was built to catch. Linked each to the
Configuration-*nodematching its actual behavior (NeedsReview for coverage/constraint semantics,
Fingerprinting for fingerprint exclusion, Elaboration for context display),
based on test-to-parent overlap evidence, not arbitrary placement.
Also closed several smaller genuine omissions:
ReviewMark-PathHelpers-TraversalRejectionmissing from
Indexing-SafePathCombine's children,ReviewMark-Indexing-CreateEvidence(the
noneevidence-source path) never linked toSystem-ReviewReport,ReviewMark-Program-ExecuteOperationnever linked underSystem-Version, andReviewMark-Cmd-LintSilencenever linked underSystem-LintSilenceOnSuccess.No dead code was found in this repository (unlike FileAssert, where the same
process uncovered a genuinely superseded feature).
Validation
dotnet reqstream --requirements requirements.yaml-> 0 orphansdotnet reqstream --requirements requirements.yaml --lint-> passdotnet build -c Release-> 0 warnings, 0 errorsdotnet test(net8.0/net9.0/net10.0) -> 867/867 passedpwsh ./lint.ps1-> passdotnet reviewmark --lint-> passdotnet sysml2tools lint-> no errorsCo-authored-by: Copilot 223556219+Copilot@users.noreply.github.com