Skip to content

Add root-tags orphan detection with ReqStream 1.11.0 - #97

Merged
Malcolmnixon merged 2 commits into
mainfrom
feature/root-tags-orphan-detection
Sep 1, 2026
Merged

Malcolmnixon merged 2 commits into
mainfrom
feature/root-tags-orphan-detection

Conversation

@Malcolmnixon

Copy link
Copy Markdown
Member

Summary

Upgrades demaconsulting.reqstream 1.10.0 -> 1.11.0 and adopts the root-tags
orphan-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

  • Tagged all 23 ReviewMark-System-* requirements with [system].
  • Added docs/reqstream/quality.yaml -- 8 quality-outcome categories (build
    integrity, traceable versions, static analysis, peer review, documentation
    generation, test infrastructure, requirements traceability, architecture
    traceability), tagged [quality], covering all process/tooling OTS
    dependencies and the self-dogfooded ReviewMark-OTS-ReviewMark-* set.
  • Set root-tags: [system, quality] in requirements.yaml.
  • Linked 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.

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:

  • The context: (reference-material) feature -- context: entries are
    parsed, excluded from fingerprinting and coverage, shown during
    --elaborate, deduplicated against paths:, and support per-review-set
    exclusion patterns.
  • The needs-review-constrained review-set resolution feature -- review set
    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 System
requirement -- exactly the class of "good in isolation, no user" gap
root-tags was built to catch. 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 test-to-parent overlap evidence, not arbitrary placement.

Also closed several smaller genuine omissions: ReviewMark-PathHelpers-TraversalRejection
missing from Indexing-SafePathCombine's children, ReviewMark-Indexing-CreateEvidence
(the none evidence-source path) never linked to System-ReviewReport,
ReviewMark-Program-ExecuteOperation never linked under System-Version, and
ReviewMark-Cmd-LintSilence never linked under System-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 orphans
  • dotnet reqstream --requirements requirements.yaml --lint -> pass
  • dotnet build -c Release -> 0 warnings, 0 errors
  • dotnet test (net8.0/net9.0/net10.0) -> 867/867 passed
  • pwsh ./lint.ps1 -> pass
  • dotnet reviewmark --lint -> pass
  • dotnet sysml2tools lint -> no errors

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

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>
Copilot AI lite review requested due to automatic review settings September 1, 2026 21:02

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 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.reqstream from 1.10.0 to 1.11.0 and enabled root-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.

Comment thread docs/reqstream/quality.yaml Outdated
Comment thread docs/reqstream/quality.yaml
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>
Copilot AI review requested due to automatic review settings September 1, 2026 21:13

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 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

@Malcolmnixon
Malcolmnixon merged commit 5e7fb04 into main Sep 1, 2026
16 checks passed
@Malcolmnixon
Malcolmnixon deleted the feature/root-tags-orphan-detection branch September 1, 2026 21:26
This was referenced Oct 19, 2026
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.

2 participants