Feature: M5 ACMS pipeline and large-project context smoke tests As a developer working with the CleverAgents M5 milestone I want to verify the ACMS context pipeline end-to-end So that context assembly, budget enforcement, and multi-project context work correctly Background: Given a m5 smoke test runner And a m5 smoke mocked context service # --- Fixture loading --- Scenario: M5 smoke load ACMS context policy fixture When I m5 smoke load the ACMS context policy fixture Then the m5 smoke policy fixture should have a default view And the m5 smoke policy fixture should have a strategize view And the m5 smoke policy fixture should have an execute view Scenario: M5 smoke load large project context fixture When I m5 smoke load the large project context fixture Then the m5 smoke large project fixture should have file entries And the m5 smoke large project fixture should have context tiers Scenario: M5 smoke load context analysis results fixture When I m5 smoke load the context analysis results fixture Then the m5 smoke analysis fixture should have a summary And the m5 smoke analysis fixture should have dependencies And the m5 smoke analysis fixture should have relevance scores # --- Context policy resolution --- Scenario: M5 smoke resolve default view from empty policy Given a m5 smoke empty context policy When I m5 smoke resolve the view for phase "default" Then the m5 smoke resolved view should include all paths Scenario: M5 smoke resolve strategize view inherits from default Given a m5 smoke policy with only default view When I m5 smoke resolve the view for phase "strategize" Then the m5 smoke resolved view should match the default view Scenario: M5 smoke resolve strategize view with override Given a m5 smoke policy with strategize override When I m5 smoke resolve the view for phase "strategize" Then the m5 smoke resolved view should use the strategize override Scenario: M5 smoke resolve execute view inherits from strategize Given a m5 smoke policy with strategize override When I m5 smoke resolve the view for phase "execute" Then the m5 smoke resolved view should use the strategize override Scenario: M5 smoke resolve apply view falls through to default Given a m5 smoke policy with only default view When I m5 smoke resolve the view for phase "apply" Then the m5 smoke resolved view should match the default view Scenario: M5 smoke invalid phase raises ValueError Given a m5 smoke empty context policy When I m5 smoke resolve the view for invalid phase "invalid" Then a m5 smoke ValueError should be raised # --- Budget enforcement --- Scenario: M5 smoke max file size rejects oversized files Given a m5 smoke context view with max_file_size 1024 Then a m5 smoke file of size 2048 should exceed the budget And a m5 smoke file of size 512 should be within the budget Scenario: M5 smoke max total size limits aggregate context Given a m5 smoke context view with max_total_size 8192 Then a m5 smoke aggregate of size 10000 should exceed the budget And a m5 smoke aggregate of size 4096 should be within the budget Scenario: M5 smoke zero max file size is invalid When I m5 smoke create a context view with max_file_size 0 Then a m5 smoke validation error should be raised Scenario: M5 smoke negative max total size is invalid When I m5 smoke create a context view with max_total_size -1 Then a m5 smoke validation error should be raised Scenario: M5 smoke None size limits allow unlimited Given a m5 smoke context view with no size limits Then a m5 smoke file of size 999999999 should be within the budget And a m5 smoke aggregate of size 999999999 should be within the budget # --- Context assembly via CLI --- Scenario: M5 smoke context list with empty project Given a m5 smoke project with no context When I m5 smoke invoke context list Then the m5 smoke context list should succeed And the m5 smoke context list output should be empty Scenario: M5 smoke context add file to project Given a m5 smoke project with mocked context service When I m5 smoke invoke context add with path "src/main.py" Then the m5 smoke context add should succeed Scenario: M5 smoke context add missing path reports an error Given a m5 smoke project with mocked context service When I m5 smoke invoke context add with missing path "src/missing.py" Then the m5 smoke context add output should report the missing path And the m5 smoke context service should not add any files Scenario: M5 smoke context show displays file content Given a m5 smoke project with context entries When I m5 smoke invoke context show for path "src/main.py" Then the m5 smoke context show should succeed And the m5 smoke context show output should contain content Scenario: M5 smoke context clear removes all entries Given a m5 smoke project with context entries When I m5 smoke invoke context clear Then the m5 smoke context clear should succeed # --- Context CLI: multiple resources --- Scenario: M5 smoke context list with multiple resources Given a m5 smoke project with multiple context entries When I m5 smoke invoke context list Then the m5 smoke context list should succeed And the m5 smoke context list output should contain multiple files Scenario: M5 smoke context add multiple files to project Given a m5 smoke project with mocked multi-add context service When I m5 smoke invoke context add with paths "src/a.py" and "src/b.py" Then the m5 smoke context add should succeed Scenario: M5 smoke context show with multiple resources shows summary Given a m5 smoke project with multiple context entries When I m5 smoke invoke context show without path Then the m5 smoke context show should succeed And the m5 smoke context show output should contain an exact summary # --- Context CLI: clear and re-add --- Scenario: M5 smoke context clear then re-add restores entries Given a m5 smoke project with context entries When I m5 smoke invoke context clear Then the m5 smoke context clear should succeed When I m5 smoke re-add context entry "src/main.py" after clear Then the m5 smoke context add should succeed Scenario: M5 smoke context clear on empty project succeeds Given a m5 smoke project with no context When I m5 smoke invoke context clear Then the m5 smoke context clear should succeed # --- Project context policy CLI --- Scenario: M5 smoke project context show displays policy Given a m5 smoke project with a saved context policy When I m5 smoke invoke project context show Then the m5 smoke project context show should succeed And the m5 smoke project context output should contain phase views Scenario: M5 smoke project context inspect is wired to ACMS When I m5 smoke invoke project context inspect Then the m5 smoke project context inspect should succeed Scenario: M5 smoke project context simulate is wired to ACMS When I m5 smoke invoke project context simulate Then the m5 smoke project context simulate should succeed # --- Context analysis agent --- Scenario: M5 smoke context analysis produces summary Given a m5 smoke mocked context analysis agent When I m5 smoke invoke context analysis Then the m5 smoke analysis result should have a non-empty summary Scenario: M5 smoke context analysis produces dependencies Given a m5 smoke mocked context analysis agent When I m5 smoke invoke context analysis Then the m5 smoke analysis result should have dependency entries Scenario: M5 smoke context analysis produces relevance scores Given a m5 smoke mocked context analysis agent When I m5 smoke invoke context analysis Then the m5 smoke analysis result should have relevance scores And all m5 smoke relevance scores should be between 0 and 1 # --- Multi-project context --- Scenario: M5 smoke multiple projects have independent context Given m5 smoke project "proj-a" with 3 context files And m5 smoke project "proj-b" with 5 context files Then m5 smoke project "proj-a" should have 3 context entries And m5 smoke project "proj-b" should have 5 context entries Scenario: M5 smoke context exclusion patterns filter correctly Given a m5 smoke context view excluding "**/__pycache__/**" Then the m5 smoke path "src/__pycache__/module.pyc" should be excluded And the m5 smoke path "src/module.py" should not be excluded # --- Budget enforcement (enforce_size_budget) --- Scenario: M5 smoke enforce_size_budget excludes oversized fragments Given m5 smoke fragments of sizes 50 200 80 And a m5 smoke context view with max_file_size 100 When I m5 smoke enforce the size budget Then 2 m5 smoke fragments should be accepted And 1 m5 smoke fragments should be violated And the m5 smoke violation type should be "max_file_size" And the m5 smoke total accepted size should be 130 Scenario: M5 smoke enforce_size_budget caps total size Given m5 smoke fragments of sizes 50 60 70 And a m5 smoke context view with max_total_size 120 When I m5 smoke enforce the size budget Then 2 m5 smoke fragments should be accepted And 1 m5 smoke fragments should be violated And the m5 smoke violation type should be "max_total_size" And the m5 smoke total accepted size should be 110 Scenario: M5 smoke enforce_size_budget with mixed limits Given m5 smoke fragments of sizes 30 200 40 50 And a m5 smoke context view with max_file_size 100 and max_total_size 100 When I m5 smoke enforce the size budget Then 2 m5 smoke fragments should be accepted And 2 m5 smoke fragments should be violated And the m5 smoke violations should include type "max_file_size" And the m5 smoke violations should include type "max_total_size" Scenario: M5 smoke enforce_size_budget with no limits accepts all Given m5 smoke fragments of sizes 500 600 700 And a m5 smoke context view with no size limits When I m5 smoke enforce the size budget Then 3 m5 smoke fragments should be accepted And 0 m5 smoke fragments should be violated And the m5 smoke total accepted size should be 1800 Scenario: M5 smoke enforce_size_budget boundary exact fit Given m5 smoke fragments of sizes 50 50 And a m5 smoke context view with max_total_size 100 When I m5 smoke enforce the size budget Then 2 m5 smoke fragments should be accepted And 0 m5 smoke fragments should be violated And the m5 smoke total accepted size should be 100 Scenario: M5 smoke enforce_size_budget reports violation details Given m5 smoke fragments of sizes 200 And a m5 smoke context view with max_file_size 100 When I m5 smoke enforce the size budget Then the m5 smoke violation reason should contain "exceeded max_file_size" And the m5 smoke violation content size should be 200 Scenario: M5 smoke pipeline applies size budget with context view Given m5 smoke fragments of sizes 50 200 80 And a m5 smoke context view with max_file_size 100 When I m5 smoke assemble via pipeline with the context view Then the m5 smoke pipeline should return 2 fragments And the m5 smoke pipeline enforcement result should have 1 violation(s) # --- Budget enforcement edge cases --- Scenario: M5 smoke enforce_size_budget with empty fragments list Given m5 smoke fragments of sizes And a m5 smoke context view with max_file_size 100 When I m5 smoke enforce the size budget Then 0 m5 smoke fragments should be accepted And 0 m5 smoke fragments should be violated And the m5 smoke total accepted size should be 0 Scenario: M5 smoke enforce_size_budget all fragments exceed max_file_size Given m5 smoke fragments of sizes 200 300 400 And a m5 smoke context view with max_file_size 100 When I m5 smoke enforce the size budget Then 0 m5 smoke fragments should be accepted And 3 m5 smoke fragments should be violated And the m5 smoke total accepted size should be 0 Scenario: M5 smoke enforce_size_budget single fragment at exact max_file_size boundary Given m5 smoke fragments of sizes 100 And a m5 smoke context view with max_file_size 100 When I m5 smoke enforce the size budget Then 1 m5 smoke fragments should be accepted And 0 m5 smoke fragments should be violated And the m5 smoke total accepted size should be 100 Scenario: M5 smoke enforce_size_budget with multi-byte Unicode content Given m5 smoke fragments with unicode content And a m5 smoke context view with max_file_size 10 When I m5 smoke enforce the size budget Then 1 m5 smoke fragments should be accepted And 1 m5 smoke fragments should be violated And the m5 smoke violation type should be "max_file_size"