Align v0.1.0 documentation and test every example - #427
Conversation
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
Summary
Validation passed for 1,150 tests, formatting, type checking, linting, Markdown and Nixie validation, and whitespace checks. WalkthroughNetsuke’s v0.1.0 workflow now uses Changesv0.1.0 CLI and build workflow
Possibly related issues
Possibly related PRs
Suggested labels: Suggested reviewers: Poem
Caution Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional.
❌ Failed checks (3 errors, 1 inconclusive)
✅ Passed checks (16 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
|
@coderabbitai review |
✅ Action performedReview finished.
|
f121d24 to
764e869
Compare
|
@coderabbitai resume |
✅ Action performedReviews resumed. |
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response. Ensure that this is validated against the current version of the codegraph. If further refinement to address this finding would be deleterious, please supply a clear explanatory one to two paragraph markdown message I can paste into the CodeScene web ui's diagnostic suppression function so this diagnostic can be silenced. Comment on lines +49 to +52 fn generate_streams_to_stdout_by_default() -> Result<()> {
let temp = setup_simple_workspace("generate stdout test")?;
let output = create_netsuke_command(temp.path())
.arg("generate")❌ New issue: Code Duplication |
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response. Ensure that this is validated against the current version of the codegraph. If further refinement to address this finding would be deleterious, please supply a clear explanatory one to two paragraph markdown message I can paste into the CodeScene web ui's diagnostic suppression function so this diagnostic can be silenced. tests/bdd/steps/accessibility_preferences.rs Comment on file fn simulated_env(world: &TestWorld) -> impl Fn(&str) -> Option<String> + '_ {
move |key| match key {
"NO_COLOR" => world.simulated_no_color.get(),
"NETSUKE_NO_EMOJI" => world.simulated_no_emoji.get(),❌ New issue: Code Duplication |
Extract a shared `assert_captured_stream_is_empty` helper from the `stdout should be empty` and `stderr should be empty` step definitions. The helper takes the stream name and the captured `Option<&String>`, fails with `<stream> should be captured` when nothing was recorded, and preserves the `expected <stream> to be empty, got:\n<output>` diagnostic. Both `#[then]` bindings are retained so the feature files keep specifying distinct stdout and stderr contracts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Extract a Unix-only `assert_json_ninja_subcommand_success` helper that runs `netsuke --json <command>` with `NINJA_ENV` pointed at a fake Ninja, asserts the success envelope via the existing `parse_success_result`, and checks `/result/content` is null. `json_success_build_keeps_stdout_result_and_stderr_empty` and `json_success_clean_invokes_clean_tool_with_empty_stderr` remain as focused wrappers, each retaining its distinct fake-Ninja fixture (valid build-file input for build, `ninja -t clean` dispatch for clean) so the two contracts stay separately proven. No production code, schema assertions, or unrelated tests change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response. Ensure that this is validated against the current version of the codegraph. If further refinement to address this finding would be deleterious, please supply a clear explanatory one to two paragraph markdown message I can paste into the CodeScene web ui's diagnostic suppression function so this diagnostic can be silenced. Comment on file //! JSON diagnostic, result-envelope, and standard stderr integration tests.
❌ New issue: String Heavy Function Arguments |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '== Current PR head =='
git rev-parse --short HEAD
printf '%s\n' '== JSON logging module outline =='
ast-grep outline tests/logging_stderr/json.rs --items all --view expanded
printf '%s\n' '== Function signatures, string parameters, and call contexts =='
rg -n -A45 -B10 --type rust \
'^\s*(?:#\[[^]]+\]\s*)*(?:pub\(super\)\s+)?fn\s+\w+\s*\([^)]*(?:&str|String|OsStr|OsString)[^)]*\)|\b(parse_success_result|assert_json_ninja_subcommand_success)\s*\(' \
tests/logging_stderr/json.rs || true
printf '%s\n' '== Full target source with line numbers =='
cat -n tests/logging_stderr/json.rs
printf '%s\n' '== Existing CodeScene suppressions/configuration =='
fd -HI -t f -E .git . | rg -n '(codescene|code.?health|suppress|\.codescene)' || true
rg -n -i -C3 'codescene|String Heavy Function Arguments|string-heavy' \
.github docs .codescene.yml coderabbit.yaml 2>/dev/null || trueLength of output: 29312
Suppress this CodeScene diagnostic. The current codegraph at PR head Do not introduce test-only newtypes, enums, or wrapper structs merely to lower this metric. Such a refactor would relocate fixed literals without strengthening type safety or reducing behavioural duplication, while making the concise parameterized Clap pass-through cases harder to read. The repository guidance on typed wrappers targets ambiguous BDD step parameters; these integration-test arguments are unambiguous and deliberately map to command-line and JSON string interfaces. |
|
@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 (1 error, 2 warnings)
|
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '== Current PR head =='
git rev-parse --short HEAD
printf '%s\n' '== Roadmap task 3.15.4 =='
rg -n -A45 -B8 '3\.15\.4|color|emoji|progress|accessibility|OrthoConfig' docs/roadmap.md || true
printf '%s\n' '== Configuration-discovery step outline =='
ast-grep outline tests/bdd/steps/configuration_discovery.rs --items all --type function --view expanded
printf '%s\n' '== write_config_file implementation and filesystem APIs =='
rg -n -A55 -B15 --type rust \
'^\s*use\s+(std::fs|std::path|cap_std)|^\s*fn\s+write_config_file\b|\b(fs::write|Dir::open_ambient_dir|\.write\(|std::fs)' \
tests/bdd/steps/configuration_discovery.rs || true
printf '%s\n' '== Scenario headings in both feature files =='
awk '/^Scenario:/ { print FILENAME ":" FNR ":" $0 }' \
tests/features/json_diagnostics.feature tests/features/advanced_usage.feature
printf '%s\n' '== JSON-generate scenario bodies and result assertions =='
rg -n -A16 -B5 \
'(--json[[:space:]]+generate|generate[[:space:]]+--json|one generate result json document|JSON diagnostics with generate)' \
tests/features/json_diagnostics.feature tests/features/advanced_usage.feature || trueLength of output: 31023
|
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '== Current PR head =='
git rev-parse --short HEAD
printf '%s\n' '== Target function outlines =='
ast-grep outline tests/assert_cmd_tests.rs --items all --type function --match 'generate_writes_file' --view expanded
ast-grep outline tests/bdd/steps/json_diagnostics.rs --items all --type function --match 'parse_single_result_document' --view expanded
printf '%s\n' '== generate_writes_file and predicate imports =='
rg -n -A50 -B15 --type rust \
'^\s*fn\s+generate_writes_file\b|^\s*use\s+predicates|predicate::str::is_empty|\.stdout\s*\(' \
tests/assert_cmd_tests.rs || true
printf '%s\n' '== parse_single_result_document =='
rg -n -A90 -B15 --type rust \
'^\s*fn\s+parse_single_result_document\b|result JSON should contain only|object-valued result|schema_version' \
tests/bdd/steps/json_diagnostics.rs || true
printf '%s\n' '== JSON design-contract wording =='
rg -n -A16 -B12 \
'(exactly one|one versioned|one JSON|--json --help|--json --version|Clap|envelope-producing|result/diagnostic|NETSUKE_JSON)' \
docs/netsuke-cli-design-document.md || true
printf '%s\n' '== Executable coverage of JSON help/version behaviour =='
rg -n -A16 -B8 --type rust \
'(--json.*(--help|--version)|(--help|--version).*--json|normal Clap|Clap output)' \
tests/logging_stderr tests 2>/dev/null || trueLength of output: 35866
|
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '== Current PR head =='
git rev-parse --short HEAD
printf '%s\n' '== build.rs symbol-audit structure =='
ast-grep outline build.rs --items all --view expanded
rg -n -A100 -B15 --type rust \
'verify_public_api_symbols|const\s+_\s*:\s*fn|size_of|symbol.audit|public.api' \
build.rs
printf '%s\n' '== Current production references for audited CLI APIs =='
rg -n -C3 --type rust \
'\b(resolve_merged_json|json_hint_from_args|AccessibilityPolicy|EmojiPolicy|ProgressPolicy|theme_preference|accessibility_override)\b' \
src tests build.rs || true
printf '%s\n' '== Legacy CLI/doc-contract references =='
rg -n -i -C3 \
'(--file\b|\bmanifest\b|--diag-json\b|progress\s*:\s*Option\s*<\s*bool\s*>)' \
docs/netsuke-design.md docs/netsuke-cli-design-document.md || true
printf '%s\n' '== Current JSON/help/version contract wording =='
rg -n -i -C3 \
'(--json\b|envelope|Clap|--help|--version|NETSUKE_JSON|generate\b|progress)' \
docs/netsuke-design.md docs/netsuke-cli-design-document.md || true
printf '%s\n' '== Process streaming structure and wait/join paths =='
ast-grep outline src/runner/process/mod.rs --items all --type function --match 'spawn_and_stream_output|run_ninja_internal' --view expanded
rg -n -A180 -B30 --type rust \
'^\s*fn\s+spawn_and_stream_output\b|child\.wait\(|\.join\(\)|JoinHandle|stderr_thread|spawn\(' \
src/runner/process/mod.rs
printf '%s\n' '== Process streaming tests and test seams =='
rg -n -A30 -B15 --type rust \
'(spawn_and_stream_output|run_command_and_stream|child\.wait|wait.*fail|JoinHandle|stderr.*join|stream.*output)' \
src tests || trueLength of output: 2747 🏁 Script executed: #!/bin/bash
set -u
printf '%s\n' '== build.rs: symbol audit and anchors =='
rg -n -A140 -B12 \
'verify_public_api_symbols|const[[:space:]]+_[[:space:]]*:[[:space:]]*fn|size_of|audit' \
build.rs || true
printf '%s\n' '== build.rs complete lower section (for anchor context) =='
nl -ba build.rs | sed -n '1,280p' || true
printf '%s\n' '== Legacy terms in both design documents =='
rg -n -i -C2 \
-- '--file|--diag-json|progress[[:space:]]*:[[:space:]]*Option[[:space:]]*<[[:space:]]*bool[[:space:]]*>|\bmanifest\b' \
docs/netsuke-design.md docs/netsuke-cli-design-document.md || true
printf '%s\n' '== Process module: streaming implementation =='
rg -n -A210 -B25 --type rust \
'fn[[:space:]]+spawn_and_stream_output|child\.wait\(|stderr_thread|\.join\(' \
src/runner/process/mod.rs || true
printf '%s\n' '== Tests covering stream/wait cleanup =='
rg -n -A25 -B10 --type rust \
'spawn_and_stream_output|child\.wait|wait.*(error|fail)|stderr_thread|join.*thread|stream.*output' \
src tests || trueLength of output: 129499
Address this in the PR; documentation and validation coverage are in scope, so no follow-up issue is required. AI coding-agent prompt: |
|
@coderabbitai are these features actually implemented?
|
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '== Current PR head =='
git rev-parse --short HEAD
printf '%s\n' '== CLI parser outline =='
ast-grep outline src/cli/parser.rs --items all --view expanded
printf '%s\n' '== Active CLI definitions and legacy identifiers =='
rg -n -A18 -B8 --type rust \
'pub struct Cli|pub enum Commands|pub struct BuildArgs|Cli\.file|Commands::Manifest|BuildArgs\s*\{[^}]*emit|emit:|file:|Generate|Manifest|--emit|--file' \
src/cli src/runner tests/cli_tests tests/assert_cmd_tests.rs || true
printf '%s\n' '== Clap-facing argument annotations and command dispatch =='
rg -n -A14 -B6 --type rust \
'#\[arg\(|#\[command\(|Commands::(Generate|Manifest)|BuildArgs' \
src/cli/parser.rs src/cli/merge.rs src/runner || true
printf '%s\n' '== Current CLI parsing acceptance/rejection coverage =='
rg -n -A12 -B6 --type rust \
'(generate|manifest|--emit|--file|-f\b|UnknownArgument)' \
tests/cli_tests/parsing.rs tests/features/cli.feature || true
printf '%s\n' '== Named design-document legacy occurrences =='
rg -n -i -C3 -- \
'--file\b|-f\b|--emit\b|--diag-json\b|progress[[:space:]]*:[[:space:]]*Option[[:space:]]*<[[:space:]]*bool[[:space:]]*>|Commands::Manifest|Cli\.file|BuildArgs\.emit|build[[:space:]]+\[--emit' \
docs/netsuke-design.md docs/netsuke-cli-design-document.md || trueLength of output: 104532
At current PR head
Therefore, retain documentation for the live root-level manifest selector: Do not remove
🐇🔎 ✏️ Learnings added
|
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/runner/process/mod.rs (1)
222-222: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winUpdate the stale diagnostics-only terminology.
request.cli.jsonnow selects unified JSON mode, but the nearby forwarding comment still describes “JSON diagnostics mode”. Rename that wording to “JSON mode” so the suppression contract matches the value passed here.🤖 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 `@src/runner/process/mod.rs` at line 222, Update the nearby forwarding comment associated with request.cli.json to say “JSON mode” instead of “JSON diagnostics mode,” preserving the existing suppression contract and code behavior.
🤖 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 `@build.rs`:
- Around line 11-14: Replace std::fs and std::path usage in build.rs with
capability-scoped I/O: add cap-std and camino under [build-dependencies], and
use cap_std::fs_utf8::Dir with camino::Utf8PathBuf to stage the man page. In
tests/assert_cmd_tests.rs, replace std::fs::read_to_string with reads through a
capability-scoped handle, preserving the existing generated-file assertions.
In `@docs/netsuke-design.md`:
- Around line 2426-2428: Update the surrounding CLI model in
docs/netsuke-design.md to consistently remove the retired generate command
contract: revise or remove the related Commands::Manifest schema and behavior
examples, and eliminate the build --emit surface where it represents the same
retired workflow. Ensure the document no longer publishes both command
interfaces while preserving unrelated command documentation.
- Around line 2277-2282: Update the JSON output contract in the documented
automation behavior to guarantee exactly one JSON document only when JSON mode
has been successfully resolved. Explicitly exclude early-startup
configuration-file failures that occur before JSON mode can be determined, while
preserving the existing success and failure document requirements for resolved
JSON mode.
---
Outside diff comments:
In `@src/runner/process/mod.rs`:
- Line 222: Update the nearby forwarding comment associated with
request.cli.json to say “JSON mode” instead of “JSON diagnostics mode,”
preserving the existing suppression contract and code behavior.
🪄 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: 4a9881d9-6188-4750-9954-e17caab3e966
📒 Files selected for processing (21)
build.rsdocs/developers-guide.mddocs/execplans/netsuke-cli-overhaul.mddocs/netsuke-cli-design-document.mddocs/netsuke-design.mddocs/roadmap.mddocs/users-guide.mdsrc/json_envelope.rssrc/runner/process/mod.rssrc/runner/process/tests.rstests/assert_cmd_tests.rstests/bdd/steps/configuration_discovery.rstests/bdd/steps/configuration_preferences.rstests/bdd/steps/json_diagnostics.rstests/bdd/steps/progress_output.rstests/features/advanced_usage.featuretests/features/json_diagnostics.featuretests/logging_stderr/json.rstests/logging_stderr/support.rstests/logging_stderr/verbose.rstests/runner_tests.rs
🔗 Linked repositories identified
CodeRabbit considers these linked repositories for cross-repo context during reviews:
leynos/rstest-bdd(auto-detected)leynos/ortho-config(auto-detected)leynos/shared-actions(auto-detected)
💤 Files with no reviewable changes (1)
- tests/features/advanced_usage.feature
| use std::{ | ||
| env, | ||
| ffi::OsString, | ||
| fs, | ||
| env, fs, | ||
| path::{Path, PathBuf}, | ||
| sync::Arc, | ||
| }; |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
rg -n -C 2 'std::\{[^}]*\b(fs|path)\b|std::fs|std::path|fs::read_to_string' \
build.rs tests/assert_cmd_tests.rs
rg -n -C 2 'cap_std|fs_utf8|camino' Cargo.toml build.rs testsRepository: leynos/netsuke
Length of output: 19575
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== build.rs ==\n'
cat -n build.rs | sed -n '1,220p'
printf '\n== tests/assert_cmd_tests.rs ==\n'
cat -n tests/assert_cmd_tests.rs | sed -n '1,220p'Repository: leynos/netsuke
Length of output: 12258
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== Cargo.toml dependencies ==\n'
cat -n Cargo.toml | sed -n '1,240p'Repository: leynos/netsuke
Length of output: 8472
Replace std::fs/std::path with capability-scoped I/O.
build.rs: addcap-stdandcaminoto[build-dependencies]too, then stage the man page throughcap_std::fs_utf8::Dirandcamino::Utf8PathBuf.tests/assert_cmd_tests.rs: read the generated file through a capability-scoped handle instead ofstd::fs::read_to_string.
📍 Affects 2 files
build.rs#L11-L14(this comment)tests/assert_cmd_tests.rs#L68-L70
🤖 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 `@build.rs` around lines 11 - 14, Replace std::fs and std::path usage in
build.rs with capability-scoped I/O: add cap-std and camino under
[build-dependencies], and use cap_std::fs_utf8::Dir with camino::Utf8PathBuf to
stage the man page. In tests/assert_cmd_tests.rs, replace
std::fs::read_to_string with reads through a capability-scoped handle,
preserving the existing generated-file assertions.
Source: Coding guidelines
| For automation use cases, Netsuke supports a root `--json` flag layered through | ||
| OrthoConfig as `--json`, `NETSUKE_JSON`, and `json = true`. When enabled, every | ||
| invocation emits exactly one versioned JSON document: on success, a result | ||
| document on `stdout`; on failure, a diagnostic document on `stderr`. Both | ||
| documents share `schema_version = 1` and a `generator` object of `name` and | ||
| `version`: |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Limit the JSON guarantee to resolved JSON mode.
This sentence says “every invocation” emits a JSON document, while the same section states that configuration-file failures cannot request JSON during early startup. Limit the guarantee to invocations where JSON mode has been resolved, or state the early-startup exception in the same contract.
🤖 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/netsuke-design.md` around lines 2277 - 2282, Update the JSON output
contract in the documented automation behavior to guarantee exactly one JSON
document only when JSON mode has been successfully resolved. Explicitly exclude
early-startup configuration-file failures that occur before JSON mode can be
determined, while preserving the existing success and failure document
requirements for resolved JSON mode.
| - `netsuke generate`: This command performs the pipeline up to Ninja synthesis | ||
| and writes the resulting Ninja file to stdout without invoking Ninja. | ||
| Supplying `--output FILE` writes the generated Ninja file to `FILE` instead. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Remove the retired command contract from the surrounding CLI model.
This new generate description still sits beside the unchanged Commands::Manifest and build --emit schema and behaviour examples above. Update those entries together so the design document does not publish both command surfaces.
🤖 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/netsuke-design.md` around lines 2426 - 2428, Update the surrounding CLI
model in docs/netsuke-design.md to consistently remove the retired generate
command contract: revise or remove the related Commands::Manifest schema and
behavior examples, and eliminate the build --emit surface where it represents
the same retired workflow. Ensure the document no longer publishes both command
interfaces while preserving unrelated command documentation.
) The rebase onto main lands #427 and ADR-004, which remove the legacy `NETSUKE_CONFIG_PATH` alias and keep `NETSUKE_CONFIG` as the only environment selector. Reconcile the config-path instrumentation with that decision: - Drop the `NETSUKE_CONFIG_PATH` branch from `resolve_config_selector`, `explicit_config_path`, and their tracing so selection is `--config` then `NETSUKE_CONFIG` only. - Remove the legacy dimension from the discovery tracing tests (fixture, scenario struct, and the legacy-only rstest case) and correct the stale docstrings that still referenced the legacy variable. - Track main's `diag_json` to `json` rename in the developers guide while keeping the `explicit_config_path -> ConfigPathResolution` signature fix and the pure-query/bounded-hash wording. - Rebuild `Cargo.lock` from main's, adding only the `test_support` tracing/tracing-subscriber edges. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Summary
This branch gives early adopters an accurate account of Netsuke v0.1.0 and
prevents its user-facing examples from drifting away from executable
behaviour.
It replaces outdated product claims with an honest completion assessment and
road ahead, reorganizes the user's guide around real tasks, corrects linked
example manifests, and adds Rust integration, rstest-bdd, end-to-end, and
property coverage for the README and user's guide examples.
Review follow-ups align the configured default with
hello.txt, correct thephoto-edit and writing outputs, and reject unsupported reusable-rule
depsinstead of accepting and silently dropping them. Target and action
dependencies remain the supported implicit-dependency contract until the
planned rule-level
deps_fromfeature is implemented.Review walkthrough
for the v0.1.0 positioning, completion assessment, limitations, and
post-release priorities.
for the task-oriented first-run flow, current manifest and CLI contracts,
corrected defaults, target-only dependency guidance, diagnostics,
accessibility, and safety boundaries.
and writing
manifests for their declared output contracts.
integration contracts,
loader properties and failures,
and real-Ninja E2E tests.
and AST validation test
for the localized rejection of rule-level
deps.Validation
origin/mainat2afbcb6;range-difffoundone whitespace-only replay artefact, removed in
764e869unterminated-fence contracts passed; a deliberate duplicate-rejection
mutation failed and shrank to the minimal input
make check-fmt: passedmake test: passed, 1,150 tests with no failures or skipsmake typecheck: passedmake lint: passed, including Rustdoc, Clippy, and Whitakermake markdownlint: passed, 69 files with zero errorsmake nixie: passedgit diff --check: passedNotes
Each manifest example runs in an isolated temporary workspace. The documented
first-run flows execute with real Ninja and assert the exact
cat hello.txtoutput; the rstest-bdd scenarios retain the novice-flow fake-Ninja process
boundary. Deterministic child-only stubs exercise the photo-edit and writing
manifests without requiring Darktable, Pandoc, or LaTeX.
The CLI rewrite requested in later review feedback was not applied: the live
parser still exposes
manifest,build --emit,--diag-json, and the currentpresentation flags, and does not expose
generate, root--no-input, orcanonical
--json. Changing the guide alone would make it inaccurate.