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:
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -141,7 +141,7 @@ permission:
|
||||
"*FORGEJO_PAT*": deny
|
||||
"*FORGEJO_USERNAME*": deny
|
||||
"*FORGEJO_PASSWORD*": deny
|
||||
|
||||
|
||||
"*force_merge*": deny
|
||||
"*sudo*": 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
|
||||
|
||||
@@ -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_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
|
||||
|
||||
@@ -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 +0,0 @@
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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;">'project'</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;">"Refactor authentication module"</span>
|
||||
<span style="color: cyan; font-weight: 600;">downstream_plan_ids</span>: ["plan-auth-refactor-123"]
|
||||
<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>: ["auth.rs", "auth_test.rs", "auth_types.rs"]
|
||||
- <span style="color: cyan;">api_updates</span>: ["api/v2/login.rs", "api/v2/logout.rs"]
|
||||
|
||||
|
||||
<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;">"Convert utility libraries in parallel"</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's intermediate states
|
||||
- Cannot accidentally depend on Plan B'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'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;">'git-checkout'</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;">'database'</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'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 > project > global</span>
|
||||
<span style="color: magenta; font-weight: 600;">return</span> reconciler.reconcile(raw, precedence=[<span style="color: #66cc66;">'plan'</span>, <span style="color: #66cc66;">'project'</span>, <span style="color: #66cc66;">'global'</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;">"""Collect invariants from all scopes accessible to this plan."""</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: "Payment processing must be idempotent"</span>
|
||||
<span style="opacity: 0.7;"># Project: "Database transactions must complete within 5 seconds"</span>
|
||||
<span style="opacity: 0.7;"># Action: "Test files must not import production secrets"</span>
|
||||
<span style="opacity: 0.7;"># Plan: "All API calls over TCP must be mocked"</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 <plan_id>
|
||||
|
||||
<span style="opacity: 0.7;"># User knows gRPC would be better for this use case</span>
|
||||
agents plan correct <decision_id> <span style="color: cyan;">--mode</span>=revert <span style="opacity: 0.7;">\</span>
|
||||
<span style="color: cyan;">--guidance</span> "Use gRPC instead of REST. This service requires streaming
|
||||
updates and binary protocol efficiency. Set up protocol
|
||||
<span style="color: cyan;">--guidance</span> "Use gRPC instead of REST. This service requires streaming
|
||||
updates and binary protocol efficiency. Set up protocol
|
||||
buffer definitions and generate client/server stubs."
|
||||
|
||||
<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;">'risk_assessment'</span>: self.evaluate_risk(decision),
|
||||
<span style="color: #66cc66;">'invariant_complexity'</span>: self.analyze_invariants(decision)
|
||||
}
|
||||
|
||||
|
||||
confidence = self.compute_confidence(factors) <span style="opacity: 0.7;"># Returns 0.0–1.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 >= 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.
|
||||
|
||||
|
||||
@@ -224,4 +224,3 @@ additional_properties: false
|
||||
# maxValue -> max_value
|
||||
# schemaVersion -> schema_version
|
||||
# Legacy camelCase keys emit a warning but are accepted.
|
||||
|
||||
|
||||
@@ -242,4 +242,3 @@ additional_properties: false
|
||||
# sideEffects -> side_effects
|
||||
# toolFilter -> tool_filter
|
||||
# Legacy camelCase keys emit a warning but are accepted.
|
||||
|
||||
|
||||
@@ -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 ┃
|
||||
┡━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩
|
||||
|
||||
@@ -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.*
|
||||
|
||||
@@ -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]*
|
||||
|
||||
@@ -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.*
|
||||
|
||||
@@ -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.*
|
||||
|
||||
@@ -43,4 +43,3 @@ automation_profile: trusted
|
||||
invariants:
|
||||
- "All existing tests must continue to pass"
|
||||
- "Public API signatures must not change without deprecation"
|
||||
|
||||
|
||||
@@ -56,4 +56,3 @@ inputs_schema:
|
||||
- parquet
|
||||
required:
|
||||
- stages
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -25,4 +25,3 @@ definition_of_done: |
|
||||
reusable: true
|
||||
read_only: true
|
||||
state: available
|
||||
|
||||
|
||||
@@ -16,4 +16,3 @@ definition_of_done: |
|
||||
|
||||
reusable: true
|
||||
read_only: true
|
||||
|
||||
|
||||
@@ -34,4 +34,4 @@ context:
|
||||
global:
|
||||
conversation_mode: true
|
||||
# Actor-specific context variables
|
||||
default_actor: openai/gpt-4
|
||||
default_actor: openai/gpt-4
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -28,4 +28,3 @@ mcp_servers:
|
||||
- create_pull_request
|
||||
- list_repos
|
||||
- get_file_contents
|
||||
|
||||
|
||||
@@ -34,4 +34,3 @@ inline_tools:
|
||||
type: string
|
||||
required: ["text"]
|
||||
writes: false
|
||||
|
||||
|
||||
@@ -20,4 +20,3 @@ mcp_servers:
|
||||
tool_filter:
|
||||
exclude:
|
||||
- delete_project
|
||||
|
||||
|
||||
@@ -8,4 +8,3 @@ tools:
|
||||
- name: builtin/read_file
|
||||
- name: builtin/list_directory
|
||||
- name: builtin/search_files
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -80,4 +80,3 @@ Should Contain Any
|
||||
IF ${status} RETURN
|
||||
END
|
||||
Fail Text does not contain any of: @{patterns}
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user