Skip to content

fix: CodeRabbit auto-fixes for PR #13 - #15

Closed
coderabbitai[bot] wants to merge 80 commits into
manus/novel-workfrom
coderabbitai/autofix/40feea7
Closed

coderabbitai[bot] wants to merge 80 commits into
manus/novel-workfrom
coderabbitai/autofix/40feea7

Conversation

@coderabbitai

@coderabbitai coderabbitai Bot commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

This stacked PR contains CodeRabbit auto-fixes for #13.

Files modified:

  • archwiz/archwiz.py
  • archwiz/linear_sync.py
  • archwiz/restore_version.py
  • deepcli/deepcli/core.py
  • docs/evaluations/manus/REPORT.md
  • docs/proposals/active/manus-critical-eval/ITEMS.md

Open in Devin Review

Summary by CodeRabbit

  • New Features

    • Added NexusCLI for sessions, chat, file uploads, conversation branching, and Markdown/JSON exports.
    • Added model routing across available free-tier providers with usage tracking and fallback handling.
    • Added automated issue triage, pull-request reviews, feedback tracking, and wiki publishing workflows.
    • Added a Rich-based live dashboard and improved CLI help display.
    • Added full-text message search and faster project indexing.
  • Bug Fixes

    • Improved network compatibility, subprocess error reporting, restore-path safety, and interrupt handling.
    • Strengthened task matching and content-hash reliability.
  • Documentation

    • Expanded architecture, setup, Termux testing, operations, security, and workflow guidance.

timerloggedout-spec and others added 4 commits August 2, 2026 14:43
Add critical evaluation of the termux-monorepo architecture, detailing branch topology, security concerns, and recommendations for improvement prior to Merging.
Added detailed repository audit findings, including branch inventory, pull request evaluations, architectural strengths, risks, and recommendations for improvement.

Added content from the links.
Added initial proposal for ChatGPT integration and repository improvements.
Fixed 6 file(s) based on 10 unresolved review comments.

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
@vercel

vercel Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
termux-monorepo Ready Ready Preview, v0 Aug 4, 2026 11:20pm

@coderabbitai

coderabbitai Bot commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor Author

Review Change Stack

Caution

Review failed

Failed to post review comments.

We encountered an issue with GitHub. Use @coderabbitai full review to retry the review.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 6f6465f8-43d4-4233-991b-45b6484ab3b1

📥 Commits

Reviewing files that changed from the base of the PR and between d133872 and 20e9c0b.

📒 Files selected for processing (95)
  • .Jules/palette.md
  • .coderabbit.yaml
  • .github/actions/http-llm-invoke/action.yml
  • .github/actions/model-router/action.yml
  • .github/workflows/agent-feedback-linear-sync.yml
  • .github/workflows/agent-jules-on-issues.yml
  • .github/workflows/agent-review-auto-jules.yml
  • .github/workflows/gemini-after-peers.yml
  • .github/workflows/gemini-dispatch.yml
  • .github/workflows/gemini-invoke.yml
  • .github/workflows/gemini-review.yml
  • .github/workflows/gemini-triage.yml
  • .github/workflows/peer-review-orchestrator.yml
  • .github/workflows/publish-wiki.yml
  • .jules/bolt.md
  • AGENTS.md
  • GEMINI.md
  • README.md
  • archwiz/archwiz.py
  • bin/lean-monorepo.sh
  • cli-synthegration/synthegration_index.py
  • deepcli-tui/tui.py
  • deepcli/deepcli/core.py
  • docs/AGENTIC-BUILDERS-VS-REVIEWERS.md
  • docs/AGENTIC-CICD-FREE-TIER.md
  • docs/ARCHW1Z-GATE.md
  • docs/ARCHW1Z-OPERATOR-CHECKLIST.md
  • docs/ARCHW1Z-STATUS.md
  • docs/CONSENSUS.md
  • docs/PR-SUMMARY-LOG.md
  • docs/PR-SUMMARY-PROCESS.md
  • docs/SECURITY-REMEDIATION.md
  • docs/TERMUX-SMOKE.md
  • docs/ops/AGENT_AUTO_RESOLVE.md
  • docs/ops/JULES_ADE_PROJECT.md
  • docs/ops/JULES_REPO_ROSTER.yaml
  • docs/ops/LEAN_TERMUX_MONOREPO.md
  • docs/proposals/AGENTIC-PERMISSIONS.md
  • docs/proposals/ChatGPT-initial.md
  • docs/proposals/ChatGPT_Critical-Eval(TER0-15+other-branches).md
  • docs/proposals/ChatGPT_droidApp.md
  • docs/proposals/PROCESS.md
  • docs/proposals/README.md
  • docs/proposals/_template/MANIFEST.md
  • docs/proposals/active/chatgpt-critical-eval/ITEMS.md
  • docs/proposals/active/chatgpt-critical-eval/MANIFEST.md
  • docs/proposals/active/chatgpt-droidapp/ITEMS.md
  • docs/proposals/active/chatgpt-droidapp/MANIFEST.md
  • docs/proposals/active/chatgpt-initial/ITEMS.md
  • docs/proposals/active/chatgpt-initial/MANIFEST.md
  • docs/proposals/active/kimi-cloud-offload/DEBATE.md
  • docs/proposals/active/kimi-cloud-offload/ITEMS.md
  • docs/proposals/active/kimi-cloud-offload/MANIFEST.md
  • docs/proposals/active/rate-limit-rotation/ITEMS.md
  • docs/proposals/active/rate-limit-rotation/MANIFEST.md
  • docs/proposals/active/user/gates.md
  • docs/proposals/corrected_cloud_offload_evaluation.md
  • docs/proposals/registry.yaml
  • docs/schemas/llm-leaderboard-matrix.yaml
  • docs/schemas/model-rotation.yaml
  • docs/schemas/model-success-matrix.yaml
  • docs/schemas/provider-capabilities.md
  • docs/schemas/routing-priority.yaml
  • docs/schemas/session-ssot.md
  • docs/security/local-identity-hygiene.md
  • exchanges/yobit.py
  • multi-ai-cli/backends/claude_web.py
  • multi-ai-cli/backends/colab.py
  • multi-ai-cli/backends/deepseek.py
  • multi-ai-cli/backends/gemini_web.py
  • nexuscli/README.md
  • nexuscli/__init__.py
  • nexuscli/cli/__init__.py
  • nexuscli/cli/main.py
  • nexuscli/core/__init__.py
  • nexuscli/core/api.py
  • nexuscli/nexuscli.py
  • nexuscli/pow_solver.js
  • nexuscli/requirements.txt
  • scripts/model_router.py
  • src/context_collector.py
  • src/db.py
  • termux-multi-agent/dashboard.py
  • termux-multi-agent/provision_agent.py
  • termux-multi-agent/run.py
  • termux-multi-agent/src/db.py
  • termux-multi-agent/workspace/run.py
  • tests/test_db_optimized.py
  • tests/test_model_router.py
  • wiki/Architecture.md
  • wiki/DeepWiki-Mirror.md
  • wiki/Home.md
  • wiki/Navigation.md
  • wiki/_Sidebar.md
  • workspace/llm_map/master_tasks.json
💤 Files with no reviewable changes (1)
  • exchanges/yobit.py
⚠️ CI failures not shown inline (1)

Commit Status: ci/gitlab/gitlab.com: ci/gitlab/gitlab.com

Conclusion: failure

Pipeline failed on GitLab
🧰 Additional context used
📓 Path-based instructions (7)
**/*

📄 CodeRabbit inference engine (AGENTS.md)

**/*: For integration work, target master-staging rather than raw master.
Cite Implements: <ITEM-ID> on pull requests and commits.
Do not wholesale-merge PR #6 (TER-9) or PR #2 (Rust CI); follow their disposition comments.
Do not add Class 3/4 artifacts to git, including session stores, browser profiles, and tokens.
Unposted chat is not consensus; record decisions in a Review log or DEBATE.md.
Follow the execution loop: consult registry.yaml, select a todo item, branch from master-staging, implement it, open a PR with Implements: ID, pass both gates, merge, and update ITEMS.md status.
Credential rotation and history rewrites require Operator (human) authorization; consult docs/SECURITY-REMEDIATION.md.

**/*: Target master-staging for integration work; do not target raw master.
Do not commit Class 3 or Class 4 artifacts, including session stores, browser profiles, tokens, or credentials.
Prefer minimal diffs.
Preserve Sentinel security permissions of 0o600 or 0o700 when touching credential or session paths.
When changing code that affects credential or session caches, enforce strict permissions and never log secrets.

Files:

  • workspace/llm_map/master_tasks.json
  • docs/proposals/active/chatgpt-droidapp/ITEMS.md
  • nexuscli/nexuscli.py
  • docs/ARCHW1Z-GATE.md
  • docs/proposals/active/rate-limit-rotation/MANIFEST.md
  • docs/proposals/active/kimi-cloud-offload/MANIFEST.md
  • docs/proposals/active/chatgpt-initial/ITEMS.md
  • nexuscli/requirements.txt
  • docs/proposals/active/kimi-cloud-offload/DEBATE.md
  • nexuscli/cli/__init__.py
  • docs/proposals/active/user/gates.md
  • nexuscli/__init__.py
  • docs/proposals/corrected_cloud_offload_evaluation.md
  • bin/lean-monorepo.sh
  • docs/proposals/_template/MANIFEST.md
  • docs/proposals/active/chatgpt-critical-eval/ITEMS.md
  • docs/ops/JULES_ADE_PROJECT.md
  • docs/schemas/routing-priority.yaml
  • wiki/Home.md
  • AGENTS.md
  • docs/ops/AGENT_AUTO_RESOLVE.md
  • wiki/_Sidebar.md
  • README.md
  • docs/CONSENSUS.md
  • docs/PR-SUMMARY-LOG.md
  • docs/proposals/active/rate-limit-rotation/ITEMS.md
  • nexuscli/README.md
  • docs/AGENTIC-CICD-FREE-TIER.md
  • docs/schemas/model-rotation.yaml
  • docs/ops/LEAN_TERMUX_MONOREPO.md
  • docs/security/local-identity-hygiene.md
  • wiki/Navigation.md
  • docs/ops/JULES_REPO_ROSTER.yaml
  • docs/schemas/provider-capabilities.md
  • docs/schemas/session-ssot.md
  • GEMINI.md
  • wiki/DeepWiki-Mirror.md
  • termux-multi-agent/workspace/run.py
  • docs/schemas/model-success-matrix.yaml
  • docs/ARCHW1Z-OPERATOR-CHECKLIST.md
  • docs/proposals/AGENTIC-PERMISSIONS.md
  • deepcli/deepcli/core.py
  • docs/proposals/active/chatgpt-droidapp/MANIFEST.md
  • docs/proposals/README.md
  • tests/test_db_optimized.py
  • docs/ARCHW1Z-STATUS.md
  • wiki/Architecture.md
  • nexuscli/core/__init__.py
  • archwiz/archwiz.py
  • docs/proposals/active/chatgpt-critical-eval/MANIFEST.md
  • docs/proposals/active/chatgpt-initial/MANIFEST.md
  • docs/TERMUX-SMOKE.md
  • docs/proposals/active/kimi-cloud-offload/ITEMS.md
  • multi-ai-cli/backends/colab.py
  • src/context_collector.py
  • termux-multi-agent/run.py
  • docs/schemas/llm-leaderboard-matrix.yaml
  • docs/SECURITY-REMEDIATION.md
  • nexuscli/pow_solver.js
  • docs/proposals/ChatGPT_droidApp.md
  • multi-ai-cli/backends/deepseek.py
  • docs/PR-SUMMARY-PROCESS.md
  • termux-multi-agent/dashboard.py
  • docs/AGENTIC-BUILDERS-VS-REVIEWERS.md
  • multi-ai-cli/backends/gemini_web.py
  • cli-synthegration/synthegration_index.py
  • deepcli-tui/tui.py
  • multi-ai-cli/backends/claude_web.py
  • termux-multi-agent/provision_agent.py
  • tests/test_model_router.py
  • nexuscli/cli/main.py
  • docs/proposals/ChatGPT-initial.md
  • docs/proposals/PROCESS.md
  • docs/proposals/registry.yaml
  • scripts/model_router.py
  • termux-multi-agent/src/db.py
  • src/db.py
  • nexuscli/core/api.py
  • docs/proposals/ChatGPT_Critical-Eval(TER0-15+other-branches).md
docs/proposals/active/**/ITEMS.md

📄 CodeRabbit inference engine (AGENTS.md)

Do not invent work outside an active proposal's ITEMS.md; add a row first.

Files:

  • docs/proposals/active/chatgpt-droidapp/ITEMS.md
  • docs/proposals/active/chatgpt-initial/ITEMS.md
  • docs/proposals/active/chatgpt-critical-eval/ITEMS.md
  • docs/proposals/active/rate-limit-rotation/ITEMS.md
  • docs/proposals/active/kimi-cloud-offload/ITEMS.md
docs/proposals/active/**

📄 CodeRabbit inference engine (AGENTS.md)

To close a proposal, ensure all items are terminal, record the Review log outcome, move active/ to closed/, and update the registry.

Files:

  • docs/proposals/active/chatgpt-droidapp/ITEMS.md
  • docs/proposals/active/rate-limit-rotation/MANIFEST.md
  • docs/proposals/active/kimi-cloud-offload/MANIFEST.md
  • docs/proposals/active/chatgpt-initial/ITEMS.md
  • docs/proposals/active/kimi-cloud-offload/DEBATE.md
  • docs/proposals/active/user/gates.md
  • docs/proposals/active/chatgpt-critical-eval/ITEMS.md
  • docs/proposals/active/rate-limit-rotation/ITEMS.md
  • docs/proposals/active/chatgpt-droidapp/MANIFEST.md
  • docs/proposals/active/chatgpt-critical-eval/MANIFEST.md
  • docs/proposals/active/chatgpt-initial/MANIFEST.md
  • docs/proposals/active/kimi-cloud-offload/ITEMS.md
docs/proposals/active/*/ITEMS.md

📄 CodeRabbit inference engine (GEMINI.md)

Do not invent work outside docs/proposals/active/<id>/ITEMS.md; add a row first when needed.

Files:

  • docs/proposals/active/chatgpt-droidapp/ITEMS.md
  • docs/proposals/active/chatgpt-initial/ITEMS.md
  • docs/proposals/active/chatgpt-critical-eval/ITEMS.md
  • docs/proposals/active/rate-limit-rotation/ITEMS.md
  • docs/proposals/active/kimi-cloud-offload/ITEMS.md
AGENTS.md

📄 CodeRabbit inference engine (GEMINI.md)

Read AGENTS.md first for the full agent contract.

Files:

  • AGENTS.md
docs/SECURITY-REMEDIATION.md

📄 CodeRabbit inference engine (GEMINI.md)

Consult docs/SECURITY-REMEDIATION.md for security remediation guidance.

Files:

  • docs/SECURITY-REMEDIATION.md
docs/PR-SUMMARY-PROCESS.md

📄 CodeRabbit inference engine (AGENTS.md)

PR body rewrites must follow the roster in docs/PR-SUMMARY-PROCESS.md; rewriting is not restricted to a single agent.

Files:

  • docs/PR-SUMMARY-PROCESS.md
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: timerloggedout-spec/termux-monorepo

Timestamp: 2026-08-10T06:25:21.629Z
Learning: Cite `Implements: <ITEM-ID>` on pull requests and commits when applicable.
Learnt from: CR
Repo: timerloggedout-spec/termux-monorepo

Timestamp: 2026-08-10T06:25:21.629Z
Learning: Respect the existing agent orchestration involving Jules, CodeRabbit, and the automatic Jules trigger on bot feedback.
Learnt from: CR
Repo: timerloggedout-spec/termux-monorepo

Timestamp: 2026-08-10T06:25:21.629Z
Learning: Treat Jules as the primary builder; perform triage, review, or analysis unless explicitly asked to implement.
Learnt from: CR
Repo: timerloggedout-spec/termux-monorepo

Timestamp: 2026-08-10T06:25:21.629Z
Learning: Before recommending or making file changes, check open agent pull requests linked to the same issue or touching the same area.
Learnt from: CR
Repo: timerloggedout-spec/termux-monorepo

Timestamp: 2026-08-10T06:25:21.629Z
Learning: Do not edit files already present in another open agent pull request for the same issue unless that pull request is closed or clearly superseded.
Learnt from: CR
Repo: timerloggedout-spec/termux-monorepo

Timestamp: 2026-08-10T06:25:21.629Z
Learning: Prefer disjoint file sets; when overlap is unavoidable, post an agent-claim comment identifying the agent, issue, files, and pull request.
Learnt from: CR
Repo: timerloggedout-spec/termux-monorepo

Timestamp: 2026-08-10T06:25:21.629Z
Learning: After Jules opens a pull request, review it instead of starting a parallel implementation.
Learnt from: CR
Repo: timerloggedout-spec/termux-monorepo

Timestamp: 2026-08-10T06:25:21.629Z
Learning: Prefer reviewing prior open pull requests listed in workflow context over duplicating work.
Learnt from: CR
Repo: timerloggedout-spec/termux-monorepo

Timestamp: 2026-08-10T06:25:21.629Z
Learning: Credential rotation requires human Operator authorization.
Learnt from: CR
Repo: timerloggedout-spec/termux-monorepo

Timestamp: 2026-08-10T06:25:21.629Z
Learning: If a task is ambiguous or requires Operator authority, state that clearly and stop.
🪛 actionlint (1.7.12)
.github/workflows/agent-jules-on-issues.yml

[error] 102-102: context "secrets" is not allowed here. available contexts are "env", "github", "inputs", "job", "matrix", "needs", "runner", "steps", "strategy", "vars". see https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability for more details

(expression)


[error] 138-138: context "secrets" is not allowed here. available contexts are "env", "github", "inputs", "job", "matrix", "needs", "runner", "steps", "strategy", "vars". see https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability for more details

(expression)


[error] 232-232: context "secrets" is not allowed here. available contexts are "env", "github", "inputs", "job", "matrix", "needs", "runner", "steps", "strategy", "vars". see https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability for more details

(expression)

🪛 ast-grep (0.45.0)
archwiz/archwiz.py

[info] 196-202: use secrets package over random package
Context: random.choice([
"ArchWiz signing off. Forge well.",
"Until next cycle. Stay l33T.",
"Dashboard closed. The Forge awaits.",
"ArchWiz out. Happy hacking.",
"Systems stable. ArchWiz offline."
])
Note: [CWE-330] Use of Insufficiently Random Values.

(avoid-random-python)

src/context_collector.py

[warning] 70-70: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(os.path.join(self.workspace, active_target_file), 'r')
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)

tests/test_model_router.py

[info] 44-50: use jsonify instead of json.dumps for JSON output
Context: json.dumps({
"data": [
{"id": "meta-llama/llama-3.3-70b-instruct:free", "pricing": {"prompt": "0", "completion": "0"}},
{"id": "google/gemma-3-12b-it:free", "pricing": {"prompt": "0", "completion": "0"}},
{"id": "paid/model-example", "pricing": {"prompt": "0.0015", "completion": "0.002"}}
]
})
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[info] 80-84: use jsonify instead of json.dumps for JSON output
Context: json.dumps({
"data": [
{"id": "google/gemma-4-31b-it:free", "pricing": {"prompt": "0", "completion": "0"}}
]
})
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)

nexuscli/cli/main.py

[info] 75-75: use jsonify instead of json.dumps for JSON output
Context: json.dumps(cfg, indent=2)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[warning] 169-169: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(args.output, "w")
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)

scripts/model_router.py

[warning] 39-39: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(filepath, 'r', encoding='utf-8')
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[warning] 177-177: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(cache_file, "r")
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[warning] 194-194: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(cache_file, "w")
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[warning] 219-219: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(filename, 'r')
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[warning] 234-234: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(filename, 'w')
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[warning] 363-363: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(os.environ["GITHUB_OUTPUT"], "a")
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[warning] 404-404: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(os.environ["GITHUB_OUTPUT"], "a")
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[warning] 420-420: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(os.environ["GITHUB_OUTPUT"], "a")
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[warning] 440-440: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(os.environ["GITHUB_OUTPUT"], "a")
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[warning] 133-133: Request-controlled URL passed to urlopen; validate against an allowlist to prevent SSRF.
Context: urllib.request.urlopen(req, timeout=5)
Note: [CWE-918] Server-Side Request Forgery (SSRF).

(urlopen-unsanitized-data)


[info] 17-17: Do not hardcode temporary file or directory names
Context: "/tmp/model-router"
Note: [CWE-377] Insecure Temporary File.

(hardcoded-tmp-file)

termux-multi-agent/src/db.py

[error] 87-91: Avoid command injection
Context: subprocess.check_output(
["ast-grep", "run", "--pattern", ".*", "--json", abs_path],
cwd="/data/data/com.termux/files/home/termux-multi-agent",
text=True
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(command-injection-python)


[error] 96-100: Avoid command injection
Context: subprocess.check_output(
["ast-grep", "run", "--pattern", import_pattern, "--json", abs_path],
cwd="/data/data/com.termux/files/home/termux-multi-agent",
text=True
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(command-injection-python)


[error] 87-91: Command coming from incoming request
Context: subprocess.check_output(
["ast-grep", "run", "--pattern", ".*", "--json", abs_path],
cwd="/data/data/com.termux/files/home/termux-multi-agent",
text=True
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)


[error] 96-100: Command coming from incoming request
Context: subprocess.check_output(
["ast-grep", "run", "--pattern", import_pattern, "--json", abs_path],
cwd="/data/data/com.termux/files/home/termux-multi-agent",
text=True
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)

src/db.py

[error] 102-102: Avoid command injection
Context: subprocess.check_output(["ast-grep", "scan", "--json", abs_path], text=True)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(command-injection-python)


[error] 107-109: Avoid command injection
Context: subprocess.check_output(
["ast-grep", "scan", "--pattern", import_pattern, "--json", abs_path], text=True
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(command-injection-python)


[warning] 73-73: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(rh_file, 'a')
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[error] 102-102: Command coming from incoming request
Context: subprocess.check_output(["ast-grep", "scan", "--json", abs_path], text=True)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)


[error] 107-109: Command coming from incoming request
Context: subprocess.check_output(
["ast-grep", "scan", "--pattern", import_pattern, "--json", abs_path], text=True
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)

nexuscli/core/api.py

[info] 396-396: use secrets package over random package
Context: random.uniform(0, base_delay)
Note: [CWE-330] Use of Insufficiently Random Values.

(avoid-random-python)


[info] 407-407: use secrets package over random package
Context: random.uniform(0, 3)
Note: [CWE-330] Use of Insufficiently Random Values.

(avoid-random-python)


[error] 194-200: Command coming from incoming request
Context: subprocess.run(
["node", str(WASM_SOLVER)],
input=inp,
capture_output=True,
text=True,
timeout=10,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)


[warning] 104-104: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(path)
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[warning] 116-116: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(path, "w")
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[warning] 277-277: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(file_path, "rb")
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)


[info] 133-133: use jsonify instead of json.dumps for JSON output
Context: json.dumps(cfg, indent=2)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[info] 192-192: use jsonify instead of json.dumps for JSON output
Context: json.dumps(challenge)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[info] 216-216: use jsonify instead of json.dumps for JSON output
Context: json.dumps(payload)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[info] 559-559: use jsonify instead of json.dumps for JSON output
Context: json.dumps(messages, indent=2)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)

🪛 LanguageTool
docs/ARCHW1Z-GATE.md

[uncategorized] ~28-~28: The official name of this software platform is spelled with a capital “H”.
Context: ... scripts/ci/repo_gate.py ``` Workflow: .github/workflows/repo-gate.yml Docs: this fil...

(GITHUB)


[uncategorized] ~64-~64: The official name of this software platform is spelled with a capital “H”.
Context: ... # for agents ``` Workflow: .github/workflows/termux-smoke.yml Full docs: ...

(GITHUB)

docs/proposals/active/kimi-cloud-offload/MANIFEST.md

[uncategorized] ~31-~31: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...and un-pause jules-worker-pool path. Full text lives on branch `docs/kimi-cloud-offl...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[uncategorized] ~46-~46: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...(registered, not yet accepted) - Notes: Full body stays on debate branch until Tier 2–3 a...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

docs/proposals/active/user/gates.md

[grammar] ~6-~6: Use a hyphen to join words.
Context: ... lot going on. Each PR ought to be a sub branch of each of termux-smoke and `ma...

(QB_NEW_EN_HYPHEN)

wiki/Home.md

[uncategorized] ~10-~10: The official name of this software platform is spelled with a capital “H”.
Context: ... in-repo under wiki/ and published by .github/workflows/publish-wiki.yml on every pu...

(GITHUB)

README.md

[grammar] ~40-~40: Use a hyphen to join words.
Context: ...fic background constraints? ``` ° Termux specific considerations. ° Termux is the...

(QB_NEW_EN_HYPHEN)


[grammar] ~50-~50: Ensure spelling is correct
Context: ...r Considerations). ## HIGH PRIORITY INTIALIZE: https://github.com/marketplace/render...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

docs/proposals/active/rate-limit-rotation/ITEMS.md

[uncategorized] ~6-~6: The official name of this software platform is spelled with a capital “H”.
Context: ... composite action | P0 | grok | done | .github/actions/model-router | | RL-03 | Wire t...

(GITHUB)

nexuscli/README.md

[style] ~143-~143: Consider using a more formal and expressive alternative to ‘amazing’.
Context: ...azing-feature) 3. Commit your changes (git commit -m 'Add amazing feature') 4. Push to the branch (git ...

(AWESOME)

wiki/DeepWiki-Mirror.md

[uncategorized] ~15-~15: The official name of this software platform is spelled with a capital “H”.
Context: ...ory (Markdown pages). 2. Publisher: .github/workflows/publish-wiki.yml runs `Andre...

(GITHUB)

docs/proposals/README.md

[uncategorized] ~20-~20: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ... debate branches | Pointer on master | Full text branch | Notes | |-------------------|-...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

docs/proposals/ChatGPT_droidApp.md

[style] ~119-~119: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ment variables, paths, feature flags). Whether long-running automation is resilient to...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~121-~121: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...process death and storage constraints. Whether AI-generated code has been normalized t...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

docs/proposals/ChatGPT-initial.md

[style] ~13-~13: Consider a different adjective to strengthen your wording.
Context: ...r, even though I can inspect it. --- Deeper Review After reading the latest README...

(DEEP_PROFOUND)


[style] ~76-~76: Consider using a more formal and expressive alternative to ‘awesome’.
Context: ...tes Historical Timeline 🤣 That's awesome... ...until six months from now. Then...

(AWESOME)


[style] ~231-~231: Consider using an extreme adjective for ‘interesting’.
Context: ... This is where I think things could get really interesting. I'd add an automatic repository intel...

(EXTREME_ADJECTIVES)

docs/proposals/ChatGPT_Critical-Eval(TER0-15+other-branches).md

[style] ~13-~13: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...-is. Do not merge the Rust CI PR as-is. Do not treat PR #3's session-store deletio...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[uncategorized] ~65-~65: The official name of this software platform is spelled with a capital “H”.
Context: ...re strategically valuable than PR #2: .github/workflows/repo-gate.yml scripts/ci/rep...

(GITHUB)


[style] ~88-~88: Consider an alternative for the overused word “exactly”.
Context: ...ium, no device dependencies. That is exactly the correct philosophy for this reposit...

(EXACTLY_PRECISELY)


[uncategorized] ~136-~136: “Discover” is a proper noun and needs to be capitalized.
Context: ...doc. That is not valid Python. So the discover job can fail before the actual crate di...

(A_GOOGLE)


[style] ~216-~216: The adverb ‘never’ is usually put between ‘have’ and ‘become’.
Context: ...s contain things that absolutely should never have become repository content: conversation histo...

(ADVERB_WORD_ORDER)


[grammar] ~429-~429: Ensure spelling is correct
Context: ...ick command named list shadows Python's builtin list. Then unrelated calls such as: l...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[style] ~443-~443: Consider an alternative for the overused word “exactly”.
Context: ...iers but pass empty histories. This is exactly the kind of bug that makes an abstracti...

(EXACTLY_PRECISELY)


[style] ~1429-~1429: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ession identity. One provider contract. One dispatch event model. One provenance mo...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~1430-~1430: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...der contract. One dispatch event model. One provenance model. One content-addressed...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~1431-~1431: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...atch event model. One provenance model. One content-addressed evidence layer. One c...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~1432-~1432: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: .... One content-addressed evidence layer. One cheap invariant gate. Then let DeepForg...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

🪛 markdownlint-cli2 (0.23.2)
.Jules/palette.md

[warning] 1-1: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 1-1: First line in a file should be a top-level heading

(MD041, first-line-heading, first-line-h1)

docs/proposals/active/user/gates.md

[warning] 1-1: First line in a file should be a top-level heading

(MD041, first-line-heading, first-line-h1)

docs/ops/JULES_ADE_PROJECT.md

[warning] 6-6: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

wiki/_Sidebar.md

[warning] 1-1: First line in a file should be a top-level heading

(MD041, first-line-heading, first-line-h1)

README.md

[warning] 1-1: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 2-2: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 39-39: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 44-44: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 50-50: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

nexuscli/README.md

[warning] 80-80: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/ops/LEAN_TERMUX_MONOREPO.md

[warning] 14-14: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 15-15: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 21-21: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 22-22: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 38-38: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 39-39: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 43-43: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 44-44: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 53-53: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 73-73: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/schemas/session-ssot.md

[warning] 7-7: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

GEMINI.md

[warning] 23-23: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 23-23: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 29-29: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 35-35: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/TERMUX-SMOKE.md

[warning] 9-9: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

.jules/bolt.md

[warning] 5-5: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

docs/proposals/ChatGPT_droidApp.md

[warning] 157-157: Ordered list item prefix
Expected: 1; Actual: 2; Style: 1/1/1

(MD029, ol-prefix)


[warning] 173-173: Ordered list item prefix
Expected: 1; Actual: 3; Style: 1/1/1

(MD029, ol-prefix)


[warning] 290-290: Ordered list item prefix
Expected: 1; Actual: 2; Style: 1/1/1

(MD029, ol-prefix)


[warning] 306-306: Ordered list item prefix
Expected: 1; Actual: 3; Style: 1/1/1

(MD029, ol-prefix)


[warning] 343-343: Ordered list item prefix
Expected: 1; Actual: 4; Style: 1/1/1

(MD029, ol-prefix)

docs/AGENTIC-BUILDERS-VS-REVIEWERS.md

[warning] 40-40: Ordered list item prefix
Expected: 1; Actual: 5; Style: 1/1/1

(MD029, ol-prefix)

docs/proposals/ChatGPT-initial.md

[warning] 1-1: First line in a file should be a top-level heading

(MD041, first-line-heading, first-line-h1)

docs/proposals/PROCESS.md

[warning] 9-9: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/proposals/ChatGPT_Critical-Eval(TER0-15+other-branches).md

[warning] 1-1: First line in a file should be a top-level heading

(MD041, first-line-heading, first-line-h1)


[warning] 61-61: Ordered list item prefix
Expected: 1; Actual: 2; Style: 1/1/1

(MD029, ol-prefix)


[warning] 122-122: Ordered list item prefix
Expected: 1; Actual: 3; Style: 1/1/1

(MD029, ol-prefix)


[warning] 198-198: Ordered list item prefix
Expected: 1; Actual: 4; Style: 1/1/1

(MD029, ol-prefix)


[warning] 274-274: Ordered list item prefix
Expected: 1; Actual: 5; Style: 1/2/3

(MD029, ol-prefix)


[warning] 277-277: Ordered list item prefix
Expected: 2; Actual: 6; Style: 1/2/3

(MD029, ol-prefix)


[warning] 286-286: Ordered list item prefix
Expected: 1; Actual: 5; Style: 1/1/1

(MD029, ol-prefix)


[warning] 361-361: Ordered list item prefix
Expected: 1; Actual: 6; Style: 1/1/1

(MD029, ol-prefix)


[warning] 528-528: Ordered list item prefix
Expected: 1; Actual: 7; Style: 1/1/1

(MD029, ol-prefix)


[warning] 572-572: Ordered list item prefix
Expected: 1; Actual: 2; Style: 1/1/1

(MD029, ol-prefix)


[warning] 588-588: Ordered list item prefix
Expected: 1; Actual: 3; Style: 1/1/1

(MD029, ol-prefix)


[warning] 607-607: Ordered list item prefix
Expected: 1; Actual: 8; Style: 1/1/1

(MD029, ol-prefix)


[warning] 651-651: Ordered list item prefix
Expected: 1; Actual: 9; Style: 1/1/1

(MD029, ol-prefix)


[warning] 692-692: Ordered list item prefix
Expected: 1; Actual: 10; Style: 1/1/1

(MD029, ol-prefix)


[warning] 728-728: Ordered list item prefix
Expected: 1; Actual: 11; Style: 1/1/1

(MD029, ol-prefix)


[warning] 775-775: Ordered list item prefix
Expected: 1; Actual: 12; Style: 1/1/1

(MD029, ol-prefix)


[warning] 818-818: Ordered list item prefix
Expected: 1; Actual: 13; Style: 1/1/1

(MD029, ol-prefix)


[warning] 851-851: Ordered list item prefix
Expected: 1; Actual: 14; Style: 1/1/1

(MD029, ol-prefix)


[warning] 888-888: Ordered list item prefix
Expected: 1; Actual: 15; Style: 1/1/1

(MD029, ol-prefix)


[warning] 942-942: Ordered list item prefix
Expected: 1; Actual: 16; Style: 1/1/1

(MD029, ol-prefix)


[warning] 991-991: Ordered list item prefix
Expected: 1; Actual: 17; Style: 1/1/1

(MD029, ol-prefix)


[warning] 1010-1010: Ordered list item prefix
Expected: 1; Actual: 18; Style: 1/1/1

(MD029, ol-prefix)


[warning] 1047-1047: Ordered list item prefix
Expected: 1; Actual: 19; Style: 1/1/1

(MD029, ol-prefix)


[warning] 1090-1090: Ordered list item prefix
Expected: 1; Actual: 20; Style: 1/1/1

(MD029, ol-prefix)


[warning] 1118-1118: Ordered list item prefix
Expected: 1; Actual: 21; Style: 1/1/1

(MD029, ol-prefix)


[warning] 1151-1151: Ordered list item prefix
Expected: 1; Actual: 22; Style: 1/1/1

(MD029, ol-prefix)


[warning] 1203-1203: Ordered list item prefix
Expected: 1; Actual: 23; Style: 1/1/1

(MD029, ol-prefix)


[warning] 1207-1207: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1208-1208: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1209-1209: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1210-1210: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1211-1211: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1212-1212: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1213-1213: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1214-1214: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1219-1219: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1221-1221: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1223-1223: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1225-1225: No space after hash on atx style heading

(MD018, no-missing-space-atx)


[warning] 1239-1239: Ordered list item prefix
Expected: 1; Actual: 24; Style: 1/1/1

(MD029, ol-prefix)


[warning] 1292-1292: Ordered list item prefix
Expected: 1; Actual: 5; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1295-1295: Ordered list item prefix
Expected: 2; Actual: 6; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1298-1298: Ordered list item prefix
Expected: 3; Actual: 7; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1301-1301: Ordered list item prefix
Expected: 4; Actual: 8; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1307-1307: Ordered list item prefix
Expected: 1; Actual: 9; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1310-1310: Ordered list item prefix
Expected: 2; Actual: 10; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1313-1313: Ordered list item prefix
Expected: 3; Actual: 11; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1316-1316: Ordered list item prefix
Expected: 4; Actual: 12; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1322-1322: Ordered list item prefix
Expected: 1; Actual: 13; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1325-1325: Ordered list item prefix
Expected: 2; Actual: 14; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1328-1328: Ordered list item prefix
Expected: 3; Actual: 15; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1331-1331: Ordered list item prefix
Expected: 4; Actual: 16; Style: 1/2/3

(MD029, ol-prefix)


[warning] 1338-1338: Ordered list item prefix
Expected: 1; Actual: 25; Style: 1/1/1

(MD029, ol-prefix)


[warning] 1377-1377: Ordered list item prefix
Expected: 1; Actual: 26; Style: 1/1/1

(MD029, ol-prefix)

🪛 OSV Scanner (2.4.0)
nexuscli/requirements.txt

[MEDIUM] 1-1: idna 3.9.0: undefined

(PYSEC-2026-215)


[MEDIUM] 1-1: idna 3.9.0: Internationalized Domain Names in Applications (IDNA): Specially crafted inputs to idna.encode() can bypass CVE-2024-3651 fix

(GHSA-65pc-fj4g-8rjx)

🪛 Pylint (4.0.6)
nexuscli/nexuscli.py

[error] 12-12: Unable to import 'cli.main'

(E0401)


[convention] 12-12: Import "from cli.main import main" should be placed at the top of the module

(C0413)

termux-multi-agent/workspace/run.py

[convention] 90-90: Import outside toplevel (sqlite3)

(C0415)


[convention] 91-91: Import outside toplevel (src.db.DB_PATH)

(C0415)


[warning] 99-99: Catching too general exception Exception

(W0718)


[error] 97-97: Unexpected keyword argument 'conn' in function call

(E1123)


[warning] 104-104: Catching too general exception Exception

(W0718)

deepcli/deepcli/core.py

[warning] 14-14: Catching too general exception Exception

(W0718)


[warning] 28-28: Missing timeout argument for method 'standard_requests.get' can cause your program to hang indefinitely

(W3101)


[warning] 31-31: Missing timeout argument for method 'standard_requests.post' can cause your program to hang indefinitely

(W3101)


[warning] 34-34: Missing timeout argument for method 'standard_requests.put' can cause your program to hang indefinitely

(W3101)


[warning] 37-37: Missing timeout argument for method 'standard_requests.delete' can cause your program to hang indefinitely

(W3101)

tests/test_db_optimized.py

[convention] 36-36: Line too long (111/100)

(C0301)


[convention] 93-93: Line too long (110/100)

(C0301)


[error] 3-3: Unable to import 'pytest'

(E0401)


[error] 5-5: Unable to import 'src.db'

(E0401)


[refactor] 54-59: Unnecessary "else" after "return", remove the "else" and de-indent the code inside it

(R1705)


[warning] 51-51: Unused argument 'cmd'

(W0613)


[warning] 51-51: Unused argument 'kwargs'

(W0613)


[error] 88-88: Unable to import 'src.db'

(E0401)


[convention] 88-88: Import outside toplevel (src.db.batch_insert_fts_messages, src.db.search_fts_messages)

(C0415)


[convention] 4-4: standard import "subprocess" should be placed before third party import "pytest"

(C0411)


[warning] 1-1: Unused import os

(W0611)


[warning] 3-3: Unused import pytest

(W0611)


[warning] 5-5: Unused DB_PATH imported from src.db

(W0611)

archwiz/archwiz.py

[warning] 39-39: Catching too general exception Exception

(W0718)

multi-ai-cli/backends/colab.py

[warning] 4-4: Catching too general exception Exception

(W0718)


[warning] 18-18: Missing timeout argument for method 'standard_requests.get' can cause your program to hang indefinitely

(W3101)


[warning] 21-21: Missing timeout argument for method 'standard_requests.post' can cause your program to hang indefinitely

(W3101)


[warning] 24-24: Missing timeout argument for method 'standard_requests.put' can cause your program to hang indefinitely

(W3101)


[warning] 27-27: Missing timeout argument for method 'standard_requests.delete' can cause your program to hang indefinitely

(W3101)

src/context_collector.py

[convention] 58-58: Line too long (115/100)

(C0301)


[convention] 61-61: Line too long (101/100)

(C0301)


[convention] 64-64: Line too long (104/100)

(C0301)


[convention] 73-73: Line too long (112/100)

(C0301)


[warning] 71-71: Using open without explicitly specifying an encoding

(W1514)

termux-multi-agent/run.py

[convention] 73-73: Line too long (239/100)

(C0301)


[convention] 87-87: Import outside toplevel (sqlite3)

(C0415)


[convention] 88-88: Import outside toplevel (src.db.DB_PATH)

(C0415)


[warning] 96-96: Catching too general exception Exception

(W0718)


[warning] 101-101: Catching too general exception Exception

(W0718)

multi-ai-cli/backends/deepseek.py

[warning] 5-5: Catching too general exception Exception

(W0718)


[warning] 19-19: Missing timeout argument for method 'standard_requests.get' can cause your program to hang indefinitely

(W3101)


[warning] 22-22: Missing timeout argument for method 'standard_requests.post' can cause your program to hang indefinitely

(W3101)


[warning] 25-25: Missing timeout argument for method 'standard_requests.put' can cause your program to hang indefinitely

(W3101)


[warning] 28-28: Missing timeout argument for method 'standard_requests.delete' can cause your program to hang indefinitely

(W3101)

termux-multi-agent/dashboard.py

[convention] 63-63: Line too long (115/100)

(C0301)


[convention] 66-66: Line too long (112/100)

(C0301)


[warning] 38-38: Catching too general exception Exception

(W0718)


[refactor] 43-43: Too many local variables (17/15)

(R0914)

multi-ai-cli/backends/gemini_web.py

[warning] 4-4: Catching too general exception Exception

(W0718)


[warning] 18-18: Missing timeout argument for method 'standard_requests.get' can cause your program to hang indefinitely

(W3101)


[warning] 21-21: Missing timeout argument for method 'standard_requests.post' can cause your program to hang indefinitely

(W3101)


[warning] 24-24: Missing timeout argument for method 'standard_requests.put' can cause your program to hang indefinitely

(W3101)


[warning] 27-27: Missing timeout argument for method 'standard_requests.delete' can cause your program to hang indefinitely

(W3101)

cli-synthegration/synthegration_index.py

[convention] 37-37: Import outside toplevel (struct)

(C0415)


[convention] 44-44: Import outside toplevel (struct)

(C0415)


[convention] 132-132: Import outside toplevel (struct)

(C0415)


[error] 133-133: Instance of '_CodexIndex_v1' has no 'session_id' member

(E1101)


[error] 134-134: Instance of '_CodexIndex_v1' has no 'message_index' member

(E1101)


[error] 134-134: Instance of '_CodexIndex_v1' has no 'block_index' member

(E1101)


[error] 135-135: Instance of '_CodexIndex_v1' has no 'content_hash' member

(E1101)


[convention] 139-139: Import outside toplevel (struct)

(C0415)


[convention] 348-348: Line too long (116/100)

(C0301)


[error] 341-341: Instance of 'CodexIndex' has no 'blobs' member

(E1101)


[warning] 348-348: Using open without explicitly specifying an encoding

(W1514)


[warning] 348-348: Using open without explicitly specifying an encoding

(W1514)


[warning] 348-348: Using open without explicitly specifying an encoding

(W1514)

deepcli-tui/tui.py

[convention] 293-293: Line too long (108/100)

(C0301)

multi-ai-cli/backends/claude_web.py

[warning] 4-4: Catching too general exception Exception

(W0718)


[warning] 18-18: Missing timeout argument for method 'standard_requests.get' can cause your program to hang indefinitely

(W3101)


[warning] 21-21: Missing timeout argument for method 'standard_requests.post' can cause your program to hang indefinitely

(W3101)


[warning] 24-24: Missing timeout argument for method 'standard_requests.put' can cause your program to hang indefinitely

(W3101)


[warning] 27-27: Missing timeout argument for method 'standard_requests.delete' can cause your program to hang indefinitely

(W3101)

tests/test_model_router.py

[convention] 47-47: Line too long (108/100)

(C0301)


[convention] 147-147: Line too long (122/100)

(C0301)


[convention] 150-150: Line too long (106/100)

(C0301)


[error] 5-5: Unable to import 'pytest'

(E0401)


[error] 10-10: Unable to import 'scripts.model_router'

(E0401)


[convention] 10-10: Import "import scripts.model_router as mr" should be placed at the top of the module

(C0413)


[warning] 69-69: Raising too general exception: Exception

(W0719)


[warning] 89-89: Unused argument 'args'

(W0613)


[warning] 89-89: Unused argument 'kwargs'

(W0613)


[convention] 6-6: standard import "unittest.mock.MagicMock" should be placed before third party import "pytest"

(C0411)


[warning] 5-5: Unused import pytest

(W0611)

nexuscli/cli/main.py

[convention] 211-211: Line too long (110/100)

(C0301)


[error] 18-27: Unable to import 'core.api'

(E0401)


[convention] 18-27: Import "from core.api import get_token, create_session, fetch_sessions, get_history, stream_completion, send_message, export_markdown, export_json" should be placed at the top of the module

(C0413)


[warning] 45-45: Unused argument 'args'

(W0613)


[warning] 70-70: Catching too general exception Exception

(W0718)


[warning] 79-79: Catching too general exception Exception

(W0718)


[warning] 130-130: Catching too general exception Exception

(W0718)


[warning] 170-170: Using open without explicitly specifying an encoding

(W1514)


[warning] 174-174: Catching too general exception Exception

(W0718)

scripts/model_router.py

[convention] 162-162: Line too long (110/100)

(C0301)


[convention] 206-206: Line too long (110/100)

(C0301)


[convention] 260-260: Line too long (104/100)

(C0301)


[convention] 303-303: Line too long (102/100)

(C0301)


[convention] 317-317: Line too long (117/100)

(C0301)


[convention] 324-324: Line too long (137/100)

(C0301)


[convention] 327-327: Line too long (107/100)

(C0301)


[convention] 329-329: Line too long (140/100)

(C0301)


[convention] 360-360: Line too long (143/100)

(C0301)


[convention] 368-368: Line too long (137/100)

(C0301)


[convention] 402-402: Line too long (145/100)

(C0301)


[convention] 409-409: Line too long (139/100)

(C0301)


[convention] 418-418: Line too long (118/100)

(C0301)


[convention] 425-425: Line too long (112/100)

(C0301)


[refactor] 29-29: Too many local variables (19/15)

(R0914)


[convention] 65-65: More than one statement on a single line

(C0321)


[convention] 73-73: More than one statement on a single line

(C0321)


[refactor] 41-121: Too many nested blocks (6/5)

(R1702)


[refactor] 29-29: Too many branches (31/12)

(R0912)


[refactor] 29-29: Too many statements (78/50)

(R0915)


[warning] 161-161: Catching too general exception Exception

(W0718)


[warning] 182-182: Catching too general exception Exception

(W0718)


[warning] 178-178: Using open without explicitly specifying an encoding

(W1514)


[warning] 200-200: Catching too general exception Exception

(W0718)


[warning] 195-195: Using open without explicitly specifying an encoding

(W1514)


[warning] 222-222: Catching too general exception Exception

(W0718)


[warning] 220-220: Using open without explicitly specifying an encoding

(W1514)


[warning] 235-235: Using open without explicitly specifying an encoding

(W1514)


[refactor] 240-240: Too many local variables (26/15)

(R0914)


[warning] 364-364: Redefining name 'go' from outer scope (line 441)

(W0621)


[warning] 359-359: Using an f-string that does not have any interpolated variables

(W1309)


[warning] 364-364: Using open without explicitly specifying an encoding

(W1514)


[warning] 367-367: Using an f-string that does not have any interpolated variables

(W1309)


[warning] 399-399: Using an f-string that does not have any interpolated variables

(W1309)


[warning] 401-401: Using an f-string that does not have any interpolated variables

(W1309)


[warning] 405-405: Using open without explicitly specifying an encoding

(W1514)


[warning] 406-406: Using an f-string that does not have any interpolated variables

(W1309)


[warning] 408-408: Using an f-string that does not have any interpolated variables

(W1309)


[warning] 415-415: Using an f-string that does not have any interpolated variables

(W1309)


[warning] 416-416: Using an f-string that does not have any interpolated variables

(W1309)


[warning] 417-417: Using an f-string that does not have any interpolated variables

(W1309)


[warning] 421-421: Using open without explicitly specifying an encoding

(W1514)


[warning] 422-422: Using an f-string that does not have any interpolated variables

(W1309)


[warning] 423-423: Using an f-string that does not have any interpolated variables

(W1309)


[warning] 424-424: Using an f-string that does not have any interpolated variables

(W1309)


[refactor] 240-240: Too many branches (18/12)

(R0912)


[refactor] 240-240: Too many statements (88/50)

(R0915)


[warning] 431-431: Catching too general exception Exception

(W0718)


[warning] 446-446: Catching too general exception Exception

(W0718)


[warning] 441-441: Using open without explicitly specifying an encoding

(W1514)


[warning] 15-15: Unused import ssl

(W0611)

termux-multi-agent/src/db.py

[convention] 131-131: Line too long (103/100)

(C0301)


[convention] 167-167: Line too long (111/100)

(C0301)


[convention] 192-192: Line too long (139/100)

(C0301)


[refactor] 68-68: Too many local variables (23/15)

(R0914)


[warning] 139-139: Catching too general exception Exception

(W0718)

src/db.py

[convention] 140-140: Line too long (103/100)

(C0301)


[convention] 176-176: Line too long (111/100)

(C0301)


[convention] 202-202: Line too long (139/100)

(C0301)


[warning] 84-84: Catching too general exception Exception

(W0718)


[convention] 70-70: Import outside toplevel (pathlib.Path)

(C0415)


[convention] 71-71: Import outside toplevel (datetime.datetime, datetime.timezone)

(C0415)


[warning] 74-74: Using open without explicitly specifying an encoding

(W1514)


[refactor] 87-87: Too many local variables (23/15)

(R0914)


[warning] 148-148: Catching too general exception Exception

(W0718)

nexuscli/core/api.py

[convention] 166-166: Line too long (145/100)

(C0301)


[convention] 271-271: Line too long (101/100)

(C0301)


[convention] 289-289: Line too long (111/100)

(C0301)


[convention] 400-400: Line too long (102/100)

(C0301)


[convention] 482-482: Line too long (104/100)

(C0301)


[warning] 19-19: Catching too general exception Exception

(W0718)


[warning] 36-36: Missing timeout argument for method 'standard_requests.get' can cause your program to hang indefinitely

(W3101)


[warning] 40-40: Missing timeout argument for method 'standard_requests.post' can cause your program to hang indefinitely

(W3101)


[warning] 44-44: Missing timeout argument for method 'standard_requests.put' can cause your program to hang indefinitely

(W3101)


[warning] 48-48: Missing timeout argument for method 'standard_requests.delete' can cause your program to hang indefinitely

(W3101)


[warning] 66-66: Catching too general exception Exception

(W0718)


[warning] 88-88: Catching too general exception Exception

(W0718)


[warning] 105-105: Using open without explicitly specifying an encoding

(W1514)


[warning] 115-115: Catching too general exception Exception

(W0718)


[warning] 117-117: Using open without explicitly specifying an encoding

(W1514)


[warning] 121-121: Catching too general exception Exception

(W0718)


[warning] 137-137: Catching too general exception Exception

(W0718)


[warning] 155-155: Using global for '_sessions' but no assignment is done

(W0602)


[warning] 195-201: 'subprocess.run' used without explicitly defining the value for 'check'.

(W1510)


[warning] 283-287: Missing timeout argument for method 'http_requests.post' can cause your program to hang indefinitely

(W3101)


[warning] 267-267: Unused argument 'session_id'

(W0613)


[refactor] 348-348: Too many arguments (9/5)

(R0913)


[refactor] 348-348: Too many positional arguments (9/5)

(R0917)


[refactor] 348-348: Too many local variables (26/15)

(R0914)


[warning] 437-437: Catching too general exception Exception

(W0718)


[warning] 433-433: Catching too general exception Exception

(W0718)


[refactor] 382-441: Too many nested blocks (7/5)

(R1702)


[refactor] 348-348: Too many branches (13/12)

(R0912)


[refactor] 348-348: Too many statements (63/50)

(R0915)


[warning] 356-356: Unused argument 'auto_retry'

(W0613)


[refactor] 448-448: Too many arguments (6/5)

(R0913)


[refactor] 448-448: Too many positional arguments (6/5)

(R0917)


[warning] 471-471: Missing timeout argument for method 'http_requests.post' can cause your program to hang indefinitely

(W3101)


[warning] 487-487: Catching too general exception Exception

(W0718)


[refactor] 494-494: Too many arguments (9/5)

(R0913)


[refactor] 494-494: Too many positional arguments (9/5)

(R0917)


[refactor] 494-494: Too many local variables (17/15)

(R0914)


[convention] 505-505: Import outside toplevel (io)

(C0415)


[convention] 506-506: Import outside toplevel (contextlib.redirect_stdout)

(C0415)


[warning] 537-537: Catching too general exception Exception

(W0718)

🪛 Ruff (0.16.1)
termux-multi-agent/workspace/run.py

[error] 99-100: try-except-pass detected, consider logging the exception

(S110)


[warning] 99-99: Do not catch blind exception: Exception

(BLE001)


[warning] 102-105: Use contextlib.suppress(Exception) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(Exception): ...

(SIM105)


[error] 104-105: try-except-pass detected, consider logging the exception

(S110)


[warning] 104-104: Do not catch blind exception: Exception

(BLE001)

deepcli/deepcli/core.py

[warning] 14-14: Do not catch blind exception: Exception

(BLE001)


[warning] 17-17: Missing return type annotation for special method __init__

Add return type annotation: None

(ANN204)


[warning] 17-17: Missing type annotation for *args

(ANN002)


[warning] 17-17: Missing type annotation for **kwargs

(ANN003)


[warning] 20-20: Missing type annotation for *args

(ANN002)


[warning] 20-20: Missing type annotation for **kwargs

(ANN003)


[warning] 26-26: Missing type annotation for *args

(ANN002)


[warning] 26-26: Missing type annotation for **kwargs

(ANN003)


[error] 28-28: Probable use of requests call without timeout

(S113)


[warning] 29-29: Missing type annotation for *args

(ANN002)


[warning] 29-29: Missing type annotation for **kwargs

(ANN003)


[error] 31-31: Probable use of requests call without timeout

(S113)


[warning] 32-32: Missing type annotation for *args

(ANN002)


[warning] 32-32: Missing type annotation for **kwargs

(ANN003)


[error] 34-34: Probable use of requests call without timeout

(S113)


[warning] 35-35: Missing type annotation for *args

(ANN002)


[warning] 35-35: Missing type annotation for **kwargs

(ANN003)


[error] 37-37: Probable use of requests call without timeout

(S113)

tests/test_db_optimized.py

[warning] 51-51: Missing return type annotation for private function mock_check_output

Add return type annotation: str

(ANN202)


[warning] 51-51: Unused function argument: cmd

(ARG001)


[warning] 51-51: Missing type annotation for **kwargs

(ANN003)


[warning] 51-51: Unused function argument: kwargs

(ARG001)


[warning] 57-57: Unnecessary else after return statement

Remove unnecessary else

(RET505)

nexuscli/core/__init__.py

[warning] 24-39: __all__ is not sorted

Apply an isort-style sorting to __all__

(RUF022)

archwiz/archwiz.py

[warning] 39-39: Do not catch blind exception: Exception

(BLE001)


[error] 197-203: Standard pseudo-random generators are not suitable for cryptographic purposes

(S311)

multi-ai-cli/backends/colab.py

[warning] 4-4: Do not catch blind exception: Exception

(BLE001)


[warning] 7-7: Missing return type annotation for special method __init__

Add return type annotation: None

(ANN204)


[warning] 7-7: Missing type annotation for *args

(ANN002)


[warning] 7-7: Missing type annotation for **kwargs

(ANN003)


[warning] 10-10: Missing type annotation for *args

(ANN002)


[warning] 10-10: Missing type annotation for **kwargs

(ANN003)


[warning] 16-16: Missing type annotation for *args

(ANN002)


[warning] 16-16: Missing type annotation for **kwargs

(ANN003)


[error] 18-18: Probable use of requests call without timeout

(S113)


[warning] 19-19: Missing type annotation for *args

(ANN002)


[warning] 19-19: Missing type annotation for **kwargs

(ANN003)


[error] 21-21: Probable use of requests call without timeout

(S113)


[warning] 22-22: Missing type annotation for *args

(ANN002)


[warning] 22-22: Missing type annotation for **kwargs

(ANN003)


[error] 24-24: Probable use of requests call without timeout

(S113)


[warning] 25-25: Missing type annotation for *args

(ANN002)


[warning] 25-25: Missing type annotation for **kwargs

(ANN003)


[error] 27-27: Probable use of requests call without timeout

(S113)

src/context_collector.py

[warning] 71-71: Unnecessary mode argument

Remove mode argument

(UP015)

termux-multi-agent/run.py

[error] 96-97: try-except-pass detected, consider logging the exception

(S110)


[warning] 96-96: Do not catch blind exception: Exception

(BLE001)


[warning] 99-102: Use contextlib.suppress(Exception) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(Exception): ...

(SIM105)


[error] 101-102: try-except-pass detected, consider logging the exception

(S110)


[warning] 101-101: Do not catch blind exception: Exception

(BLE001)

multi-ai-cli/backends/deepseek.py

[warning] 5-5: Do not catch blind exception: Exception

(BLE001)


[warning] 8-8: Missing return type annotation for special method __init__

Add return type annotation: None

(ANN204)


[warning] 8-8: Missing type annotation for *args

(ANN002)


[warning] 8-8: Missing type annotation for **kwargs

(ANN003)


[warning] 11-11: Missing type annotation for *args

(ANN002)


[warning] 11-11: Missing type annotation for **kwargs

(ANN003)


[warning] 17-17: Missing type annotation for *args

(ANN002)


[warning] 17-17: Missing type annotation for **kwargs

(ANN003)


[error] 19-19: Probable use of requests call without timeout

(S113)


[warning] 20-20: Missing type annotation for *args

(ANN002)


[warning] 20-20: Missing type annotation for **kwargs

(ANN003)


[error] 22-22: Probable use of requests call without timeout

(S113)


[warning] 23-23: Missing type annotation for *args

(ANN002)


[warning] 23-23: Missing type annotation for **kwargs

(ANN003)


[error] 25-25: Probable use of requests call without timeout

(S113)


[warning] 26-26: Missing type annotation for *args

(ANN002)


[warning] 26-26: Missing type annotation for **kwargs

(ANN003)


[error] 28-28: Probable use of requests call without timeout

(S113)

termux-multi-agent/dashboard.py

[error] 38-39: try-except-pass detected, consider logging the exception

(S110)


[warning] 38-38: Do not catch blind exception: Exception

(BLE001)


[warning] 48-48: datetime.datetime.now() called without a tz argument

(DTZ005)


[warning] 108-108: Naive datetime constructed using datetime.datetime.strptime() without %z

(DTZ007)

multi-ai-cli/backends/gemini_web.py

[warning] 4-4: Do not catch blind exception: Exception

(BLE001)


[warning] 7-7: Missing return type annotation for special method __init__

Add return type annotation: None

(ANN204)


[warning] 7-7: Missing type annotation for *args

(ANN002)


[warning] 7-7: Missing type annotation for **kwargs

(ANN003)


[warning] 10-10: Missing type annotation for *args

(ANN002)


[warning] 10-10: Missing type annotation for **kwargs

(ANN003)


[warning] 16-16: Missing type annotation for *args

(ANN002)


[warning] 16-16: Missing type annotation for **kwargs

(ANN003)


[error] 18-18: Probable use of requests call without timeout

(S113)


[warning] 19-19: Missing type annotation for *args

(ANN002)


[warning] 19-19: Missing type annotation for **kwargs

(ANN003)


[error] 21-21: Probable use of requests call without timeout

(S113)


[warning] 22-22: Missing type annotation for *args

(ANN002)


[warning] 22-22: Missing type annotation for **kwargs

(ANN003)


[error] 24-24: Probable use of requests call without timeout

(S113)


[warning] 25-25: Missing type annotation for *args

(ANN002)


[warning] 25-25: Missing type annotation for **kwargs

(ANN003)


[error] 27-27: Probable use of requests call without timeout

(S113)

cli-synthegration/synthegration_index.py

[warning] 36-36: Docstring contains ambiguous ‑ (NON-BREAKING HYPHEN). Did you mean - (HYPHEN-MINUS)?

(RUF002)


[warning] 131-131: Docstring contains ambiguous ‑ (NON-BREAKING HYPHEN). Did you mean - (HYPHEN-MINUS)?

(RUF002)

multi-ai-cli/backends/claude_web.py

[warning] 4-4: Do not catch blind exception: Exception

(BLE001)


[warning] 7-7: Missing return type annotation for special method __init__

Add return type annotation: None

(ANN204)


[warning] 7-7: Missing type annotation for *args

(ANN002)


[warning] 7-7: Missing type annotation for **kwargs

(ANN003)


[warning] 10-10: Missing type annotation for *args

(ANN002)


[warning] 10-10: Missing type annotation for **kwargs

(ANN003)


[warning] 16-16: Missing type annotation for *args

(ANN002)


[warning] 16-16: Missing type annotation for **kwargs

(ANN003)


[error] 18-18: Probable use of requests call without timeout

(S113)


[warning] 19-19: Missing type annotation for *args

(ANN002)


[warning] 19-19: Missing type annotation for **kwargs

(ANN003)


[error] 21-21: Probable use of requests call without timeout

(S113)


[warning] 22-22: Missing type annotation for *args

(ANN002)


[warning] 22-22: Missing type annotation for **kwargs

(ANN003)


[error] 24-24: Probable use of requests call without timeout

(S113)


[warning] 25-25: Missing type annotation for *args

(ANN002)


[warning] 25-25: Missing type annotation for **kwargs

(ANN003)


[error] 27-27: Probable use of requests call without timeout

(S113)

tests/test_model_router.py

[warning] 57-57: Unused lambda argument: args

(ARG005)


[warning] 57-57: Unused lambda argument: kwargs

(ARG005)


[warning] 68-68: Missing return type annotation for private function mock_urlopen

Add return type annotation: NoReturn

(ANN202)


[warning] 68-68: Missing type annotation for *args

(ANN002)


[warning] 68-68: Unused function argument: args

(ARG001)


[warning] 68-68: Missing type annotation for **kwargs

(ANN003)


[warning] 68-68: Unused function argument: kwargs

(ARG001)


[warning] 69-69: Create your own exception

(TRY002)


[warning] 69-69: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 89-89: Missing return type annotation for private function mock_urlopen

(ANN202)


[warning] 89-89: Missing type annotation for *args

(ANN002)


[warning] 89-89: Unused function argument: args

(ARG001)


[warning] 89-89: Missing type annotation for **kwargs

(ANN003)


[warning] 89-89: Unused function argument: kwargs

(ARG001)

nexuscli/cli/main.py

[warning] 45-45: Unused function argument: args

(ARG001)


[warning] 68-71: Use contextlib.suppress(Exception) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(Exception): ...

(SIM105)


[error] 70-71: try-except-pass detected, consider logging the exception

(S110)


[warning] 70-70: Do not catch blind exception: Exception

(BLE001)


[warning] 77-80: Use contextlib.suppress(Exception) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(Exception): ...

(SIM105)


[error] 79-80: try-except-pass detected, consider logging the exception

(S110)


[warning] 79-79: Do not catch blind exception: Exception

(BLE001)


[warning] 130-130: Do not catch blind exception: Exception

(BLE001)


[warning] 172-175: Use contextlib.suppress(Exception) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(Exception): ...

(SIM105)


[error] 174-175: try-except-pass detected, consider logging the exception

(S110)


[warning] 174-174: Do not catch blind exception: Exception

(BLE001)

scripts/model_router.py

[error] 18-18: Probable insecure usage of temporary file or directory: "/tmp/model-router"

(S108)


[warning] 29-29: Too many branches (32 > 12)

(PLR0912)


[warning] 29-29: Too many statements (80 > 50)

(PLR0915)


[warning] 40-40: Unnecessary mode argument

Remove mode argument

(UP015)


[warning] 60-60: Call startswith once with a tuple

Merge into a single startswith call

(PIE810)


[warning] 65-66: Use ternary operator v = float(v) if '.' in v else int(v) instead of if-else-block

Replace if-else-block with v = float(v) if '.' in v else int(v)

(SIM108)


[error] 65-65: Multiple statements on one line (colon)

(E701)


[error] 66-66: Multiple statements on one line (colon)

(E701)


[warning] 73-74: Use ternary operator item_val = float(item_val) if '.' in item_val else int(item_val) instead of if-else-block

Replace if-else-block with item_val = float(item_val) if '.' in item_val else int(item_val)

(SIM108)


[error] 73-73: Multiple statements on one line (colon)

(E701)


[error] 74-74: Multiple statements on one line (colon)

(E701)


[warning] 83-83: Prefer next(iter(item_val.keys())) over single element slice

Replace with next(iter(item_val.keys()))

(RUF015)


[warning] 105-106: Use elif instead of else then if, to reduce indentation

Convert to elif

(PLR5501)


[warning] 112-115: Use ternary operator parsed_val = float(val) if '.' in val else int(val) instead of if-else-block

Replace if-else-block with parsed_val = float(val) if '.' in val else int(val)

(SIM108)


[error] 134-134: Audit URL open for permitted schemes. Allowing use of file: or custom schemes is often unexpected.

(S310)


[warning] 161-161: Do not catch blind exception: Exception

(BLE001)


[warning] 178-178: Unnecessary mode argument

Remove mode argument

(UP015)


[error] 182-183: try-except-pass detected, consider logging the exception

(S110)


[warning] 182-182: Do not catch blind exception: Exception

(BLE001)


[error] 200-201: try-except-pass detected, consider logging the exception

(S110)


[warning] 200-200: Do not catch blind exception: Exception

(BLE001)


[warning] 220-220: Unnecessary mode argument

Remove mode argument

(UP015)


[warning] 222-222: Do not catch blind exception: Exception

(BLE001)


[warning] 240-240: Too many branches (19 > 12)

(PLR0912)


[warning] 240-240: Too many statements (88 > 50)

(PLR0915)


[warning] 326-328: Use elif instead of else then if, to reduce indentation

Convert to elif

(PLR5501)


[error] 359-359: f-string without any placeholders

Remove extraneous f prefix

(F541)


[error] 367-367: f-string without any placeholders

Remove extraneous f prefix

(F541)


[error] 399-399: f-string without any placeholders

Remove extraneous f prefix

(F541)


[error] 401-401: f-string without any placeholders

Remove extraneous f prefix

(F541)


[error] 406-406: f-string without any placeholders

Remove extraneous f prefix

(F541)


[error] 408-408: f-string without any placeholders

Remove extraneous f prefix

(F541)


[error] 415-415: f-string without any placeholders

Remove extraneous f prefix

(F541)


[error] 416-416: f-string without any placeholders

Remove extraneous f prefix

(F541)


[error] 417-417: f-string without any placeholders

Remove extraneous f prefix

(F541)


[error] 422-422: f-string without any placeholders

Remove extraneous f prefix

(F541)


[error] 423-423: f-string without any placeholders

Remove extraneous f prefix

(F541)


[error] 424-424: f-string without any placeholders

Remove extraneous f prefix

(F541)


[warning] 431-431: Do not catch blind exception: Exception

(BLE001)


[error] 446-447: try-except-pass detected, consider logging the exception

(S110)


[warning] 446-446: Do not catch blind exception: Exception

(BLE001)

termux-multi-agent/src/db.py

[error] 88-88: subprocess call: check for execution of untrusted input

(S603)


[error] 89-89: Starting a process with a partial executable path

(S607)


[error] 97-97: subprocess call: check for execution of untrusted input

(S603)


[error] 98-98: Starting a process with a partial executable path

(S607)


[error] 139-140: try-except-pass detected, consider logging the exception

(S110)


[warning] 139-139: Do not catch blind exception: Exception

(BLE001)

src/db.py

[error] 84-85: try-except-pass detected, consider logging the exception

(S110)


[warning] 84-84: Do not catch blind exception: Exception

(BLE001)


[error] 103-103: subprocess call: check for execution of untrusted input

(S603)


[error] 103-103: Starting a process with a partial executable path

(S607)


[error] 108-108: subprocess call: check for execution of untrusted input

(S603)


[error] 109-109: Starting a process with a partial executable path

(S607)


[error] 148-149: try-except-pass detected, consider logging the exception

(S110)


[warning] 148-148: Do not catch blind exception: Exception

(BLE001)

nexuscli/core/api.py

[warning] 15-15: typing.List is deprecated, use list instead

(UP035)


[warning] 15-15: typing.Dict is deprecated, use dict instead

(UP035)


[warning] 19-19: Do not catch blind exception: Exception

(BLE001)


[warning] 23-23: Missing return type annotation for special method __init__

Add return type annotation: None

(ANN204)


[warning] 23-23: Missing type annotation for *args

(ANN002)


[warning] 23-23: Missing type annotation for **kwargs

(ANN003)


[warning] 27-27: Missing type annotation for *args

(ANN002)


[warning] 27-27: Missing type annotation for **kwargs

(ANN003)


[warning] 34-34: Missing type annotation for *args

(ANN002)


[warning] 34-34: Missing type annotation for **kwargs

(ANN003)


[error] 36-36: Probable use of requests call without timeout

(S113)


[warning] 38-38: Missing type annotation for *args

(ANN002)


[warning] 38-38: Missing type annotation for **kwargs

(ANN003)


[error] 40-40: Probable use of requests call without timeout

(S113)


[warning] 42-42: Missing type annotation for *args

(ANN002)


[warning] 42-42: Missing type annotation for **kwargs

(ANN003)


[error] 44-44: Probable use of requests call without timeout

(S113)


[warning] 46-46: Missing type annotation for *args

(ANN002)


[warning] 46-46: Missing type annotation for **kwargs

(ANN003)


[error] 48-48: Probable use of requests call without timeout

(S113)


[warning] 64-67: Use contextlib.suppress(Exception) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(Exception): ...

(SIM105)


[error] 66-67: try-except-pass detected, consider logging the exception

(S110)


[warning] 66-66: Do not catch blind exception: Exception

(BLE001)


[error] 88-89: try-except-pass detected, consider logging the exception

(S110)


[warning] 88-88: Do not catch blind exception: Exception

(BLE001)


[warning] 97-97: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 110-110: Missing return type annotation for private function _cache_save

Add return type annotation: None

(ANN202)


[warning] 113-116: Use contextlib.suppress(Exception) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(Exception): ...

(SIM105)


[error] 115-116: try-except-pass detected, consider logging the exception

(S110)


[warning] 115-115: Do not catch blind exception: Exception

(BLE001)


[warning] 119-122: Use contextlib.suppress(Exception) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(Exception): ...

(SIM105)


[error] 121-122: try-except-pass detected, consider logging the exception

(S110)


[warning] 121-121: Do not catch blind exception: Exception

(BLE001)


[warning] 135-138: Use contextlib.suppress(Exception) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(Exception): ...

(SIM105)


[error] 137-138: try-except-pass detected, consider logging the exception

(S110)


[warning] 137-137: Do not catch blind exception: Exception

(BLE001)


[warning] 148-148: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 154-154: PEP 484 prohibits implicit Optional

Convert to T | None

(RUF013)


[warning] 155-155: Using the global statement to update _session is discouraged

(PLW0603)


[warning] 155-155: Using the global statement to update _session is discouraged

(PLW0603)


[warning] 155-155: Using global for _sessions but no assignment is done

(PLW0602)


[error] 195-195: subprocess call: check for execution of untrusted input

(S603)


[warning] 195-195: subprocess.run without explicit check argument

Add explicit check=False

(PLW1510)


[error] 196-196: Starting a process with a partial executable path

(S607)


[warning] 203-203: Abstract raise to an inner function

(TRY301)


[warning] 203-203: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 222-222: PEP 484 prohibits implicit Optional

Convert to T | None

(RUF013)


[warning] 243-243: Boolean-typed positional argument in function definition

(FBT001)


[warning] 243-243: Boolean default positional argument in function definition

(FBT002)


[warning] 267-267: Unused function argument: session_id

(ARG001)


[warning] 271-271: Parenthesize a and b expressions when chaining and and or together, to make the precedence clear

Parenthesize the and subexpression

(RUF021)


[warning] 272-272: Avoid specifying long messages outside the exception class

(TRY003)


[error] 283-283: Probable use of requests call without timeout

(S113)


[warning] 348-348: Too many branches (13 > 12)

(PLR0912)


[warning] 348-348: Too many statements (63 > 50)

(PLR0915)


[warning] 353-353: Boolean-typed positional argument in function definition

(FBT001)


[warning] 353-353: Boolean default positional argument in function definition

(FBT002)


[warning] 354-354: Boolean-typed positional argument in function definition

(FBT001)


[warning] 354-354: Boolean default positional argument in function definition

(FBT002)


[warning] 356-356: Boolean-typed positional argument in function definition

(FBT001)


[warning] 356-356: Boolean default positional argument in function definition

(FBT002)


[warning] 356-356: Unused function argument: auto_retry

(ARG001)


[warning] 388-388: String contains ambiguous – (EN DASH). Did you mean - (HYPHEN-MINUS)?

(RUF001)


[error] 397-397: Standard pseudo-random generators are not suitable for cryptographic purposes

(S311)


[error] 408-408: Standard pseudo-random generators are not suitable for cryptographic purposes

(S311)


[warning] 412-412: String contains ambiguous – (EN DASH). Did you mean - (HYPHEN-MINUS)?

(RUF001)


[warning] 431-434: Use contextlib.suppress(Exception) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(Exception): ...

(SIM105)


[error] 433-434: try-except-pass detected, consider logging the exception

(S110)


[warning] 433-433: Do not catch blind exception: Exception

(BLE001)


[warning] 435-435: Consider moving this statement to an else block

(TRY300)


[warning] 437-437: Do not catch blind exception: Exception

(BLE001)


[warning] 452-452: PEP 484 prohibits implicit Optional

Convert to T | None

(RUF013)


[warning] 453-453: Boolean-typed positional argument in function definition

(FBT001)


[warning] 453-453: Boolean default positional argument in function definition

(FBT002)


[warning] 454-454: Boolean-typed positional argument in function definition

(FBT001)


[warning] 454-454: Boolean default positional argument in function definition

(FBT002)


[error] 471-471: Probable use of requests call without timeout

(S113)


[warning] 476-479: Use contextlib.suppress(KeyError, IndexError, TypeError) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(KeyError, IndexError, TypeError): ...

(SIM105)


[warning] 485-488: Use contextlib.suppress(Exception) instead of try-except-pass

Replace try-except-pass with with contextlib.suppress(Exception): ...

(SIM105)


[error] 487-488: try-except-pass detected, consider logging the exception

(S110)


[warning] 487-487: Do not catch blind exception: Exception

(BLE001)


[warning] 499-499: Boolean-typed positional argument in function definition

(FBT001)


[warning] 499-499: Boolean default positional argument in function definition

(FBT002)


[warning] 500-500: Boolean-typed positional argument in function definition

(FBT001)


[warning] 500-500: Boolean default positional argument in function definition

(FBT002)


[warning] 502-502: Boolean-typed positional argument in function definition

(FBT001)


[warning] 502-502: Boolean default positional argument in function definition

(FBT002)


[error] 537-538: try-except-pass detected, consider logging the exception

(S110)


[warning] 537-537: Do not catch blind exception: Exception

(BLE001)

🪛 zizmor (1.29.0)
.github/workflows/publish-wiki.yml

[warning] 24-25: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[error] 18-18: overly broad permissions (excessive-permissions): contents: write is overly broad at the workflow level

(excessive-permissions)


[error] 25-25: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 28-28: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[warning] 18-18: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[info] 21-21: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)

.github/workflows/gemini-dispatch.yml

[info] 124-124: code injection via template expansion (template-injection): may expand into attacker-controllable code

(template-injection)


[warning] 50-50: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[warning] 153-153: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[warning] 167-167: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[warning] 181-181: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[warning] 150-150: secrets unconditionally inherited by called workflow (secrets-inherit): this reusable workflow

(secrets-inherit)


[warning] 164-164: secrets unconditionally inherited by called workflow (secrets-inherit): this reusable workflow

(secrets-inherit)


[warning] 178-178: secrets unconditionally inherited by called workflow (secrets-inherit): this reusable workflow

(secrets-inherit)


[info] 32-32: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)


[warning] 13-23: insufficient job-level concurrency limits (concurrency-limits): workflow is missing concurrency setting

(concurrency-limits)

.github/workflows/agent-review-auto-jules.yml

[warning] 1-172: overly broad permissions (excessive-permissions): default permissions used due to no permissions: block

(excessive-permissions)


[info] 97-97: code injection via template expansion (template-injection): may expand into attacker-controllable code

(template-injection)


[info] 98-98: code injection via template expansion (template-injection): may expand into attacker-controllable code

(template-injection)


[error] 66-66: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 94-94: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[warning] 57-57: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[info] 23-23: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)


[info] 154-154: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)

.github/workflows/gemini-invoke.yml

[warning] 34-34: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[info] 30-30: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)

.github/workflows/gemini-after-peers.yml

[error] 7-10: use of fundamentally insecure workflow trigger (dangerous-triggers): workflow_run is almost always used insecurely

(dangerous-triggers)


[warning] 23-23: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[info] 15-15: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)


[warning] 7-10: insufficient job-level concurrency limits (concurrency-limits): workflow is missing concurrency setting

(concurrency-limits)

.github/workflows/gemini-review.yml

[warning] 30-30: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[info] 26-26: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)

.github/workflows/agent-jules-on-issues.yml

[warning] 1-251: overly broad permissions (excessive-permissions): default permissions used due to no permissions: block

(excessive-permissions)


[error] 43-43: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 104-104: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 139-139: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 183-183: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 217-217: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 234-234: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[warning] 38-38: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[warning] 178-178: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[info] 26-26: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)


[info] 165-165: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)

.github/workflows/agent-feedback-linear-sync.yml

[warning] 1-201: overly broad permissions (excessive-permissions): default permissions used due to no permissions: block

(excessive-permissions)


[error] 49-49: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[warning] 43-43: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[info] 18-18: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)

.github/workflows/peer-review-orchestrator.yml

[warning] 30-30: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[info] 22-22: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)

.github/workflows/gemini-triage.yml

[warning] 30-30: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[info] 26-26: workflow or action definition without a name (anonymous-definition): this job

(anonymous-definition)

📝 Walkthrough

Walkthrough

This PR adds agentic GitHub workflows, model routing, NexusCLI, database batching and FTS search, runtime reliability fixes, content-addressed storage updates, Rich dashboard rendering, and extensive repository documentation and proposal updates.

Changes

Runtime and tooling

Layer / File(s) Summary
Reliability and safety
archwiz/*, deepcli/*, archwiz/restore_version.py, archwiz/linear_sync.py
Adds bounded log reads, subprocess failure reporting, portable identity lookup, restore containment checks, safer task matching, and HTTP fallback handling.
Content addressing and dashboard
cli-synthegration/*, termux-multi-agent/dashboard.py, deepcli-tui/tui.py
Uses full SHA-256 hashes and replaces ANSI dashboard rendering with Rich Live output.

Agentic CI

Layer / File(s) Summary
Routing actions and workflows
.github/actions/*, scripts/model_router.py, .github/workflows/gemini-*.yml
Adds provider routing, free-model discovery, quota handling, reusable Gemini workflows, and HTTP model invocation.
Agent feedback and review orchestration
.github/workflows/agent-*.yml, .github/workflows/peer-review-orchestrator.yml
Adds Linear feedback subtasks, Jules triggers, peer-review polling, Autofix requests, and idempotent status comments.
Wiki publication
.github/workflows/publish-wiki.yml
Publishes wiki changes on branch pushes or manual dispatch.

NexusCLI and indexing

Layer / File(s) Summary
NexusCLI
nexuscli/*, multi-ai-cli/backends/*
Adds session and chat commands, API operations, proof-of-work solving, exports, secure caches, and requests compatibility wrappers.
Database indexing
src/db.py, termux-multi-agent/src/db.py, termux-multi-agent/*/run.py, termux-multi-agent/provision_agent.py, tests/test_db_optimized.py
Adds shared SQLite connections, batched writes, FTS5 message search, and database tests.

Documentation and governance

Layer / File(s) Summary
Repository guidance and proposals
AGENTS.md, GEMINI.md, README.md, docs/**, .Jules/*, .coderabbit.yaml
Adds operating rules, Termux guidance, identity hygiene, proposal records, routing schemas, and review configuration.
Wiki content and status
wiki/*, workspace/llm_map/master_tasks.json
Adds architecture and navigation pages, DeepWiki mirroring guidance, and marks arch-015 complete.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related issues

Possibly related PRs

Suggested reviewers: timerloggedout-spec

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 11 potential issues.

Open in Devin Review

Comment thread archwiz/archwiz.py Outdated
Comment thread archwiz/archwiz.py
Comment thread deepcli/deepcli/core.py Outdated
Comment on lines +63 to +64
f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - Dispatch error: {e}\n")
except:
except OSError:

@devin-ai-integration devin-ai-integration Bot Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Command-line tool can crash right after starting a new chat session

The fallback error-logging step only tolerates file-system failures (except OSError at deepcli/deepcli/core.py:79) instead of any failure, so if the logging helper itself cannot be loaded the whole command aborts with an error instead of quietly continuing.
Impact: Users creating a new session can see the CLI/server crash with a traceback in environments where the companion configuration package isn't importable.

Exception type narrowing inside the nested error handler

_set_last_session wraps get_history(...) in a try/except; inside the handler it does from archwiz.config import LOG_DIR and writes a log file. When deepcli is installed/run without the monorepo root on sys.path, that import raises ModuleNotFoundError (a subclass of ImportError, not OSError). Previously the bare except: swallowed it; now the exception escapes _set_last_session and propagates to callers such as deepcli/deepcli/cli.py:80 and deepcli/server.py:49. Note the sibling hook in _cache_save was correctly changed to except Exception: (deepcli/deepcli/core.py:64), making this inconsistent.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread archwiz/linear_sync.py
Comment on lines +59 to +60
# Match task ID as complete token, not substring
status = "DONE" if any(task_id_str == line.strip() or task_id_str in line.split() for line in done) else "TODO"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Completed tasks can be reported as not done after stricter matching

Task completion is now decided by whitespace-separated exact matching (task_id_str in line.split() at archwiz/linear_sync.py:60), so completion entries where the identifier is followed by punctuation are no longer recognized.
Impact: Tasks that are actually finished are reported as TODO in the sync output, giving a misleading status list.

Punctuation-adjacent IDs no longer match

taDone.md lines are free-form markdown; common forms such as - [x] M-01: path normalization, **M-01**, or (M-01) split into tokens like M-01: / **M-01**, which never equal task_id_str, and the whole-line comparison also fails. The previous substring test matched all of these. If a whole-token match is desired, use a word-boundary regex (re.search(rf"(?<!\w){re.escape(task_id_str)}(?!\w)", line)) instead of split().

Prompt for agents
In archwiz/linear_sync.py the DONE/TODO determination was changed from a substring check to `task_id_str == line.strip() or task_id_str in line.split()`. taDone.md is free-form markdown, so IDs typically appear adjacent to punctuation or markdown emphasis (e.g. '- [x] M-01: done', '**M-01**'), which tokenizes into 'M-01:' or '**M-01**' and no longer matches, causing completed tasks to be reported as TODO. Consider a word-boundary regex match on the escaped ID instead of split()-based tokenization, so punctuation-adjacent occurrences still match while avoiding partial-ID substring matches.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread archwiz/restore_version.py Outdated
Comment on lines +116 to +126

# Root containment check: ensure target_path resolves within HOME
try:
resolved_target = target_path.resolve()
resolved_home = HOME.resolve()
if not str(resolved_target).startswith(str(resolved_home)):
print(f"{R}Error: Target path must be within home directory{N}")
return False
except (OSError, ValueError) as e:
print(f"{R}Error validating target path: {e}{N}")
return False

@devin-ai-integration devin-ai-integration Bot Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Home-containment check happens after expensive retrieval work

The containment validation runs only after find_last_good_version and extract_code_from_session (and potentially a subprocess codex search at archwiz/restore_version.py:104-107) have already executed. Validating output_path/target_file at the start of restore() (or in __main__) would avoid doing all that work for a path that will be rejected anyway.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread archwiz/archwiz.py
Comment on lines 78 to +92
if PIPELINE_ACTIVE:
subprocess.run(['python3', str(control_script), 'stop'])
print(f"{R}Pipeline stopped.{N}")
PIPELINE_ACTIVE = False
result = subprocess.run(['python3', str(control_script), 'stop'])
if result.returncode == 0:
print(f"{R}Pipeline stopped.{N}")
PIPELINE_ACTIVE = False
else:
print(f"{R}Failed to stop pipeline.{N}")
else:
env = os.environ.copy()
env['ARCHWIZ_MODE'] = PIPELINE_MODE
subprocess.run(['python3', str(control_script), 'start'])
print(f"{G}Pipeline started in {PIPELINE_MODE} mode.{N}")
PIPELINE_ACTIVE = True
result = subprocess.run(['python3', str(control_script), 'start'], env=env)
if result.returncode == 0:
print(f"{G}Pipeline started in {PIPELINE_MODE} mode.{N}")
PIPELINE_ACTIVE = True
else:

@devin-ai-integration devin-ai-integration Bot Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Pipeline state is only in-memory, so start/stop success tracking can drift

PIPELINE_ACTIVE is a module-global initialized to False on every dashboard launch; the new return-code checks make the flag more faithful to the last command executed but still don't reflect an already-running listener started outside this process. Consequently get_pipeline_status() shows OFF (and never reads the log) for a pipeline that is actually running. Querying listener_control.py status at startup would make the display accurate.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread archwiz/archwiz.py
Comment thread archwiz/restore_version.py
Comment thread archwiz/archwiz.py
timerloggedout-spec and others added 6 commits August 3, 2026 08:36
- Document mandatory pull/cherry-pick → smoke-test → clean workflow for agents
- Forbid models, session dumps, exports, venvs in working tree
- Provide agent checklist + weekly health commands
- Target: keep .git under 200 MB under normal use

Co-authored-by: ArchW1z <lean-maintenance>
…Bolt)

Up to ~95% reduction in SQLite transaction/connection I/O during workspace indexing.

- executemany batching for nodes/edges
- optional shared conn across tree walks
- FTS5 messages table + helpers
- tests/test_db_optimized.py
- synchronized blueprints in provision_agent

Jules task 11274228245989312171
Merged by automated production prioritization.
… (Palette)

Replaces raw ANSI clear with rich.live.Live + Table/Panel.

- Differential updates, color status, clean empty-state guidance
- KeyboardInterrupt restores cleanly
- Journaled in .Jules/palette.md

Jules task 10623504202529550216
Merged by automated production prioritization.
Immediate enablement: GHA workflows only fire from default branch for
pull_request_review / review_comment events.

Agent: Grok
Profile: https://x.com/grok
Signed-off-by: Grok <grok@x.ai>
Seed wiki/ + publish-wiki workflow. Address Devin review (concurrency, explicit token).

One-time: initialize Wiki tab with a dummy page, then run Actions → Publish wiki.
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 3 new potential issues.

Open in Devin Review

Comment thread archwiz/archwiz.py
Comment on lines +50 to +67
# Read only the last few lines instead of the whole file
try:
with open(plog, 'rb') as f:
f.seek(0, 2) # Go to end
file_size = f.tell()
# Read up to last 2KB (roughly 20-30 lines)
read_size = min(2048, file_size)
f.seek(file_size - read_size)
chunk = f.read().decode('utf-8', errors='replace')
lines = chunk.splitlines()
if read_size < file_size and lines:
lines = lines[1:] # drop possibly partial first line
for line in reversed(lines):
if line.strip() and '\u274c' not in line and '#' not in line:
last = line.strip()[:80]
return f" {status} {mode_str} | {C}{last}{N}"
except OSError:
pass

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Tail-read of autoexec.log silently loses the newest matching line if it's beyond the 2KB window

The new tail-read only inspects the last 2KB and additionally drops the first (possibly partial) line when truncation occurred (archwiz/archwiz.py:56-61). If the log's most recent lines are all filtered out (contain # or ❌) but an eligible line exists earlier in the file, the status line silently degrades to showing no last-activity text, whereas the previous full-file read would have found it. Acceptable trade-off for a dashboard, but worth noting as a behavior change.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread archwiz/linear_sync.py
Comment on lines +55 to +60
# Handle missing IDs and match as complete tokens
if task_id is None:
continue
task_id_str = str(task_id)
# Match task ID as complete token, not substring
status = "DONE" if any(task_id_str == line.strip() or task_id_str in line.split() for line in done) else "TODO"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Task ID matching still relies on whitespace tokenization

The new match task_id_str == line.strip() or task_id_str in line.split() (archwiz/linear_sync.py:60) is stricter than the prior substring check, but markdown lines like - [x] TASK-12: done tokenize to TASK-12: (with a trailing colon), so IDs followed by punctuation will now be reported as TODO where they were previously DONE. A regex word-boundary match would handle punctuation-adjacent IDs.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread archwiz/archwiz.py
Added detailed instructions for setting up a Termux environment on Ubuntu/Linux, including methods like Docker, Anbox/Waydroid, and Android Studio Emulator. Provided a comparison of these methods for sandbox testing.
Added a section on developing workflow for the termux-smoke branch and considerations for agent access.
Added high priority note about initializing Render marketplace.
Docs-only sync from master-staging + kimi cloud-offload pointer.

Signed-off-by: Grok ArchW1z
…fault branch

Place agent-jules-on-issues + gemini-* workflows on master so issue_comment
and issues events fire (GitHub only loads these from the default branch).

Includes coordination: prior open agent PR inventory + agent-claim rules so
Jules and Gemini do not edit the same files on the same issue.

Also ships GEMINI.md + agentic docs for agent context.

Agent: Grok · Signed-off-by: Grok <grok@x.ai>
- Nest kimi-cloud-offload under active/ (MANIFEST, ITEMS, DEBATE)
- Keep full text on docs/kimi-cloud-offload-evaluation; pointer on master
- Update registry.yaml + proposals README navigation
- CONSENSUS §10 + PROCESS automation for promotion path
- scripts/proposals: validate_registry, record_vote, promote_proposal
- GHA proposal-lifecycle: registry validate + PR checklist comment
timerloggedout-spec and others added 25 commits August 8, 2026 16:43
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…sue_comment)

On issue_comment/review events checkout is default branch, so
git diff origin/master...HEAD is empty. Fetch the real PR diff via
gh api independent of checkout ref. Cap at 24k chars. Add curl
timeouts so network blips degrade to warning comment not silent fail.

Also validate TARGET_PR is numeric before write path.

Addresses Devin empty-diff finding on #97.
Signed-off-by: Grok <grok@x.ai>
…ter-invoke-free

feat(routing): FB-01 OpenRouter free-tier invoke + leaderboard matrix (#94)
- model-router: peer band (Omni auto/best-free + OR :free) ordered by
  role model preference; Gemini residual only
- http-llm-invoke: shared OpenAI-compat call + comment; auto base URL
  discovery; curl timeouts; :free hard rule
- routing-priority.yaml v2 peer policy + discovery catalog (ADE/BIUDL)
- gemini-triage: wire has-omni + peer invoke paths

FREE TIER ONLY. After #93 + #97 on master.

Signed-off-by: Grok <grok@x.ai>
…list, wire review/invoke

Devin 🔴 triage prompt had no issue #/title/body/EXTRA_CTX.
SEC: validate https + catalog hosts before Bearer POST.
Wire has-omni + http-llm-invoke on review/invoke; continue-on-error on invoke.
FREE TIER ONLY. Closes operational gap for #91.

Signed-off-by: Grok <grok@x.ai>
…101)

Peer Omni/OpenRouter by desired model + soft budget; Gemini residual.
Triage fetches issue context; https host allow-list; review/invoke wired.
FREE TIER ONLY. Implements #91.

Signed-off-by: Grok <grok@x.ai>
Was hard-coded has-openrouter:false → always Gemini-only.
Wire peer flags + optional peer HTTP second-pass; Gemini residual kept.
Checkout default branch for trusted composite actions under workflow_run.

Signed-off-by: Grok <grok@x.ai>
…#102)

Wire has-omni/has-openrouter on after-peers; peer HTTP second-pass; Gemini residual.
Trusted checkout from default branch under workflow_run.

Signed-off-by: Grok <grok@x.ai>
Maximize CodeRabbit coverage on deep_core track and auto-labeling.

Implements: CodeRabbit maximization (operator request)

Signed-off-by: Grok <grok@x.ai>
…outing (#119)

- Replaced rigid bash picking logic inside GHA model router with `scripts/model_router.py`.
- Implemented real-time OpenRouter `:free` model availability polling via live API endpoint.
- Introduced custom performance index (ELO ≈ 3L0) in `docs/schemas/model-success-matrix.yaml` to phase out reliance on public leaderboards.
- Maintained 100% GHA cache budget compatibility and added comprehensive pytest unit tests under `tests/test_model_router.py`.
…119)

- Replaced rigid bash picking logic inside GHA model router with `scripts/model_router.py`.
- Implemented real-time OpenRouter `:free` model availability polling via live API endpoint.
- Introduced custom performance index (ELO ≈ 3L0) in `docs/schemas/model-success-matrix.yaml` to phase out reliance on public leaderboards.
- Catch Linear 'usage limit exceeded' / 'USAGE_LIMIT_EXCEEDED' GraphQL errors gracefully in `agent-feedback-linear-sync.yml` to prevent CI failure when free tiers are exhausted.
- Maintained 100% GHA cache budget compatibility and added comprehensive pytest unit tests under `tests/test_model_router.py`.
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…ching, robust fallback, security checks, and graceful Linear sync limit handling (#119)

- Replaced rigid GHA bash router with `scripts/model_router.py`.
- Added 1-hour temporal file caching for OpenRouter `:free` model list polling to optimize polling timing/intervals.
- Guarded polling behind `has_openrouter` to completely eliminate redundant network latency on restricted runners.
- Asserted `:free` suffix check on all selected OpenRouter models for robust safety enforcement.
- Wrapped `main()` in a top-level try-except for seamless graceful degradation inside actions.
- Moved comment reaction inside try-except for Linear issue synchronization in `agent-feedback-linear-sync.yml` to prevent fake success reactions on limit errors.
- Added comprehensive unit tests in `tests/test_model_router.py` (all passed).
- Replaced rigid GHA bash router with `scripts/model_router.py`.
- Added 1-hour temporal file caching for OpenRouter `:free` model list polling to optimize polling timing/intervals.
- Guarded polling behind `has_openrouter` to completely eliminate redundant network latency on restricted runners.
- Asserted `:free` suffix check on all selected OpenRouter models for robust safety enforcement.
- Wrapped `main()` in a top-level try-except for seamless graceful degradation inside actions.
- Moved comment reaction inside try-except for Linear issue synchronization in `agent-feedback-linear-sync.yml` to prevent fake success reactions on limit errors.
- Added comprehensive unit tests in `tests/test_model_router.py` (all passed).
- Updated `docs/proposals/active/rate-limit-rotation/ITEMS.md` tracking row.

Implements: RL-17
Signed-off-by: Jules <jules@grok.x.ai>
- Replaced rigid GHA bash router with `scripts/model_router.py`.
- Added 1-hour temporal file caching for OpenRouter `:free` model list polling to optimize polling timing/intervals.
- Guarded polling behind `has_openrouter` to completely eliminate redundant network latency on restricted runners.
- Asserted `:free` suffix check on all selected OpenRouter models for robust safety enforcement.
- Wrapped `main()` in a top-level try-except for seamless graceful degradation inside actions.
- Moved comment reaction inside try-except for Linear issue synchronization in `agent-feedback-linear-sync.yml` to prevent fake success reactions on limit errors.
- Added comprehensive unit tests in `tests/test_model_router.py` (all passed).
- Updated `docs/proposals/active/rate-limit-rotation/ITEMS.md` tracking row.

Implements: RL-17
Signed-off-by: Jules <jules@grok.x.ai>
- Replaced rigid GHA bash router with `scripts/model_router.py`.
- Added 1-hour temporal file caching for OpenRouter `:free` model list polling to optimize polling timing/intervals.
- Guarded polling behind `has_openrouter` to completely eliminate redundant network latency on restricted runners.
- Asserted `:free` suffix check on all selected OpenRouter models for robust safety enforcement.
- Wrapped `main()` in a top-level try-except for seamless graceful degradation inside actions.
- Moved comment reaction inside try-except for Linear issue synchronization in `agent-feedback-linear-sync.yml` to prevent fake success reactions on limit errors.
- Added comprehensive unit tests in `tests/test_model_router.py` (all passed).
- Updated `docs/proposals/active/rate-limit-rotation/ITEMS.md` tracking row.

Implements: RL-17
Signed-off-by: Jules <jules@grok.x.ai>
- Replaced rigid GHA bash router with `scripts/model_router.py`.
- Added 1-hour temporal file caching for OpenRouter `:free` model list polling to optimize polling timing/intervals.
- Guarded polling behind `has_openrouter` to completely eliminate redundant network latency on restricted runners.
- Asserted `:free` suffix check on all selected OpenRouter models for robust safety enforcement.
- Wrapped `main()` in a top-level try-except for seamless graceful degradation inside actions.
- Moved comment reaction inside try-except for Linear issue synchronization in `agent-feedback-linear-sync.yml` to prevent fake success reactions on limit errors.
- Added comprehensive unit tests in `tests/test_model_router.py` (all passed).
- Updated `docs/proposals/active/rate-limit-rotation/ITEMS.md` tracking row.

Implements: RL-17
Signed-off-by: Jules <jules@grok.x.ai>
- Replaced rigid GHA bash router with `scripts/model_router.py`.
- Added 1-hour temporal file caching for OpenRouter `:free` model list polling to optimize polling timing/intervals.
- Guarded polling behind `has_openrouter` to completely eliminate redundant network latency on restricted runners.
- Asserted `:free` suffix check on all selected OpenRouter models for robust safety enforcement.
- Wrapped `main()` in a top-level try-except for seamless graceful degradation inside actions.
- Moved comment reaction inside try-except for Linear issue synchronization in `agent-feedback-linear-sync.yml` to prevent fake success reactions on limit errors.
- Added comprehensive unit tests in `tests/test_model_router.py` (all passed).
- Updated `docs/proposals/active/rate-limit-rotation/ITEMS.md` tracking row.

Implements: RL-17
Signed-off-by: Jules <jules@grok.x.ai>
- Replaced rigid GHA bash router with `scripts/model_router.py`.
- Added 1-hour temporal file caching for OpenRouter `:free` model list polling to optimize polling timing/intervals.
- Guarded polling behind `has_openrouter` to completely eliminate redundant network latency on restricted runners.
- Asserted `:free` suffix check on all selected OpenRouter models for robust safety enforcement.
- Wrapped `main()` in a top-level try-except for seamless graceful degradation inside actions.
- Moved comment reaction inside try-except for Linear issue synchronization in `agent-feedback-linear-sync.yml` to prevent fake success reactions on limit errors.
- Added comprehensive unit tests in `tests/test_model_router.py` (all passed).
- Updated `docs/proposals/active/rate-limit-rotation/ITEMS.md` tracking row.

Implements: RL-17
Signed-off-by: Jules <jules@grok.x.ai>
- Replaced rigid GHA bash router with `scripts/model_router.py`.
- Added 1-hour temporal file caching for OpenRouter `:free` model list polling to optimize polling timing/intervals.
- Guarded polling behind `has_openrouter` to completely eliminate redundant network latency on restricted runners.
- Asserted `:free` suffix check on all selected OpenRouter models for robust safety enforcement.
- Wrapped `main()` in a top-level try-except for seamless graceful degradation inside actions.
- Moved comment reaction inside try-except for Linear issue synchronization in `agent-feedback-linear-sync.yml` to prevent fake success reactions on limit errors.
- Added comprehensive unit tests in `tests/test_model_router.py` (all passed).
- Updated `docs/proposals/active/rate-limit-rotation/ITEMS.md` tracking row.

Implements: RL-17
Signed-off-by: Jules <jules@grok.x.ai>
Implements OpenRouter free-model polling and internal ELO≈3L0 historic performance index for triage/review/invoke routing.

Fixes #122
Implements: RL-17
Advances rate-limit-rotation RL-05

Signed-off-by: OPERATOR (Grok via Connectors)
Resolved conflicts in:
- AGENTS.md (both-modified)
- archwiz/archwiz.py (content)
- docs/ARCHW1Z-GATE.md (both-modified)
- docs/ARCHW1Z-OPERATOR-CHECKLIST.md (both-modified)
- docs/ARCHW1Z-STATUS.md (both-modified)
- docs/CONSENSUS.md (both-modified)
- docs/PR-SUMMARY-LOG.md (both-modified)
- docs/PR-SUMMARY-PROCESS.md (both-modified)
- docs/SECURITY-REMEDIATION.md (both-modified)
- docs/TERMUX-SMOKE.md (both-modified)
- docs/proposals/AGENTIC-PERMISSIONS.md (both-modified)
- docs/proposals/PROCESS.md (both-modified)
- docs/proposals/README.md (both-modified)
- docs/proposals/_template/MANIFEST.md (both-modified)
- docs/proposals/active/chatgpt-critical-eval/ITEMS.md (both-modified)
- docs/proposals/active/chatgpt-critical-eval/MANIFEST.md (both-modified)
- docs/proposals/active/chatgpt-droidapp/ITEMS.md (both-modified)
- docs/proposals/active/chatgpt-droidapp/MANIFEST.md (both-modified)
- docs/proposals/active/chatgpt-initial/ITEMS.md (both-modified)
- docs/proposals/active/chatgpt-initial/MANIFEST.md (both-modified)
- docs/proposals/registry.yaml (both-modified)
- docs/schemas/provider-capabilities.md (both-modified)
- docs/schemas/session-ssot.md (both-modified)

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 13 new potential issues.

Open in Devin Review

core.setOutput('prior_prs', inventory);

- name: Invoke Jules API (optional)
if: ${{ secrets.JULES_API_KEY != '' }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 The workflow that summons the coding agent from issues cannot run at all

The step that decides whether to call the coding agent is gated on a secret value inside a step condition (if: ${{ secrets.JULES_API_KEY != '' }} at .github/workflows/agent-jules-on-issues.yml:102), which GitHub does not allow, so the whole workflow is rejected and never runs.

Impact: Labelling an issue or mentioning the agent produces no acknowledgement and no agent work at all.

secrets context is unavailable in step-level if conditions

GitHub Actions only exposes github, needs, strategy, matrix, job, runner, env, vars, steps, inputs to jobs.<id>.steps.if. Referencing secrets there yields Unrecognized named-value: 'secrets' at workflow parse time, which fails the entire run — including the earlier acknowledgement/inventory step in the same job. The same pattern appears three times: .github/workflows/agent-jules-on-issues.yml:102, :138, and :232.

The usual fix is to surface the presence of the secret through a job/step env (or an earlier step output) and test that in if, e.g. set HAS_JULES_KEY: ${{ secrets.JULES_API_KEY != '' }} at job level and use if: env.HAS_JULES_KEY == 'true'.

Prompt for agents
In .github/workflows/agent-jules-on-issues.yml the three step-level conditions at lines 102, 138 and 232 reference the secrets context (`if: ${{ secrets.JULES_API_KEY != '' }}` / `== ''`). GitHub Actions does not expose the secrets context to step-level `if`, so the workflow fails to parse and no job in it ever executes, including the acknowledgement step. Rework the gating so the presence of the key is computed somewhere secrets are allowed (job-level `env:` mapping, or a preceding step that writes an output) and have the steps test that env var / step output instead.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@@ -306,7 +306,7 @@ def index_conversation(self, session_id: str, title: str, messages: List[dict],
for blk_idx, match in enumerate(re.finditer(r"```(\w+)?\n(.*?)```", content, re.DOTALL)):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Previously stored code snippets become unreachable after the content-hash length change

Code snippets are now filed under a full-length fingerprint instead of the short one used until now (hashlib.sha256(...).hexdigest() at cli-synthegration/synthegration_index.py:306), so everything stored earlier can no longer be found and gets saved a second time.

Impact: Existing indexed snippets stop showing up in lookups and the on-disk store silently doubles up on the same content.

Mixed 16-char and 64-char hashes in blobs, index and wire format

All hash producers were widened from hexdigest()[:16] to the full 64-char digest (:206, :228, :306, :557). Blob files already on disk are named <16-char>.blob and are re-registered by _rebuild_hash_index (:274-283) under those short keys, while codex_index.json pointers loaded by _from_flat (:264-271) also carry short ch values. reverse_lookup (:557-564) now computes a 64-char hash, so exact matches against any pre-existing entry always miss, and index_conversation writes a new blob for content already stored.

The wire format is affected too: to_wire (:35-40) emits len(hash)/2 bytes, so old short hashes serialize to 8 bytes while from_wire (:42-47) now unconditionally reads data[20:52], misaligning any stream that contains a legacy pointer.

A migration (rename existing blobs / rewrite index entries, or tolerate both lengths on read) is needed alongside the widening.

Prompt for agents
cli-synthegration/synthegration_index.py switched every content hash from sha256()[:16] to the full 64-char digest (lines 206, 228, 306, 557), but persisted state still uses the old 16-char keys: blob filenames rescanned by _rebuild_hash_index, `ch` fields in codex_index.json read by _from_flat, and any serialized pointers. Consequences: reverse_lookup exact-hash hits always miss for pre-existing content, index_conversation re-writes duplicate blobs, and Pointer.from_wire now assumes a fixed 32-byte hash while to_wire emits 8 bytes for legacy short hashes, so mixed streams deserialize incorrectly. Decide on a migration strategy — e.g. a one-time rename/rewrite of existing blobs and index entries to full-length hashes, plus a length-tolerant read path (and a length prefix or version tag in the wire format) so old data is not silently orphaned.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread scripts/model_router.py
Comment on lines +348 to +360
for candidate in peer_candidates:
prov = candidate["provider"]
mod = candidate["model"]
limit_dict = limits.get(f"{prov}/{mod}", {})
limit = limit_dict.get(role, limit_dict.get("default", 40))

used = get_usage(prov, mod)
if used < limit:
new_used = increment_usage(prov, mod)
print(f"::set-output name=provider::{prov}")
print(f"::set-output name=model::{mod}")
print(f"::set-output name=skip::false")
print(f"::set-output name=reason::role={role} peer={prov} model={mod} used={new_used}/{limit} (ranked score={candidate['score']})")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Router increments the soft-budget counter before the provider call is attempted

increment_usage runs at selection time, but the downstream invoke steps are continue-on-error: true and may fail (transport error, empty response, non-free rejection). Failed attempts therefore consume budget, and since the counters live in a per-branch Actions cache restored/saved around the job, concurrent runs on different branches keep independent tallies. Both are acknowledged as “best-effort” in docs/schemas/model-rotation.yaml, but the accounting will drift optimistically low in aggregate and pessimistically high per branch.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread scripts/model_router.py
Comment on lines +29 to +123
def parse_yaml(filepath):
"""
Minimal robust YAML parser for standard key-value and indentation structures.
Does not require external dependencies like PyYAML.
"""
if not os.path.exists(filepath):
return {}

result = {}
path = []

with open(filepath, 'r', encoding='utf-8') as f:
for line in f:
stripped = line.strip()
if not stripped or stripped.startswith('#'):
continue

indent = len(line) - len(line.lstrip())

while path and path[-1][0] >= indent:
path.pop()

if not path:
parent = result
parent_key = None
else:
parent = path[-1][1]
parent_key = path[-1][2]

if stripped.startswith('- '):
item_str = stripped[2:].strip()
if ':' in item_str and not (item_str.startswith('"') or item_str.startswith("'")):
k, v = item_str.split(':', 1)
k = k.strip().strip('"\'')
v = v.strip().strip('"\'')
try:
if '.' in v: v = float(v)
else: v = int(v)
except ValueError:
pass
item_val = {k: v}
else:
item_val = item_str.strip('"\'')
try:
if '.' in item_val: item_val = float(item_val)
else: item_val = int(item_val)
except ValueError:
pass

if isinstance(parent, dict) and parent_key is not None:
if parent_key not in parent or not isinstance(parent[parent_key], list):
parent[parent_key] = []
parent[parent_key].append(item_val)
if isinstance(item_val, dict):
sub_key = list(item_val.keys())[0]
path.append((indent, item_val, sub_key))
continue

m = re.match(r'^("[^"]+"|\'[^\']+\'|[^:]+):\s*(.*)$', stripped)
if not m:
continue

key = m.group(1).strip().strip('"\'')
val = m.group(2).strip()
if '#' in val:
val = val.split('#')[0].strip()
val = val.strip('"\'')

if not val:
new_dict = {}
if isinstance(parent, dict):
parent[key] = new_dict
path.append((indent, new_dict, key))
else:
if val.startswith('[') and val.endswith(']'):
parsed_val = [v.strip().strip('"\'') for v in val[1:-1].split(',')]
else:
if val.lower() == 'true':
parsed_val = True
elif val.lower() == 'false':
parsed_val = False
else:
try:
if '.' in val:
parsed_val = float(val)
else:
parsed_val = int(val)
except ValueError:
parsed_val = val

if isinstance(parent, dict):
parent[key] = parsed_val
path.append((indent, parent, key))

return result

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Hand-rolled YAML parser is fragile for the success matrix it consumes

parse_yaml only supports a narrow subset: it ignores block scalars (|/>), anchors, multi-line strings, and nested lists-of-lists, and it treats any # inside an unquoted scalar as a comment. docs/schemas/model-success-matrix.yaml currently fits the subset, but adding a notes: | block or an inline # to that file would silently produce wrong ELO/suitability values and thus wrong routing, with no error. Consider validating the parsed structure (e.g. assert every model entry has a numeric elo) so schema drift fails loudly instead of degrading to the 1000 default.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

blob = Path(blob_path)
if blob.exists():
results.append({
'pointer': p.to_key(),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Search results still crash when a blob has no recorded timestamp

self.time_index.get(p.content_hash, '') falls back to a plain string, and ''.isoformat() raises AttributeError. Pointers restored by _rebuild_hash_index (cli-synthegration/synthegration_index.py:274-283) never populate time_index, so any recovered blob that matches a search will blow up here — exactly the recovery path this module exists for. The surrounding lines were touched in this PR (blob lookup moved to self.blobs), so it is a natural place to also return None plus a timestamp_source marker, as docs/schemas/session-ssot.md prescribes.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +209 to +217
- name: Publish peer-review-ready marker
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
SUMMARY: ${{ steps.wait.outputs.peer_summary }}
AUTOFIX: ${{ steps.autofix.outputs.posted }}
TIMED_OUT: ${{ steps.wait.outputs.timed_out }}
READY: ${{ steps.wait.outputs.ready }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Peer-review gate publishes the ready marker even when no peer was seen

The Publish peer-review-ready marker step has no if: guard, so it posts on every run, including the timeout path where ready: false. Downstream, gemini-after-peers.yml:69-75 only searches for the marker comment and never inspects the embedded ready:/timed_out: fields, so a 12-minute timeout with zero peer activity still triggers the second-pass reviewer — which defeats the stated purpose of saving free-tier quota until peers finish. Consider having the consumer parse ready: or gating publication on steps.wait.outputs.ready == 'true'.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +92 to +115
- name: Post @jules resolve (idempotent window)
if: steps.meta.outputs.should_invoke == 'true'
uses: actions/github-script@v7
with:
script: |
const prNumber = Number('${{ steps.meta.outputs.pr_number }}');
const head = '${{ steps.meta.outputs.head_ref }}';
const marker = '<!-- agent-auto-jules -->';
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
per_page: 50,
});
const recent = comments
.filter(c => c.body && c.body.includes(marker))
.sort((a, b) => new Date(b.created_at) - new Date(a.created_at))[0];
if (recent) {
const ageMs = Date.now() - new Date(recent.created_at).getTime();
if (ageMs < 20 * 60 * 1000) {
core.info('Debounced: recent agent-auto-jules comment exists');
return;
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Second-pass workflow can loop on its own comments

gemini-after-peers only runs on workflow_run of the orchestrator, which is fine, but agent-review-auto-jules.yml fires on issue_comment/pull_request_review_comment from any login containing coderabbit/devin and posts a new PR comment. The orchestrator in turn posts @coderabbitai autofix, which will trigger CodeRabbit to comment again. The only brakes are the 20-minute debounce (agent-review-auto-jules.yml:109-115) and the 45-minute autofix throttle (peer-review-orchestrator.yml:169-179); both are time-based rather than SHA-based for the auto-jules path, so a busy PR can still produce repeated cycles. Worth confirming the loop terminates in practice before enabling on high-traffic branches.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skipped: comment is from another GitHub bot.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@coderabbitai resolve conflicts && fix #15 (review)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="timerloggedout-spec/termux-monorepo"
pr="15"
review_id="4893888061"

echo "== PR metadata =="
gh api "repos/$repo/pulls/$pr" \
  --jq '{number, state, mergeable, mergeable_state, head: .head.sha, head_ref: .head.ref, base_ref: .base.ref, changed_files, url}'

echo
echo "== Referenced review =="
gh api "repos/$repo/pulls/$pr/reviews/$review_id" \
  --jq '{id, user: .user.login, state, body, submitted_at, commit_id}'

echo
echo "== Comments in referenced review =="
gh api "repos/$repo/pulls/$pr/comments?per_page=100" \
  --jq --argjson review_id "$review_id" \
  '.[] | select(.pull_request_review_id == $review_id) |
   {id, path, line, start_line, side, body, user: .user.login, commit_id, html_url}'

echo
echo "== All unresolved review threads =="
gh api graphql \
  -F owner="timerloggedout-spec" \
  -F name="termux-monorepo" \
  -F number="$pr" \
  -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        nodes {
          isResolved
          path
          line
          comments(first: 20) {
            nodes {
              author { login }
              body
              url
            }
          }
        }
      }
    }
  }
}' \
  --jq '.data.repository.pullRequest.reviewThreads.nodes[] |
   select(.isResolved == false) |
   {path, line, comments: [.comments.nodes[] | {author: .author.login, body, url}]}'

Length of output: 2973


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="timerloggedout-spec/termux-monorepo"
pr="15"
review_id="4893888061"
base_ref="manus/novel-work"

echo "== Comments in review $review_id =="
gh api --paginate "repos/$repo/pulls/$pr/comments?per_page=100" |
  jq --argjson review_id "$review_id" '
    .[] | select(.pull_request_review_id == $review_id) |
    {
      id,
      path,
      line,
      start_line,
      side,
      body,
      user: .user.login,
      commit_id,
      html_url
    }
  '

echo
echo "== Unresolved review threads =="
gh api graphql \
  -F owner="timerloggedout-spec" \
  -F name="termux-monorepo" \
  -F number="$pr" \
  -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        nodes {
          isResolved
          path
          line
          comments(first: 20) {
            nodes {
              author { login }
              body
              url
            }
          }
        }
      }
    }
  }
}' |
  jq '
    .data.repository.pullRequest.reviewThreads.nodes[] |
    select(.isResolved == false) |
    {
      path,
      line,
      comments: [.comments.nodes[] | {author: .author.login, body, url}]
    }
  '

echo
echo "== Conflicting files =="
git fetch --quiet origin "$base_ref"
base="$(git merge-base HEAD "origin/$base_ref")"
git merge-tree "$base" HEAD "origin/$base_ref" |
  awk '
    /^changed in both$/ { capture=1; next }
    capture && /^  base / { next }
    capture && /^  our / { next }
    capture && /^  their / { next }
    capture && /^  result / { next }
    capture && /^  / { sub(/^  /, ""); print; capture=0 }
  ' |
  sort -u

Length of output: 74166


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="timerloggedout-spec/termux-monorepo"
pr="15"

base_sha="$(gh api "repos/$repo/pulls/$pr" --jq '.base.sha')"
head_sha="$(gh api "repos/$repo/pulls/$pr" --jq '.head.sha')"

echo "base_sha=$base_sha"
echo "head_sha=$head_sha"

git fetch --quiet origin "$base_sha" "$head_sha"
merge_base="$(git merge-base "$head_sha" "$base_sha")"

echo "== Conflicted paths =="
git merge-tree --messages "$merge_base" "$head_sha" "$base_sha" |
  sed -n '/^CONFLICT/,/^$/p'

echo "== Changed files on both sides =="
git diff --name-only "$merge_base" "$head_sha" | sort > /tmp/pr-files
git diff --name-only "$merge_base" "$base_sha" | sort > /tmp/base-files
comm -12 /tmp/pr-files /tmp/base-files

Length of output: 1208


🏁 Script executed:

#!/bin/bash
set -euo pipefail

workflow=".github/workflows/agent-jules-on-issues.yml"
ast-grep outline "$workflow" --items all || true
echo "== Secret and event-expression uses =="
rg -n -C 4 '\bsecrets\.JULES_API_KEY\b|github\.event\.(issue|comment)\.(title|body)' "$workflow"
echo "== Workflow section =="
sed -n '1,280p' "$workflow"

Length of output: 13673


🏁 Script executed:

#!/bin/bash
set -euo pipefail

file="cli-synthegration/synthegration_index.py"
ast-grep outline "$file" --lang python --items all
echo "== Persistence and search implementations =="
rg -n -C 5 'class Pointer|def (to_wire|from_wire|_from_flat|_rebuild_hash_index|index_conversation|reverse_lookup|search)' "$file"
echo "== Candidate tests =="
fd -t f . | rg '(^|/)(test.*synthegration|.*synthegration.*test).*\.py$'

Length of output: 9021


🏁 Script executed:

#!/bin/bash
set -euo pipefail

for file in \
  ".github/workflows/peer-review-orchestrator.yml" \
  ".github/workflows/gemini-after-peers.yml" \
  ".github/actions/http-llm-invoke/action.yml" \
  "scripts/model_router.py" \
  "tests/test_model_router.py" \
  "docs/schemas/model-success-matrix.yaml"; do
  if [ -f "$file" ]; then
    echo "== $file =="
    ast-grep outline "$file" --items all 2>/dev/null || true
    rg -n -C 4 'peer-review-ready|ready:|timed_out:|::set-output|GITHUB_OUTPUT|parse_yaml|increment_usage|elo|exit 0|::error::' "$file" || true
  fi
done

Length of output: 18359


🏁 Script executed:

#!/bin/bash
set -euo pipefail

files=(
  "termux-multi-agent/src/db.py"
  "src/db.py"
  "termux-multi-agent/run.py"
  "termux-multi-agent/workspace/run.py"
  "termux-multi-agent/provision_agent.py"
  "termux-multi-agent/dashboard.py"
  "archwiz/linear_sync.py"
  "archwiz/archwiz.py"
  "archwiz/restore_version.py"
)

for file in "${files[@]}"; do
  if [ -f "$file" ]; then
    echo "== $file =="
    ast-grep outline "$file" --lang python --items all
    rg -n -C 4 'batch_insert_fts_messages|messages_fts|index_project_file|except Exception|conn\.commit|task_id|subprocess\.run|PIPELINE_ACTIVE|restore\(' "$file" || true
  fi
done

echo "== Candidate tests =="
fd -t f . | rg '(^|/)(test.*(archwiz|linear_sync|db|provision|router)|.*(archwiz|linear_sync|db|provision|router).*test).*\.py$'

Length of output: 28394


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base_sha="40feea7790aafa7cac2bd13ffc596cb9ab0f1489"
head_sha="20e9c0be9fef85800ad5253d337d63f28a90b377"

git fetch --quiet origin "$base_sha" "$head_sha"

echo "== Merge conflicts =="
git merge-tree --write-tree "$head_sha" "$base_sha" 2>&1 || true

echo
echo "== Synthegration persistence and result rendering =="
sed -n '250,370p' "cli-synthegration/synthegration_index.py"
sed -n '540,585p' "cli-synthegration/synthegration_index.py"

echo
echo "== Peer-ready publication and consumer selection =="
sed -n '195,255p' ".github/workflows/peer-review-orchestrator.yml"
sed -n '45,90p' ".github/workflows/gemini-after-peers.yml"

echo
echo "== Model-router parser and output helpers =="
sed -n '29,125p' "scripts/model_router.py"
sed -n '345,455p' "scripts/model_router.py"

echo
echo "== FTS and embedded-template shapes =="
sed -n '142,210p' "termux-multi-agent/src/db.py"
sed -n '1,145p' "termux-multi-agent/provision_agent.py"

Length of output: 29117


@timerloggedout-spec, I completed the analysis and prepared the code-change plan.

The confirmed fixes cover:

  • .github/workflows/agent-jules-on-issues.yml

    • Replace invalid step-level secrets conditions.
    • Pass issue and comment text as environment data. Do not interpolate it into workflow script or prompt syntax.
  • cli-synthegration/synthegration_index.py

    • Support legacy 16-character hashes with full SHA-256 hashes.
    • Prevent duplicate legacy blobs.
    • Make pointer decoding compatible with persisted data.
    • Handle missing timestamps safely.
  • .github/workflows/peer-review-orchestrator.yml and .github/workflows/gemini-after-peers.yml

    • Prevent the second-pass workflow from running when the peer-review gate is not ready.
  • .github/actions/http-llm-invoke/action.yml

    • Return a failing status for invalid HTTPS and OpenRouter free-model validation paths.
  • scripts/model_router.py and tests/test_model_router.py

    • Remove deprecated ::set-output commands.
    • Retain GITHUB_OUTPUT.
    • Add validation for malformed model-matrix entries.
  • termux-multi-agent database, runner, and provisioning-template files

    • Make FTS re-indexing idempotent.
    • Report indexing and commit failures.
    • Synchronize generated templates with live modules.
  • archwiz/linear_sync.py and archwiz/archwiz.py

    • Skip empty task IDs.
    • Match Markdown-adjacent IDs without matching partial IDs.
    • Handle OSError from controller and backup subprocess launches.

GitHub still reports the PR as conflicted. The local merge simulation produced a merge tree without conflict diagnostics. This result is inconclusive. After the planned branch updates, GitHub must recompute the merge status before the conflict can be considered resolved.

You are interacting with an AI system.

Comment on lines +79 to +104
if [[ ! "$RAW" =~ ^https:// ]]; then
echo "::error::base_url must be https:// (got scheme-less or http)"
exit 0
fi
HOST=$(echo "$RAW" | sed -E 's|^https://([^/]+).*|\1|' | tr '[:upper:]' '[:lower:]')
OK=0
for h in $ALLOW_HOSTS; do
if [ "$HOST" = "$h" ]; then OK=1; break; fi
done
if [ "$OK" != 1 ]; then
echo "::error::base_url host '$HOST' not in allow-list ($ALLOW_HOSTS); using catalog default"
RAW="$CATALOG"
fi
BASE="$RAW"

case "$PROVIDER" in
omni)
TITLE="termux-monorepo-${ROLE}-omni"
MARKER="<!-- omni-${ROLE} -->"
HEAD="### 🌐 OmniRoute ${ROLE} (\`${MODEL}\`)"
EGG="<!-- matrix: valley-hunt via omni free aggregation / 3L0 labels pending -->"
;;
openrouter)
if [[ "$MODEL" != *:free ]]; then
echo "::error::OpenRouter path requires :free model id (got $MODEL)"
exit 0

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: HTTP invoke action reports a hard error but exits successfully

Both the scheme check and the OpenRouter :free check emit ::error:: and then exit 0, so the step is green while doing nothing. Since callers already set continue-on-error: true, using a non-zero exit (or downgrading to ::warning::) would keep run logs honest — as written, an annotated error with a passing step is easy to miss. Note also that the non-allow-listed-host branch falls back to the catalog default and continues, which is a different (and reasonable) policy than the scheme branch that aborts.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread scripts/model_router.py
Comment on lines +357 to +360
print(f"::set-output name=provider::{prov}")
print(f"::set-output name=model::{mod}")
print(f"::set-output name=skip::false")
print(f"::set-output name=reason::role={role} peer={prov} model={mod} used={new_used}/{limit} (ranked score={candidate['score']})")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Deprecated ::set-output commands are still emitted

::set-output was disabled on GitHub-hosted runners; the script also writes GITHUB_OUTPUT, so routing still works, but the stdout commands are dead weight and will show as workflow warnings. The crash handler at scripts/model_router.py:429-447 relies on the same pair, so removing the ::set-output prints is safe as long as the GITHUB_OUTPUT writes are retained. The tests in tests/test_model_router.py:160-163 assert on the deprecated stdout form, so they would need updating together.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +108 to +116
prompt: |
You are Jules working on termux-monorepo. Read AGENTS.md and GEMINI.md if present.

## Issue #${{ github.event.issue.number }}: ${{ github.event.issue.title }}

${{ github.event.issue.body }}

## Open agent / related PRs (DO NOT overlap files)
${{ steps.coord.outputs.prior_prs }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟨 Untrusted PR/issue text is interpolated directly into workflow shell and prompt expressions

Several new workflows inline attacker-controllable payload fields directly into run:/prompt bodies via ${{ }} expansion, e.g. the Jules invoke prompt embeds ${{ github.event.issue.title }} / ${{ github.event.issue.body }} (.github/workflows/agent-jules-on-issues.yml:111-113, :239-244). Anything expanded with ${{ }} is substituted before the step content is parsed, so issue/comment text containing quote or backtick sequences can alter the surrounding YAML/shell context rather than being treated as data.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@timerloggedout-spec

Copy link
Copy Markdown
Owner

sha: 20e9c0b
state: dirty
threads_open: 23

@jules Continuous ops (GHA agent-continuous-ops) — unattended advance.

PR #15 · coderabbitai/autofix/40feea7 → manus/novel-work
Why: merge conflict / dirty vs base; stale agent activity (187h)

Instructions

  1. Rebase or merge base into head; resolve conflicts; push.
  2. Prefer content-preserving resolution; cite Implements: if board item applies.
  3. Address all open review threads (CodeRabbit, Devin, Copilot).
  4. Prefer minimal diffs; preserve Sentinel 0o600/0o700.
    Push commits to the existing head branch. Do not retarget base without cause.
    Skip pure nits only if they conflict with security/gates.
    If the PR is superseded, close it with a pointer to the replacement.

Read AGENTS.md. No Class 3/4 artifacts. No secret leaks.
Agent: Grok orchestration · Profile: https://x.com/grok

This branch was successfully deployed

1 active deployment
Preview — 20e9c0be Deployed Aug 10, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant