diff --git a/.cspell.yaml b/.cspell.yaml
index c9af776..6189e92 100644
--- a/.cspell.yaml
+++ b/.cspell.yaml
@@ -42,6 +42,7 @@ ignorePaths:
- "**/thirdparty/**"
- "**/third-party/**"
- "**/3rd-party/**"
+ - "**/generated/**"
- "**/AGENT_REPORT_*.md"
- "**/.agent-logs/**"
- "**/bin/**"
diff --git a/.fileassert.yaml b/.fileassert.yaml
index 018fe72..63d275f 100644
--- a/.fileassert.yaml
+++ b/.fileassert.yaml
@@ -15,7 +15,7 @@ tests:
description: "Build Notes HTML was generated by Pandoc"
tags: [build-notes]
files:
- - pattern: "docs/build_notes/build_notes.html"
+ - pattern: "docs/build_notes/generated/build_notes.html"
count: 1
html:
- query: "//head/title"
@@ -27,7 +27,7 @@ tests:
description: "Build Notes PDF was generated by WeasyPrint"
tags: [build-notes]
files:
- - pattern: "docs/TemplateDotNetLibrary Build Notes.pdf"
+ - pattern: "docs/generated/TemplateDotNetLibrary Build Notes.pdf"
count: 1
pdf:
metadata:
@@ -48,7 +48,7 @@ tests:
description: "Code Quality HTML was generated by Pandoc"
tags: [code-quality]
files:
- - pattern: "docs/code_quality/quality.html"
+ - pattern: "docs/code_quality/generated/quality.html"
count: 1
html:
- query: "//head/title"
@@ -60,7 +60,7 @@ tests:
description: "Code Quality PDF was generated by WeasyPrint"
tags: [code-quality]
files:
- - pattern: "docs/TemplateDotNetLibrary Code Quality.pdf"
+ - pattern: "docs/generated/TemplateDotNetLibrary Code Quality.pdf"
count: 1
pdf:
metadata:
@@ -81,7 +81,7 @@ tests:
description: "Code Review Plan HTML was generated by Pandoc"
tags: [code-review]
files:
- - pattern: "docs/code_review_plan/plan.html"
+ - pattern: "docs/code_review_plan/generated/plan.html"
count: 1
html:
- query: "//head/title"
@@ -93,7 +93,7 @@ tests:
description: "Code Review Plan PDF was generated by WeasyPrint"
tags: [code-review]
files:
- - pattern: "docs/TemplateDotNetLibrary Review Plan.pdf"
+ - pattern: "docs/generated/TemplateDotNetLibrary Review Plan.pdf"
count: 1
pdf:
metadata:
@@ -114,7 +114,7 @@ tests:
description: "Code Review Report HTML was generated by Pandoc"
tags: [code-review]
files:
- - pattern: "docs/code_review_report/report.html"
+ - pattern: "docs/code_review_report/generated/report.html"
count: 1
html:
- query: "//head/title"
@@ -126,7 +126,7 @@ tests:
description: "Code Review Report PDF was generated by WeasyPrint"
tags: [code-review]
files:
- - pattern: "docs/TemplateDotNetLibrary Review Report.pdf"
+ - pattern: "docs/generated/TemplateDotNetLibrary Review Report.pdf"
count: 1
pdf:
metadata:
@@ -147,7 +147,7 @@ tests:
description: "Design HTML was generated by Pandoc"
tags: [design]
files:
- - pattern: "docs/design/design.html"
+ - pattern: "docs/design/generated/design.html"
count: 1
html:
- query: "//head/title"
@@ -159,7 +159,7 @@ tests:
description: "Design PDF was generated by WeasyPrint"
tags: [design]
files:
- - pattern: "docs/TemplateDotNetLibrary Software Design.pdf"
+ - pattern: "docs/generated/TemplateDotNetLibrary Software Design.pdf"
count: 1
pdf:
metadata:
@@ -180,7 +180,7 @@ tests:
description: "User Guide HTML was generated by Pandoc"
tags: [user-guide]
files:
- - pattern: "docs/user_guide/user_guide.html"
+ - pattern: "docs/user_guide/generated/user_guide.html"
count: 1
html:
- query: "//head/title"
@@ -192,7 +192,7 @@ tests:
description: "User Guide PDF was generated by WeasyPrint"
tags: [user-guide]
files:
- - pattern: "docs/TemplateDotNetLibrary User Guide.pdf"
+ - pattern: "docs/generated/TemplateDotNetLibrary User Guide.pdf"
count: 1
pdf:
metadata:
@@ -214,7 +214,7 @@ tests:
description: "Requirements HTML was generated by Pandoc"
tags: [requirements]
files:
- - pattern: "docs/requirements_doc/requirements.html"
+ - pattern: "docs/requirements_doc/generated/requirements.html"
count: 1
html:
- query: "//head/title"
@@ -226,7 +226,7 @@ tests:
description: "Requirements PDF was generated by WeasyPrint"
tags: [requirements]
files:
- - pattern: "docs/TemplateDotNetLibrary Requirements.pdf"
+ - pattern: "docs/generated/TemplateDotNetLibrary Requirements.pdf"
count: 1
pdf:
metadata:
@@ -248,7 +248,7 @@ tests:
description: "Trace Matrix HTML was generated by Pandoc"
tags: [requirements]
files:
- - pattern: "docs/requirements_report/trace_matrix.html"
+ - pattern: "docs/requirements_report/generated/trace_matrix.html"
count: 1
html:
- query: "//head/title"
@@ -260,7 +260,7 @@ tests:
description: "Trace Matrix PDF was generated by WeasyPrint"
tags: [requirements]
files:
- - pattern: "docs/TemplateDotNetLibrary Trace Matrix.pdf"
+ - pattern: "docs/generated/TemplateDotNetLibrary Trace Matrix.pdf"
count: 1
pdf:
metadata:
diff --git a/.github/agents/lint-fix.agent.md b/.github/agents/lint-fix.agent.md
index 83ad8cb..549e751 100644
--- a/.github/agents/lint-fix.agent.md
+++ b/.github/agents/lint-fix.agent.md
@@ -36,7 +36,12 @@ submission, not during normal development.
- **markdownlint MD013 (line length)**: Wrap long lines at natural break points,
after commas, before conjunctions, or at sentence boundaries. Do not break
- in the middle of a code span or URL.
+ in the middle of a code span or URL. **Pipe-tables that cannot be wrapped
+ without breaking structure** are a special case - convert them to a bullet
+ list if the data reads naturally that way, or rewrite as a
+ [grid table](https://pandoc.org/MANUAL.html#tables) if a tabular layout is
+ essential. Do not get stuck trying to squeeze a wide pipe-table into 120
+ characters.
- **markdownlint other rules**: Apply the specific fix indicated in the output
(e.g., missing blank lines, heading levels, code fence languages).
diff --git a/.github/standards/coding-principles.md b/.github/standards/coding-principles.md
index 213c031..8470677 100644
--- a/.github/standards/coding-principles.md
+++ b/.github/standards/coding-principles.md
@@ -25,6 +25,29 @@ All code MUST follow literate programming principles:
and compliance verification
- **Clarity Over Cleverness**: Code should be immediately understandable by team members
+## API Documentation
+
+Good API documentation enables consumers, reviewers, and agents to use an
+interface correctly without reading the implementation:
+
+- **Self-Contained**: Each member's documentation must be fully understandable
+ in isolation - consumers must not need to read the implementation to call it
+ correctly
+- **Intent-Focused**: Explain WHY the member exists and WHAT problem it solves,
+ not just restate the name - this lets reviewers verify the implementation
+ matches design intent
+- **Parameter and Return Contracts**: Document valid ranges, null handling, and
+ boundary cases - agents and consumers rely on these contracts to call the API
+ correctly
+- **Error Conditions**: Document every exception or error code, the condition
+ that triggers it, and how the caller should respond - undocumented errors
+ cannot be handled correctly
+- **Side Effects**: Document I/O, state mutation, resource allocation, or
+ network calls - hidden side effects cause integration bugs that are hard to
+ diagnose
+- **Thread Safety**: State whether the API is safe for concurrent use - missing
+ this forces consumers to read the implementation or risk data races
+
## Universal Code Architecture Principles
### Design Patterns
diff --git a/.github/standards/csharp-language.md b/.github/standards/csharp-language.md
index 707b0f9..a580a39 100644
--- a/.github/standards/csharp-language.md
+++ b/.github/standards/csharp-language.md
@@ -16,25 +16,57 @@ Read these standards first before applying this standard:
- **Source Files**: `**/*.cs`
-# Literate Coding Example
+# API Documentation and Literate Coding Example
+
+The example below demonstrates good XmlDoc API documentation combined with
+literate coding comments.
```csharp
-// Validate input parameters to prevent downstream errors
-if (string.IsNullOrEmpty(input))
+///
+/// Converts a raw sensor reading into a validated measurement ready for downstream consumers.
+///
+///
+/// Clamping is preferred over throwing on out-of-range values because sensor drift at
+/// range boundaries is expected; clamping produces a usable result where rejection would
+/// discard valid near-boundary readings. Stateless and thread-safe; the calibration
+/// profile is read but never modified.
+///
+/// Raw sensor value. Must be finite (NaN and infinities are rejected).
+/// Calibration profile providing offset and range. Must not be null.
+/// Corrected value clamped to [calibration.Minimum, calibration.Maximum].
+/// Thrown when is NaN or infinite.
+/// Thrown when is null.
+public double ProcessReading(double reading, CalibrationProfile calibration)
{
- throw new ArgumentException("Input cannot be null or empty", nameof(input));
-}
-
-// Transform input data using the configured processing pipeline
-var processedData = ProcessingPipeline.Transform(input);
+ // Reject invalid inputs before any calculation - non-finite readings cannot be
+ // corrected, and a null calibration profile provides no offset or range to apply
+ if (!double.IsFinite(reading))
+ throw new ArgumentException("Reading must be a finite number.", nameof(reading));
+ ArgumentNullException.ThrowIfNull(calibration);
-// Apply business rules and validation logic
-var validatedResults = BusinessRuleEngine.ValidateAndProcess(processedData);
+ // Apply the calibration offset to convert raw counts to physical units
+ var corrected = reading + calibration.Offset;
-// Return formatted results matching the expected output contract
-return OutputFormatter.Format(validatedResults);
+ // Clamp to the operational range so consumers can rely on the documented contract
+ return Math.Clamp(corrected, calibration.Minimum, calibration.Maximum);
+}
```
+Key qualities demonstrated above:
+
+- **``** is a brief one-liner explaining *what* the method does
+- **``** sits directly after summary and carries the extended intent —
+ *why* it exists, design decisions, thread-safety, and side-effect disclosures
+- **`` tags** state constraints (finite, non-null) so callers know what
+ is valid without reading the body
+- **``** documents the boundary guarantee so consumers can rely on the
+ contract
+- **`` tags** name every thrown exception and the condition that
+ triggers each one
+- **Inline block comments** follow the Literate Coding principles from
+ `coding-principles.md`, separating logical steps so reviewers can verify each
+ step against design intent
+
# Code Formatting
- **Format entire solution**: `dotnet format`
diff --git a/.github/standards/design-documentation.md b/.github/standards/design-documentation.md
index 30becb5..f664c98 100644
--- a/.github/standards/design-documentation.md
+++ b/.github/standards/design-documentation.md
@@ -108,6 +108,13 @@ src/Project2Name/
└── HelperClass.cs - Helper functions
```
+### References Section (RECOMMENDED)
+
+If the design references external documents (standards, specifications), include
+a `## References` section in `introduction.md`. This is the **only** place in the
+design document collection where a References section should appear — do not add
+one to any other design file.
+
### Companion Artifact Structure (RECOMMENDED)
Include a brief note explaining that each software item has parallel artifacts
@@ -168,6 +175,9 @@ implementation specification for formal code review:
- **Implementation Detail**: Provide sufficient detail for code review and implementation
- **Architectural Clarity**: Clearly define component boundaries and interfaces
- **Traceability**: Link to requirements where applicable using ReqStream patterns
+- **Verbal Cross-References**: Reference other parts of the design by name (e.g.,
+ "See *Parser Design* for more details") — do not use markdown hyperlinks, which
+ break in compiled PDFs
# Mermaid Diagram Integration
diff --git a/.github/standards/reqstream-usage.md b/.github/standards/reqstream-usage.md
index ae5e565..58b08b4 100644
--- a/.github/standards/reqstream-usage.md
+++ b/.github/standards/reqstream-usage.md
@@ -104,16 +104,16 @@ dotnet reqstream --requirements requirements.yaml --lint
# Generate requirements document for compliance record
dotnet reqstream --requirements requirements.yaml \
- --report docs/requirements_doc/requirements.md
+ --report docs/requirements_doc/generated/requirements.md
# Generate justifications document for compliance record
dotnet reqstream --requirements requirements.yaml \
- --justifications docs/requirements_doc/justifications.md
+ --justifications docs/requirements_doc/generated/justifications.md
# Generate trace matrix proving each requirement is covered by passing tests
dotnet reqstream --requirements requirements.yaml \
--tests "artifacts/**/*.trx" \
- --matrix docs/requirements_report/trace_matrix.md
+ --matrix docs/requirements_report/generated/trace_matrix.md
```
# Quality Checks
diff --git a/.github/standards/requirements-principles.md b/.github/standards/requirements-principles.md
index 7d2d572..ac89321 100644
--- a/.github/standards/requirements-principles.md
+++ b/.github/standards/requirements-principles.md
@@ -29,6 +29,10 @@ implementation code.
- **Valid**: "The parser shall report the line number of the first syntax error."
- **Not a requirement (design decision)**: "The parser shall use a `TokenStream` class."
+A unit may use its own name freely — that is identity, not HOW. What is
+forbidden is describing *internal construction*: class names, method signatures,
+algorithms, or data structures.
+
# Requirements at Every Level (MANDATORY)
Every identified subsystem and unit MUST have its own requirements file because
diff --git a/.github/standards/reviewmark-usage.md b/.github/standards/reviewmark-usage.md
index 5d6219e..2fd2ca4 100644
--- a/.github/standards/reviewmark-usage.md
+++ b/.github/standards/reviewmark-usage.md
@@ -20,7 +20,7 @@ review, organizes them into review-sets, and generates review plans and reports.
- **Lint Configuration**: `dotnet reviewmark --lint`
- **Elaborate Review-Set**: `dotnet reviewmark --elaborate {review-set}`
-- **Generate Plan**: `dotnet reviewmark --plan docs/code_review_plan/plan.md --enforce`
+- **Generate Plan**: `dotnet reviewmark --plan docs/code_review_plan/generated/plan.md --enforce`
> **Note**: `--enforce` causes the plan to fail with a non-zero exit code if any repository
> files are not covered by a review-set. Uncovered files indicate a gap in review-set
@@ -31,7 +31,8 @@ review, organizes them into review-sets, and generates review plans and reports.
Required repository items for ReviewMark operation:
- `.reviewmark.yaml` - Configuration for review-sets, file-patterns, and review evidence-source.
-- `docs/code_review_plan/` - Review planning artifacts
+- `docs/code_review_plan/generated/` - Generated review plan (build output, do not edit)
+- `docs/code_review_report/generated/` - Generated review report (build output, do not edit)
# Review Definition Structure
diff --git a/.github/standards/technical-documentation.md b/.github/standards/technical-documentation.md
index 455b2fd..b85573b 100644
--- a/.github/standards/technical-documentation.md
+++ b/.github/standards/technical-documentation.md
@@ -1,7 +1,7 @@
---
name: Technical Documentation
description: Follow these standards when creating technical documentation.
-globs: ["docs/**/*.md", "README.md"]
+globs: ["docs/**/*.md", "README.md", "!docs/**/generated/**"]
---
# Technical Documentation Standards
@@ -23,63 +23,25 @@ for regulatory review:
- **Review Integration**: Documentation follows ReviewMark patterns for formal
review tracking
-# Documentation Organization
+# Pandoc Document Structure (MANDATORY)
-Structure documentation under `docs/` following standard patterns for
-consistency and tool compatibility:
+Each document collection under `docs/` follows this layout:
```text
-docs/
- build_notes.md # Generated by BuildMark
- build_notes/ # Auto-generated build notes
- versions.md # Generated by VersionMark
- code_review_plan/ # Auto-generated review plans
- plan.md # Generated by ReviewMark
- code_review_report/ # Auto-generated review reports
- report.md # Generated by ReviewMark
- design/ # Design documentation
- introduction.md # Design overview
- {system-name}/ # System architecture folder
- {system-name}.md # System architecture
- {subsystem-name}/ # Subsystem folder; may nest recursively
- {subsystem-name}.md # Subsystem-specific designs
- {child-subsystem}/ # Child subsystem (same structure)
- {unit-name}.md # Unit-specific designs
- {unit-name}.md # Top-level unit design
- reqstream/ # Requirements source files
- {system-name}/ # System requirements folder
- {system-name}.yaml # System requirements
- platform-requirements.yaml # Platform requirements
- {subsystem-name}/ # Subsystem folder; may nest recursively
- {subsystem-name}.yaml # Subsystem requirements
- {child-subsystem}/ # Child subsystem (same structure)
- {unit-name}.yaml # Unit-specific requirements
- {unit-name}.yaml # Top-level unit requirements
- ots/ # OTS requirement files
- {ots-name}.yaml # OTS requirements
- requirements_doc/ # Auto-generated requirements reports
- requirements.md # Generated by ReqStream
- justifications.md # Generated by ReqStream
- requirements_report/ # Auto-generated trace matrices
- trace_matrix.md # Generated by ReqStream
- user_guide/ # User-facing documentation
- introduction.md # User guide overview
- {section}.md # User guide sections
+docs/{collection}/
+ title.txt # MANDATORY — YAML document metadata (title, author, etc.)
+ definition.yaml # MANDATORY — Pandoc build definition (inputs, template, paths)
+ introduction.md # MANDATORY — document introduction (Purpose, Scope, References)
+ {section}.md # optional checked-in content sections (zero or more)
+ generated/ # BUILD OUTPUT — never read, edit, or lint these files
+ {report}.md # generated by CI tools (ReqStream, ReviewMark, SarifMark, etc.)
+ {collection}.html # generated by Pandoc
```
-# Pandoc Document Structure (MANDATORY)
-
-All document collections processed by Pandoc MUST include all four files below -
-without `title.txt` and `definition.yaml` the pipeline cannot generate the document:
-
-- `title.txt` - YAML metadata (title, subtitle, author, description, lang, keywords)
-- `definition.yaml` - Pandoc build definition (resource paths, input file list, template)
-- `introduction.md` - document introduction
-- `{sections}.md` - additional content sections
-
-When creating a new document collection, create `title.txt` and `definition.yaml`
-alongside `introduction.md`. Use the existing files under `docs/` as templates -
-they share a consistent structure across all collections.
+Without `title.txt` and `definition.yaml` the pipeline cannot generate the document.
+When creating a new document collection, create these three files together and use
+the existing collections under `docs/` as templates — they share a consistent
+structure across all collections.
**`title.txt`** - YAML front matter with document metadata. Use the existing
files under `docs/` as a pattern and keep fields consistent with the rest of
@@ -106,8 +68,17 @@ Include regulatory or business drivers where applicable.
Define what is covered and what is explicitly excluded from this documentation.
Specify version, system boundaries, and applicability constraints.
+
+## References
+
+- [REF-1] Document Title, Author, Version, Date
+- [REF-2] Standard Name (e.g., IEEE 12207, ISO 9001)
```
+The `Purpose`, `Scope`, and `References` sections are **unique to `introduction.md`** and must
+**not** be replicated in other markdown files within the same document collection. Including them
+elsewhere causes duplicate sections in the compiled PDF.
+
## Document Ordering
List documents in logical reading order in Pandoc configuration because
@@ -135,6 +106,19 @@ References in design/technical documents must point to **external specifications
- **INCLUDE**: Requirements documents, system specifications, program documents, standards (IEEE, ISO, etc.)
- **NEVER INCLUDE**: Internal development standards (`.github/standards/` files) - these are agent guides
+## Cross-References (Within-Document and Cross-Document)
+
+Do **not** use markdown hyperlinks to reference other sections or documents. Markdown anchor links
+(`[text](#heading)`) and relative file links work in a browser but break when compiled to a PDF.
+
+Instead use **verbal references** — plain prose that identifies the target by name:
+
+> See *XYZ Design* for more details.
+>
+> Refer to the *System Requirements* document for the full specification.
+
+Verbal references are readable by both AI agents and humans in any rendering environment.
+
# Markdown Format Requirements
Markdown documentation in this repository must follow the formatting standards
@@ -156,14 +140,13 @@ for consistency and professional presentation:
# Auto-Generated Content (CRITICAL)
-**NEVER modify auto-generated markdown files** because changes will be
-overwritten and break compliance automation:
+**NEVER read, lint, or modify files inside any `generated/` folder** — they are
+build outputs that are overwritten on every CI run:
-- **Read-Only Files**: Generated reports under `docs/requirements_doc/`,
- `docs/requirements_report/`, `docs/code_review_plan/`, and
- `docs/code_review_report/` are regenerated on every build
-- **Source Modification**: Update source files (requirements YAML, code
- comments) instead of generated output
+- **Location**: All generated files live in `generated/` subfolders within their
+ respective `docs/` sections, or in `docs/generated/` for final release artifacts
+- **Source Modification**: Update source files (requirements YAML, `.reviewmark.yaml`,
+ tool configuration) instead of generated output
- **Tool Integration**: Generated content integrates with CI/CD pipelines and
manual changes disrupt automation
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 5f76ab6..c67869b 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -359,6 +359,15 @@ jobs:
buildmark versionmark reviewmark fileassert
echo "✓ Tool versions captured"
+ # === PREPARE DOCUMENT OUTPUT ===
+ # Creates the shared docs/generated/ folder that all document sections write PDFs into.
+ # This step is intentionally separate from the document sections so any individual
+ # section can be commented out without breaking the shared output directory.
+
+ - name: Create documents output directory
+ shell: bash
+ run: mkdir -p docs/generated
+
# === COMPILE BUILD NOTES ===
# This section generates the Build Notes document. BuildMark and VersionMark self-validations
# run here to co-locate their evidence with the document that depends on their output.
@@ -366,6 +375,10 @@ jobs:
# validates the outputs contain expected content.
# Downstream projects: Add any additional build notes steps here.
+ - name: Create build notes output directories
+ shell: bash
+ run: mkdir -p docs/build_notes/generated
+
- name: Run BuildMark self-validation
run: >
dotnet buildmark
@@ -385,20 +398,20 @@ jobs:
run: >
dotnet buildmark
--build-version ${{ inputs.version }}
- --report docs/build_notes.md
+ --report docs/build_notes/generated/build_notes.md
--report-depth 1
- name: Display Build Notes Report
shell: bash
run: |
echo "=== Build Notes Report ==="
- cat docs/build_notes.md
+ cat docs/build_notes/generated/build_notes.md
- name: Publish Tool Versions
shell: bash
run: |
echo "Publishing tool versions..."
- dotnet versionmark --publish --report docs/build_notes/versions.md --report-depth 1 \
+ dotnet versionmark --publish --report docs/build_notes/generated/versions.md --report-depth 1 \
-- "artifacts/**/versionmark-*.json"
echo "✓ Tool versions published"
@@ -406,7 +419,7 @@ jobs:
shell: bash
run: |
echo "=== Tool Versions Report ==="
- cat docs/build_notes/versions.md
+ cat docs/build_notes/generated/versions.md
- name: Generate Build Notes HTML with Pandoc
shell: bash
@@ -416,14 +429,14 @@ jobs:
--filter node_modules/.bin/mermaid-filter.cmd
--metadata version="${{ inputs.version }}"
--metadata date="$(date +'%Y-%m-%d')"
- --output docs/build_notes/build_notes.html
+ --output docs/build_notes/generated/build_notes.html
- name: Generate Build Notes PDF with WeasyPrint
run: >
dotnet weasyprint
--pdf-variant pdf/a-3u
- docs/build_notes/build_notes.html
- "docs/TemplateDotNetLibrary Build Notes.pdf"
+ docs/build_notes/generated/build_notes.html
+ "docs/generated/TemplateDotNetLibrary Build Notes.pdf"
- name: Assert Build Notes Documents with FileAssert
run: >
@@ -431,6 +444,10 @@ jobs:
--results artifacts/fileassert-build-notes.trx
build-notes
+ - name: Copy Build Notes report to docs/generated
+ shell: bash
+ run: cp docs/build_notes/generated/build_notes.md docs/generated/build_notes.md
+
# === COMPILE CODE QUALITY REPORT ===
# This section generates the Code Quality document. SarifMark and SonarMark self-validations
# run here to co-locate their evidence with the document that depends on their output.
@@ -438,6 +455,10 @@ jobs:
# validates the outputs contain expected content.
# Downstream projects: Add any additional code quality steps here.
+ - name: Create code quality output directory
+ shell: bash
+ run: mkdir -p docs/code_quality/generated
+
- name: Run SarifMark self-validation
run: >
dotnet sarifmark
@@ -454,7 +475,7 @@ jobs:
run: >
dotnet sarifmark
--sarif artifacts/csharp.sarif
- --report docs/code_quality/codeql-quality.md
+ --report docs/code_quality/generated/codeql-quality.md
--heading "Template DotNet Library CodeQL Analysis"
--report-depth 1
@@ -462,7 +483,7 @@ jobs:
shell: bash
run: |
echo "=== CodeQL Quality Report ==="
- cat docs/code_quality/codeql-quality.md
+ cat docs/code_quality/generated/codeql-quality.md
- name: Generate SonarCloud Quality Report
shell: bash
@@ -474,14 +495,14 @@ jobs:
--project-key demaconsulting_TemplateDotNetLibrary
--branch ${{ github.ref_name }}
--token "$SONAR_TOKEN"
- --report docs/code_quality/sonar-quality.md
+ --report docs/code_quality/generated/sonar-quality.md
--report-depth 1
- name: Display SonarCloud Quality Report
shell: bash
run: |
echo "=== SonarCloud Quality Report ==="
- cat docs/code_quality/sonar-quality.md
+ cat docs/code_quality/generated/sonar-quality.md
- name: Generate Code Quality HTML with Pandoc
shell: bash
@@ -491,14 +512,14 @@ jobs:
--filter node_modules/.bin/mermaid-filter.cmd
--metadata version="${{ inputs.version }}"
--metadata date="$(date +'%Y-%m-%d')"
- --output docs/code_quality/quality.html
+ --output docs/code_quality/generated/quality.html
- name: Generate Code Quality PDF with WeasyPrint
run: >
dotnet weasyprint
--pdf-variant pdf/a-3u
- docs/code_quality/quality.html
- "docs/TemplateDotNetLibrary Code Quality.pdf"
+ docs/code_quality/generated/quality.html
+ "docs/generated/TemplateDotNetLibrary Code Quality.pdf"
- name: Assert Code Quality Documents with FileAssert
run: >
@@ -513,6 +534,10 @@ jobs:
# PDF, and FileAssert validates the outputs contain expected content.
# Downstream projects: Add any additional code review steps here.
+ - name: Create code review output directories
+ shell: bash
+ run: mkdir -p docs/code_review_plan/generated docs/code_review_report/generated
+
- name: Run ReviewMark self-validation
run: >
dotnet reviewmark
@@ -524,22 +549,22 @@ jobs:
# TODO: Add --enforce once reviews branch is populated with review evidence PDFs and index.json
run: >
dotnet reviewmark
- --plan docs/code_review_plan/plan.md
+ --plan docs/code_review_plan/generated/plan.md
--plan-depth 1
- --report docs/code_review_report/report.md
+ --report docs/code_review_report/generated/report.md
--report-depth 1
- name: Display Review Plan
shell: bash
run: |
echo "=== Review Plan ==="
- cat docs/code_review_plan/plan.md
+ cat docs/code_review_plan/generated/plan.md
- name: Display Review Report
shell: bash
run: |
echo "=== Review Report ==="
- cat docs/code_review_report/report.md
+ cat docs/code_review_report/generated/report.md
- name: Generate Review Plan HTML with Pandoc
shell: bash
@@ -549,14 +574,14 @@ jobs:
--filter node_modules/.bin/mermaid-filter.cmd
--metadata version="${{ inputs.version }}"
--metadata date="$(date +'%Y-%m-%d')"
- --output docs/code_review_plan/plan.html
+ --output docs/code_review_plan/generated/plan.html
- name: Generate Review Plan PDF with WeasyPrint
run: >
dotnet weasyprint
--pdf-variant pdf/a-3u
- docs/code_review_plan/plan.html
- "docs/TemplateDotNetLibrary Review Plan.pdf"
+ docs/code_review_plan/generated/plan.html
+ "docs/generated/TemplateDotNetLibrary Review Plan.pdf"
- name: Generate Review Report HTML with Pandoc
shell: bash
@@ -566,14 +591,14 @@ jobs:
--filter node_modules/.bin/mermaid-filter.cmd
--metadata version="${{ inputs.version }}"
--metadata date="$(date +'%Y-%m-%d')"
- --output docs/code_review_report/report.html
+ --output docs/code_review_report/generated/report.html
- name: Generate Review Report PDF with WeasyPrint
run: >
dotnet weasyprint
--pdf-variant pdf/a-3u
- docs/code_review_report/report.html
- "docs/TemplateDotNetLibrary Review Report.pdf"
+ docs/code_review_report/generated/report.html
+ "docs/generated/TemplateDotNetLibrary Review Report.pdf"
- name: Assert Code Review Documents with FileAssert
run: >
@@ -586,6 +611,10 @@ jobs:
# FileAssert validates that the HTML and PDF outputs contain expected content.
# Downstream projects: Add any additional design document steps here.
+ - name: Create design output directory
+ shell: bash
+ run: mkdir -p docs/design/generated
+
- name: Generate Design HTML with Pandoc
shell: bash
run: >
@@ -594,14 +623,14 @@ jobs:
--filter node_modules/.bin/mermaid-filter.cmd
--metadata version="${{ inputs.version }}"
--metadata date="$(date +'%Y-%m-%d')"
- --output docs/design/design.html
+ --output docs/design/generated/design.html
- name: Generate Design PDF with WeasyPrint
run: >
dotnet weasyprint
--pdf-variant pdf/a-3u
- docs/design/design.html
- "docs/TemplateDotNetLibrary Software Design.pdf"
+ docs/design/generated/design.html
+ "docs/generated/TemplateDotNetLibrary Software Design.pdf"
- name: Assert Design Documents with FileAssert
run: >
@@ -614,6 +643,10 @@ jobs:
# FileAssert validates that the HTML and PDF outputs contain expected content.
# Downstream projects: Add any additional user guide steps here.
+ - name: Create user guide output directory
+ shell: bash
+ run: mkdir -p docs/user_guide/generated
+
- name: Generate User Guide HTML with Pandoc
shell: bash
run: >
@@ -622,14 +655,14 @@ jobs:
--filter node_modules/.bin/mermaid-filter.cmd
--metadata version="${{ inputs.version }}"
--metadata date="$(date +'%Y-%m-%d')"
- --output docs/user_guide/user_guide.html
+ --output docs/user_guide/generated/user_guide.html
- name: Generate User Guide PDF with WeasyPrint
run: >
dotnet weasyprint
--pdf-variant pdf/a-3u
- docs/user_guide/user_guide.html
- "docs/TemplateDotNetLibrary User Guide.pdf"
+ docs/user_guide/generated/user_guide.html
+ "docs/generated/TemplateDotNetLibrary User Guide.pdf"
- name: Assert User Guide Documents with FileAssert
run: >
@@ -659,6 +692,10 @@ jobs:
# confirm the requirements pipeline produced well-formed documents.
# Downstream projects: Add any additional requirements steps here.
+ - name: Create requirements output directories
+ shell: bash
+ run: mkdir -p docs/requirements_doc/generated docs/requirements_report/generated
+
- name: Run ReqStream self-validation
run: >
dotnet reqstream
@@ -670,9 +707,9 @@ jobs:
dotnet reqstream
--requirements requirements.yaml
--tests "artifacts/**/*.trx"
- --report docs/requirements_doc/requirements.md
- --justifications docs/requirements_doc/justifications.md
- --matrix docs/requirements_report/trace_matrix.md
+ --report docs/requirements_doc/generated/requirements.md
+ --justifications docs/requirements_doc/generated/justifications.md
+ --matrix docs/requirements_report/generated/trace_matrix.md
--enforce
- name: Generate Requirements HTML with Pandoc
@@ -683,14 +720,14 @@ jobs:
--filter node_modules/.bin/mermaid-filter.cmd
--metadata version="${{ inputs.version }}"
--metadata date="$(date +'%Y-%m-%d')"
- --output docs/requirements_doc/requirements.html
+ --output docs/requirements_doc/generated/requirements.html
- name: Generate Requirements PDF with WeasyPrint
run: >
dotnet weasyprint
--pdf-variant pdf/a-3u
- docs/requirements_doc/requirements.html
- "docs/TemplateDotNetLibrary Requirements.pdf"
+ docs/requirements_doc/generated/requirements.html
+ "docs/generated/TemplateDotNetLibrary Requirements.pdf"
- name: Generate Trace Matrix HTML with Pandoc
shell: bash
@@ -700,14 +737,14 @@ jobs:
--filter node_modules/.bin/mermaid-filter.cmd
--metadata version="${{ inputs.version }}"
--metadata date="$(date +'%Y-%m-%d')"
- --output docs/requirements_report/trace_matrix.html
+ --output docs/requirements_report/generated/trace_matrix.html
- name: Generate Trace Matrix PDF with WeasyPrint
run: >
dotnet weasyprint
--pdf-variant pdf/a-3u
- docs/requirements_report/trace_matrix.html
- "docs/TemplateDotNetLibrary Trace Matrix.pdf"
+ docs/requirements_report/generated/trace_matrix.html
+ "docs/generated/TemplateDotNetLibrary Trace Matrix.pdf"
- name: Assert Requirements Documents with FileAssert
run: >
@@ -723,6 +760,4 @@ jobs:
uses: actions/upload-artifact@v7
with:
name: documents
- path: |-
- docs/*.pdf
- docs/build_notes.md
+ path: docs/generated/*
diff --git a/.gitignore b/.gitignore
index 2d385e3..244fc19 100644
--- a/.gitignore
+++ b/.gitignore
@@ -88,18 +88,7 @@ __pycache__/
.venv/
# Generated documentation
-docs/**/*.html
-docs/**/*.pdf
-!docs/template/**
-docs/requirements_doc/requirements.md
-docs/requirements_doc/justifications.md
-docs/requirements_report/trace_matrix.md
-docs/code_quality/codeql-quality.md
-docs/code_quality/sonar-quality.md
-docs/code_review_plan/plan.md
-docs/code_review_report/report.md
-docs/build_notes.md
-docs/build_notes/versions.md
+**/generated/
# Test results
TestResults/
diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml
index c16c443..4942746 100644
--- a/.markdownlint-cli2.yaml
+++ b/.markdownlint-cli2.yaml
@@ -50,5 +50,6 @@ ignores:
- "**/thirdparty/**"
- "**/third-party/**"
- "**/3rd-party/**"
+ - "**/generated/**"
- "**/AGENT_REPORT_*.md"
- "**/.agent-logs/**"
diff --git a/.yamllint.yaml b/.yamllint.yaml
index 4fbc811..79c3aee 100644
--- a/.yamllint.yaml
+++ b/.yamllint.yaml
@@ -15,13 +15,14 @@ extends: default
# Exclude common build artifacts, dependencies, and vendored third-party code
ignore: |
- .git/
- node_modules/
- .venv/
- thirdparty/
- third-party/
- 3rd-party/
- .agent-logs/
+ **/.git/**
+ **/node_modules/**
+ **/.venv/**
+ **/thirdparty/**
+ **/third-party/**
+ **/3rd-party/**
+ **/generated/**
+ **/.agent-logs/**
rules:
# Allow 'on:' in GitHub Actions workflows (not a boolean value)
diff --git a/AGENTS.md b/AGENTS.md
index 295e6a2..3611fee 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -124,6 +124,8 @@ reqstream, versionmark, and reviewmark.
# Scope Discipline (ALL Agents Must Follow)
+- **No generated file access**: Files inside any `generated/` folder are build
+ outputs — do not read, lint, or modify them
- **Minimum necessary changes**: Only modify files directly required by the task
- **No speculative refactoring**: Do not refactor code adjacent to the change
unless the task explicitly requests it
diff --git a/docs/build_notes/definition.yaml b/docs/build_notes/definition.yaml
index 207a375..ba1360b 100644
--- a/docs/build_notes/definition.yaml
+++ b/docs/build_notes/definition.yaml
@@ -5,8 +5,8 @@ resource-path:
input-files:
- docs/build_notes/title.txt
- docs/build_notes/introduction.md
- - docs/build_notes.md
- - docs/build_notes/versions.md
+ - docs/build_notes/generated/build_notes.md
+ - docs/build_notes/generated/versions.md
template: template.html
table-of-contents: true
number-sections: true
diff --git a/docs/code_quality/definition.yaml b/docs/code_quality/definition.yaml
index 68c58f2..fed5f02 100644
--- a/docs/code_quality/definition.yaml
+++ b/docs/code_quality/definition.yaml
@@ -5,8 +5,8 @@ resource-path:
input-files:
- docs/code_quality/title.txt
- docs/code_quality/introduction.md
- - docs/code_quality/codeql-quality.md
- - docs/code_quality/sonar-quality.md
+ - docs/code_quality/generated/codeql-quality.md
+ - docs/code_quality/generated/sonar-quality.md
template: template.html
table-of-contents: true
number-sections: true
diff --git a/docs/code_review_plan/definition.yaml b/docs/code_review_plan/definition.yaml
index 3a24f0b..56989bf 100644
--- a/docs/code_review_plan/definition.yaml
+++ b/docs/code_review_plan/definition.yaml
@@ -5,7 +5,7 @@ resource-path:
input-files:
- docs/code_review_plan/title.txt
- docs/code_review_plan/introduction.md
- - docs/code_review_plan/plan.md
+ - docs/code_review_plan/generated/plan.md
template: template.html
table-of-contents: true
number-sections: true
diff --git a/docs/code_review_report/definition.yaml b/docs/code_review_report/definition.yaml
index 6498e6c..b238d43 100644
--- a/docs/code_review_report/definition.yaml
+++ b/docs/code_review_report/definition.yaml
@@ -5,7 +5,7 @@ resource-path:
input-files:
- docs/code_review_report/title.txt
- docs/code_review_report/introduction.md
- - docs/code_review_report/report.md
+ - docs/code_review_report/generated/report.md
template: template.html
table-of-contents: true
number-sections: true
diff --git a/docs/requirements_doc/definition.yaml b/docs/requirements_doc/definition.yaml
index 0f4ccd2..628b789 100644
--- a/docs/requirements_doc/definition.yaml
+++ b/docs/requirements_doc/definition.yaml
@@ -5,8 +5,8 @@ resource-path:
input-files:
- docs/requirements_doc/title.txt
- docs/requirements_doc/introduction.md
- - docs/requirements_doc/requirements.md
- - docs/requirements_doc/justifications.md
+ - docs/requirements_doc/generated/requirements.md
+ - docs/requirements_doc/generated/justifications.md
template: template.html
table-of-contents: true
number-sections: true
diff --git a/docs/requirements_report/definition.yaml b/docs/requirements_report/definition.yaml
index 918a645..9ee62a4 100644
--- a/docs/requirements_report/definition.yaml
+++ b/docs/requirements_report/definition.yaml
@@ -5,7 +5,7 @@ resource-path:
input-files:
- docs/requirements_report/title.txt
- docs/requirements_report/introduction.md
- - docs/requirements_report/trace_matrix.md
+ - docs/requirements_report/generated/trace_matrix.md
template: template.html
table-of-contents: true
number-sections: true