Skip to content

Enhance review hierarchy and improve DotNet/C++ compliance#31

Merged
Malcolmnixon merged 62 commits into
mainfrom
feature/reviewmark-context-hierarchy
Jun 26, 2026
Merged

Enhance review hierarchy and improve DotNet/C++ compliance#31
Malcolmnixon merged 62 commits into
mainfrom
feature/reviewmark-context-hierarchy

Conversation

@Malcolmnixon

@Malcolmnixon Malcolmnixon commented Jun 26, 2026

Copy link
Copy Markdown
Member

This pull request updates formal review configuration and documentation to clarify and standardize the use of context files and review-set organization for ReviewMark. It ensures that review-sets have clearly defined scopes, context, and file patterns, and that the documentation and configuration are aligned. The changes also update spell-checking and tooling versions.

Key changes include:

ReviewMark configuration and review-set organization:

  • Updated .reviewmark.yaml to explicitly define global and per-review-set context files, align review-set IDs and titles with new documentation standards, and ensure each review-set includes the correct context and file paths. The configuration now follows the hierarchical scope and context management principles described in the documentation. [1] [2] [3]
  • Revised .github/standards/reviewmark-usage.md to provide detailed explanations and tables for context file usage, review-set scope, and naming conventions. Each review-set type now specifies required context files, and the documentation offers improved guidance on review-set design and coverage. [1] [2] [3] [4] [5] [6] [7] [8] [9]

Documentation standards and review process:

  • Clarified in .github/standards/design-documentation.md that version numbers should not be recorded in design documentation, except for stable standards and placeholders, to prevent staleness and duplication with SBOMs. [1] [2]
  • Improved instructions in .github/agents/formal-review.agent.md to guide reviewers in using context files for orientation and to ensure a consistent review process.

Tooling and spell-checking:

  • Updated the demaconsulting.reviewmark tool version in .config/dotnet-tools.json from 1.2.0 to 1.3.0.
  • Added new domain-specific terms to .cspell.yaml to improve spell-checking accuracy for technical vocabulary. [1] [2] [3]

Malcolm Nixon and others added 30 commits June 23, 2026 00:33
…cture context flow

- Rename Specification review to Decomposition (repo-level, no system prefix)
- Rename Purpose review to repo-level (no system prefix)
- Add README + user_guide context to all Architecture reviews
- Add system requirements as context to all Design reviews
- Add system requirements as context to all Verification reviews
- Move system-level requirements from paths to context in AllRequirements reviews
- Upgrade ReviewMark to 1.3.0-beta.3

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add 8-level review context hierarchy to .reviewmark.yaml so every
  software item receives design, requirements, and parent-system context
  during formal review
- Update ReviewMark to 1.3.0; exclude design intro from Purpose review
  using '!' syntax to prevent design back-feeding into user-doc reviews
- Add verification/introduction.md to Core-Verification review-set paths

ApiMark.Core contract hardening (driven by 9 rounds of formal review):
- EmitConfig: validate HeadingDepth range 1-3 at construction
- FileMarkdownWriter: null/empty/shape guards on all 6 write methods;
  WriteTable validates headers non-empty, row lengths, null rows/elements
- GlobFileCollector: StringComparer.Ordinal fix; null guards on Collect
- PathHelpers: zero-segment returns basePath; clarified error handling
- IMarkdownWriterFactory: whitespace subFolder treated as root-level
- IApiGenerator/IApiEmitter: XML doc corrections and requirement splits

Test helpers hardened to enforce same preconditions as production code:
- InMemoryMarkdownWriter: heading range 1-6, table shape, null elements
- InMemoryContext: null guards

New artifacts for FileMarkdownWriter and FileMarkdownWriterFactory:
- docs/design, docs/reqstream, docs/verification unit documents
- EmitConfigTests.cs created

Documentation:
- design/introduction.md: scope clarified; test/ removed from Folder Layout
- verification/introduction.md: scope clarified; Folder Layout section added
- i-markdown-writer.md: preconditions documented for all write methods
- N/A em-dash sweep across 36 design/verification docs
- docs/design/ots.md: OTS strategy split by type; lock-file claim removed
- docs/user_guide/cpp.md: @code/@Endcode authoring section added
- README.md: ClangPath -> ApiMarkClangPath

114 Core tests passing.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Restructure DotNetGenerator, DotNetEmitter, and sub-emitters for clarity
- Merge ApiVisibility.cs and DotNetGeneratorOptions.cs into DotNetGenerator.cs
- Merge ExternalTypeInfo.cs into TypeLinkResolver.cs
- Add IContext progress reporting to DotNetGenerator
- Fix init accessor detection via RequiredModifierType (IsExternalInit modreq)
- Fix array rank rendering in TypeLinkResolver and TypeNameSimplifier
- Fix BuildPropertyAccessors accessibility logic
- Add ThrowIfNull guards for options and context in DotNetGenerator
- Add BuildInheritanceChain requirement and RejectNullContext test
- Add operators page, NamespaceDoc, and nested type support
- Update requirements: move emitting reqs from Generator to unit YAMLs
- Update design docs: all 9 DotNet unit design docs for consistency
- Update verification docs: all DotNet unit verification docs
- Add copyright headers to fixture files; add new fixture classes
- Add 237 passing tests across DotNet test suite

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Design docs: restore clang interface, expand MSBuild 4->9 props, add GD/SF
->CppAstModel diagram edges, add RunProcess with concurrent-drain detail,
expand Parse Key Method, add platform path-comparison note, add CppGenerator
External Interfaces section, fix CppNamespaceDecl in deps, cross-ref
CppExternalTypeInfo, expand GD Emit method spec.

Requirements: rewrite impl-detail reqs, rewrite ParseHeaders (no HOW),
add RejectNullContext + WorkingDirectory reqs, remove cross-unit test refs,
fix SupportAbsolute to mention WorkingDirectory.

Source code: position-aware splice in CppTypeLinkResolver (String.Replace bug),
knownTypes null guard, PathConventionRows 2 missing rows, TypeAliases.Count in
declaration count, SanitizeFileName null guard, CppGenerator Parse null-context
guard + XML doc fixes.

Tests: template-arg prefix corruption regression, namespace operators page,
Parse null-context, ClangAstParser null options + empty errors, IsDeleted
assertion, CppEmitter final+base + GetIncludePath + WriteExternalTypesSection,
tightened weak Contains assertion.

Verification docs: clang-ast-parser 9 scenarios, cpp-ast-model 15 scenarios,
cpp-emitter 7 scenarios, GD 5 new scenarios, SF writer-key scenario,
cpp-generator ownership/links/external/deleted, TLR 4+ scenarios,
api-mark-cpp single-file criterion and scenario.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Group A: TLR fixes
- Remove null/whitespace tests from LinkifyPrimitiveType requirement (A1)
- Add ArgumentNullException.ThrowIfNull(externalTypes) guard in Linkify (A2)
- Add currentFolder ??= string.Empty null-coalescing semantics (A3)
- Add 8th acceptance criterion to TLR verification doc (A4)

Group B: CppGenerator external types integration test
- Create ExternalTypeFixture.h with external::ns::Logger* return type (B1)
- Add CppGenerator_Generate_ExternalTypeReference_EmitsExternalTypesSection test (B1)
- Add external types criterion and scenario to api-mark-cpp.md (B2)

Group C: Verification doc prose format fixes
- Rewrite 10 scenario descriptions in cpp-ast-model.md (C1)
- Fix 2 scenario descriptions in cpp-emitter-single-file.md (C2)
- Add inheritance criterion and scenario to api-mark-cpp.md (C3)

Group D: Test organisation
- Move CppTypeLinkResolver_Linkify_UnknownNamespacedType_TracksExternalType
  from CppGeneratorTests.cs to CppTypeLinkResolverTests.cs (D1)
- Replace with CppGenerator_Generate_ExternalTypeReference_EmitsExternalTypesSection (D1)

Group E: CppEmitter low findings
- Fix GetIncludePath XML doc: 'Must not be null or empty' -> 'Must not be null' (E1)
- Add CppEmitter_GetIncludePath_NullSourceFile_ThrowsArgumentNullException test (E2)
- Add CppEmitter_WriteCombinedMemberPage_TooFewMembers_ThrowsArgumentException test (E2)
- Update cpp-emitter.md verification doc with new criteria and scenarios (E2/E3)
- Add FinalClassWithBaseTypes test to BuildClassDeclaration requirement yaml (E3)

Group F: CppAstModel low findings
- Add Assert.False(cppEnum.IsDeprecated) to CppEnum construction test (F1)
- Add Assert.False(alias.IsDeprecated) to CppTypeAlias construction test (F1)
- Add Assert.Null(fn.Location/fn.Doc) to CppFunction construction test (F2)
- Add Assert.Null(cls.Location/cls.Doc) to CppClass construction test (F2)
- Add Assert.Null(field.Doc) to CppField construction test (F2)

Group G: GD low findings
- Reorder PathConventionRows table to match code array order (G1)
- Add WriteClassSignatureBlock null-Location early-return note (G2)
- Add WriteTypePage early-exit condition for empty classes (G2)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The test CppGenerator_Generate_ExternalTypeReference_EmitsExternalTypesSection
exercises the full Cpp pipeline (CppGenerator + CppTypeLinkResolver + CppEmitter)
and is an integration test at the subsystem level. Add a top-level subsystem
requirement ApiMarkCpp-EmitExternalTypesSection to api-mark-cpp.yaml and link
the test to it.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… R6 F-01)

Add Assert.True(factory.HasWriter("testlib/Widget", "size_type")) to
Emit_TypeAlias_CreatesTypeAliasPage so the class-scoped alias path is
explicitly verified. Update the verification doc scenario and acceptance
criterion to cover both namespace-level and class-scoped type aliases.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…rarchy

Add ApiMarkCpp-EmitExternalTypesSection to the parent requirement's children
list and add a children list pointing to the two implementing unit requirements
(CppEmitter-RepresentExternalTypeInfo, CppTypeLinkResolver-LinkifyExternalTypeTracking)
to satisfy structural traceability (AllRequirements R7 findings R7-01, R7-02).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Design: add CppEmitterGradualDisclosure/SingleFile->CppEmitter back-edges
- Architecture: remove CppAstModel from Dependencies (internal unit, not OTS)
- Verification: expand operator criterion and naming convention to include
  namespace-level operators.md; add namespace-level operator scenario; add
  absolute-pattern scenario; normalize 'This scenario is tested by' prose in
  cpp-ast-model.md, cpp-emitter.md, cpp-emitter-single-file.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Design:
- Remove CppEmitterSingleFile->CppTypeLinkResolver diagram edge (SingleFile
  accepts but discards the resolver; type links are omitted in single-file mode)

TLR design:
- Remove CppEmitterSingleFile from Callers section (confirmed unused)
- Add empty-stripped-name early-return note to Linkify Key Methods

TLR tests:
- Add AAA comments to NullKnownTypes and NullExternalTypes null-guard tests

TLR verification:
- Add test scenarios for constructor null-guard and Linkify null externalTypes
- Normalize 4x 'This scenario is tested by' -> 'Tested by'

System verification (api-mark-cpp.md):
- Normalize 31x 'This scenario is tested by' -> 'Tested by'
- Add namespace/operators.md rows to user guide output structure table

GD verification:
- Clarify operator criterion: class-level and namespace-level operator pages

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…k-cpp.md

8 instances spanned line breaks ('This scenario is<newline>tested by' or
'This scenario is tested<newline>by') that weren't caught by the single-line
replace in R8/R9. Fixed with pattern matching across the line boundary.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- CppEmitter design doc: add instance fields (_options, _namespaceDecls,
  _cppResolver) to Data Model section and constructor to Key Methods
- CppTypeLinkResolver design doc: remove CppEmitterSingleFile from Callers
  (confirmed by code: resolver is accepted but discarded via _ = cppResolver)
- api-mark-cpp.md: remove CppEmitterSingleFile->CppTypeLinkResolver diagram
  edge (SingleFile does not use the resolver; type links omitted in single-file
  mode to prevent anchor collisions)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add WriteSingleFileTypeAliasSection to CppEmitterSingleFile.cs
- Wire namespace-level TypeAliases loop in EmitSingleFile
- Emit class-scoped type aliases as H{depth+3} sub-entries in WriteSingleFileClassSection
- Add unit test CppEmitterSingleFile_Emit_TypeAlias_ContainsTypeAliasSection
- Update design doc: Purpose, Emit algorithm, WriteSingleFileClassSection description,
  add WriteSingleFileTypeAliasSection Key Method entry, update Dependencies
- Update api-mark-cpp.md Data Flow step 4 to include type aliases in single-file path
- Add ApiMarkCpp-CppEmitterSingleFile-EmitsTypeAliasSection requirement and test link
- Add type alias test scenario to verification doc

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add class-scoped type alias req + test (AllRequirements/SingleFile R10 F-01/F-02)
- Fix CppEmitterSingleFile Data Model: document _emitter/_namespaceDecls fields (Design R10 F-01)
- Fix CppEmitterGradualDisclosure Data Model: document instance fields (Design R10 F-02)
- Add constructors to Key Methods for SingleFile and GD units (Design R10 F-03)
- Extend EmitSingleFile algorithm description with namespace heading/summary (Design R10 F-04)
- Add system-level type alias criterion + scenario to api-mark-cpp.md (Architecture R10)
- Add CWD-relative criterion to system verification (Verification R10 VER-02)
- Add final keyword criterion to system verification (Verification R10 VER-06)
- Add single-file type alias criterion to system verification (Architecture R10)
- Add 6 missing system-level test scenarios to api-mark-cpp.md (Verification R10 VER-01..VER-05)
- Add class-scoped alias acceptance criterion to cpp-emitter-single-file.md (VER-08)
- Add cross-references to mono-cecil.md and clang.md from ots.md (VER-07)
- Normalize 'This scenario is tested by' in ots/clang.md (OBS-02)
- Add CppGenerator_SingleFile_TypeAlias_AppearsInOutput integration test

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…Requirements R11)

Split malformed EmitsClassScopedTypeAliasSection block into two proper entries:
- EmitsTypeAliasSection (namespace-level aliases)
- EmitsClassScopedTypeAliasSection (class-scoped aliases at H{depth+3})

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add CppTypeLinkResolver constructor to Key Methods (Design R11)
- Add final keyword test scenario to system verification (Architecture R11)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Fix stale test name in api-mark-cpp.md system verification (Verification R12)
- Split compound GD EmitTypeAliasPage into namespace-level and class-scoped reqs (AllRequirements R12)
- Add CppEmitterGradualDisclosure_Emit_ClassScopedTypeAlias_CreatesAliasPage test

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…s (AllRequirements R13)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Fix 1: correct 5 wrong test references in vhdl-emitter-gradual-disclosure.yaml
  (EmitSubprogramDetailPage requirement now links to the 4 actual test names)
- Fix 2: correct arch test name in vhdl-emitter-gradual-disclosure.md verification
  doc and add subprogram detail page scenarios
- Fix 3a: correct VhdlEmitterGradualDisclosure architecture description in
  api-mark-vhdl.md (architectures are inline, not separate files)
- Fix 3b: remove version-specific platform constraint from api-mark-vhdl.md
- Fix 3c: add ANTLR4 OTS cross-reference link in api-mark-vhdl.md dependencies
- Fix 4: remove orphaned fragment 'a VhdlDocComment.' from vhdl-ast-parser.md
- Fix 5: add VhdlEmitter_ImplementsIApiEmitter test to VhdlEmitterTests.cs and
  link it in vhdl-emitter.yaml
- Fix 6: update VhdlGenerator glob pattern title to include .vhdl extension
- Fix 7: split ParsePackage into parent + 7 discrete child requirements
  (ParsePackageTypes, ParsePackageConstants, ParsePackageComponents,
  ParsePackageSubprograms, ParseSubprogramParameters, ParseSubprogramReturnType,
  ParseSubprogramDocComments) in vhdl-ast-parser.yaml
- Fix 8: add CounterVhd property to FixturePaths; add entity name and generic
  inline doc comment tests to VhdlAstParserTests.cs
- Fix 9: update api-mark-vhdl.md verification acceptance criteria (precise entity
  name, generic comments, syntax error rejection) and add three new test scenarios
- Replace markdown link with prose cross-reference for ANTLR4 OTS doc
  (design documentation standard requires verbal not hyperlink references)
- Add inline architecture acceptance criterion and test scenario to
  docs/verification/api-mark-vhdl.md
- Add ApiMarkVhdl-VhdlGenerator-ValidatesLibraryName requirement with
  Empty/Whitespace constructor test links (moved from AcceptSourceGlobPatterns)
- Add EntityNameIsCounter and GenericsHaveInlineDocComments test links
  to ApiMarkVhdl-VhdlAstParser-ParseEntity

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add VhdlGenerator_Parse_InvalidVhdlFile_EmitsErrorAndSkipsFile test
- Add ApiMarkVhdl-VhdlGenerator-ReportParseErrors requirement with test link
- Add architecture-inline test links to VhdlEmitterGradualDisclosure requirement

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Strengthen VhdlGenerator_Parse_InvalidVhdlFile_EmitsErrorAndSkipsFile test to
  use a mixed valid/invalid temp directory and assert valid files still produce output
- Add ReportParseErrors acceptance criterion and scenario to vhdl-generator.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove sealed modifier from ApiMarkTask to allow test subclassing
- Change RunToolProcess from private to protected virtual to provide a
  testability seam for overriding process execution in unit tests
- Add FailingApiMarkTask test subclass that overrides RunToolProcess to
  simulate a non-zero exit without spawning a real child process
- Add ApiMarkTask_Execute_ToolExitsNonZero_ReturnsFalseAndLogsError test
  verifying Execute returns false and logs an MSBuild error on non-zero exit
- Split ApiMarkMsbuild-ApiMarkTask-SupportOutputsItemGroup compound
  requirement into three focused requirements: SupportOutputsItemGroup
  (parent), OverrideOutputProperties, and RestoreOutputProperties
- Add ApiMarkMsbuild-ApiMarkTask-ResolveDotNetExecutable requirement for
  dotnet host path resolution behavior
- Add ApiMarkMsbuild-ApiMarkTask-SurfaceToolExitCode requirement linked
  to the new test
- Add ApiMarkMsbuild-ApiMarkTask-ForwardStdoutToLog requirement for
  stdout forwarding behavior
- Replace known-gap notes in both verification docs with confirmed
  acceptance criteria
- Add non-zero exit test scenario to api-mark-task verification doc
…sts and split dotnet-resolve requirement

- Fix 1: correct ApiMarkOutput (item group) vs ApiMarkOutputs (task property) naming
  in SupportOutputsItemGroup requirement title and verification docs

- Fix 2: change ResolveDotNetExe() from private static to protected virtual so test
  subclasses can override it; add NoDotNetApiMarkTask helper subclass

- Fix 3: split ResolveDotNetExecutable requirement into two separate requirements:
  ApiMarkMsbuild-ApiMarkTask-ResolveDotNetFromEnvironment (DOTNET_HOST_PATH / PATH
  resolution, tested by the existing end-to-end test) and
  ApiMarkMsbuild-ApiMarkTask-ReportMissingDotNetExe (missing dotnet error path, tested
  by new ApiMarkTask_Execute_DotNetExeNotResolved_ReturnsFalseAndLogsError)

- Fix 4: add LogMessageEvent assertion to ApiMarkTask_Execute_WithDotNetProject_
  GeneratesDocumentation and link it to the ForwardStdoutToLog requirement

- Fix 5: add ApiMarkMsbuild-ApiMarkTask-ForwardStderrErrors requirement and
  ApiMarkTask_Execute_ToolWritesToStderr_ForwardsToMsBuildErrors test that runs the
  real tool with invalid inputs to exercise the ErrorDataReceived forwarding path

- Fix 6: add ApiMarkTask_Execute_WithMultipleOutputs_RunsToolForEachOutput test with
  RecordingApiMarkTask helper; link test to SupportOutputsItemGroup requirement and
  add verification scenario in both verification docs

- Fix 7: update verification docs with new acceptance criteria and test scenarios for
  dotnet resolution failure, stdout forwarding, stderr forwarding, and multi-output
  execution

All 26 MSBuild tests pass (4 new tests added).
- Make ResolveDotNetExe protected virtual; add NoDotNetApiMarkTask subclass
- Split ResolveDotNetExecutable into ResolveDotNetFromEnvironment + ReportMissingDotNetExe
- Add ApiMarkTask_Execute_DotNetExeNotResolved_ReturnsFalseAndLogsError test
- Add ForwardStderrErrors requirement + ApiMarkTask_Execute_ToolWritesToStderr test
- Add ForwardStdoutToLog test evidence via end-to-end test assertion
- Add RecordingApiMarkTask + multi-output execution test
- Fix ApiMarkOutput (item group) vs ApiMarkOutputs (task property) naming in docs
- Rewrite ForwardApiHeaders title as single observable criterion; move order/verbatim detail to justification
- Update verification docs with new acceptance criteria and scenarios

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…older

- Rewrite OverrideOutputProperties/RestoreOutputProperties in observable-behavior terms
- Fix ApiMarkOutputs (task property) vs ApiMarkOutput (item group) in design doc
- Add test/ApiMark.MSBuild.PackageTests/ to design and verification introduction listings

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Malcolm Nixon and others added 4 commits June 25, 2026 23:29
…ssor accessibility

Bug 1: Context.cs only guarded --depth > 3 when --format single-file was active.
Supplying --depth 4 with the default gradual-disclosure format passed CLI
validation, reached EmitConfig.HeadingDepth = 4, and threw a cryptic
ArgumentOutOfRangeException from the setter. Add an unconditional guard that
rejects any value above 3 with a clear error for every format, before the
existing single-file-specific check.

Bug 2: BuildPropertyAccessors (and BuildPropertySignature) used
  GetAccessibilityKeyword(prop.GetMethod ?? prop.SetMethod!)
which always picks the getter when present. For a public property with a
restricted getter (e.g. protected get; set;) this produced the wrong
property-level keyword (protected) and emitted contradictory output such as
'protected Foo { get; public set; }' instead of 'public Foo { protected get; set; }'.
Add a MostPermissiveAccessor(MethodDefinition? a, MethodDefinition? b) helper
backed by an AccessibilityRank scorer, and use it in both call sites so that
the property-level keyword always matches the most permissive accessor.

Tests added:
- Context_Create_WithDepth4_ThrowsArgumentException (Tool.Tests)
- DotNetEmitter_BuildPropertyAccessors_AsymmetricGetSet_UsesMostPermissiveAccessibility (DotNet.Tests)
- Fixture class AsymmetricAccessorClass with public { protected get; set; } property

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace LastIndexOf('::', cppTypeString) approach with a search bounded
before the first '<', preventing corruption when a template argument is a
qualified name sharing a prefix with the type being linked
(e.g. ns::Foo<ns::FooBar> was producing ns::Foo<ns::[Foo](link)Bar>).

Add regression test: QualifiedTypeWithQualifiedTemplateArgSharingPrefix.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…-independent

- Change GetRequiredIntArgument upper bound from 6 to 3 so '--depth 7'
  reports the correct valid range (1-3) instead of the misleading 1-6
- Override ResolveDotNetExe in FailingApiMarkTask to return 'dummy-dotnet',
  ensuring the non-zero exit-code test always reaches RunToolProcess
  regardless of whether dotnet is on PATH

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 26, 2026 03:58

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.

Pull request overview

This PR substantially expands ApiMark’s correctness/contract enforcement and corresponding documentation by adding new guardrails (null/argument validation), improving type/name formatting, and broadening test coverage across Core, Tool, DotNet, Cpp, and VHDL. It also updates verification/design/requirements artifacts to reflect the new behaviors and adds a few tooling/docs adjustments.

Changes:

  • Strengthen API boundary validation (e.g., null guards, EmitConfig heading-depth range enforcement) and extend CLI parsing/behavior.
  • Improve documentation generation fidelity (e.g., generic type cref rendering, array rank formatting, external-type tracking, C++ type-alias emission).
  • Add/extend unit & integration tests plus update verification/design/requirements documentation accordingly.

Reviewed changes

Copilot reviewed 218 out of 218 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
test/ApiMark.Vhdl.Tests/VhdlGeneratorTests.cs Adds constructor/input and parse edge-case tests for VHDL generator behavior.
test/ApiMark.Vhdl.Tests/VhdlEmitterTests.cs Adds VHDL emitter contract/format dispatch tests.
test/ApiMark.Vhdl.Tests/FixturePaths.cs Adds fixture path for counter.vhd.
test/ApiMark.Tool.Tests/SelfTest/ValidationTests.cs Strengthens results-file assertions via TRX/JUnit round-trip deserialization.
test/ApiMark.Tool.Tests/ConsoleCollection.cs Introduces xUnit collection to serialize tests that mutate global Console streams.
test/ApiMark.Tool.Tests/ApiMark.Tool.Tests.csproj Adds DemaConsulting.TestResults package reference for test deserialization.
test/ApiMark.DotNet.Tests/XmlDocReaderTests.cs Adds test for generic-type cref formatting in summaries.
test/ApiMark.DotNet.Tests/DotNetGeneratorTests.cs Adds generator guard tests and namespace-doc assertions.
test/ApiMark.DotNet.Tests/DotNetAstModelTests.cs Tightens namespace/root assertions and adds read-only/nonnull model checks.
test/ApiMark.DotNet.Fixtures/StaticFixtureClass.cs New fixture for static-class signature emission.
test/ApiMark.DotNet.Fixtures/SampleEnum.cs Adds license header.
test/ApiMark.DotNet.Fixtures/SampleClass.cs Adds license header.
test/ApiMark.DotNet.Fixtures/OuterClass.cs Adds license header.
test/ApiMark.DotNet.Fixtures/OperatorsStruct.cs Adds license header.
test/ApiMark.DotNet.Fixtures/IsExternalInit.cs Adds IsExternalInit polyfill for init-only setters on netstandard targets.
test/ApiMark.DotNet.Fixtures/IntVsIntArrayClass.cs Adds license header.
test/ApiMark.DotNet.Fixtures/InitPropertyClass.cs New fixture for init-only property accessor rendering.
test/ApiMark.DotNet.Fixtures/CaseCollisionClass.cs Adds license header.
test/ApiMark.DotNet.Fixtures/AsymmetricAccessorClass.cs New fixture for asymmetric accessor accessibility rendering.
test/ApiMark.DotNet.Fixtures/AbstractFixtureClass.cs New fixture for abstract modifier/signature rendering.
test/ApiMark.Cpp.Tests/CppGeneratorFixture.cs Updates fixture docs to reflect Parse/Emit pipeline and option-count change.
test/ApiMark.Cpp.Tests/CppAstModelTests.cs Expands default-property assertions for AST records.
test/ApiMark.Cpp.Tests/ClangAstParserTests.cs Adds argument-guard tests and “errors collection empty” test for fixtures.
test/ApiMark.Cpp.Fixtures/include/fixtures/ExternalTypeFixture.h New C++ fixture for external (non-std) type reference tracking.
test/ApiMark.Core.Tests/PathHelpersTests.cs Adds test for zero-segment SafePathCombine behavior.
test/ApiMark.Core.Tests/IContextTests.cs Adds null-guard and ordering tests for InMemoryContext channels.
test/ApiMark.Core.Tests/GlobFileCollectorTests.cs Adds null-argument guard tests for GlobFileCollector.
test/ApiMark.Core.Tests/FileMarkdownWriterFactoryTests.cs Adds constructor and CreateMarkdown validation tests + whitespace subfolder behavior.
test/ApiMark.Core.Tests/EmitConfigTests.cs New tests for EmitConfig defaults and heading-depth range validation.
test/ApiMark.Core.TestHelpers/InMemoryContext.cs Enforces null guards in test context implementation.
src/ApiMark.Vhdl/VhdlGenerator.cs Documents normalization behavior for null Sources.
src/ApiMark.Vhdl/VhdlEmitterSingleFile.cs Clarifies unused context parameter intent in docs.
src/ApiMark.Vhdl/VhdlEmitterGradualDisclosure.cs Clarifies unused config/context parameter intent in docs.
src/ApiMark.Vhdl/VhdlEmitter.cs Refines internal documentation for keyword stripping/options/models.
src/ApiMark.Vhdl/VhdlAst/VhdlAstParser.cs Uses sourceText splitting for line indexing; improves error listener docs.
src/ApiMark.Vhdl/VhdlAst/VhdlAstModel.cs Clarifies port/mode documentation semantics.
src/ApiMark.Tool/Program.cs Updates help text to include --result alias and constructs EmitConfig from CLI context.
src/ApiMark.Tool/Cli/Context.cs Tightens --depth constraints and rejects flag tokens as string values.
src/ApiMark.MSBuild/ApiMarkTask.cs Makes task extensible (unsealed + virtualized process/dotnet resolution).
src/ApiMark.DotNet/XmlDocReader.cs Adds thread-safety remarks; formats generic-type arity as List<T> style placeholders.
src/ApiMark.DotNet/TypeLinkResolver.cs Improves array rank formatting and inlines ExternalTypeInfo record.
src/ApiMark.DotNet/ExternalTypeInfo.cs Removes standalone ExternalTypeInfo (moved into TypeLinkResolver).
src/ApiMark.DotNet/DotNetGeneratorOptions.cs Removes standalone options type (moved elsewhere in DotNet assembly).
src/ApiMark.DotNet/DotNetEmitterGradualDisclosure.cs Refactors member-page writing path (introduces consolidated writer helper usage).
src/ApiMark.DotNet/DotNetAstModel.cs Switches to read-only collection interfaces for model/context records.
src/ApiMark.DotNet/ApiVisibility.cs Removes standalone enum (moved elsewhere in DotNet assembly).
src/ApiMark.Cpp/CppGenerator.cs Adds null-guard for Parse context and updates process description docs.
src/ApiMark.Cpp/CppEmitterSingleFile.cs Emits namespace-level and class-level type aliases in single-file output.
src/ApiMark.Cpp/CppEmitter.cs Adds argument guards; enforces min-size precondition for combined member page writer.
src/ApiMark.Cpp/CppAst/CppAstModel.cs Adds concurrency/read-only safety remarks to AST model.
src/ApiMark.Cpp/CppAst/ClangAstParser.cs Adds null/empty/whitespace header + options validation.
src/ApiMark.Core/PathHelpers.cs Updates docs to reflect zero-segment behavior.
src/ApiMark.Core/IMarkdownWriterFactory.cs Clarifies Parse/Emit pipeline and whitespace subfolder behavior.
src/ApiMark.Core/IApiGenerator.cs Clarifies Parse contract wording.
src/ApiMark.Core/GlobFileCollector.cs Adds null guards; adds literal-absolute-path handling; changes dedupe comparer.
src/ApiMark.Core/EmitConfig.cs Enforces HeadingDepth range (1–3) at init time.
requirements.yaml Adds reqstream includes for FileMarkdownWriter(+Factory) requirements.
README.md Updates MSBuild clang property name reference and clarifies user guide distribution.
docs/verification/ots/file-system-globbing.md Narrows described verified feature subset.
docs/verification/ots/dema-consulting-test-results.md Updates verification narrative to match round-trip assertions.
docs/verification/ots/clang.md Minor wording normalization in verification scenarios.
docs/verification/ots.md Adds Mono.Cecil and TestResults sections; adds cross-links.
docs/verification/introduction.md Expands layout/OTS list and clarifies scope boundaries.
docs/verification/api-mark-vhdl/vhdl-generator.md Updates verification scenarios to include new edge cases.
docs/verification/api-mark-vhdl/vhdl-emitter.md Updates verification scenarios for format dispatch and empty-output behavior.
docs/verification/api-mark-vhdl/vhdl-emitter-gradual-disclosure.md Adds scenarios around architecture inline rendering and package subprogram detail files.
docs/verification/api-mark-vhdl/vhdl-ast-parser.md Adds invalid-VHDL error scenario.
docs/verification/api-mark-tool/program.md Adds results-file scenario and strengthens silent/log description.
docs/verification/api-mark-tool/cli/context.md Updates CLI verification scenarios for depth validation and flag-as-value rejection.
docs/verification/api-mark-tool/cli.md Clarifies silent/log routing expectations.
docs/verification/api-mark-msbuild/api-mark-task.md Updates MSBuild task verification scenarios (stdout/stderr, dotnet resolution, multi-output).
docs/verification/api-mark-dot-net/type-link-resolver.md Adds scenarios for external-type tracking, arrays, and generics.
docs/verification/api-mark-dot-net/dot-net-emitter-single-file.md Expands single-file emitter acceptance criteria and scenarios.
docs/verification/api-mark-dot-net/dot-net-emitter-gradual-disclosure.md Adds scenarios for overload/collision/operators/nested types.
docs/verification/api-mark-dot-net/dot-net-ast-model.md Updates scenarios for read-only collections and non-null properties.
docs/verification/api-mark-dot-net.md Clarifies member-page behavior (dedicated vs collision pages).
docs/verification/api-mark-core/path-helpers.md Adds zero-segment behavior scenario.
docs/verification/api-mark-core/i-markdown-writer.md Normalizes wording and updates referenced test name.
docs/verification/api-mark-core/i-markdown-writer-factory.md Adds whitespace-subfolder root behavior scenario.
docs/verification/api-mark-core/i-context.md Updates null-message contract and ordering scenarios.
docs/verification/api-mark-core/i-api-generator.md Updates contract narrative for Parse/Emit separation and null-context behavior.
docs/verification/api-mark-core/i-api-emitter.md Expands emitter contract verification (format selection, null guards).
docs/verification/api-mark-core/glob-file-collector.md Adds literal-path and null-argument scenarios.
docs/verification/api-mark-core/file-markdown-writer-factory.md New verification doc for filesystem writer factory.
docs/verification/api-mark-core/emit-config.md Updates verification approach and adds range-validation scenarios.
docs/verification/api-mark-core.md Updates core verification summary and scenario references.
docs/user_guide/introduction.md Clarifies per-language coverage scope and file discovery responsibilities.
docs/user_guide/cpp.md Adds Doxygen @code/@endcode example section; updates output structure table.
docs/reqstream/ots/file-system-globbing.yaml Removes requirements for excluded features; narrows OTS requirement set.
docs/reqstream/ots/dema-consulting-test-results.yaml Updates requirements and test links for results collection and serialization.
docs/reqstream/api-mark-vhdl/vhdl-generator.yaml Expands VHDL generator requirements (library name validation, no-files matched, parse errors).
docs/reqstream/api-mark-vhdl/vhdl-emitter.yaml Expands emitter requirements hierarchy and links to tests.
docs/reqstream/api-mark-vhdl/vhdl-emitter-gradual-disclosure.yaml Adds requirement for per-subprogram detail pages.
docs/reqstream/api-mark-vhdl/vhdl-ast-model.yaml Adds common_types fixture scenario coverage.
docs/reqstream/api-mark-tool/program.yaml Adds results-file scenario to validation requirement evidence.
docs/reqstream/api-mark-tool/cli.yaml Adds requirements for silent suppression and context-based output routing.
docs/reqstream/api-mark-dot-net/xml-doc-reader.yaml Refines wording and expands inheritdoc requirement statement.
docs/reqstream/api-mark-dot-net/type-name-simplifier.yaml Updates referenced test IDs to match new naming.
docs/reqstream/api-mark-dot-net/dot-net-ast-model.yaml Updates test list for additional model properties/constraints.
docs/reqstream/api-mark-cpp/cpp-type-link-resolver.yaml Refactors resolver requirements into finer-grained child requirements.
docs/reqstream/api-mark-cpp/cpp-emitter.yaml Refactors emitter requirements (null guards, sanitization, external types, collision pages).
docs/reqstream/api-mark-cpp/cpp-ast-model.yaml Adds/extends test coverage mapping for AST model requirements.
docs/reqstream/api-mark-cpp/clang-ast-parser.yaml Updates Parse requirements and adds argument-guard tests.
docs/reqstream/api-mark-cpp.yaml Adds top-level external-types requirement and other requirement references.
docs/reqstream/api-mark-core/path-helpers.yaml Updates requirement to allow zero segments and adds corresponding test.
docs/reqstream/api-mark-core/i-markdown-writer-factory.yaml Refines subfolder/root and output-dir validation requirements.
docs/reqstream/api-mark-core/i-context.yaml Adds null-message rejection requirements.
docs/reqstream/api-mark-core/i-api-generator.yaml Refines Parse contract requirements (context param, emitter return, null rejection).
docs/reqstream/api-mark-core/i-api-emitter.yaml Expands emitter contract requirements (format support, api.md, null guards).
docs/reqstream/api-mark-core/glob-file-collector.yaml Adds literal-absolute-path support and null-argument rejection requirements.
docs/reqstream/api-mark-core/file-markdown-writer-factory.yaml New requirements file for FileMarkdownWriterFactory behavior.
docs/reqstream/api-mark-core/emit-config.yaml Adds explicit tests for defaults and heading-depth range validation.
docs/reqstream/api-mark-core.yaml Updates core requirements set and test mappings.
docs/design/ots/dema-consulting-test-results.md Adds explicit error-handling behavior for results writing.
docs/design/ots.md Clarifies OTS integration modes (NuGet vs external CLI tools).
docs/design/api-mark-vhdl/vhdl-generator.md Adds Description option and clarifies generator option semantics.
docs/design/api-mark-vhdl/vhdl-emitter.md Documents NoItemsPlaceholder and keyword stripping set.
docs/design/api-mark-vhdl/vhdl-emitter-single-file.md Refines single-file layout and model dependencies list.
docs/design/api-mark-vhdl/vhdl-emitter-gradual-disclosure.md Clarifies optional sections and inline architecture behavior.
docs/design/api-mark-vhdl/vhdl-ast-parser.md Normalizes N/A formatting and clarifies doc parsing method.
docs/design/api-mark-vhdl/vhdl-ast-model.md Normalizes N/A formatting and clarifies invariants.
docs/design/api-mark-vhdl.md Updates architecture handling and parse-error data flow description.
docs/design/api-mark-tool/self-test/validation.md Normalizes N/A formatting.
docs/design/api-mark-tool/program.md Formatting tweaks and normalized N/A wording.
docs/design/api-mark-tool/cli/context.md Documents depth constraints and normalizes N/A wording.
docs/design/api-mark-tool/cli.md Normalizes N/A wording.
docs/design/api-mark-tool.md Normalizes N/A wording.
docs/design/api-mark-msbuild/api-mark-task.md Normalizes N/A wording.
docs/design/api-mark-msbuild.md Clarifies multi-output item group naming and normalizes wording.
docs/design/api-mark-dot-net/type-link-resolver.md Documents ExternalTypeInfo and link-generation behaviors/constraints.
docs/design/api-mark-dot-net/dot-net-emitter-single-file.md Documents heading-depth effects, ordering rules, and delegate/nested behavior.
docs/design/api-mark-dot-net/dot-net-ast-model.md Updates immutability/read-only collection interface design narrative.
docs/design/api-mark-core/path-helpers.md Clarifies zero-segment behavior and escape-check algorithm.
docs/design/api-mark-core/i-markdown-writer.md Expands preconditions and error-handling expectations.
docs/design/api-mark-core/i-context.md Normalizes N/A wording.
docs/design/api-mark-core/i-api-generator.md Normalizes N/A wording.
docs/design/api-mark-core/i-api-emitter.md Clarifies parse/emit relationship in data model narrative.
docs/design/api-mark-core/glob-file-collector.md Documents null-guard and literal-file-path behavior.
docs/design/api-mark-core/file-markdown-writer-factory.md New design doc for FileMarkdownWriterFactory (purpose, method contracts).
docs/design/api-mark-core/emit-config.md Documents HeadingDepth runtime validation.
docs/design/api-mark-core.md Updates role wording and clarifies core dependency on FileSystemGlobbing OTS.
.github/standards/design-documentation.md Clarifies “no version numbers” guidance with examples/allowed identifiers.
.github/agents/formal-review.agent.md Refines ReviewMark context-vs-files review flow and artifact saving steps.
.cspell.yaml Adds domain words to reduce false positives.
.config/dotnet-tools.json Bumps demaconsulting.reviewmark from 1.2.0 to 1.3.0.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/ApiMark.Tool/Cli/Context.cs Outdated
Comment thread src/ApiMark.Core/GlobFileCollector.cs
Comment thread test/ApiMark.Vhdl.Tests/VhdlGeneratorTests.cs
Comment thread README.md
Comment thread test/ApiMark.Vhdl.Tests/VhdlEmitterTests.cs
Malcolm Nixon and others added 3 commits June 26, 2026 00:08
GetRequiredIntArgument now enforces max=3 directly so the subsequent
if-HeadingDepth>3 blocks can never be reached.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Paths from Matcher.GetResultsInFullPath already reflect actual on-disk
casing, so Ordinal is correct and filesystem-agnostic — no two distinct
physical files produce ordinal-equal paths, and case-distinct paths on
Linux are not incorrectly collapsed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
TypeNameSimplifier_Simplify_GenericArguments_AreSimplifiedRecursively
was referenced as TypeNameSimplifier_GenericArguments_AreSimplifiedRecursively
(missing '_Simplify_' segment), causing reqstream to report an unsatisfied
requirement.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 26, 2026 11:12

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.

Pull request overview

Copilot reviewed 219 out of 219 changed files in this pull request and generated 4 comments.

Comments suppressed due to low confidence (1)

src/ApiMark.DotNet/TypeLinkResolver.cs:100

  • With nullable reference types enabled, the XML doc now explicitly says typeRef may be null and the method has a null guard, but the signature is still TypeReference typeRef (non-nullable). Consider changing the parameter type to TypeReference? (and updating call sites) so the contract is represented correctly in the type system and you don’t need null-forgiving at call sites.

Comment thread src/ApiMark.Core/GlobFileCollector.cs
Comment thread src/ApiMark.Tool/Cli/Context.cs
Comment thread docs/verification/api-mark-tool/cli/context.md Outdated
Comment thread docs/design/api-mark-tool/cli/context.md Outdated
Malcolm Nixon and others added 4 commits June 26, 2026 07:29
Add ResolveOnDiskPath helper that uses Directory.GetFiles to resolve
the actual filesystem entry name, ensuring literal path keys are
casing-consistent with paths returned by Matcher.GetResultsInFullPath.
This makes exclusion removal correct on case-insensitive filesystems
(Windows/macOS) when the caller-supplied casing differs from on-disk.

Update design doc to document ResolveOnDiskPath and the Ordinal/casing rationale.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Context now validates --depth in the range 1-6 only (first-principles CLI
validation); the format-specific constraint (single-file requires depth <= 3)
is enforced in Program.RunToolLogic after all arguments are known.

Changes:
- Context.cs: widen GetRequiredIntArgument max from 3 to 6; remove the
  cross-argument SingleFile+depth>3 check from the --format case
- EmitConfig.cs: widen HeadingDepth validation to 1-6; update XML doc
- Program.cs RunToolLogic: add cross-argument rejection of
  single-file + depth > 3 with a clear WriteError diagnostic
- ContextTests.cs: replace Depth4_Throws test with Depth4_SetsHeadingDepth;
  remove DepthAbove3AndSingleFileFormat_Throws (moved to program layer)
- EmitConfigTests.cs: update AboveMaximum test to use depth 7; add
  ValueFour_SetsCorrectly confirming the widened range
- ProgramTests.cs: add test verifying single-file + depth 4 returns
  non-zero exit code with --depth in the error message
- docs/design and docs/verification: update --depth range to 1-6 in
  Context and EmitConfig docs; document new program-layer constraint

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… validates 1-6

Context now validates --depth against first principles (1-6: valid ATX heading
levels in Markdown). The single-file format constraint (depth <= 3) is enforced
post-parse in Program.cs where both --format and --depth are known.

This separation ensures Context does not memorize downstream format constraints.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The ValidateDepthForSingleFileFormat requirement belongs to Program
(post-parse cross-argument validation), not Context. Context_Create_
WithDepth3AndSingleFileFormat_Succeeds moved to ParseDepthOption.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 26, 2026 12:37

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.

Pull request overview

Copilot reviewed 216 out of 219 changed files in this pull request and generated 5 comments.

Comment thread src/ApiMark.Core/GlobFileCollector.cs
Comment thread docs/reqstream/api-mark-core/emit-config.yaml
Comment thread docs/verification/api-mark-tool/cli/context.md Outdated
Comment thread docs/verification/ots/file-system-globbing.md Outdated
Comment thread docs/reqstream/ots/file-system-globbing.yaml
Malcolm Nixon and others added 2 commits June 26, 2026 08:49
- Guard Directory.Exists before Directory.GetFiles in ResolveOnDiskPath
- Update EmitConfig-ValidateHeadingDepthRange requirement to 1-6 range
- Remove duplicate Depth6 scenario in context verification doc
- Restore exclusion-pattern and non-existent-root coverage in
  file-system-globbing verification doc and reqstream requirements

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Validation_Run_WithResultsTrxFile_CreatesTrxFile already proves the
program can write results to a file; no new Program_Main_* test needed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 26, 2026 13:10

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.

Pull request overview

Copilot reviewed 216 out of 219 changed files in this pull request and generated 4 comments.

Comment thread src/ApiMark.Core/GlobFileCollector.cs
Comment thread src/ApiMark.Vhdl/VhdlAst/VhdlAstParser.cs Outdated
Comment thread src/ApiMark.DotNet/XmlDocReader.cs Outdated
Comment thread README.md
…cape angle brackets

- GlobFileCollector: add inline block comment explaining why StringComparer.Ordinal
  is correct — all paths in collected carry on-disk casing via Matcher or
  ResolveOnDiskPath, so Ordinal deduplication is exact on all filesystems
- VhdlAstParser: use ReplaceLineEndings to handle CR-only line endings in addition
  to CRLF and LF
- XmlDocReader: escape angle brackets in FormatTypeArity output as \< and \> so
  generic type params are not parsed as HTML tags in Markdown prose

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Malcolmnixon
Malcolmnixon merged commit b7909c8 into main Jun 26, 2026
15 checks passed
@Malcolmnixon
Malcolmnixon deleted the feature/reviewmark-context-hierarchy branch June 26, 2026 13:53
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