chore(ci): fix pre-commit hook failures

Fix JSON syntax errors in .devcontainer/devcontainer.json (removed
invalid JS-style // comments) and .devcontainer/opencode.json (removed
90+ trailing commas). Apply auto-fixes for end-of-file and trailing
whitespace issues across 100+ files. Fix SIM105 ruff violations in
benchmarks/core_circuit_breaker_bench.py (use contextlib.suppress).

Note: The security fix from issue #7478 (validate_path startswith bypass)
was already delivered to master in commit e18ac5f2. This PR as currently
structured is non-atomic (35 commits across 10+ issues) and needs
significant restructure before merge. This commit only addresses the
CI/pre-commit failures.

ISSUES CLOSED: #7478
This commit is contained in:
2026-05-17 14:58:50 +00:00
committed by drew
parent 90083e3ae5
commit f808abff86
101 changed files with 227 additions and 372 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ if [ -f /proc/self/mountinfo ] && grep -q '/_data[[:space:]]/app[[:space:]]' /pr
# `/app` is *not* mounted as a volume. Skip installation to avoid polluting
# the image and to respect the caller's intent.
echo "Skipping requirements installation because /app is not a mounted volume." >&2
elif [ -f requirements.txt ]; then
elif [ -f requirements.txt ]; then
# `/app` **is** a separate mount → proceed with installation.
pyenv local 3.10.17
python -m pip install --no-cache-dir -r requirements.txt
+4 -14
View File
@@ -2,8 +2,7 @@
"name": "CleverErnie Dev Environment",
"dockerFile": "Dockerfile",
"context": "..",
// Configure tool-specific properties
"customizations": {
"vscode": {
"settings": {
@@ -58,16 +57,12 @@
}
},
// Use 'postCreateCommand' to run commands after the container is created
"postCreateCommand": ".devcontainer/post-create.sh",
// Use 'postStartCommand' to run commands after the container starts
"postStartCommand": "echo 'Welcome to your Python 3.13 development environment! 🚀'",
"postStartCommand": "echo 'Welcome to your Python 3.13 development environment!'",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root
"remoteUser": "vscode",
// Features to add to the dev container
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": true,
@@ -98,7 +93,6 @@
}
},
// Configure container environment
"containerEnv": {
"PYTHONPATH": "/app/src",
"PYTHONDONTWRITEBYTECODE": "1",
@@ -109,14 +103,12 @@
"NODE_PATH": "/usr/local/lib/node_modules"
},
// Mounts
"mounts": [
"source=${localWorkspaceFolder}/.devcontainer/bashrc-append.sh,target=/tmp/bashrc-append.sh,type=bind,consistency=cached",
"source=cleverernie-uv-cache,target=/tmp/uv-cache,type=volume",
"source=cleverernie-mcp-cache,target=/home/vscode/.local/share/mcp-logs,type=volume"
],
// Port forwarding
"forwardPorts": [8000, 8080, 3000, 9090, 3001],
"portsAttributes": {
"8000": {
@@ -124,7 +116,7 @@
"onAutoForward": "notify"
},
"8080": {
"label": "Development Server",
"label": "Development Server",
"onAutoForward": "silent"
},
"3000": {
@@ -141,11 +133,9 @@
}
},
// Lifecycle scripts
"initializeCommand": "echo 'Initializing CleverErnie Dev Environment...',",
"initializeCommand": "echo 'Initializing CleverErnie Dev Environment...'",
"onCreateCommand": "echo 'Creating development environment...'",
// Resource limits (increased for MCP servers and Claude Code)
"hostRequirements": {
"cpus": 4,
"memory": "8gb",
+1 -1
View File
@@ -206,4 +206,4 @@ For optional parameters not provided in your prompt, you may fall back to the en
## **CRITICAL** Rules
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
+1 -1
View File
@@ -165,4 +165,4 @@ error: <one-line description>
## **CRITICAL** Rules
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
+1 -1
View File
@@ -209,4 +209,4 @@ For optional parameters not provided in your prompt, you may fall back to the en
## **CRITICAL** Rules
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
+1 -1
View File
@@ -184,4 +184,4 @@ You compose `git-stage-util` → `git-create-commit-util` → `git-push-util`
## **CRITICAL** Rules
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
+1 -1
View File
@@ -184,4 +184,4 @@ error: <one-line description>
## **CRITICAL** Rules
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
+1 -1
View File
@@ -163,4 +163,4 @@ error: <one-line description>
## **CRITICAL** Rules
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
@@ -204,4 +204,4 @@ lease. Execute these steps exactly.
## **CRITICAL** Rules
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
+1 -1
View File
@@ -199,4 +199,4 @@ For optional parameters not provided in your prompt, you may fall back to the en
## **CRITICAL** Rules
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
+2 -2
View File
@@ -106,7 +106,7 @@ permission:
"printenv *": allow
"git -C * remote get-url origin": allow
"git remote get-url origin": allow
"git -C /tmp/*": allow
# Universal auto-agents-system bash blocks
@@ -188,4 +188,4 @@ You compose `git-fetch-util` → `git-rebase-util` → `git-push-util`
## **CRITICAL** Rules
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
+1 -1
View File
@@ -171,4 +171,4 @@ error: <one-line description>
## **CRITICAL** Rules
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
+1 -1
View File
@@ -311,4 +311,4 @@ The hardcoded values in the template (worker subagent name, work groups, fetch a
- **Pass all credentials verbatim.** Do not interpret, summarise, or modify any credential or configuration content received in your prompt — embed it as-is into the supervisor prompt template.
- **Only pass explicitly-present variables.** When constructing the supervisor prompt, include only variables that were **explicitly present** in your prompt. Omit any variable you fetched from environment variables or git remote — the supervisor subagent will fetch them itself.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
+1 -1
View File
@@ -433,4 +433,4 @@ The `git-rebase-util` needs the working directory of the isolated clone and the
## **CRITICAL** Rules
1. **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
1. **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question.
+1 -1
View File
@@ -141,7 +141,7 @@ permission:
"*FORGEJO_PAT*": deny
"*FORGEJO_USERNAME*": deny
"*FORGEJO_PASSWORD*": deny
"*force_merge*": deny
"*sudo*": deny
+1 -1
View File
@@ -108,7 +108,7 @@ permission:
"printenv *": allow
"git -C * remote get-url origin": allow
"git remote get-url origin": allow
"npx --yes tsx /app/.opencode/skills/auto-agents-system/scripts/session_*": allow
"*api/v1/orgs/*/labels*": deny
"*api/v1/repos/*/labels*": deny
@@ -108,7 +108,7 @@ permission:
"printenv *": allow
"git -C * remote get-url origin": allow
"git remote get-url origin": allow
"npx --yes tsx /app/.opencode/skills/auto-agents-system/scripts/session_*": allow
"*api/v1/orgs/*/labels*": deny
"*api/v1/repos/*/labels*": deny
+1 -1
View File
@@ -108,7 +108,7 @@ permission:
"printenv *": allow
"git -C * remote get-url origin": allow
"git remote get-url origin": allow
"npx --yes tsx /app/.opencode/skills/auto-agents-system/scripts/session_messages.ts*": allow
"*api/v1/orgs/*/labels*": deny
"*api/v1/repos/*/labels*": deny
@@ -46,43 +46,43 @@ Python import rules are, what the exact backwards compatibility policy is
name to use, whether something should be an Issue vs Epic vs Legendary, or
any other project-specific question.
Some examples of things covered by this skill:
Some examples of things covered by this skill:
- Exact directory layout (src/cleveragents, features/, features/mocks/, robot/,
- Exact directory layout (src/cleveragents, features/, features/mocks/, robot/,
docs/, config/, scripts/, examples/, k8s/, benchmarks/)
- Issue anatomy (Metadata section, Subtasks checklist, Definition of Done, 11
- Issue anatomy (Metadata section, Subtasks checklist, Definition of Done, 11
quality criteria, label rules, Ref field, parent links)
- Ticket hierarchy (Issue vs Epic vs Legendary)
- Ticket lifecycle state machine (Unverified → Verified → In progress → In
- Ticket lifecycle state machine (Unverified → Verified → In progress → In
review → Completed)
- Triaging rules
- Branch naming (feature/mN-, bugfix/mN-, tdd/mN- with milestone number)
- Commit quality rules (atomic, bisect-friendly, prescribed first line from
- Commit quality rules (atomic, bisect-friendly, prescribed first line from
Metadata, interactive staging, squash/rebase hygiene)
- PR requirements (all 12 requirements, critical dependency direction: PR blocks
issue not vice versa, one Epic per PR, milestone, Type/label, post-submission
- PR requirements (all 12 requirements, critical dependency direction: PR blocks
issue not vice versa, one Epic per PR, milestone, Type/label, post-submission
responsibilities)
- Code writing rules (spec-first, ADR for architectural changes, argument
- Code writing rules (spec-first, ADR for architectural changes, argument
validation first in every public method, SOLID patterns)
- Documentation traceability (no line numbers, module.class.method + commit hash,
- Documentation traceability (no line numbers, module.class.method + commit hash,
same-commit requirement, single canonical surface, ADR process)
- Behave BDD unit testing with exact step-file naming rules and Gherkin quality
- Robot Framework integration testing (real services, no mocks), full TDD bug
fix workflow with three-tag system and AssertionError enforcement
- Multi-level testing mandate (unit + integration + benchmarks for every task)
- All nox sessions (unit_tests, integration_tests, e2e_tests, coverage_report,
lint, typecheck, security_scan, dead_code, complexity, benchmark,
- All nox sessions (unit_tests, integration_tests, e2e_tests, coverage_report,
lint, typecheck, security_scan, dead_code, complexity, benchmark,
benchmark_regression, docs, build, format)
- 97% coverage as hard merge gate (measured by Slipcover via nox -s
coverage_report)
- 97% coverage as hard merge gate (measured by Slipcover via nox -s
coverage_report)
- Pyright strict type checking (no # type: ignore ever)
- Python import rules (top of file, if TYPE_CHECKING: exception)
- Mock placement (features/mocks/ only)
- All 13 CI/CD jobs and 3 workflow files with triggers, 5 required-for-merge
- All 13 CI/CD jobs and 3 workflow files with triggers, 5 required-for-merge
checks
- LangChain/LangGraph patterns (TypedDict state, MemorySaver, BaseLanguageModel,
- LangChain/LangGraph patterns (TypedDict state, MemorySaver, BaseLanguageModel,
FakeListLLM, RxPY streams)
- Plan lifecycle migration (agents plan use vs agents tell, ULID format, separate
- Plan lifecycle migration (agents plan use vs agents tell, ULID format, separate
storage backends, no migration path)
- Backwards compatibility policy (none pre-v3.0.0)
- docs/specification.md as authoritative source
@@ -323,7 +323,7 @@ if [ "$PR_BASE_SHA" != "$CURRENT_BASE_SHA" ]; then
echo "PR is stale. Base branch has advanced."
echo "PR base SHA: $PR_BASE_SHA"
echo "Current base SHA: $CURRENT_BASE_SHA"
# Optionally update the PR branch server-side
curl -s -X POST \
-H "Authorization: token ${FORGEJO_PAT}" \
@@ -366,14 +366,14 @@ if [ "$PR_BASE_SHA" != "$CURRENT_BASE_SHA" ]; then
UPDATE_RESULT=$(curl -s -w "\n%{http_code}" -X POST \
-H "Authorization: token ${FORGEJO_PAT}" \
"${FORGEJO_URL}/api/v1/repos/${OWNER}/${REPO}/pulls/${PR_INDEX}/update?style=rebase")
UPDATE_CODE=$(echo "$UPDATE_RESULT" | tail -1)
if [ "$UPDATE_CODE" = "409" ]; then
echo "Conflict during update. Resolve manually."
exit 1
fi
echo "Branch updated successfully."
# Re-fetch PR to get updated mergeable status
sleep 2
PR=$(curl -s \
@@ -190,7 +190,7 @@ for REPO in {repo1} {repo2} {repo3}; do
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
"${FORGEJO_URL}/api/v1/repos/${OWNER}/${REPO}/flags/{flag}" \
-H "Authorization: token ${FORGEJO_PAT}")
if [ "$HTTP_CODE" = "204" ]; then
echo "${REPO}: verified"
else
@@ -220,9 +220,9 @@ What actually happened.
## Environment
- OS:
- Browser:
- Version:
- OS:
- Browser:
- Version:
```
### YAML Form Template Example
@@ -237,7 +237,7 @@ while true; do
VERIFIED=$(curl -s "${FORGEJO_URL}/api/v1/user/emails" \
-H "Authorization: token ${FORGEJO_PAT}" \
| jq -r '.[] | select(.email == "newemail@example.com") | .verified')
if [ "$VERIFIED" = "true" ]; then
echo "Email verified!"
break
@@ -354,7 +354,7 @@ REPO_LIMIT=$(echo "$QUOTA" | jq '[.groups[].rules[] | select(.subjects[] == "siz
if [ "$REPO_LIMIT" != "null" ] && [ "$REPO_LIMIT" != "-1" ] && [ "$REPO_LIMIT" -gt 0 ]; then
PERCENT=$(( REPO_USED * 100 / REPO_LIMIT ))
echo "Repo usage: ${REPO_USED} / ${REPO_LIMIT} bytes (${PERCENT}%)"
if [ "$PERCENT" -ge 90 ]; then
echo "WARNING: Over 90% of repo quota used!"
elif [ "$PERCENT" -ge 75 ]; then
@@ -70,7 +70,7 @@ The action run page contains log content embedded in the HTML. Extract it for an
```bash
# Example: extract log lines from the HTML
echo "$ACTION_PAGE" | grep -oP 'log-msg[^>]*>\K[^<]+'
echo "$ACTION_PAGE" | grep -oP 'log-msg[^>]*>\K[^<]+'
```
## Complete Script
@@ -121,7 +121,7 @@ curl -sS -L -c "$COOKIE_JAR" -b "$COOKIE_JAR" \
for job_url in $FAILING; do
echo "=== Fetching logs for: ${job_url} ==="
PAGE=$(curl -sS -b "$COOKIE_JAR" "${FORGEJO_URL}${job_url}")
# Extract log content (parsing depends on Forgejo version / HTML structure)
echo "$PAGE" | grep -oP 'log-msg[^>]*>\K[^<]+' || echo "(Could not parse logs from HTML)"
echo ""
@@ -2422,7 +2422,7 @@ Patterns applied:
```
Stage 1: First working version (1 pattern)
└─ Guard Clause — at minimum, validate inputs
Stage 2: Making it testable (3 patterns)
├─ Dependency Injection — inject the DB dependency
├─ Repository — abstract the data access
@@ -131,8 +131,8 @@ if __name__ == "__main__":
**Output:**
```
=== Class-based iterator (for loop) ===
0 1 1 2 3 5 8 13 21 34
0 1 1 2 3 5 8 13 21 34
=== Manual iteration ===
Got: 0
Got: 1
@@ -142,7 +142,7 @@ if __name__ == "__main__":
Done!
=== Generator function ===
0 1 1 2 3 5 8 13 21 34
0 1 1 2 3 5 8 13 21 34
=== Multiple independent iterators ===
iter1: 0, 1, 1
@@ -239,13 +239,13 @@ func main() {
**Output:**
```
=== Closure-based iterator ===
0 1 1 2 3 5 8 13 21 34
0 1 1 2 3 5 8 13 21 34
=== Slice-based (eager) ===
0 1 1 2 3 5 8 13 21 34
0 1 1 2 3 5 8 13 21 34
=== Channel-based iterator ===
0 1 1 2 3 5 8 13 21 34
0 1 1 2 3 5 8 13 21 34
=== Two independent iterators ===
iter1: 0, 1, 1
-1
View File
@@ -199,4 +199,3 @@ Apache License
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-1
View File
@@ -1 +0,0 @@
+9 -24
View File
@@ -7,6 +7,7 @@ state transitions, and fast-fail latency in open state.
from __future__ import annotations
import asyncio
import contextlib
import time
from cleveragents.core.circuit_breaker import (
@@ -74,17 +75,13 @@ class CircuitBreakerOpenStateBench:
)
# Force the breaker into open state
for _ in range(3):
try:
with contextlib.suppress(ZeroDivisionError):
self.breaker.call(lambda: 1 / 0) # Raise ZeroDivisionError
except ZeroDivisionError:
pass
def time_fast_fail(self) -> None:
"""Benchmark fast-fail latency when circuit is open."""
try:
with contextlib.suppress(CircuitBreakerOpen):
self.breaker.call(lambda: "should not execute")
except CircuitBreakerOpen:
pass
def time_open_state_check(self) -> None:
"""Benchmark state check when open."""
@@ -111,10 +108,8 @@ class CircuitBreakerClosedToOpenTransitionBench:
"""Benchmark transition from closed to open state."""
# Trigger failures to transition to open
for _ in range(3):
try:
with contextlib.suppress(ZeroDivisionError):
self.breaker.call(lambda: 1 / 0)
except ZeroDivisionError:
pass
class CircuitBreakerOpenToHalfOpenTransitionBench:
@@ -134,20 +129,16 @@ class CircuitBreakerOpenToHalfOpenTransitionBench:
)
# Force to open state
for _ in range(3):
try:
with contextlib.suppress(ZeroDivisionError):
self.breaker.call(lambda: 1 / 0)
except ZeroDivisionError:
pass
# Wait for recovery timeout so transition to half-open is possible
time.sleep(0.1)
def time_open_to_half_open_transition(self) -> None:
"""Benchmark transition from open to half-open state."""
# Attempt call to trigger half-open transition
try:
with contextlib.suppress(CircuitBreakerOpen):
self.breaker.call(lambda: "success")
except CircuitBreakerOpen:
pass
class CircuitBreakerHalfOpenToClosedTransitionBench:
@@ -167,10 +158,8 @@ class CircuitBreakerHalfOpenToClosedTransitionBench:
)
# Force to open state
for _ in range(3):
try:
with contextlib.suppress(ZeroDivisionError):
self.breaker.call(lambda: 1 / 0)
except ZeroDivisionError:
pass
# Wait for recovery timeout so breaker enters half-open on next call
time.sleep(0.1)
@@ -205,10 +194,8 @@ class CircuitBreakerAsyncBench:
name="test_service_open",
)
for _ in range(3):
try:
with contextlib.suppress(ZeroDivisionError):
self.open_breaker.call(lambda: 1 / 0)
except ZeroDivisionError:
pass
def time_async_call_success(self) -> None:
"""Benchmark successful async call overhead."""
@@ -232,10 +219,8 @@ class CircuitBreakerAsyncBench:
async def dummy_async() -> str:
return "should not execute"
try:
with contextlib.suppress(CircuitBreakerOpen):
asyncio.run(self.open_breaker.async_call(dummy_async))
except CircuitBreakerOpen:
pass
class CircuitBreakerInitializationBench:
-1
View File
@@ -456,4 +456,3 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
renders permission requests directly in the conversation stream for single-file
operations. Users can allow/reject with single-key shortcuts (`a`/`A`/`r`/`R`),
navigate with arrow keys, confirm with `Enter`, or press `v` to open the full
@@ -173,17 +173,17 @@ During the Strategize phase, the strategy actor follows a structured reasoning l
def strategize(plan, context):
# System has already created the prompt_definition root decision
# Invariant Reconciliation Actor has already recorded invariant_enforced decisions
# Actor receives: plan description, enforced invariants, project context
while unresolved_ambiguities_remain(plan, context):
# 1. Identify a choice point
choice_point = analyze_context_for_ambiguity(context)
# 2. Evaluate options
options = generate_options(choice_point, context)
best_option = evaluate_options(options, context, invariants)
# 3. Record the decision via tool call
decision_id = record_decision(
decision_type = choice_point.type, # strategy_choice, subplan_spawn, etc.
@@ -193,10 +193,10 @@ def strategize(plan, context):
confidence_score = best_option.confidence,
rationale = best_option.rationale
)
# 4. Decision becomes part of the actor's context for subsequent reasoning
context.add_decision(decision_id)
# Result: a complete decision tree for this plan's strategy
```
@@ -165,7 +165,7 @@ When `agents plan correct <decision_id> --mode=revert` targets an Execute-phase
WARNING: The following resources cannot be rolled back (sandbox strategy: none):
- local/external-api
- local/notification-service
Resource changes since this decision will persist.
Proceed with rollback of other resources? [y/N]
```
@@ -179,7 +179,7 @@ When `agents plan correct <decision_id> --mode=revert` targets an Execute-phase
irreversible external effects:
- local/deploy-to-staging (1 invocation) — external deployment
- local/send-notification (2 invocations) — emails sent
Sandbox resources can be rolled back, but external effects cannot be undone.
Proceed? [y/N]
```
@@ -239,29 +239,29 @@ def compute_affected_subtree(target_decision_id: str) -> tuple[set[str], set[str
affected_decisions = {target_decision_id}
affected_plans = set()
queue = [target_decision_id]
while queue:
current = queue.pop(0)
# Follow structural tree children
children = db.query(
"SELECT decision_id FROM decisions "
"WHERE parent_decision_id = :current AND superseded_by IS NULL",
current=current
)
# Follow influence DAG dependents
dependents = db.query(
"SELECT downstream_ref FROM decision_dependencies "
"WHERE upstream_decision_id = :current AND dependency_type = 'decision'",
current=current
)
for decision_id in children | dependents:
if decision_id not in affected_decisions:
affected_decisions.add(decision_id)
queue.append(decision_id)
# Collect affected child plans
child_plans = db.query(
"SELECT downstream_ref FROM decision_dependencies "
@@ -269,7 +269,7 @@ def compute_affected_subtree(target_decision_id: str) -> tuple[set[str], set[str
current=current
)
affected_plans.update(child_plans)
return affected_decisions, affected_plans
```
@@ -76,7 +76,7 @@ blockdiag {
label = "Tier 2: Workers";
color = "#FCE4EC";
"Implementation Worker\n(issue-impl mode)" [color = "#C62828", textcolor = "#fff"];
"PR Reviewer" [color = "#C62828", textcolor = "#fff"];
"UAT Worker" [color = "#C62828", textcolor = "#fff"];
"Bug Hunter Worker" [color = "#C62828", textcolor = "#fff"];
@@ -3379,10 +3379,10 @@ FG --> BGR : cleanup old tickets
note bottom of FG
Tracking issues follow format:
[PREFIX] Type (Cycle N)
Announcements follow format:
[PREFIX] Announce: message
ALL carry "Automation Tracking" label
end note
@enduml
+1 -1
View File
@@ -240,7 +240,7 @@ for issue in automation_tracking_issues:
expected_interval = get_expected_interval(issue.agent_prefix, issue.type)
time_since_creation = now() - issue.created_at
staleness_threshold = expected_interval * 1.2 # 20% tolerance
if time_since_creation > staleness_threshold:
mark_agent_as_stalled(issue.agent_prefix)
trigger_recovery_actions(issue.agent_prefix, issue)
+28 -29
View File
@@ -59,7 +59,7 @@ Plan: Convert Firefox Renderer to Rust
├── [<span style="color: magenta;">strategy_choice</span>] Architecture approach: Start with leaf modules, work inward
│ Context: Analyzed module dependency graph, 2,847 modules total
│ Resources: module_graph.json, architecture_docs.md
├── [<span style="color: magenta;">subplan_parallel_spawn</span>] Phase 1: Convert utility libraries (no external deps)
│ └── [<span style="color: magenta;">subplan_spawn</span>] Convert string_utils module
│ └── Plan: 01KH29R8WPKPBHRY7Q0NA9XW86
@@ -87,21 +87,21 @@ During the Strategize phase, the strategy actor employs several mechanisms to co
<span style="opacity: 0.7;"># Pseudocode of what happens inside a strategy actor</span>
<span style="color: magenta; font-weight: 600;">def</span> <span style="color: cyan; font-weight: 600;">compute_closure_for_refactoring</span>(target_module):
closure = ResourceClosure()
<span style="opacity: 0.7;"># Direct file dependencies</span>
closure.add_files(find_imports(target_module))
closure.add_files(find_includes(target_module))
<span style="opacity: 0.7;"># Symbol dependencies</span>
<span style="color: magenta; font-weight: 600;">for</span> symbol <span style="color: magenta; font-weight: 600;">in</span> extract_exported_symbols(target_module):
closure.add_files(find_symbol_usage(symbol, scope=<span style="color: #66cc66;">&#x27;project&#x27;</span>))
<span style="opacity: 0.7;"># Test dependencies</span>
closure.add_files(find_tests_for_module(target_module))
<span style="opacity: 0.7;"># Build system dependencies</span>
closure.add_files(find_build_references(target_module))
<span style="color: magenta; font-weight: 600;">return</span> closure
</code></pre></div>
@@ -117,10 +117,10 @@ During the Strategize phase, the strategy actor employs several mechanisms to co
<span style="color: cyan; font-weight: 600;">decision_type</span>: subplan_spawn
<span style="color: cyan; font-weight: 600;">chosen_option</span>: <span style="color: #66cc66;">&quot;Refactor authentication module&quot;</span>
<span style="color: cyan; font-weight: 600;">downstream_plan_ids</span>: [&quot;plan-auth-refactor-123&quot;]
<span style="color: cyan; font-weight: 600;">artifacts_produced</span>:
<span style="color: cyan; font-weight: 600;">artifacts_produced</span>:
- <span style="color: cyan;">auth_module_files</span>: [&quot;auth.rs&quot;, &quot;auth_test.rs&quot;, &quot;auth_types.rs&quot;]
- <span style="color: cyan;">api_updates</span>: [&quot;api/v2/login.rs&quot;, &quot;api/v2/logout.rs&quot;]
<span style="opacity: 0.7;"># Parallel group of child plans</span>
<span style="color: cyan; font-weight: 600;">decision_type</span>: subplan_parallel_spawn
<span style="color: cyan; font-weight: 600;">chosen_option</span>: <span style="color: #66cc66;">&quot;Convert utility libraries in parallel&quot;</span>
@@ -137,14 +137,14 @@ STRATEGIZE PHASE:
- Identifies 847 C++ files in netwerk/ directory
- Traces public API surface (237 exported functions)
- Maps internal dependencies (1,432 internal calls)
2. Compute minimal closure for Phase 1 (DNS resolver):
- Core files: dns_resolver.cpp, dns_cache.cpp, dns_config.cpp (3 files)
- Direct dependencies: 12 files in netwerk/base/
- Test files: 8 test files specific to DNS
- Build files: 2 moz.build files
- Total closure: 25 files (not 847!)
3. Generate execution blueprint with child plans:
- [<span style="color: magenta;">subplan_parallel_spawn</span>] DNS module conversions:
- convert-dns-types: Closure of 5 files (type definitions)
@@ -183,7 +183,7 @@ The Firefox example would decompose into ~1,000 bounded child plans (grouped via
- Sandbox A1: Contains only auth/*.cpp, auth_tests/*.cpp
- Cannot see Plan B&#x27;s intermediate states
- Cannot accidentally depend on Plan B&#x27;s half-done work
Plan B (updating API endpoints):
- Sandbox B1: Contains only api/*.cpp, api_tests/*.cpp
- Makes changes assuming current auth interface
@@ -197,13 +197,13 @@ The Firefox example would decompose into ~1,000 bounded child plans (grouped via
- <span style="color: cyan;">Coordination</span>: Git&#x27;s three-way merge algorithm
- Conflict detection: Built into Git
- <span style="color: cyan;">Rollback</span>: git reset/checkout
<span style="color: cyan; font-weight: 600;">Databases</span>:
- <span style="color: cyan;">Strategy</span>: Transaction isolation
- <span style="color: cyan;">Coordination</span>: MVCC (multi-version concurrency control)
- Conflict detection: Serialization failures
- <span style="color: cyan;">Rollback</span>: Transaction abort
Cloud Infrastructure:
- <span style="color: cyan;">Strategy</span>: Terraform workspaces
- <span style="color: cyan;">Coordination</span>: State locking
@@ -217,7 +217,7 @@ The Firefox example would decompose into ~1,000 bounded child plans (grouped via
<span style="color: magenta; font-weight: 600;">def</span> <span style="color: cyan; font-weight: 600;">merge_subplan_results</span>(subplan_results):
<span style="opacity: 0.7;"># Group by resource type</span>
by_resource = group_by_resource_type(subplan_results)
<span style="opacity: 0.7;"># Apply resource-specific merge strategies</span>
<span style="color: magenta; font-weight: 600;">for</span> resource_type, changes <span style="color: magenta; font-weight: 600;">in</span> by_resource:
<span style="color: magenta; font-weight: 600;">if</span> resource_type == <span style="color: #66cc66;">&#x27;git-checkout&#x27;</span>:
@@ -226,7 +226,7 @@ The Firefox example would decompose into ~1,000 bounded child plans (grouped via
merge_fs_changes(changes) <span style="opacity: 0.7;"># Copy-on-write reconciliation</span>
<span style="color: magenta; font-weight: 600;">elif</span> resource_type.startswith(<span style="color: #66cc66;">&#x27;database&#x27;</span>):
merge_db_changes(changes) <span style="opacity: 0.7;"># Sequential application</span>
<span style="opacity: 0.7;"># Validate merged state</span>
run_integration_tests()
</code></pre></div>
@@ -248,14 +248,14 @@ Parent Plan: Refactor auth library
├── [<span style="color: magenta;">subplan_spawn</span>] Plan 1: Update auth library interface
│ Sandbox: Only auth library files
│ Output: New interface definition
├── Barrier: Wait for Plan 1 completion
├── [<span style="color: magenta;">subplan_parallel_spawn</span>] Plans 2-16: Update each service (in parallel)
│ Each sandbox: Only that service&#x27;s files
│ Each uses: New interface from Plan 1
│ No inter-service dependencies during execution
└── Merge Phase:
- Collect all service updates
- <span style="color: yellow; font-weight: 600;">Apply</span> to main branch in order
@@ -270,7 +270,7 @@ Parent Plan: Refactor auth library
Two child plans both modify api/user.rs:
- Plan A: Adds async fn get_user_profile()
- Plan B: Adds fn validate_user_permissions()
Merge strategy:
- Git merge succeeds (different functions)
- Semantic validation ensures both functions work together
@@ -351,7 +351,7 @@ Invariants are attached at four scopes (global, project, action, plan) and manag
)
<span style="opacity: 0.7;"># Apply precedence: plan &gt; project &gt; global</span>
<span style="color: magenta; font-weight: 600;">return</span> reconciler.reconcile(raw, precedence=[<span style="color: #66cc66;">&#x27;plan&#x27;</span>, <span style="color: #66cc66;">&#x27;project&#x27;</span>, <span style="color: #66cc66;">&#x27;global&#x27;</span>])
<span style="color: magenta; font-weight: 600;">def</span> <span style="color: cyan; font-weight: 600;">collect_all_invariants</span>(self, plan):
<span style="color: #66cc66;">&quot;&quot;&quot;Collect invariants from all scopes accessible to this plan.&quot;&quot;&quot;</span>
invariants = []
@@ -361,13 +361,13 @@ Invariants are attached at four scopes (global, project, action, plan) and manag
invariants.extend(self.get_action_invariants(plan.action))
invariants.extend(self.get_plan_invariants(plan))
<span style="color: magenta; font-weight: 600;">return</span> invariants
<span style="opacity: 0.7;"># Example invariants at different scopes:</span>
<span style="opacity: 0.7;"># Global: &quot;Payment processing must be idempotent&quot;</span>
<span style="opacity: 0.7;"># Project: &quot;Database transactions must complete within 5 seconds&quot;</span>
<span style="opacity: 0.7;"># Action: &quot;Test files must not import production secrets&quot;</span>
<span style="opacity: 0.7;"># Plan: &quot;All API calls over TCP must be mocked&quot;</span>
<span style="color: magenta; font-weight: 600;">def</span> <span style="color: cyan; font-weight: 600;">check_invariant_preservation</span>(self, changes, enforced_invariants):
<span style="color: magenta; font-weight: 600;">for</span> invariant <span style="color: magenta; font-weight: 600;">in</span> enforced_invariants:
<span style="color: magenta; font-weight: 600;">if</span> <span style="color: magenta; font-weight: 600;">not</span> self.verify_invariant(invariant, changes):
@@ -407,12 +407,12 @@ PROACTIVE CONTAINMENT IN ACTION:
- Detects: PaymentService.chargeCard() called after OrderCreated event
- Semantic issue: Payment before order confirmation violates business rules
- Automatic fix: Insert OrderConfirmed event requirement
3. Validation Node Catches Edge Case:
- Discovers: Audit service expects synchronous order numbers
- Impact: Async events break compliance reporting
- Resolution: Add audit event buffer with guaranteed ordering
4. Pre-<span style="color: yellow; font-weight: 600;">Apply</span> Semantic Verification:
- Simulates production event flow
- Detects: Under high load, events can arrive out of order
@@ -520,8 +520,8 @@ agents plan tree &lt;plan_id&gt;
<span style="opacity: 0.7;"># User knows gRPC would be better for this use case</span>
agents plan correct &lt;decision_id&gt; <span style="color: cyan;">--mode</span>=revert <span style="opacity: 0.7;">\</span>
<span style="color: cyan;">--guidance</span> &quot;Use gRPC instead of REST. This service requires streaming
updates and binary protocol efficiency. Set up protocol
<span style="color: cyan;">--guidance</span> &quot;Use gRPC instead of REST. This service requires streaming
updates and binary protocol efficiency. Set up protocol
buffer definitions and generate client/server stubs.&quot;
<span style="opacity: 0.7;"># System:</span>
@@ -553,10 +553,10 @@ True autonomy isn't about removing humans - it's about the system understanding
<span style="color: #66cc66;">&#x27;risk_assessment&#x27;</span>: self.evaluate_risk(decision),
<span style="color: #66cc66;">&#x27;invariant_complexity&#x27;</span>: self.analyze_invariants(decision)
}
confidence = self.compute_confidence(factors) <span style="opacity: 0.7;"># Returns 0.01.0</span>
threshold = profile.get_threshold(decision.flag) <span style="opacity: 0.7;"># From profile</span>
<span style="color: magenta; font-weight: 600;">if</span> confidence &gt;= threshold:
<span style="color: magenta; font-weight: 600;">return</span> ProceedAutonomously(decision, confidence)
<span style="color: magenta; font-weight: 600;">else</span>:
@@ -720,4 +720,3 @@ The difference between handling a 1,000 file project and a 100,000 file project
- More validation patterns (accumulate over time)
This isn't speculative architecture astronautics - it's applying proven distributed systems principles to AI agent coordination. The innovation is in the integration, not in requiring fundamental breakthroughs.
-1
View File
@@ -224,4 +224,3 @@ additional_properties: false
# maxValue -> max_value
# schemaVersion -> schema_version
# Legacy camelCase keys emit a warning but are accepted.
-1
View File
@@ -242,4 +242,3 @@ additional_properties: false
# sideEffects -> side_effects
# toolFilter -> tool_filter
# Legacy camelCase keys emit a warning but are accepted.
+1 -1
View File
@@ -29,4 +29,4 @@ Examples in this directory demonstrate:
---
*Examples in this directory are automatically generated from successful UAT test runs.*
*Examples in this directory are automatically generated from successful UAT test runs.*
@@ -79,7 +79,7 @@ $ python -m cleveragents project list
**Expected Output:**
```
Projects
Projects
┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Name ┃ Namespace ┃ Description ┃ Resources ┃ Created ┃
┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━┩
@@ -217,7 +217,7 @@ $ python -m cleveragents actor context list
**Expected Output:**
```
Context Files (1 total)
Context Files (1 total)
┏━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ File Path ┃ Type ┃ Size ┃ Added ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
@@ -292,7 +292,7 @@ $ python -m cleveragents session list
**Expected Output:**
```
Sessions
Sessions
┏━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓
┃ ID ┃ Name ┃ Actor ┃ Messages ┃ Updated ┃
┡━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩
@@ -413,7 +413,7 @@ $ python -m cleveragents project create local/my-webapp --description "A sample
# 3. List projects
$ python -m cleveragents project list
Projects
Projects
┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Name ┃ Namespace ┃ Description ┃ Resources ┃ Created ┃
┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━┩
@@ -439,7 +439,7 @@ $ python -m cleveragents actor context add src/main.py
# 6. List context
$ python -m cleveragents actor context list
Context Files (1 total)
Context Files (1 total)
┏━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ File Path ┃ Type ┃ Size ┃ Added ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
@@ -465,7 +465,7 @@ $ python -m cleveragents session create
# 8. List sessions
$ python -m cleveragents session list
Sessions
Sessions
┏━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓
┃ ID ┃ Name ┃ Actor ┃ Messages ┃ Updated ┃
┡━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩
+1 -1
View File
@@ -29,4 +29,4 @@ Examples cover common data formats:
---
*Examples in this directory are automatically generated from successful UAT test runs.*
*Examples in this directory are automatically generated from successful UAT test runs.*
+1 -1
View File
@@ -95,4 +95,4 @@ Now that you've seen how to [what was built], try these variations:
---
*This example was automatically generated and verified by the CleverAgents UAT system.*
*Feature area: [area] | Test cycle: [N] | Generated: [timestamp]*
*Feature area: [area] | Test cycle: [N] | Generated: [timestamp]*
+1 -1
View File
@@ -47,4 +47,4 @@ These examples are automatically generated by our UAT system. If you'd like to s
---
*Last updated: This index is automatically maintained by the CleverAgents UAT system.*
*Last updated: This index is automatically maintained by the CleverAgents UAT system.*
+1 -1
View File
@@ -29,4 +29,4 @@ Examples demonstrate various testing patterns:
---
*Examples in this directory are automatically generated from successful UAT test runs.*
*Examples in this directory are automatically generated from successful UAT test runs.*
-1
View File
@@ -43,4 +43,3 @@ automation_profile: trusted
invariants:
- "All existing tests must continue to pass"
- "Public API signatures must not change without deprecation"
-1
View File
@@ -56,4 +56,3 @@ inputs_schema:
- parquet
required:
- stages
-1
View File
@@ -47,4 +47,3 @@ invariants:
- "All findings must include reproducible steps"
- "Secrets found during scanning must be redacted in reports"
- "Remediation fixes must not break existing tests"
-1
View File
@@ -25,4 +25,3 @@ definition_of_done: |
reusable: true
read_only: true
state: available
-1
View File
@@ -16,4 +16,3 @@ definition_of_done: |
reusable: true
read_only: true
+1 -1
View File
@@ -34,4 +34,4 @@ context:
global:
conversation_mode: true
# Actor-specific context variables
default_actor: openai/gpt-4
default_actor: openai/gpt-4
+74 -74
View File
@@ -82,7 +82,7 @@ actors:
if not routed:
# Pass the user input along with the stage routing
result = f"GOTO_{stage.upper()}:{clean_input}"
print(f"DEBUG: returning: {result}", file=sys.stderr)
@@ -96,7 +96,7 @@ actors:
# Debug: print what we received
import sys
print(f"DEBUG command_handler: input_data='{input_data}'", file=sys.stderr)
# Extract the actual command from the input_data
# It comes as "GOTO_COMMAND_HANDLER:!next" from workflow_controller
msg = ''
@@ -104,27 +104,27 @@ actors:
parts = input_data.split(':', 1)
if len(parts) > 1:
msg = parts[1].strip()
# Fallback to checking context
if not msg:
msg = context.get('initial_message', '').strip()
# Last fallback
if not msg and input_data:
msg = input_data.strip() if input_data != 'GOTO_COMMAND_HANDLER' else ''
print(f"DEBUG command_handler: using msg='{msg}'", file=sys.stderr)
if not msg:
result = "COMMAND_OUTPUT:Error: No command provided"
else:
parts = msg.split(maxsplit=1)
command = parts[0]
args = parts[1] if len(parts) > 1 else ''
if command == '!help':
result = 'COMMAND_OUTPUT:Available Commands:\n!help - Shows this help message.\n!next [stage_name] - Advances to the next stage, or the one specified.\n!start - Start/run the current stage.\n!write - (section_writing) Proceed from source selection to writing the section.\n!proofread - (section_writing) Proceed from writing to proofreading.\n!accept - Accepts current content and proceeds to next section/stage.\n!stage - Describes the current stage.\n!stages - Lists all stages and marks the current one.\n!context [hops|all] - Shows current context. \'hops\' shows recent history, \'all\' shows full history.\n!finish - Automatically completes remaining stages using first-pass suggestions and citations.'
elif command == '!next':
current_stage = context.get('writing_stage') or 'intro'
stage_order = context.get('stage_order')
@@ -149,26 +149,26 @@ actors:
context['writing_stage'] = target_stage
# Trigger the stage flow immediately by routing to it with empty input
result = f"GOTO_{target_stage.upper()}:"
elif command == '!start':
# Start/run the current stage (useful after transitioning to a new stage)
current_stage = context.get('writing_stage') or 'intro'
result = f"GOTO_{current_stage.upper()}:"
elif command == '!write':
# Proceed from source selection to section writing
if context.get('writing_stage') == 'section_writing':
result = "GOTO_SECTION_WRITER:"
else:
result = "COMMAND_OUTPUT:!write is only available during section_writing stage"
elif command == '!proofread':
# Proceed from section writing to proofreading
if context.get('writing_stage') == 'section_writing':
result = "GOTO_SECTION_PROOFREADER:"
else:
result = "COMMAND_OUTPUT:!proofread is only available during section_writing stage"
elif command == '!accept':
# Accept current section and move to next
if context.get('writing_stage') == 'section_writing':
@@ -177,7 +177,7 @@ actors:
section_paths = context.get('section_paths', [])
new_index = current_index + 1
context['current_section_index'] = new_index
# Check if we've completed all sections
if new_index >= len(section_paths):
# Keep stage as section_writing so !next advances to paper_review
@@ -203,7 +203,7 @@ actors:
result = "Final stage complete."
except (ValueError, IndexError):
result = "Error advancing stage."
elif command == '!stage':
stage_descriptions = {
'intro': 'Introduction to the writing system.',
@@ -218,7 +218,7 @@ actors:
current_stage = context.get('writing_stage', 'unknown')
description = stage_descriptions.get(current_stage, 'No description available.')
result = f"COMMAND_OUTPUT:Current Stage: {current_stage}\nPurpose: {description}"
elif command == '!stages':
stage_order = context.get('stage_order', [])
current_stage = context.get('writing_stage', 'unknown')
@@ -227,7 +227,7 @@ actors:
marker = '-->' if stage == current_stage else ' '
lines.append(f"{marker} {stage}")
result = 'COMMAND_OUTPUT:' + '\n'.join(lines)
elif command == '!context':
import json
context_copy = dict(context)
@@ -245,7 +245,7 @@ actors:
output_str += "\n\n-- History --\n"
output_str += json.dumps(history_to_show, indent=2, default=str)
result = 'COMMAND_OUTPUT:' + output_str
elif command == '!finish':
required_fields = ['topic', 'length', 'audience', 'publication', 'format']
paper_details = context.get('paper_details', {}) or {}
@@ -263,7 +263,7 @@ actors:
context['auto_finish_active'] = True
context['auto_finish_state'] = {'expect': None}
result = "GOTO_AUTO_FINISH:START"
else:
result = f"COMMAND_OUTPUT:Unknown command: {command}"
@@ -482,22 +482,22 @@ actors:
context['auto_finish_last_output'] = message
auto_active = context.get('auto_finish_active', False)
final_stage = context.get('auto_finish_final_stage', False)
# Check if this is the final output (latex source was just saved)
# We detect this by checking if latex_source exists and message contains latex-related content
latex_source = context.get('latex_source', '')
is_latex_completion = bool(latex_source) and ('document' in message.lower() or 'latex' in message.lower() or 'assembled' in message.lower() or 'compile' in message.lower())
# If auto-finish just completed (final stage done), return the full paper content
if final_stage and is_latex_completion:
# Mark as complete now
context['auto_finish_active'] = False
context['auto_finish_final_stage'] = False
context['auto_finish_state'] = {}
section_count = len(context.get('section_paths') or [])
topic = context.get('paper_details', {}).get('topic', 'Unknown')
# Build the complete paper output
output_parts = []
output_parts.append("=" * 80)
@@ -506,16 +506,16 @@ actors:
output_parts.append(f"\nPaper: {topic}")
output_parts.append(f"Sections: {section_count}")
output_parts.append("")
# Include the paper content from section_content
section_content = context.get('section_content', {})
section_paths = context.get('section_paths', [])
if section_content:
output_parts.append("\n" + "=" * 80)
output_parts.append("PAPER CONTENT")
output_parts.append("=" * 80 + "\n")
for path in section_paths:
content = section_content.get(path, '')
if content:
@@ -527,18 +527,18 @@ actors:
output_parts.append(f"\n{'#' * (depth + 1)} {path.split(' > ')[-1]}\n")
output_parts.append(content)
output_parts.append("")
# Include LaTeX if available
if latex_source:
output_parts.append("\n" + "=" * 80)
output_parts.append("LATEX SOURCE")
output_parts.append("=" * 80 + "\n")
output_parts.append(latex_source)
output_parts.append("\n" + "=" * 80)
output_parts.append("All stages completed: brainstorming, vetting, structure, section writing, paper review, and LaTeX generation.")
output_parts.append("=" * 80)
result = '\n'.join(output_parts)
elif not auto_active:
# Auto-finish was manually deactivated or never active - just pass through
@@ -665,7 +665,7 @@ actors:
result = f"ROUTE_ASK_OTHER:{msg}"
else:
result = "DISCOVERY_RESPONSE:Discovery complete! All parameters set. Type !next to proceed to brainstorming."
print(f"DEBUG discovery_controller: returning: {result}", file=sys.stderr)
ask_topic:
@@ -845,29 +845,29 @@ actors:
- name: save_vetting
code: |
import json
# Extract sources from the special markers
sources = []
message = input_data
if 'SOURCES_JSON_START' in message and 'SOURCES_JSON_END' in message:
start_marker = 'SOURCES_JSON_START'
end_marker = 'SOURCES_JSON_END'
start_pos = message.find(start_marker)
end_pos = message.find(end_marker)
if start_pos != -1 and end_pos != -1:
json_start = start_pos + len(start_marker)
json_content = message[json_start:end_pos].strip()
try:
sources = json.loads(json_content)
if not isinstance(sources, list):
sources = []
except json.JSONDecodeError:
sources = []
# Update context
if sources:
context['vetting_sources'] = sources
@@ -1046,13 +1046,13 @@ actors:
# Check if we need to parse the TOC first
section_paths = context.get('section_paths')
fallback_sections = ['Introduction', 'Methods', 'Results', 'Discussion']
# Re-parse if section_paths is empty, None, or still the generic fallback
needs_parse = (
not section_paths or
section_paths == fallback_sections
)
if needs_parse:
toc_text = context.get('table_of_contents', '')
if not toc_text:
@@ -1174,9 +1174,9 @@ actors:
You are helping select relevant sources for writing ONE SPECIFIC section of the paper.
CURRENT SECTION TO WRITE: "{{ context.current_section_path }}"
Section progress: {{ context.current_section_index + 1 }} of {{ context.section_paths|length if context.section_paths else 'unknown' }}
{% if ' > ' in context.current_section_path %}
NOTE: This is a SUBSECTION - you will be writing detailed content for this specific topic.
{% else %}
@@ -1193,20 +1193,20 @@ actors:
{% else %}
No vetted sources have been captured yet. Let the user know and suggest running !next after the vetting stage completes.
{% endif %}
YOUR TASK:
When you receive ANY message (including just a section name, "suggest something", or any other input):
1. First, announce which section we're working on: "Now working on section: [section name]"
2. List the available sources with their numbers and brief descriptions
3. Recommend which sources are most relevant for THIS specific section and explain why
4. Ask the user if they want to use these sources, find additional ones, or have questions
You MUST always show the actual source citations and your recommendations - never skip this step!
If the user asks for changes to source selection or has questions, help them.
IMPORTANT: When the user is satisfied with the source selection, tell them to type !write to proceed to writing.
Example ending: "These sources should work well for this section. When you're ready, type !write to proceed to writing."
@@ -1263,29 +1263,29 @@ actors:
- name: save_found_sources
code: |
import json
# Extract sources from the special markers
sources = []
message = input_data
if 'SOURCES_JSON_START' in message and 'SOURCES_JSON_END' in message:
start_marker = 'SOURCES_JSON_START'
end_marker = 'SOURCES_JSON_END'
start_pos = message.find(start_marker)
end_pos = message.find(end_marker)
if start_pos != -1 and end_pos != -1:
json_start = start_pos + len(start_marker)
json_content = message[json_start:end_pos].strip()
try:
sources = json.loads(json_content)
if not isinstance(sources, list):
sources = []
except json.JSONDecodeError:
sources = []
# Update context with new sources (replaces existing since source_finder includes all)
if sources:
context['vetting_sources'] = sources
@@ -1303,19 +1303,19 @@ actors:
max_history: 20
system_prompt: |
You are writing EXACTLY ONE section: "{{ context.current_section_path }}"
Paper topic: {{ context.paper_details.topic }}
Paper focus: {{ context.brainstorming_summary }}
Target length: {{ context.paper_details.length }} words total
Target audience: {{ context.paper_details.audience }}
Complete section structure (for reference only - write ONLY the current section):
{% if context.section_paths %}
{% for path in context.section_paths %}
{{ ">>> " if path == context.current_section_path else " " }}{{ path }}
{% endfor %}
{% endif %}
Available sources:
{% if context.vetting_sources %}
{% for source in context.vetting_sources %}
@@ -1325,7 +1325,7 @@ actors:
CRITICAL INSTRUCTIONS:
1. Write ONLY the content for "{{ context.current_section_path }}" - nothing else.
2. Section type guidance:
{% if ' > ' in context.current_section_path %}
- This is a SUBSECTION ({{ context.current_section_path }})
@@ -1337,12 +1337,12 @@ actors:
- Do NOT write the subsection content here - those will be written separately
- Just provide a roadmap/overview of what the subsections will address
{% endif %}
3. Do NOT include:
- Content from other sections
- Subsection headers or subsection content (those are separate sections)
- A full treatment of the topic if this is a parent section
4. Use academic tone and cite sources appropriately.
YOUR TASK:
@@ -1350,14 +1350,14 @@ actors:
- Include proper academic citations from the available sources (e.g., Author et al., Year)
- Work with the user to refine the content based on their feedback
- If the user asks for changes, make them and present the revised content
RESPONSE FORMAT (MANDATORY):
SECTION_CONTENT:
<final section text>
NEXT_ACTION:
Type !proofread when you are satisfied with this section.
Do NOT include any other commentary, explanations, or conversational text. The SECTION_CONTENT block must contain only the section prose that will be stored in the paper.
section_writer_saver:
@@ -1464,16 +1464,16 @@ actors:
5. Look for logical inconsistencies or unclear arguments
6. Ensure smooth transitions and flow
7. Verify the content matches what the section should cover (based on the TOC)
YOUR TASK:
- Present your detailed proofreading feedback on the section content shown above
- List any issues found or confirm the section is well-written
- If the user asks you to make changes, make them and present the corrected version
- When you provide a fully revised section, respond with **only** `UPDATED_SECTION_CONTENT:` followed by the final section text. This allows the system to store the new content verbatim.
- Work with the user until they are satisfied with the section
IMPORTANT: When the user is satisfied with the proofread section, tell them to type !accept to accept the section and move to the next one.
Example ending: "The section looks good overall. Type !accept when you're ready to move to the next section."
@@ -1513,14 +1513,14 @@ actors:
section_content = context.get('section_content', {})
section_paths = context.get('section_paths', [])
# Debug: show what sections we have
print(f"DEBUG section_content has {len(section_content)} sections", file=sys.stderr)
print(f"DEBUG section_paths has {len(section_paths)} paths", file=sys.stderr)
for p in section_paths[:5]:
has_content = p in section_content
print(f"DEBUG path={p[:50]} has_content={has_content}", file=sys.stderr)
if not section_content:
result = "ERROR: No sections found. Please complete section writing stage first."
else:
@@ -1900,7 +1900,7 @@ routes:
target: auto_finish_driver
extract_message: true
separator: ":"
# Command output (non-routing command results) go directly to end
- match_type: prefix
@@ -1975,14 +1975,14 @@ routes:
target: section_accept_handler
extract_message: true
separator: ":"
- match_type: prefix
pattern: "GOTO_PAPER_REVIEW"
target: paper_review
extract_message: true
separator: ":"
- match_type: prefix
pattern: "GOTO_LATEX_GENERATION"
@@ -2105,9 +2105,9 @@ routes:
target: auto_finish_driver
extract_message: true
separator: ":"
# Paper review routing
- match_type: prefix
pattern: "ROUTE_REVIEW_PAPER"
target: paper_review_agent
@@ -2185,7 +2185,7 @@ routes:
auto_finish_passthrough:
type: actor
actor: auto_finish_passthrough
intro:
type: actor
actor: intro_agent
@@ -2291,14 +2291,14 @@ routes:
paper_review:
type: actor
actor: paper_review_controller
paper_review_actor:
type: actor
actor: paper_review_agent
metadata:
max_history_messages: 10
max_history_chars: 6000
paper_review_saver:
type: actor
actor: paper_review_saver
@@ -2528,7 +2528,7 @@ routes:
type: context_value
key: next_node
value: paper_review
- source: router
target: paper_review_agent
condition:
+4 -4
View File
@@ -16,19 +16,19 @@ routes:
simple_chat:
type: graph
entry_point: start
nodes:
# Process user input
process_input:
type: agent
agent: assistant
edges:
- source: start
target: process_input
- source: process_input
target: end
# Input stream that triggers the graph
chat_input:
type: stream
@@ -50,4 +50,4 @@ context:
app_name: "Simple LangGraph Chat"
# Actor-specific configuration
default_actor: openai/gpt-3.5-turbo
enable_actor_fallback: true
enable_actor_fallback: true
-1
View File
@@ -28,4 +28,3 @@ mcp_servers:
- create_pull_request
- list_repos
- get_file_contents
-1
View File
@@ -34,4 +34,3 @@ inline_tools:
type: string
required: ["text"]
writes: false
-1
View File
@@ -20,4 +20,3 @@ mcp_servers:
tool_filter:
exclude:
- delete_project
-1
View File
@@ -8,4 +8,3 @@ tools:
- name: builtin/read_file
- name: builtin/list_directory
- name: builtin/search_files
-1
View File
@@ -2,4 +2,3 @@
# Register: agents skill add --config validation-only.yaml
name: local/empty-skill
@@ -148,6 +148,3 @@ Feature: ActorRegistry.add() accepts spec-compliant actor YAML formats
Scenario: registry.add() propagates exception raised by upsert_actor
When upsert_actor is configured to raise RuntimeError and I add a valid YAML
Then a RuntimeError should have been propagated from add
@@ -9,12 +9,12 @@ Feature: Application Container Dependency Injection Coverage
When I request the application settings from the container
Then the container should return valid settings object
@phase1
@phase1
Scenario: Container project service method creates and returns service instance
Given I have initialized an application container
When I request a project service from the container
Then the container should return a valid project service instance
@phase1
Scenario: Container context service method creates and returns service instance
Given I have initialized an application container
+1 -1
View File
@@ -56,4 +56,4 @@ Feature: CLI Commands Full Coverage
Scenario: Project command group help
When I run project command with help
Then the project help should display
Then the project help should display
+2 -2
View File
@@ -34,7 +34,7 @@ Feature: CLI Main Coverage
Then it should return 0
Scenario: Direct main function call with help
When I call the main function directly with "--help"
When I call the main function directly with "--help"
Then it should return 0
Scenario: Direct main function call with bad command
@@ -47,4 +47,4 @@ Feature: CLI Main Coverage
Scenario: CLI handles system exit
When I run a command that calls sys.exit(1)
Then it should propagate the exit code correctly
Then it should propagate the exit code correctly
@@ -8,7 +8,7 @@ Feature: CLI help text removal of legacy commands
When the basic help text is printed
Then the help should not mention tell command
Scenario: _print_basic_help does not include "build" command
Scenario: _print_basic_help does not include "build" command
Given the CLI main help function is called
When the basic help text is printed
Then the help should not mention build command
+2 -2
View File
@@ -25,11 +25,11 @@ Feature: CLI Command Processing
Scenario: Main function handles arguments
When I call main with arguments "--version"
Then main should process the version flag
Scenario: Main function handles no arguments
When I call main with no arguments
Then main should display help
Scenario: Main function handles SystemExit
When I call main and CLI raises SystemExit 1
Then main should return 1
Then main should return 1
-2
View File
@@ -846,5 +846,3 @@ Feature: Consolidated Action
Then the action schema validation should succeed
And the action config model_dump should contain key "name"
And the action config model_dump should contain key "strategy_actor"
+1 -2
View File
@@ -1018,7 +1018,7 @@ Feature: Consolidated Actor
And the actor "local/legacy-yaml" should have schema_version "1.5"
# ============================================================
# Originally from: actor_runtime.feature
# Feature: Tool-Calling Actor Runtime
@@ -1359,4 +1359,3 @@ Feature: Consolidated Actor
When I start and invoke M2 MCP stub tool "mcp/fetch" with url "http://example.com"
Then the M2 MCP stub fetch result should have status 200
And the M2 MCP stub invocation log should have 1 entries
@@ -740,4 +740,3 @@ Feature: Consolidated Ai Models Providers
Given I have sample provider domain inputs
When I attempt to create an OpenRouter chat provider without an API key
Then the OpenRouter provider creation should fail with error "OpenRouter API key is required"
-1
View File
@@ -137,4 +137,3 @@ Feature: Consolidated Cli Misc
Given system cli branch module is loaded
When system cli branch render_info_rich is called with no storage
Then system cli branch no exception should be raised
-1
View File
@@ -668,4 +668,3 @@ Feature: Consolidated Config
Scenario: Nightly workflow uses at least 96.5 percent threshold
Given the nightly quality workflow file is loaded for coverage check
Then the nightly workflow should use a fail-under of at least 96.5
-1
View File
@@ -235,4 +235,3 @@ Feature: Consolidated Context
And the context view dump should have key "exclude_paths"
And the context view dump should have key "max_file_size"
And the context view dump should have key "max_total_size"
-1
View File
@@ -909,4 +909,3 @@ Feature: Consolidated Correction
When I compute affected subtree for "R" with tree "R->A,B,C,D,E"
Then the affected subtree should be exactly "R,A,B,C,D,E" in order
And the affected subtree count should be 6
-1
View File
@@ -481,4 +481,3 @@ Feature: Consolidated Decision
When I decision persistence create a decision with a 2000 character rationale
And I decision persistence round-trip the decision through model_dump
Then the decision persistence restored rationale length should be 2000
-1
View File
@@ -2000,4 +2000,3 @@ Feature: Consolidated Misc
And I write a temp YAML file with template content
When I call load_file with template context on direct engine
Then the direct file result should contain rendered values
@@ -959,4 +959,3 @@ Feature: Consolidated Plan Model Lifecycle
And an uncovered-lines subplan on attempt 1 that failed with no error message
When the uncovered-lines failure handler evaluates whether to retry the failed work
Then the uncovered-lines failed work should not be retried
@@ -956,4 +956,3 @@ Feature: Consolidated Quality Review
And the playbook should contain the text "P1"
And the playbook should contain the text "P2"
And the playbook should contain the text "P3"
-1
View File
@@ -859,4 +859,3 @@ Feature: Consolidated Sandbox
Given the sandbox factory is available
When the compatible strategies for an unknown resource type are queried
Then the factory should return only the none strategy as compatible
-1
View File
@@ -1136,4 +1136,3 @@ Feature: Consolidated Security
And a secure template context key "name" with value "Bob"
When I render via the legacy TemplateRenderer
Then the secure template output should be "Bob"
-1
View File
@@ -1234,4 +1234,3 @@ Feature: Consolidated Skill
Then the skill_resolver result should contain tool "local/inline-test/_anon_0"
And the skill_resolver result should contain tool "local/inline-test/_anon_1"
And the skill_resolver inline tool at index 1 should be marked inline
-2
View File
@@ -1021,5 +1021,3 @@ Feature: Consolidated Tool
And a registered tool spec named "test/excl-validation" typed as "validation"
When I list tools with tool_type "tool"
Then the tool list should contain 0 tools
+1 -1
View File
@@ -9,7 +9,7 @@ Feature: Context Commands Unit Tests
When the context add command is executed with valid paths
Then files should be added successfully with output
@phase1
@phase1
Scenario: Context add with non-existent path error
Given a mock context service is configured
When the context add command is executed with non-existent path
+1 -1
View File
@@ -29,4 +29,4 @@ Feature: Maximum Code Coverage
Scenario: Test __main__ if clause
When I test the __main__ module if clause
Then the if __name__ clause should execute
Then the if __name__ clause should execute
+1 -1
View File
@@ -204,4 +204,4 @@ Feature: Database Infrastructure Models and Repositories
When I retrieve contexts for the plan
Then I should get a list of domain Context models
When I retrieve changes for the plan
Then I should get a list of domain Change models
Then I should get a list of domain Change models
+1 -1
View File
@@ -77,4 +77,4 @@ Feature: Database Repository Operations
And I have a project repository
When I attempt a failing transaction
Then the transaction should be rolled back
And no data should be persisted
And no data should be persisted
+1 -1
View File
@@ -7,4 +7,4 @@ Feature: Complete Main Module Coverage
Scenario: Test actual if __name__ == "__main__" execution
When I run the __main__ module as a script with --version
Then the version should be displayed
And the exit code should be 0
And the exit code should be 0
+1 -1
View File
@@ -43,4 +43,4 @@ Feature: Module Entry Points Coverage
Scenario: Test CLI shortcuts
When I use CLI shortcut commands
Then shortcuts should map to full commands
Then shortcuts should map to full commands
-1
View File
@@ -64,4 +64,3 @@ Feature: OpenAI chat provider coverage
When I request plan generation from the OpenAI provider
Then the OpenAI provider response should report error "graph exploded"
And the OpenAI provider response should contain no generated changes
@@ -136,4 +136,4 @@ Feature: Plan Lifecycle Service coverage boost round 3
And an action "local/apply-fail-cleanup" exists for coverage boost r3
And a plan in apply phase with processing state for r3
When I fail apply on the plan with error "Container cleanup test"
Then the plan should be in errored state and cleanup should have been called
Then the plan should be in errored state and cleanup should have been called
+1 -1
View File
@@ -113,4 +113,4 @@ Feature: Project Service Coverage
Scenario: Create project with extremely long name
Given I want to create a project with a very long name
When I create the project with 300 character name
Then the project name should be truncated appropriately
Then the project name should be truncated appropriately
+3 -9
View File
@@ -221,9 +221,7 @@ def step_host_path_result_true(context: Any, path: str) -> None:
)
@given(
'a file "{name}" with content "{content}" at "{absolute_path}"'
)
@given('a file "{name}" with content "{content}" at "{absolute_path}"')
def step_create_file_at_absolute_path(
context: Any, name: str, content: str, absolute_path: str
) -> None:
@@ -250,18 +248,14 @@ def step_check_host_path(context: Any, path: str) -> None:
def step_result_is_true(context: Any) -> None:
"""Assert that the most recent host path containment check returned True."""
result: bool = getattr(context, "_host_path_result", False)
assert result is True, (
f"Expected host path check to return True but got {result}"
)
assert result is True, f"Expected host path check to return True but got {result}"
@then("the host containment result should be false")
def step_result_is_false(context: Any) -> None:
"""Assert that the most recent host path containment check returned False."""
result: bool = getattr(context, "_host_path_result", True)
assert result is False, (
f"Expected host path check to return False but got {result}"
)
assert result is False, f"Expected host path check to return False but got {result}"
# ---------------------------------------------------------------------------
+1 -1
View File
@@ -120,4 +120,4 @@ Feature: Stdio MCP Transport
Given an MCP server config using the stdio stub server
And a connected stdio transport
When I send a "test/custom_notification" notification with params {}
Then the MCP stdio transport should still be connected
Then the MCP stdio transport should still be connected
-1
View File
@@ -49,4 +49,3 @@ Reject Invalid Action YAML
Log ${result.stdout}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} action-schema-expected-fail
+3 -3
View File
@@ -315,7 +315,7 @@ Context Policy - Verify Strategize View
... msg=resolved strategize view should include docs/**/*.md
# ----------------------------------------------------------------------- # 3. Budget Enforcement — max_file_size / max_total_size
# -----------------------------------------------------------------------
# -----------------------------------------------------------------------
Budget Enforcement — Create Project With Tight Budget
[Documentation] Create a project, link resource, and set tight budget constraints.
[Tags] E2E tdd_issue tdd_issue_4188 tdd_expected_fail
@@ -387,7 +387,7 @@ Budget Enforcement — Simulate Context Assembly (Structural)
... msg=total_tokens should be numeric
# ----------------------------------------------------------------------- # 4. Context Analysis — meaningful summaries
# -----------------------------------------------------------------------
# -----------------------------------------------------------------------
Context Analysis — Create Project With ACMS Config
[Documentation] Create a project and configure ACMS pipeline parameters.
... Uses **non-default** values to avoid vacuous assertions —
@@ -509,7 +509,7 @@ Context Analysis - Show Full Policy With ACMS Config
... msg=ACMS cold_max_decisions should be 3500 (configured value)
# ----------------------------------------------------------------------- # 5. Plan Execution — ACMS context with real LLM calls
# -----------------------------------------------------------------------
# -----------------------------------------------------------------------
Plan Execution — Create Project And Configure ACMS
[Documentation] Set up a project with ACMS context for plan tests.
[Tags] E2E tdd_issue tdd_issue_4188 tdd_expected_fail
-19
View File
@@ -318,22 +318,3 @@ WF04 Multi Project Dependency Update Supervised Profile
Skip If No LLM Keys
# Initialise test variable for teardown access.
Set Test Variable ${WF04_PLAN_ID} ${EMPTY}
-22
View File
@@ -121,25 +121,3 @@ WF05 Database Schema Migration With Safety Nets Review Profile
Skip If No LLM Keys
# Initialise test variable for teardown access.
Set Test Variable ${WF05_PLAN_ID} ${EMPTY}
-17
View File
@@ -126,20 +126,3 @@ WF12 Large Scale Hierarchical Feature Implementation
[Timeout] 35 minutes
# TDD placeholder - implementation pending
Fail WF12 hierarchical decomposition not yet implemented (TDD placeholder)
-12
View File
@@ -132,15 +132,3 @@ WF16 Devcontainer Driven Development Supervised Profile
Skip If No LLM Keys
${ac_checks_missing}= Evaluate []
Set Test Variable ${WF16_PLAN_ID} ${EMPTY}
-4
View File
@@ -125,7 +125,3 @@ WF17 TDD Precedence Level 2 Project Override Resolution
[Timeout] 10 minutes
# TDD placeholder - test implementation pending
Skip Test implementation pending for precedence level 2 project override resolution
-1
View File
@@ -80,4 +80,3 @@ Should Contain Any
IF ${status} RETURN
END
Fail Text does not contain any of: @{patterns}
-1
View File
@@ -257,4 +257,3 @@ Length Should Be Greater Than
[Documentation] Check if text length is greater than minimum
${length}= Get Length ${text}
Should Be True ${length} > ${min_length} Text length ${length} is not greater than ${min_length}
+1 -1
View File
@@ -1198,4 +1198,4 @@ main_loop() {
exit 0
}
main_loop
main_loop

Some files were not shown because too many files have changed in this diff Show More