Skip to content

(adr-0001) Parse one GNU Makefile into versioned JSON facts - #6

Open
leynos wants to merge 25 commits into
mainfrom
adr-0001-single-file-gnu-make-parse
Open

(adr-0001) Parse one GNU Makefile into versioned JSON facts#6
leynos wants to merge 25 commits into
mainfrom
adr-0001-single-file-gnu-make-parse

Conversation

@leynos

@leynos leynos commented Jul 13, 2026

Copy link
Copy Markdown
Owner

Summary

This branch carries the pre-implementation plan for parsing one explicit GNU
Makefile into deterministic, versioned JSON without evaluating Make syntax or
executing source-selected commands.

ExecPlan: docs/execplans/adr-0001-single-file-gnu-make-parse.md

The plan defines approval-gated milestones for the owned schema, parser port,
source ranges, recovered parses, CLI and stream behaviour, security evidence,
and layered unit, property, snapshot, behavioural and end-to-end testing. It
also imports the local OrthoConfig 0.8.0 user guide used to design the CLI boundary.

No feature implementation is included. Implementation remains blocked until
the plan, including the exact makefile-lossless = "=0.3.40" exception, is
explicitly approved.

Review walkthrough

  • Start with the ExecPlan for constraints, decisions, milestones, acceptance evidence and the approval record.
  • Then review the updated technical design for the frozen location, parser-boundary, determinism, security, failure and observability contracts.
  • Review the imported OrthoConfig user guide for the CLI and ArgMatches guidance signposted by the plan.
  • Finish with the documentation index and repository layout for discoverability and ownership changes.

Validation

  • git diff --check: passed.
  • make markdownlint: passed, including Oxford spelling checks.
  • make nixie: passed.
  • make check-fmt: passed.
  • make typecheck: passed with Polonius and warnings denied.
  • make lint: passed, including rustdoc, Clippy and Whitaker.
  • make test: passed, including nextest and doctests.
  • coderabbit review --agent: three completed rounds; all 27 actionable concerns were resolved. The final post-fix retry was rate-limited before analysis and emitted no new findings, so a clean follow-up remains pending after the service window resets.

Notes

Wyvern reconnaissance mapped the scaffold and test seams. A full Logisphere
community review revised the architecture and contracts before delivery.
Firecrawl research checked the authoritative makefile-lossless 0.3.40 source
and API surface.

References

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorry @leynos, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

The pull request replaces the placeholder crate with a GNU Makefile parser that emits schema-v1 JSON, supports file and stdin input, preserves source locations, reports recovery and fatal errors, and adds parser, CLI, schema, snapshot, BDD, and end-to-end coverage.

Changes

GNU Makefile parsing

Layer / File(s) Summary
Report contracts and domain model
Cargo.toml, schemas/..., src/domain/..., src/ports.rs, src/lib.rs
Define the schema-v1 report, parser port, source-location model, ordered facts, diagnostics, dependencies, and public exports.
Parser adapter and report assembly
src/adapters/makefile.rs, src/application.rs
Parse losslessly, collect syntax observations, map locations, calculate hashes, and assemble reports.
Bounded source input
src/adapters/source.rs, tests/source_adapter.rs
Read paths and stdin through injected capabilities with stable read, open, and size-limit errors.
CLI input, output, and exit handling
src/adapters/cli.rs, src/main.rs, docs/users-guide.md
Implement makeutil parse, stdin filename rules, fatal diagnostics, JSON output, and exit codes.
Schema, fixture, and behaviour validation
tests/*, schemas/..., tests/fixtures/...
Validate complete and recovered parsing, locations, ordering, inertness, schema compatibility, snapshots, BDD flows, and output failures.
Architecture and execution documentation
docs/design.md, docs/execplans/*, docs/developers-guide.md, docs/repository-layout.md
Record the accepted ADR, implementation plan, module boundaries, determinism rules, failure contract, and repository structure.
Reference and tooling guides
README.md, docs/ortho-config-users-guide.md, docs/rstest-bdd-users-guide.md, typos.toml, data/*, scripts/*, Makefile
Add project and OrthoConfig guidance, refine rstest-bdd guidance, and update spelling and provenance tooling.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant CLI
  participant SourceReader
  participant MakefileLosslessParser
  participant parse_source
  User->>CLI: makeutil parse input
  CLI->>SourceReader: read path or stdin
  SourceReader-->>CLI: source bytes
  CLI->>MakefileLosslessParser: parse UTF-8 source
  MakefileLosslessParser-->>parse_source: syntax observations
  parse_source-->>CLI: schema-v1 ParseReport
  CLI-->>User: newline-terminated JSON and exit code
Loading

Possibly related PRs

Suggested labels: Roadmap

Poem

Makefiles hum, their facts align,
Bytes find their paths in line.
Rules and vars through JSON flow,
Stdin joins the parsing show.
Errors speak, while shells stay still—
A tidy report by parser’s will.

🚥 Pre-merge checks | ✅ 20
✅ Passed checks (20 passed)
Check name Status Explanation
Title check ✅ Passed The title matches the ADR-0001 Makefile-to-JSON parsing work and includes the required roadmap reference.
Description check ✅ Passed The description stays on topic and summarises the execplan, docs, and approval-gated parsing work in the branch.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Testing (Overall) ✅ Passed New behaviour is covered by end-to-end, adapter, schema, regression, property and snapshot tests with real oracles, not just mocks.
User-Facing Documentation ✅ Passed docs/users-guide.md now documents parse file/stdin, output schema, exit codes, limits and diagnostics; README signposts the core CLI and guide clearly.
Developer Documentation ✅ Passed PASS: the developer guide documents new ports, adapters and tooling; the design/ADR record boundary decisions; the execplan progress is fully checked off.
Module-Level Documentation ✅ Passed Every Rust and Python module checked starts with a clear module docstring; nested test modules are documented too.
Testing (Unit And Behavioural) ✅ Passed PASS: The PR adds unit tests for invariants, edge cases, and error paths, plus behavioural BDD and black-box CLI E2E coverage over the public boundary.
Testing (Property / Proof) ✅ Passed PASS: The PR adds a proptest for LocationIndex span monotonicity and rejects split UTF-8 spans; no substantive lemma/proof obligation was introduced.
Testing (Compile-Time / Ui) ✅ Passed No dedicated compile-time behaviour is introduced; the PR uses focused JSON snapshots plus schema/field assertions for structured output.
Unit Architecture ✅ Passed PASS: I/O, ambient file access, and stdout/stderr are isolated in cli/source adapters; parse_source, location mapping, and report assembly stay pure and injectable.
Domain Architecture ✅ Passed PASS: domain code stays model-only; filesystem, CLI, and parser-capability concerns are confined to adapters/application, with no transport or OS leakage into domain types.
Observability ✅ Passed PASS: every failure boundary emits a stable makeutil: <operation>: <detail> stderr line, recovered parses carry JSON diagnostics/status, and this one-shot CLI adds no metric/alert boundary.
Security And Privacy ✅ Passed No secrets, credentials, or unsafe sinks were added; input handling stays capability-bound and diagnostics only echo user-provided paths/messages.
Performance And Resource Use ✅ Passed PASS: input/output paths are explicitly bounded (16 MiB cap, take(BOUNDED_READ_BYTES)), traversals are single-pass, and JSON/report materialisation is size-bounded by the same cap.
Concurrency And State ✅ Passed No async, locks, globals, or spawned tasks appear; mutable state stays local in ProcessCapabilities and ReportAssembly with single-pass deterministic ordering.
Architectural Complexity And Maintainability ✅ Passed The new ports and adapters isolate real seams, stay acyclic, and the docs give immediate reuse/test seams rather than speculative abstractions.
Rust Compiler Lint Integrity ✅ Passed No lint suppressions or artificial anchors found; shared test helpers are used, and the few clone() calls move owned paths/diagnostics or split conditional ownership.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch adr-0001-single-file-gnu-make-parse

Comment @coderabbitai help to get the list of available commands.

@pandalump
pandalump marked this pull request as ready for review July 13, 2026 22:42
@coderabbitai coderabbitai Bot added the Roadmap label Jul 13, 2026
coderabbitai[bot]

This comment was marked as resolved.

@leynos

This comment was marked as resolved.

@coderabbitai

This comment was marked as resolved.

@pandalump

Copy link
Copy Markdown
Collaborator

@coderabbitai resume

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== src/adapters/source.rs ==="
cat -n src/adapters/source.rs

echo "=== src/adapters/cli.rs ==="
cat -n src/adapters/cli.rs

echo "=== git log for these files ==="
git log --oneline -- src/adapters/source.rs src/adapters/cli.rs | head -20

Length of output: 13699


@leynos All four checks are now resolved.

Check Status Evidence
Unit Architecture ✅ Resolved Commit b4f909a ("Inject source-reader capability at CLI boundary") fixes the last gap. src/adapters/source.rs's read_path now takes reader: &(impl SourceReader + ?Sized) and no longer calls ambient_authority() itself. src/adapters/cli.rs constructs AmbientSourceReader (wrapping cap_std::ambient_authority() and File::open_ambient) exactly once inside run_from, then threads it through ProcessCapabilities into run_from_with_readerrun_parseread_inputread_path. Orchestration remains split across extract_explicit_arguments, produce_report, emit_report, and read_input.
User-Facing Documentation ✅ Resolved README.md states makeutil parses GNU Makefiles into JSON and links to docs/users-guide.md.
Developer Documentation ✅ Resolved Execplan revision note reflects completed implementation; docs/design.md assigns hashing ownership to parse_source.
Domain Architecture ✅ Resolved src/adapters/makefile.rs no longer trims variable.raw_value().

No outstanding work remains from this list; no follow-up issue is needed.

(੭ ˘ ᵕ˘)੭ nice one, all green now

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown
✅ Action performed

Reviews resumed.

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
putComment timed out

@pandalump

Copy link
Copy Markdown
Collaborator

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

coderabbitai[bot]

This comment was marked as resolved.

@leynos

leynos commented Jul 14, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai the library surface is for testing only

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

@leynos Noted — I'll treat the pub mod/pub use surface in src/lib.rs (adapters, application, domain, ports, and the parse_source/ParseApplicationError/ParseReport re-exports) as internal test-support plumbing rather than a stability-guaranteed public API going forward. I won't flag it for semver/API-stability concerns in future reviews.

(=^・ω・^=) ✧


✏️ Learnings added
Learnt from: leynos
URL: https://github.com/leynos/makeutil/pull/6

Timestamp: 2026-07-14T11:33:05.014Z
Learning: In the makeutil repository, the public library surface exposed by src/lib.rs (the `pub mod adapters;`, `pub mod application;`, `pub mod domain;`, `pub mod ports;` declarations, and the `pub use application::{ParseApplicationError, parse_source};` / `pub use domain::ParseReport;` re-exports) exists solely to support the integration/BDD test suite (e.g. tests/*.rs). It is not a stable, externally-consumed public API, so do not raise semver/API-stability concerns about changes to this surface.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

@leynos

leynos commented Jul 16, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Have the following failed checks now been resolved?

If further work is required, please provide an AI agent prompt for the remaining work to be done to address these failures.

Do not treat warnings as optional or aspirational. Where a change is out of scope for this PR, propose a GitHub issue unless one exists already. (Treat documentation and validation coverage as in scope).

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
User-Facing Documentation ⚠️ Warning README and users-guide cover the CLI, but the public library API (parse_source/ParseReport) is left undocumented and no n+1 migration note exists. Add a library-facing guide/API section for parse_source and ParseReport, and add a minor-version migration note for the CLI/API transition.
Observability ⚠️ Warning src/adapters/cli.rs still writes raw clap errors at lines 132-137; no logging, metrics, or tracing APIs were added, so one failure boundary lacks a stable operation field. Send all clap failures through fatal(operation="cli"), and add bounded trace or metric events at parse/read/report failure boundaries if operators need production diagnosis.

@pandalump

Copy link
Copy Markdown
Collaborator

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

This comment was marked as resolved.

@leynos
leynos force-pushed the adr-0001-single-file-gnu-make-parse branch from 03df0e0 to 381edd4 Compare July 16, 2026 11:00
@pandalump

Copy link
Copy Markdown
Collaborator

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

coderabbitai[bot]

This comment was marked as resolved.

@leynos

leynos commented Jul 16, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai resume

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
✅ Action performed

Reviews resumed.

@pandalump

Copy link
Copy Markdown
Collaborator

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@leynos

leynos commented Jul 24, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Have the following now been resolved?

docs/rstest-bdd-users-guide.md (1)

1409-1410: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Remove the remaining .expect(...) contradiction.
Replace the .expect(...) call at Line 2047 with an explicit match or propagated Result, so the guide does not contradict its statement that .expect(...) and .unwrap() are forbidden outside tests.
Triage: [type:docstyle]

🤖 Detailed instructions

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @docs/rstest-bdd-users-guide.md around lines 1409 - 1410, Remove the
remaining .expect(...) call near the guide’s referenced example and replace it
with explicit match-based handling or propagated Result handling. Keep the
example consistent with the stated clippy policy forbidding .expect(...) and
.unwrap() outside tests, while preserving its existing success and error
behavior.

Source: Coding guidelines

tests/domain_contract.rs (1)

109-128: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win
Cover AssignmentOperator::Define in parser-fidelity tests.
Add a define-block case to assignment_operators_remain_source_faithful and assert both the Define operator and its raw body. The current cases cover token-bearing operators, while Lines 131-145 cover only enum serialisation; a parser regression for define blocks would otherwise pass unnoticed.

🤖 Detailed instructions

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @tests/domain_contract.rs around lines 109 - 128, Add a multiline
define-block case to assignment_operators_remain_source_faithful, using the
define syntax and expected body text, then assert the parsed variable reports
AssignmentOperator::Define and the exact raw body. Keep the existing operator
cases and serialization tests unchanged.

@leynos

leynos commented Jul 24, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Have the following now been resolved?

typos.toml (1)

39-40: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win
Remove the duplicate table declaration.
Keep one [default.extend-words] header. TOML rejects table redefinition, so

make spelling cannot load this configuration.

Proposed fix
[default.extend-words]
-[default.extend-words]
 "ASO" = "ASO"
🤖 Detailed instructions

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @typos.toml around lines 39 - 40, Remove the duplicate [default.extend-words]
table declaration in typos.toml, keeping a single header and preserving its
existing word entries so the TOML configuration loads successfully.

@leynos

leynos commented Jul 24, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Have the following now been resolved?

typos.toml (1)

39-40: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win
Remove the duplicate TOML table header.
[default.extend-words] is declared twice consecutively. TOML rejects table redefinition, so make spelling cannot parse typos.toml. Retain one header.
The duplicate declaration is present in the supplied final file.

Fix the table declaration
[default.extend-ignore-re]
 ...
-[default.extend-words]
 [default.extend-words]
 "ASO" = "ASO"
🤖 Detailed instructions

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @typos.toml around lines 39 - 40, Remove the duplicate consecutive
[default.extend-words] table declaration in typos.toml, retaining a single
header with the existing "ASO" entry.

@coderabbitai

This comment was marked as resolved.

@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== Relevant table headers ==='
rg -n -C 2 '^\[default\.extend-words\]$|^\[default\.extend-ignore-re\]$' typos.toml

echo
echo '=== Header count ==='
header_count="$(rg -n '^\[default\.extend-words\]$' typos.toml | wc -l)"
printf '[default.extend-words] header count: %s\n' "$header_count"
test "$header_count" -eq 1

echo
echo '=== TOML parse ==='
python3 - <<'PY'
import tomllib
with open("typos.toml", "rb") as file:
    document = tomllib.load(file)
print("TOML valid")
print(f'extend-words entries: {len(document["default"]["extend-words"])}')
print(f'ASO entry: {document["default"]["extend-words"]["ASO"]}')
PY

Length of output: 1037


@leynos This finding is resolved.

  • typos.toml has exactly one [default.extend-words] declaration at Line 39.
  • The "ASO" = "ASO" entry remains intact.
  • Python’s standard tomllib parses the file successfully, confirming the spelling configuration is valid TOML.

Keep the current file unchanged; no follow-up work or issue is required.

@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== typos.toml: relevant section ==='
sed -n '30,55p' typos.toml

echo
echo '=== exact [default.extend-words] header occurrences ==='
rg -n '^\[default\.extend-words\]$' typos.toml
printf 'count='
rg -n '^\[default\.extend-words\]$' typos.toml | wc -l

echo
echo '=== current diff ==='
git diff -- typos.toml

echo
echo '=== all TOML table headers ==='
rg -n '^\[[^]]+\]$' typos.toml

Length of output: 1460


@leynos Treat this finding as resolved.

typos.toml contains exactly one [default.extend-words] header, at Line 39. The existing "ASO" = "ASO" entry and subsequent word mappings remain under that sole table. The file has no uncommitted diff, and its only table headers are [files], [default], and [default.extend-words].

No further change or follow-up issue is required.

@leynos

leynos commented Jul 24, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Have the following failed checks now been resolved?

If further work is required, please provide an AI agent prompt for the remaining work to be done to address these failures.

Do not treat warnings as optional or aspirational. Where a change is out of scope for this PR, propose a GitHub issue unless one exists already. (Treat documentation and validation coverage as in scope).

❌ Failed checks (2 errors, 1 warning)

Check name Status Explanation Resolution
Testing (Overall) ❌ Error The source-read failure test never checks stdout, and recovered-parse tests only assert non-empty diagnostics, so plausible bad implementations would still pass. Assert stdout is empty on source-read failures, and add a regression that exercises both positioned and unpositioned diagnostics so loss is caught.
Security And Privacy ❌ Error docs/ortho-config-users-guide.md still ships maintainer-specific repo URLs, and docs/execplans/adr-0001-single-file-gnu-make-parse.md keeps internal team/provenance names. Replace the named repo examples with neutral placeholders and anonymise internal team/provenance markers in the ExecPlan and related docs.
Performance And Resource Use ⚠️ Warning collect_diagnostics() calls line_span() per error, and line_span() rescans the source from the start each time, giving avoidable O(errors × source_len) work. Reuse cached line starts or LocationIndex for unpositioned diagnostics, and add a benchmark or large-malformed-file test to prove the bound.

@coderabbitai

This comment was marked as resolved.

Replace the contradictory `expect` call with explicit success and failure
arms so the example follows the documented pedantic lint policy.
@leynos

leynos commented Jul 25, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Have the following now been resolved?

typos.toml (1)

39-40: 🎯 Functional Correctness | 🔴 Critical
Remove the duplicate TOML table header.
Keep a single [default.extend-words] declaration. The consecutive duplicate headers make typos.toml invalid and cause make spelling to fail before scanning documentation.
This repeats the unresolved previous finding.

Proposed fix
[default.extend-ignore-re]
 ...
-[default.extend-words]
 [default.extend-words]
 "ASO" = "ASO"
🤖 Detailed instructions

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @typos.toml around lines 39 - 40, Remove the duplicate consecutive
[default.extend-words] table header in typos.toml, retaining the single
declaration that contains the "ASO" entry so the TOML remains valid.

docs/rstest-bdd-users-guide.md (1)

1043-1053: 🔒 Security & Privacy | 🟠 Major
Stop emitting raw GPUI scenario provenance.
The section explicitly documents placing feature_path, scenario_name, and scenario_line in panic text, tracing fields, and stderr. Redact or gate full metadata behind protected debug mode, emit a stable scenario identifier by default, and update this guidance to describe the protected behaviour.
This repeats the unresolved previous finding. As per coding guidelines, do not expose operational data through logs, traces, errors, or documentation without intentional protection.

🤖 Detailed instructions

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @docs/rstest-bdd-users-guide.md around lines 1043 - 1053, Update the “GPUI
panic diagnostics carry scenario context” section to remove guidance that
exposes raw feature_path, scenario_name, or scenario_line through panic
messages, tracing fields, or stderr. Document protected debug-mode gating for
full provenance and specify a stable, non-sensitive scenario identifier as the
default output.

Source: Coding guidelines

.gitattributes (1)

1-2: 🎯 Functional Correctness | 🟡 Minor
Pin LF endings for the exact-byte fixture.
-diff only suppresses textual diffs; Git can still normalize line endings. Add text eol=lf or -text so include_str! assertions retain the intended trailing whitespace.
This repeats the unresolved previous finding.

Proposed fix
- tests/fixtures/makefiles/multiline-define.mk -diff
+tests/fixtures/makefiles/multiline-define.mk text eol=lf -diff
🤖 Detailed instructions

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.gitattributes around lines 1 - 2, Update the .gitattributes rule for
tests/fixtures/makefiles/multiline-define.mk to explicitly enforce LF line
endings while retaining -diff, using the existing fixture path and attributes so
exact-byte include_str! assertions preserve trailing whitespace.

tests/domain_contract.rs (1)

145-151: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Still returns Result with an assert_eq! inside — Clippy panic_in_result_fn remains unfixed.
This is the one function in the file not yet updated to match the pattern used elsewhere (e.g. condition_kinds_use_the_closed_domain_type, which already uses .expect(...) instead of ?). Drop the Result return, serialise with .expect(...), and remove Ok(()).

🐛 Proposed fix
fn assignment_operators_match_schema_values(
     #[case] operator: AssignmentOperator,
     #[case] expected_json: &str,
-) -> Result<(), serde_json::Error> {
-    assert_eq!(serde_json::to_string(&operator)?, expected_json);
-    Ok(())
+) {
+    assert_eq!(
+        serde_json::to_string(&operator).expect("assignment operator should serialise"),
+        expected_json
+    );
 }
🤖 Detailed instructions

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @tests/domain_contract.rs around lines 145 - 151, Update
assignment_operators_match_schema_values to return unit instead of Result,
replace the serde_json::to_string ? propagation with expect(...), and remove
Ok(()) so the assertion no longer occurs inside a Result-returning test.

Source: Coding guidelines

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== Focused current diff ==='
git diff -- typos.toml docs/rstest-bdd-users-guide.md .gitattributes tests/domain_contract.rs

echo
echo '=== typos.toml table declarations and TOML parse ==='
rg -n -C 2 '^\[default\.extend-words\]$|^\[default\.extend-ignore-re\]$' typos.toml
python3 - <<'PY'
import tomllib
with open("typos.toml", "rb") as handle:
    doc = tomllib.load(handle)
entries = doc.get("default", {}).get("extend-words", {})
print("TOML valid")
print(f"extend-words header entries: {len(entries)}")
print(f'ASO: {entries.get("ASO")!r}')
PY

echo
echo '=== GPUI diagnostic documentation: target section and all related references ==='
sed -n '1015,1085p' docs/rstest-bdd-users-guide.md
rg -n -i -C 4 \
  -e 'feature_path|scenario_name|scenario_line' \
  -e 'panic diagnostics|panic text|stderr|tracing fields|scenario identifier' \
  docs/rstest-bdd-users-guide.md

echo
echo '=== Exact-byte fixture attributes and usage ==='
cat -n .gitattributes
rg -n -C 4 'multiline-define\.mk|include_str!|include_bytes!|trailing whitespace' \
  tests src .gitattributes

echo
echo '=== Assignment-operator serialization test ==='
ast-grep outline tests/domain_contract.rs --items all --view expanded
rg -n -A45 -B10 'fn assignment_operators_match_schema_values|fn condition_kinds_use_the_closed_domain_type' \
  tests/domain_contract.rs

echo
echo '=== Targeted Clippy-risk search in the test file ==='
rg -n -C 3 '->\s*Result<.*>|assert_(eq|ne)!\s*\(|\?\s*;' tests/domain_contract.rs

Length of output: 20761


@leynos All four findings are resolved.

Finding Status Evidence
Duplicate TOML table header ✅ Resolved typos.toml has one [default.extend-words] declaration at Line 39. Python tomllib parses the file successfully, and the "ASO" = "ASO" entry remains present.
Raw GPUI scenario provenance ✅ Resolved docs/rstest-bdd-users-guide.md Lines 1043-1056 now require a stable, non-sensitive scenario identifier by default. They explicitly prohibit feature paths, scenario names, and feature-file line numbers in panic messages, tracing fields, and stderr unless protected debug mode is enabled with equivalent access controls.
LF preservation for the exact-byte fixture ✅ Resolved .gitattributes Line 2 now declares tests/fixtures/makefiles/multiline-define.mk text eol=lf -diff, preserving both LF checkout behaviour and diff suppression.
panic_in_result_fn in assignment-operator serialization test ✅ Resolved tests/domain_contract.rs Lines 152-159 now returns unit, serializes with .expect("assignment operator should serialise"), and asserts the result directly. The test no longer returns Result or uses ? around an assertion.

Keep the current changes. No follow-up work or issue is required.

Replace host-specific validation history with checked-in contract evidence while preserving the parser, recovery, security, bounded-input, and schema requirements. Add a documentation-gate search that prevents the prohibited provenance markers from returning.
@buzzybee-df12

Copy link
Copy Markdown

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/rstest-bdd-users-guide.md`:
- Line 1066: Replace the placeholder owner/rstest-bdd URL at
docs/rstest-bdd-users-guide.md:1066 with a valid canonical or local ADR-007
reference, and update every placeholder footer target at
docs/rstest-bdd-users-guide.md:2784-2790 to valid canonical or local links for
the documented resources.

In `@Makefile`:
- Around line 79-84: Update both git grep checks in the Makefile provenance gate
to distinguish the expected no-match status 1 from fatal errors: retain the
failure behavior when matches are found, allow only status 1 to pass, and
propagate any other exit status such as 128. Apply this handling to both the
broad provenance-pattern grep and the leynos/ grep.

In `@scripts/generate_typos_config.py`:
- Around line 42-45: The public interfaces need complete NumPy-style docstrings.
In scripts/generate_typos_config.py lines 42-45, expand main’s docstring to
describe source, repository, output, offline behavior, return value, and
exceptions; in scripts/generate_typos_config.py lines 21-22, document
dictionary_from_cache’s repository input, returned dictionary, and loading
failures; in scripts/typos_rollout.py line 47, document RefreshResult attributes
and status semantics; and in scripts/typos_rollout.py lines 107-112, document
dictionary loading and overlay-conflict behavior.

In `@src/adapters/makefile_tests.rs`:
- Around line 92-107: The large-source diagnostic test in
src/adapters/makefile_tests.rs lines 92-107 should assert the upstream
diagnostic order and exact source spans for both positioned and fallback
diagnostics, not only presence and count; update
all_upstream_diagnostic_channels_are_retained_for_large_sources while preserving
collect_diagnostics behavior. In tests/corpus.rs lines 14-50, add an assertion
that recovered parsing produces at least one positioned diagnostic.

In `@tests/domain_contract.rs`:
- Around line 161-178: Extend
parser_version_matches_manifest_pin_and_schema_constant to read Cargo.lock and
assert the resolved makefile-lossless package uses the expected patched git
source and revision. Keep the existing Cargo.toml version-pin and schema
constant assertions, and derive the expected revision from the repository’s
established patch configuration rather than hardcoding an unrelated value.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: c33ebcfd-09e8-4ebf-bea4-8b4b7485fe60

📥 Commits

Reviewing files that changed from the base of the PR and between c5c0b7e and a2f6c44.

⛔ Files ignored due to path filters (1)
  • tests/snapshots/report_schema__recovered_output_has_stable_json.snap is excluded by !**/*.snap
📒 Files selected for processing (22)
  • .gitattributes
  • Makefile
  • README.md
  • data/typos-oxendict-base.toml
  • docs/adrs/0001-single-file-gnu-make-parse.md
  • docs/design.md
  • docs/developers-guide.md
  • docs/execplans/adr-0001-single-file-gnu-make-parse.md
  • docs/ortho-config-users-guide.md
  • docs/repository-layout.md
  • docs/rstest-bdd-users-guide.md
  • docs/terms-of-reference.md
  • scripts/generate_typos_config.py
  • scripts/typos_rollout.py
  • src/adapters/cli.rs
  • src/adapters/makefile.rs
  • src/adapters/makefile_tests.rs
  • src/adapters/source.rs
  • tests/corpus.rs
  • tests/domain_contract.rs
  • tests/output_failures.rs
  • tests/source_adapter.rs
💤 Files with no reviewable changes (1)
  • README.md

Comment thread docs/rstest-bdd-users-guide.md Outdated
Comment thread Makefile Outdated
Comment thread scripts/generate_typos_config.py Outdated
Comment thread src/adapters/makefile_tests.rs
Comment thread tests/domain_contract.rs
Preserve fatal `git grep` failures in the provenance gate. Replace
imported guide placeholders with canonical references and document the
public typos configuration interfaces.

Pin diagnostic ordering and source spans across both upstream error
channels. Retain positioned recovery evidence and verify the parser
patch source in `Cargo.lock` from the manifest configuration.
@pandalump

Copy link
Copy Markdown
Collaborator

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/rstest-bdd-users-guide.md (1)

1088-1100: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Keep each comparison row on one physical line.

Reformat this table without wrapped cells. GitHub-flavoured Markdown treats the
continuation lines as separate rows, so the vendored and published API mappings
are misaligned.

Triage: [type:syntax/md]

As per coding guidelines, do not wrap tables; as per path instructions, use
standard GitHub-flavoured Markdown table syntax.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/rstest-bdd-users-guide.md` around lines 1088 - 1100, Reformat the
comparison table in the documentation so each complete row, including all cell
contents, appears on one physical line. Preserve the existing vendored and
published API mappings and standard GitHub-flavoured Markdown table syntax,
including the header and separator rows.

Sources: Coding guidelines, Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/execplans/adr-0001-single-file-gnu-make-parse.md`:
- Around line 720-721: Update the validation instructions in the documented
workflow to replace the undeclared mbake validate Makefile command with the
appropriate declared make target exposed by the Makefile. Keep the existing make
fmt, make markdownlint, and make nixie commands unchanged, and ensure Makefile
changes still trigger the repository’s reproducible Makefile validation
entrypoint.

In `@docs/ortho-config-users-guide.md`:
- Line 4: Replace every placeholder owner/ortho-config GitHub URL in
docs/ortho-config-users-guide.md, including the references near the
introduction, line 58, line 927, and line 1028, with the canonical upstream
OrthoConfig repository links while preserving standard GitHub-flavored Markdown
link syntax.

In `@docs/repository-layout.md`:
- Around line 24-25: Update the canonical repository tree in repository-layout
documentation to include the top-level scripts/ directory, and add a concise
ownership description covering scripts/generate_typos_config.py and
scripts/typos_rollout.py as the spelling-workflow tooling. Preserve the existing
layout and documentation style while making the scripts/ responsibility
explicit.

In `@src/adapters/makefile.rs`:
- Around line 295-309: The line_spans construction currently stores a SourceSpan
for every physical line, allowing newline-heavy input to exceed bounded-memory
requirements. Update the line-span logic around parsed.errors() to retain spans
only for line numbers referenced by the diagnostics, or scan once with a cursor
that resolves those requested lines without collecting all lines; ensure
accumulated storage is explicitly bounded by the referenced diagnostics and
preserve existing span calculation behavior.

---

Outside diff comments:
In `@docs/rstest-bdd-users-guide.md`:
- Around line 1088-1100: Reformat the comparison table in the documentation so
each complete row, including all cell contents, appears on one physical line.
Preserve the existing vendored and published API mappings and standard
GitHub-flavoured Markdown table syntax, including the header and separator rows.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 4e4b7d51-6cd2-4cb0-812f-a84667161bd9

📥 Commits

Reviewing files that changed from the base of the PR and between c5c0b7e and a9a2465.

⛔ Files ignored due to path filters (1)
  • tests/snapshots/report_schema__recovered_output_has_stable_json.snap is excluded by !**/*.snap
📒 Files selected for processing (22)
  • .gitattributes
  • Makefile
  • README.md
  • data/typos-oxendict-base.toml
  • docs/adrs/0001-single-file-gnu-make-parse.md
  • docs/design.md
  • docs/developers-guide.md
  • docs/execplans/adr-0001-single-file-gnu-make-parse.md
  • docs/ortho-config-users-guide.md
  • docs/repository-layout.md
  • docs/rstest-bdd-users-guide.md
  • docs/terms-of-reference.md
  • scripts/generate_typos_config.py
  • scripts/typos_rollout.py
  • src/adapters/cli.rs
  • src/adapters/makefile.rs
  • src/adapters/makefile_tests.rs
  • src/adapters/source.rs
  • tests/corpus.rs
  • tests/domain_contract.rs
  • tests/output_failures.rs
  • tests/source_adapter.rs
💤 Files with no reviewable changes (1)
  • README.md

Comment thread docs/execplans/adr-0001-single-file-gnu-make-parse.md Outdated
Comment thread docs/ortho-config-users-guide.md Outdated
Comment thread docs/repository-layout.md
Comment thread src/adapters/makefile.rs Outdated
@leynos

leynos commented Jul 29, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai please create a new GitHub issue for the following against leynos/agent-template-rust:

Replace the undeclared mbake validation command.

Use a declared make target, or document and provision mbake; the supplied
Makefile exposes the repository validation entrypoints and contains no
mbake target or installation path.

Triage: [type:docstyle]

As per coding guidelines, documentation validation must use reproducible project
commands; the repository layout identifies Makefile as the public validation
entrypoint.

@leynos

leynos commented Jul 29, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai please create a new GitHub issue for the following against leynos/agent-template-python:

Replace the undeclared mbake validation command.

Use a declared make target, or document and provision mbake; the supplied
Makefile exposes the repository validation entrypoints and contains no
mbake target or installation path.

Triage: [type:docstyle]

As per coding guidelines, documentation validation must use reproducible project
commands; the repository layout identifies Makefile as the public validation
entrypoint.

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

source_repo="leynos/makeutil"
source_pr="6"
target_repo="leynos/agent-template-rust"

comment_url="$(
  gh api "repos/${source_repo}/issues/${source_pr}/comments" --paginate \
    --jq '.[] | select(.body | contains("Replace the undeclared `mbake` validation command.")) | .html_url' \
  | tail -n 1
)"

if [ -z "$comment_url" ]; then
  echo "Could not locate the originating PR comment URL." >&2
  exit 1
fi

body_file="$(mktemp)"
trap 'rm -f "$body_file"' EXIT

cat >"$body_file" <<EOF
## Summary

Replace the undeclared \`mbake\` validation command in repository documentation or validation guidance.

## Rationale

Documentation validation must use reproducible, project-provisioned commands. The repository layout identifies \`Makefile\` as the public validation entrypoint, but the supplied \`Makefile\` exposes no \`mbake\` target or installation/provisioning path.

## Required changes

- Replace \`mbake\` invocations with an appropriate declared \`make\` target; **or**
- Document and provision \`mbake\` as a supported project command, including its installation path and expected validation entrypoint.
- Keep validation guidance reproducible from a clean contributor environment.
- Update related documentation and validation coverage as needed.

## Affected areas

- Documentation or scripts that invoke \`mbake\`
- \`Makefile\` validation entrypoints and any associated contributor guidance

## Acceptance criteria

- No documentation validation workflow invokes an undeclared or unprovisioned \`mbake\` command.
- The documented command is available through a declared \`make\` target, or \`mbake\` is explicitly documented and provisioned.
- Repository validation instructions remain reproducible using the documented project entrypoints.

## Triage

\`[type:docstyle]\`

Requested by `@leynos`.

Backlinks:
- Originating PR: https://github.com/leynos/makeutil/pull/6
- Originating comment: ${comment_url}
EOF

issue_url="$(
  gh issue create \
    --repo "$target_repo" \
    --title "Replace the undeclared \`mbake\` validation command" \
    --body-file "$body_file" \
    --assignee "leynos"
)"

printf '%s\n' "$issue_url"

Length of output: 2367


@leynos Created and assigned the follow-up issue: #75. It includes the PR and originating-comment backlinks, reproducibility rationale, and acceptance criteria.

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="leynos/agent-template-python"
title="Replace the undeclared mbake validation command"
body="$(cat <<'EOF'
## Summary

Replace the undeclared `mbake` validation command referenced by repository documentation or validation guidance.

## Rationale

The repository `Makefile` is the public validation entrypoint and exposes the supported project commands. It does not declare an `mbake` target or provide an installation/provisioning path for an `mbake` executable. Documentation validation must use reproducible project commands.

## Required changes

- Replace `mbake` with an appropriate declared `make` target; **or**
- Document and provision `mbake`, including a reproducible installation path and its relationship to the repository validation workflow.
- Keep documentation and validation instructions aligned with the repository's public `Makefile` entrypoints.
- Update validation coverage or documentation checks where needed to prevent references to undeclared validation commands.

## Acceptance criteria

- Every documented validation command is either a declared `Makefile` target or has explicit, reproducible provisioning documentation.
- No unsupported `mbake` invocation remains unless `mbake` is documented and provisioned by the project.
- Documentation validation uses reproducible project commands.

## Triage

`[type:docstyle]`

## Backlinks

- Requester: `@leynos`
- Raised during review of [leynos/makeutil#6](https://github.com/leynos/makeutil/pull/6).
- Source request: https://github.com/leynos/makeutil/pull/6#issuecomment-0
EOF
)"

issue_url="$(gh issue create \
  --repo "$repo" \
  --title "$title" \
  --body "$body" \
  --assignee leynos)"

printf '%s\n' "$issue_url"

Length of output: 1928


🏁 Script executed:

#!/bin/bash
set -euo pipefail

pr_repo="leynos/makeutil"
target_repo="leynos/agent-template-python"
issue_number="46"

comment_url="$(
  gh api "repos/${pr_repo}/issues/6/comments?per_page=100" --paginate \
    --jq '.[] | select(.user.login == "leynos" and (.body | contains("against `leynos/agent-template-python`")) and (.body | contains("undeclared `mbake`"))) | .html_url' \
  | tail -n 1
)"

if [ -z "$comment_url" ]; then
  echo "Could not locate the exact source comment permalink; leaving the issue unchanged." >&2
  exit 1
fi

body="$(cat <<EOF
## Summary

Replace the undeclared \`mbake\` validation command referenced by repository documentation or validation guidance.

## Rationale

The repository \`Makefile\` is the public validation entrypoint and exposes the supported project commands. It does not declare an \`mbake\` target or provide an installation/provisioning path for an \`mbake\` executable. Documentation validation must use reproducible project commands.

## Required changes

- Replace \`mbake\` with an appropriate declared \`make\` target; **or**
- Document and provision \`mbake\`, including a reproducible installation path and its relationship to the repository validation workflow.
- Keep documentation and validation instructions aligned with the repository's public \`Makefile\` entrypoints.
- Update validation coverage or documentation checks where needed to prevent references to undeclared validation commands.

## Acceptance criteria

- Every documented validation command is either a declared \`Makefile\` target or has explicit, reproducible provisioning documentation.
- No unsupported \`mbake\` invocation remains unless \`mbake\` is documented and provisioned by the project.
- Documentation validation uses reproducible project commands.

## Triage

\`[type:docstyle]\`

## Backlinks

- Requester: `@leynos`
- Raised during review of [leynos/makeutil#6](https://github.com/leynos/makeutil/pull/6).
- [Source request](${comment_url})
EOF
)"

gh issue edit "$issue_number" --repo "$target_repo" --body "$body"
printf 'Updated https://github.com/%s/issues/%s\n' "$target_repo" "$issue_number"

Length of output: 2399


@leynos Created and assigned leynos/agent-template-python#46.

The issue includes the required remediation, rationale, acceptance criteria, [type:docstyle] triage, and verified backlinks to the PR and source request.

Resolve only source lines referenced by fallback diagnostics so newline-heavy
input cannot allocate one span per physical line. Preserve diagnostic order,
span calculation, and end-of-source fallback behaviour.

Expose reproducible Makefile validation through make, correct the imported
upstream links and repository layout, and restore single-line table rows in
the vendored guide.
@leynos

leynos commented Jul 29, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Have the following now been resolved?

docs/rstest-bdd-users-guide.md (1)

1088-1100: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Keep each comparison row on one physical line.
Reformat this table without wrapped cells. GitHub-flavoured Markdown treats the

continuation lines as separate rows, so the vendored and published API mappings

are misaligned.
Triage: [type:syntax/md]
As per coding guidelines, do not wrap tables; as per path instructions, use

standard GitHub-flavoured Markdown table syntax.

🤖 Detailed instructions

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @docs/rstest-bdd-users-guide.md around lines 1088 - 1100, Reformat the
comparison table in the documentation so each complete row, including all cell
contents, appears on one physical line. Preserve the existing vendored and
published API mappings and standard GitHub-flavoured Markdown table syntax,
including the header and separator rows.

Sources: Coding guidelines, Path instructions

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== Target table region ==='
sed -n '1078,1110p' docs/rstest-bdd-users-guide.md

echo
echo '=== Numbered target table region ==='
nl -ba docs/rstest-bdd-users-guide.md | sed -n '1080,1105p'

echo
echo '=== Markdown table-row shape check ==='
python3 - <<'PY'
from pathlib import Path

path = Path("docs/rstest-bdd-users-guide.md")
lines = path.read_text(encoding="utf-8").splitlines()
start, end = 1080, 1105

for number in range(start, end + 1):
    line = lines[number - 1]
    if line.strip():
        print(f"{number}: pipes={line.count('|')} starts_pipe={line.startswith('|')} {line}")
PY

Length of output: 3021


@leynos This finding is resolved.

Keep the current table unchanged. In docs/rstest-bdd-users-guide.md, the header, separator, and all four comparison rows are each on one physical line using standard GitHub-flavoured Markdown table syntax. The vendored and published gpui API mappings remain intact and aligned.

The line-number utility was unavailable in the sandbox, but direct inspection of the target section confirmed there are no wrapped cells or continuation rows.

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants