The buglog had no status field, so "is this bug open?" meant reading free text, and gitea-sync closed any issue whose `fix` text was non-empty -- including "NOT FIXED"/"PENDING"/"PARTIALLY FIXED" ones (bug-1855). - Backfill `status` (+ status_updated) on all 1,193 entries. The 85 entries whose text said not-fixed/pending/out-of-scope were checked against HEAD and git history; the rest are `fixed`. Result: 36 open, 10 partial, 2 investigating, 5 cannot-reproduce, 4 wontfix, 1 duplicate. Insert-only diff: existing lines are untouched. - .claude/rules/buglog-status.md defines the status values (kept out of openwolf.md, which `openwolf update` overwrites). - scripts/buglog.py + buglog skill: add (next free id), status, note, recur, list, show, triage. Edits only the touched entry's lines; a full json.dumps rewrite churns ~1,200 lines of mixed \u-escaping. - gitea-sync (script + skill): state and a single bug:<status> label come from `status`; reopen supported; issues shared by several entries follow the most-open one; only status labels are swapped; per-entry write-back with gitea_synced_status so unchanged entries cost no API calls; list-typed `fix` no longer crashes; spec issues close on done phases (spec.json has no implementation approval); --since no longer floods Gitea after the backfill. - Disable OpenWolf buglog auto-detection: its hook numbers new entries len(bugs)+1, which collides with existing ids (bug-1856, upstream). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
122 lines
No EOL
2.5 KiB
JSON
122 lines
No EOL
2.5 KiB
JSON
{
|
|
"version": 1,
|
|
"openwolf": {
|
|
"enabled": true,
|
|
"buglog": {
|
|
"auto_detect": false
|
|
},
|
|
"anatomy": {
|
|
"auto_scan_on_init": true,
|
|
"rescan_interval_hours": 6,
|
|
"max_description_length": 100,
|
|
"max_files": 500,
|
|
"exclude_patterns": [
|
|
"node_modules",
|
|
".git",
|
|
"dist",
|
|
"build",
|
|
".wolf",
|
|
".next",
|
|
".nuxt",
|
|
"coverage",
|
|
"__pycache__",
|
|
".cache",
|
|
"target",
|
|
".vscode",
|
|
".idea",
|
|
".turbo",
|
|
".vercel",
|
|
".netlify",
|
|
".output",
|
|
"*.min.js",
|
|
"*.min.css"
|
|
]
|
|
},
|
|
"token_audit": {
|
|
"enabled": true,
|
|
"report_frequency": "weekly",
|
|
"waste_threshold_percent": 15,
|
|
"chars_per_token_code": 3.5,
|
|
"chars_per_token_prose": 4
|
|
},
|
|
"cron": {
|
|
"enabled": true,
|
|
"max_retry_attempts": 3,
|
|
"dead_letter_enabled": true,
|
|
"heartbeat_interval_minutes": 30,
|
|
"use_claude_p": true,
|
|
"api_key_env": null
|
|
},
|
|
"memory": {
|
|
"consolidation_after_days": 7,
|
|
"max_entries_before_consolidation": 200
|
|
},
|
|
"cerebrum": {
|
|
"max_tokens": 2000,
|
|
"reflection_frequency": "weekly"
|
|
},
|
|
"daemon": {
|
|
"port": 18790,
|
|
"log_level": "info"
|
|
},
|
|
"dashboard": {
|
|
"enabled": true,
|
|
"port": 18791,
|
|
"host": "127.0.0.1"
|
|
},
|
|
"designqc": {
|
|
"enabled": true,
|
|
"viewports": [
|
|
{
|
|
"name": "desktop",
|
|
"width": 1440,
|
|
"height": 900
|
|
},
|
|
{
|
|
"name": "mobile",
|
|
"width": 375,
|
|
"height": 812
|
|
}
|
|
],
|
|
"max_screenshots": 6,
|
|
"chrome_path": null
|
|
},
|
|
"agents": [
|
|
"claude"
|
|
],
|
|
"reads": {
|
|
"duplicate_mode": "warn",
|
|
"skeleton_hints": true
|
|
},
|
|
"bash": {
|
|
"filter_mode": "suggest",
|
|
"governor": {
|
|
"mode": "replace",
|
|
"threshold_tokens": 2000,
|
|
"families": {
|
|
"grep_flood": "replace",
|
|
"file_print": "replace",
|
|
"git_show": "replace",
|
|
"test": "suggest",
|
|
"build": "suggest",
|
|
"unknown": "suggest"
|
|
}
|
|
}
|
|
},
|
|
"context": {
|
|
"session_digest_budget_tokens": 1500,
|
|
"reinjection_interval": 25,
|
|
"state_budgets": {
|
|
".wolf/cerebrum.md": 2000,
|
|
".wolf/STATUS.md": 1000
|
|
},
|
|
"budgets": {
|
|
"claude": 1500,
|
|
"codex": 1200,
|
|
"gemini": 1200,
|
|
"opencode": 1200,
|
|
"cursor": 800
|
|
}
|
|
}
|
|
}
|
|
} |