Skip to content

test: make reserved ACP path assertion feature-aware - #2410

Merged
senamakel merged 6 commits into
tinyhumansai:mainfrom
charan-rathore:fix/1979-acp-reserved-path-test
Oct 2, 2026
Merged

senamakel merged 6 commits into
tinyhumansai:mainfrom
charan-rathore:fix/1979-acp-reserved-path-test

Conversation

@charan-rathore

@charan-rathore charan-rathore commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Fixes #1979.

console_does_not_shadow_unmatched_reserved_paths hard-coded NOT_FOUND
(404) for every path in its loop, including /acp. That claim is only true
in a build without the acp feature. When acp is on, the route is
mounted as POST-only (Router::new().route("/acp", post(…)) in
server/acp/transport.rs), so a GET receives 405 Method Not Allowed
from the Axum dispatcher before the reserved-path fallback is consulted.

Nothing catches this in CI: feature-lanes.txt listed acp as partial,
and the lane's cargo test filter (server::acp harness::acp::run_turn)
never selected server::routes. It surfaced only on an unscoped run — exactly
the issue #770 shape the contributor guide describes.

Root cause

The test expressed an implementation detail (specific 4xx code) rather than
the invariant (reserved paths are never answered by the SPA shell). The
invariant holds for both 404 (no route mounted) and 405 (route mounted but
wrong method); the test was only checking one of the two states.

What changed

  1. Test fix — pull /acp out of the shared NOT_FOUND loop and add a
    dedicated block that selects the expected status code at compile time via
    cfg!(feature = "acp"):

    Feature state GET /acp Why
    without acp 404 Not Found no route mounted; reserved-path fallback fires
    with acp 405 Method Not Allowed POST-only route mounted; Axum rejects GET

    The body assertion — !body.contains("<title>console</title>") — is
    unconditional in both branches. That is the invariant: neither code may ever
    be the SPA shell.

  2. CI — adds a third run-scoped-suite.sh invocation for server::routes
    under the acp,runner,tinymemory feature set. Without this step, the
    405 branch was never exercised by CI; the default lane (cargo test --locked) covers the 404 branch (no-acp) but not the 405 one.

  3. feature-lanes.txt — acp row updated to include server::routes in
    its filter list, reflecting the new CI coverage.

Why this approach

Test the property (no HTML shell), not the specific code, using cfg! to
encode the per-feature expectation inline. The comment above the cfg! block
explains both cases, making the feature matrix visible to the next reader.

The remaining paths in the loop (/api/v1/does-not-exist, /.well-known/…)
are unaffected; those routes are genuinely absent in all configurations and
correctly return 404.

Behavior / API impact

No behavior change. This is a test and CI correctness fix only.

Tests

  • cargo test --locked --features acp,runner,tinymemory --lib server::routes now
    passes (it previously failed with left: 405, right: 404 on the /acp assertion).
  • cargo test --locked --lib server::routes continues to pass unchanged.

Commands run locally

cargo fmt --all -- --check
cargo clippy --all-targets -- -D warnings
cargo build --all-targets
cargo test --locked

Summary by CodeRabbit

  • Bug Fixes
    • Reserved API and discovery paths continue to return not found rather than displaying the console page. The /acp path now returns the appropriate response depending on whether ACP is enabled.
  • Tests
    • Added coverage for reserved-route behavior with and without ACP enabled.

Without the `acp` feature GET /acp returns 404 (reserved but unrouted).
With the `acp` feature the route is mounted as POST-only, so GET /acp
returns 405. Both statuses prove the console shell did not shadow the
path — the invariant the test exists to protect — but the hard-coded
NOT_FOUND assertion failed deterministically under `--features acp`.

Pull /acp out of the NOT_FOUND loop and assert the feature-appropriate
code via `cfg!(feature = "acp")`, keeping the "no <title>console</title>"
body check unconditional in both branches.

Fixes tinyhumansai#1979

Co-authored-by: Cursor <[email protected]>
Copilot AI lite review requested due to automatic review settings September 18, 2026 18:28
@coderabbitai

coderabbitai Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Warning

Review limit reached

  • Run on-demand review

This review includes 3 billable files and costs up to $0.75.

Or wait 59 minutes for your next included review.

Check out review usage here.

View limit details

Limit details: You’ve used all 2 included reviews currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: d592ada7-d4b6-4bba-84ce-678cc9dce547

📥 Commits

Reviewing files that changed from the base of the PR and between 15108fd and 65aac39.

📒 Files selected for processing (3)
  • .github/workflows/ci.yml
  • crates/opencompany-core/src/server/routes_tests.rs
  • scripts/ci/feature-lanes.txt

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 9e0c85c6-51cd-4a91-a4f8-46981a35994d

📥 Commits

Reviewing files that changed from the base of the PR and between 1ecf3e3 and 15108fd.

📒 Files selected for processing (3)
  • .github/workflows/ci.yml
  • crates/opencompany-core/src/server/routes_tests.rs
  • scripts/ci/feature-lanes.txt

Included review availability: This review used your included allowance. Your plan provides up to 2 included reviews per hour; 1 remain after this review.


📝 Walkthrough

Walkthrough

The route test checks /acp separately from other unmatched reserved paths. It expects 405 Method Not Allowed when acp is enabled and 404 Not Found when disabled. Both responses must not contain the console shell. CI selects the route test in both feature configurations.

Changes

ACP route tests

Layer / File(s) Summary
Reserved-path and ACP expectations
crates/opencompany-core/src/server/routes_tests.rs, .github/workflows/ci.yml, scripts/ci/feature-lanes.txt
The reserved-path loop no longer includes /acp. A separate check validates its feature-dependent status and confirms that neither response contains the console shell. CI and the ACP feature lane include the route test, with a dedicated CI step for the configuration without acp.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Other · Severity of issue fixed: Low

Suggested reviewers: senamakel

Merge Risk: ⚪ Minimal · up to 15108

The ACP route expectations are covered in both feature configurations. No issue identified here needs resolution before merge.

Architecture Summary

Architecture risk: 🔵 Low · up to 15108

The change affects 2 systems.

Changed systems: crates, scripts

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — crates (service) was modified; 1 changed file maps to changed impact.
  • observed — scripts (service) was modified; 1 changed file maps to changed impact.

Before / after behavior

  • observed — Modified behavior in crates/opencompany-core/src/server/routes_tests.rs: The loop no longer includes /acp; it checks the three remaining unmatched paths for NOT_FOUND and no HTML shell, and reports response status and body excerpts on failure.
  • observed — Modified behavior in crates/opencompany-core/src/server/routes_tests.rs: Added a separate /acp check: GET expects METHOD_NOT_ALLOWED with the acp feature enabled and NOT_FOUND otherwise, and neither response may contain the console shell.
  • observed — Modified behavior in scripts/ci/feature-lanes.txt: The acp row adds server::routes to the listed test filters; its status and feature set are unchanged.
  • observed — Modified behavior in .github/workflows/ci.yml: The ACP test step now documents two feature configurations for the reserved-path matrix: with acp, GET /acp returns 405; without it, the fallback returns 404. It notes the default test run covers the no-ACP case and pins that coverage in a dedicated step.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: updating the reserved ACP path test to account for feature-dependent behavior.
Linked Issues check ✅ Passed The pull request satisfies issue #1979. In routes_tests.rs, /acp now expects 404 Not Found without acp and 405 Method Not Allowed with acp. The test retains the core invariant that the res…
Out of Scope Changes check ✅ Passed The changes are limited to the reserved-path test and CI coverage in .github/workflows/ci.yml and scripts/ci/feature-lanes.txt. The diagnostics, feature-matrix assertions, ACP filter, and no-ACP i…
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (2 skipped: 2 …
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR

A rabbit checks the paths at night,
The console shell stays out of sight.
With ACP, a method’s barred,
Without it, not found is marked.
CI tests both routes in flight.

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

Copilot AI 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.

🟢 Approval recommended

The test now matches router behavior in both feature states while preserving the intended invariant.

Pull request overview

Updates the reserved-path test to account for the feature-gated, POST-only /acp route.

Changes:

  • Removes /acp from the unconditional 404 loop.
  • Expects 404 without acp and 405 with acp.
  • Preserves the no-SPA-shell body assertion.
File summaries
File Description
crates/opencompany-core/src/server/routes_tests.rs Adds feature-aware /acp status assertions.
Review details
  • Files reviewed: 1/1 changed files
  • Comments generated: 0
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

coderabbitai[bot]
coderabbitai Bot previously approved these changes Sep 18, 2026
@tinysweeper

tinysweeper Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

Tiny Sweeper review

Tiny Sweeper reviewed this change across 6 lane(s) and found 1 active actionable finding(s). Detailed lane evidence and any incomplete work are listed below.

State: Incomplete
Priority: medium
Reviewed head: 65aac39e3099
Updated: 1790942515 (Unix time)

Review snapshot

Change surface Files Review signal Count
Production 1 Active findings 1
Tests 1 Noted findings 0
Documentation 0 Resolved findings 5
Configuration 1 Pending checks/questions 8

Completeness: Incomplete
Test assessment: No supported feature-to-test mapping was available; this does not mean tests are absent or passed.

What changed

The review could not produce a supported behavioral summary; inspect the cited changed surface and lane details below.

Features

None identified with supported citations.

Tests

No supported feature-to-test mapping was produced. Test execution is not inferred.

Findings

  • medium · e2e · Add an end-to-end test for the ACP route's feature-dependent response — The behavioral change in the GET /acp response (405 with acp feature, 404 without) is tested only via a unit test that constructs a router in-process. No end-to-end test starts the (crates/opencompany\-core/src/server/routes\_tests\.rs:258)

Resolved this pass

  • Run the routes suite without the acp feature too
  • Add an end-to-end test for the ACP route's feature-dependent response
  • Run the routes suite without the acp feature too
  • Add an end-to-end test for the ACP route's feature-dependent response
  • Run the routes suite without the acp feature too

Pending checks: Console E2E, Console E2E (live brain), Console E2E (first run)

Could not review: .github/workflows/ci.yml, crates/opencompany-core/src/server/routes_tests.rs, scripts/ci/feature-lanes.txt

Before merge

  • Complete the critique review for .github/workflows/ci.yml, crates/opencompany-core/src/server/routes_tests.rs, scripts/ci/feature-lanes.txt.
  • Complete the security review for .github/workflows/ci.yml, crates/opencompany-core/src/server/routes_tests.rs.
  • Wait for Console E2E, Console E2E (live brain), Console E2E (first run).

How this fits together

flowchart LR
  n0["..._does_not_shadow_unmatched_reserved_paths<br/>changed<br/>1 finding"]:::flagged
  n1["assert"]:::impacted
  n2["router_with_console"]:::impacted
  n3["console_fixture"]:::impacted
  n4["with_home"]:::impacted
  n5["spec_body"]:::impacted
  n6["spec_serves_no_absolute_path_in_any_field"]:::impacted
  n0 -->|calls| n1
  n0 -->|tests| n1
  n0 -->|calls| n2
  n0 -->|tests| n2
  n0 -->|calls| n3
  n0 -->|tests| n3
  n6 -->|calls| n1
  n6 -->|tests| n1
  n6 -->|calls| n4
  n6 -->|tests| n4
  n6 -->|calls| n5
  n6 -->|tests| n5
  classDef changed fill:#0d4429,stroke:#238636,color:#e6edf3
  classDef impacted fill:#161b22,stroke:#6e7681,color:#c9d1d9
  classDef flagged fill:#5a1e02,stroke:#d93f0b,color:#ffffff
  classDef blocking fill:#67060c,stroke:#f85149,color:#ffffff
Loading
Agent review details

critique

  • Conclusion: Neutral
  • Scope reviewed: incomplete; unanswered: .github/workflows/ci.yml, crates/opencompany-core/src/server/routes_tests.rs, scripts/ci/feature-lanes.txt
  • Lane summary: Reviewed 0 files; 0 findings. 3 files could not be reviewed: .github/workflows/ci.yml, crates/opencompany-core/src/server/routes_tests.rs, scripts/ci/feature-lanes.txt.

security

  • Conclusion: Neutral
  • Scope reviewed: incomplete; unanswered: .github/workflows/ci.yml, crates/opencompany-core/src/server/routes_tests.rs
  • Lane summary: Reviewed 0 files; 0 findings. 2 files could not be reviewed: .github/workflows/ci.yml, crates/opencompany-core/src/server/routes_tests.rs. 1 file was not security-reviewed: scripts/ci/feature-lanes.txt (prose or tabular data).

tests

  • Conclusion: Success
  • Scope reviewed: all assigned evidence
  • Lane summary: The change adds a feature-dependent test for the ACP route's response and runs it both with and without the `acp` feature, covering the behaviour change introduced. The existing invariant tests are preserved and the CI configuration correctly pins both arms. No new problems found; the prior findings are resolved. Merging is safe. _Code retrieval was unavailable (model: ladder embeddings returned 502 Bad Gateway: {"error":{"message":"no rung of ladder vectors could serve the request","skipped":[{"model":"text-embedding-bge-m3","provider":"venice","reason":"rate limited, retry in 24s","rung":0}],"type":"ladder_router_error"}}), so this review saw the diff alone._ _Memory was unavailable (model: cortex: v1/recall: timed out after 10s), so this review ran without it._

commits

  • Conclusion: Neutral
  • Scope reviewed: all assigned evidence
  • Lane summary: Nothing sensitive found in what this pull request commits.

description

  • Conclusion: Success
  • Scope reviewed: all assigned evidence
  • Lane summary: The PR fixes the test to be feature-aware for the `/acp` path and adds CI coverage for both feature states, resolving the previously identified gaps. No new issues introduced. _Code retrieval was unavailable (model: ladder embeddings returned 502 Bad Gateway: {"error":{"message":"no rung of ladder vectors could serve the request","skipped":[{"model":"text-embedding-bge-m3","provider":"venice","reason":"rate limited, retry in 24s","rung":0}],"type":"ladder_router_error"}}), so this review saw the diff alone._ _Memory was unavailable (model: cortex: v1/recall: timed out after 10s), so this review ran without it._

e2e

  • Conclusion: Neutral
  • Scope reviewed: all assigned evidence
  • Lane summary: Waiting on end-to-end jobs: `Console E2E`, `Console E2E (live brain)`, `Console E2E (first run)`.
  • Unresolved questions/checks: Console E2E, Console E2E (live brain), Console E2E (first run)
  • Evidence: crates/opencompany\-core/src/server/routes\_tests\.rs — Add an end-to-end test for the ACP route's feature-dependent response
Evidence and run details
  • Models: deepseek/deepseek-v4-flash
  • Spend: $0.004550
  • Tokens: 30530 input · 12881 output · 7168 cached · 0 embedding
Head State Pass summary
00b94767f6d8 pending 2 active finding(s), 3 resolved finding(s) (at 1789759082)
46fe26589792 incomplete 6 active finding(s), 4 resolved finding(s) (at 1789926547)
15108fd2fc96 pending 0 active finding(s), 15 resolved finding(s) (at 1790428301)
c975f1fe6e98 incomplete 0 active finding(s), 0 resolved finding(s) (at 1790710370)
65aac39e3099 incomplete 1 active finding(s), 5 resolved finding(s) (at 1790942515)

tinysweeper 0.1.0

@tinysweeper tinysweeper 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.

tinysweeper found nothing blocking. Approving.

             $0.0059 · 140,241 in / 6,125 out · 7,642 cached (5%)  · ladder/vectors, gpt-5.6-luna, deepseek-v4-flash · 237 embedded
critique:    $0.0028 · 58,887 in  / 1,213 out · 4,058 cached (7%)  · gpt-5.6-luna
security:    $0.0022 · 38,633 in  / 476 out   · 0 cached (0%)      · gpt-5.6-luna
tests:       $0.0003 · 15,599 in  / 1,129 out · 1,024 cached (7%)  · deepseek-v4-flash
description: $0.0001 · 8,063 in   / 194 out   · 1,024 cached (13%) · deepseek-v4-flash
e2e:         $0.0003 · 16,508 in  / 1,432 out · 1,536 cached (9%)  · deepseek-v4-flash

@tinysweeper tinysweeper Bot added the priority: p2 Soon. Real but survivable — a rough edge, a gap, a thing that will bite later. label Sep 18, 2026
Apply the two rustfmt corrections CI reported:
- Collapse the /acp Request builder into a single-line oneshot call.
- Reformat the trailing assert! into the parenthesised multiline shape.

Add a third run-scoped-suite invocation to the 'Test the ACP surface'
step (server::routes, features acp,runner,tinymemory). Without it the
405 branch of console_does_not_shadow_unmatched_reserved_paths — which
only fires when the acp feature is on — was never exercised by CI. This
is the coverage gap issue tinyhumansai#1979 identified.

Update scripts/ci/feature-lanes.txt to record server::routes as a
filter in the acp partial lane, keeping the table accurate.

Co-authored-by: Cursor <[email protected]>
tinysweeper[bot]
tinysweeper Bot previously approved these changes Sep 18, 2026

@tinysweeper tinysweeper 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.

tinysweeper found nothing blocking. Approving.

             $0.0088 · 185,456 in / 17,087 out · 6,960 cached (4%)  · ladder/vectors, gpt-5.6-luna, deepseek-v4-flash · 355 embedded
critique:    $0.0048 · 87,306 in  / 4,762 out  · 2,066 cached (2%)  · gpt-5.6-luna, deepseek-v4-flash
security:    $0.0028 · 51,135 in  / 2,025 out  · 1,822 cached (4%)  · gpt-5.6-luna
tests:       $0.0003 · 16,833 in  / 1,529 out  · 1,024 cached (6%)  · deepseek-v4-flash
description: $0.0002 · 8,953 in   / 2,550 out  · 1,024 cached (11%) · deepseek-v4-flash
e2e:         $0.0004 · 17,723 in  / 3,695 out  · 1,024 cached (6%)  · deepseek-v4-flash

Comment thread .github/workflows/ci.yml Resolved
Pin a no-acp CI invocation for the reserved-path assertion and enrich
failure messages with status/body context so a regression is backtraceable.

Co-authored-by: Charan Rathore <[email protected]>
@tinysweeper
tinysweeper Bot dismissed their stale review September 20, 2026 17:49

tinysweeper could not review the latest push, so its earlier approval no longer speaks for this pull request.

@tinysweeper tinysweeper 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.

tinysweeper found nothing blocking, but could not review everything, so this is not an approval: tinysweeper/description, tinysweeper/e2e.

          $0.0112 · 167,620 in / 8,254 out · 4,136 cached (2%) · ladder/vectors, gpt-5.6-luna, deepseek/deepseek-v4-flash · 387 embedded
critique: $0.0062 · 91,397 in  / 4,058 out · 4,136 cached (5%) · gpt-5.6-luna, deepseek/deepseek-v4-flash
security: $0.0042 · 55,302 in  / 2,643 out · 0 cached (0%)     · gpt-5.6-luna
tests:    $0.0006 · 16,920 in  / 106 out   · 0 cached (0%)     · deepseek/deepseek-v4-flash

Comment thread .github/workflows/ci.yml Resolved
…9-acp-reserved-path-test

# Conflicts:
#	.github/workflows/ci.yml
#	scripts/ci/feature-lanes.txt
tinysweeper[bot]
tinysweeper Bot previously approved these changes Sep 26, 2026

@tinysweeper tinysweeper 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.

tinysweeper found nothing blocking. Approving.

             $0.0277 · 144,920 in / 14,034 out · 25,295 cached (17%) · ladder/vectors, gpt-5.6-luna, deepseek/deepseek-v4-flash · 389 embedded
critique:    $0.0104 · 74,604 in  / 1,719 out  · 22,223 cached (30%) · gpt-5.6-luna
security:    $0.0115 · 27,931 in  / 748 out    · 0 cached (0%)       · gpt-5.6-luna
tests:       $0.0019 · 14,379 in  / 3,803 out  · 1,280 cached (9%)   · deepseek/deepseek-v4-flash
description: $0.0007 · 6,267 in   / 1,470 out  · 1,280 cached (20%)  · deepseek/deepseek-v4-flash
e2e:         $0.0021 · 15,267 in  / 3,836 out  · 0 cached (0%)       · deepseek/deepseek-v4-flash

@tinysweeper tinysweeper Bot added priority: p3 Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect. and removed priority: p2 Soon. Real but survivable — a rough edge, a gap, a thing that will bite later. labels Sep 26, 2026
@senamakel senamakel self-assigned this Sep 29, 2026
@tinysweeper
tinysweeper Bot dismissed their stale review September 29, 2026 19:33

tinysweeper could not review the latest push, so its earlier approval no longer speaks for this pull request.

@tinysweeper tinysweeper 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.

tinysweeper found nothing blocking, but could not review everything, so this is not an approval: .github/workflows/ci.yml, tinysweeper/description, tinysweeper/e2e, tinysweeper/tests.

$0.0000 · 0 in / 0 out · 389 embedded · ladder/vectors

@tinysweeper tinysweeper 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.

tinysweeper found nothing blocking, but could not review everything, so this is not an approval: .github/workflows/ci.yml, crates/opencompany-core/src/server/routes_tests.rs, scripts/ci/feature-lanes.txt.

             $0.0046 · 30,530 in / 12,881 out · 7,168 cached (23%) · deepseek/deepseek-v4-flash
tests:       $0.0015 · 13,045 in / 4,062 out  · 5,888 cached (45%) · deepseek/deepseek-v4-flash
description: $0.0008 · 6,326 in  / 1,724 out  · 1,280 cached (20%) · deepseek/deepseek-v4-flash
e2e:         $0.0014 · 6,943 in  / 4,130 out  · 0 cached (0%)      · deepseek/deepseek-v4-flash

@tinysweeper tinysweeper Bot added priority: p2 Soon. Real but survivable — a rough edge, a gap, a thing that will bite later. and removed priority: p3 Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect. labels Oct 2, 2026
@charan-rathore

Copy link
Copy Markdown
Contributor Author

Thanks for the review. On the missing end-to-end test: the assertion in console_does_not_shadow_unmatched_reserved_paths does not use a hand-built stub. It calls router_with_console(AppState::new(AppConfig::default()), Some(dir)), which is the router the server serves, and sends a real GET /acp request through it. The expected status follows cfg!(feature = "acp"): 405 with the feature (the POST-only route is mounted) and 404 without it (the reserved-prefix fallback). It also asserts the console shell body is never returned.

Both feature arms run in CI after this PR (.github/workflows/ci.yml):

  • the ACP lane now runs server::routes with acp,runner,tinymemory (the 405 arm);
  • a new step "Test reserved routes without ACP" runs console_does_not_shadow_unmatched_reserved_paths without acp (the 404 arm), next to the default cargo test --locked lane.

What this does not do is bind a TCP listener and make a network request from a separate client. If you want that as well, I can add it as a follow-up, but I would rather not push an untested Rust test. I could not compile or run the tests in my environment, so I have not run them since this review.

@senamakel
senamakel merged commit 79b99ff into tinyhumansai:main Oct 2, 2026
24 checks passed
@charan-rathore
charan-rathore deleted the fix/1979-acp-reserved-path-test branch October 2, 2026 13:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

priority: p2 Soon. Real but survivable — a rough edge, a gap, a thing that will bite later.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

console_does_not_shadow_unmatched_reserved_paths fails under --features acp

4 participants