{"data":{"skill":{"slug":"rebelytics-task-observer","name":"task-observer","icon":"📦","repo":"https://github.com/rebelytics/one-skill-to-rule-them-all/tree/da860265ae968bdc6bb13b96c2c75fcb61176b72/","status":"approved","author":"rebelytics","authorVersion":"3.5.0","skillstoreRevision":1},"audit":{"id":"9340f949-5282-48ec-a386-5158becaace0","skill_id":"4c43430a-a6ca-4cc1-ae65-543bb9d6fe22","version":1,"content_hash":"v3:ebde31dd87e995952f287ead2e304320ba5fefce:0294c3ee7d9d7691f6ae190c7eb0718be67126ff454ab070bde868e91dbcfb68:c249c33e2414ccf0115eab9aa8f3d248b1b7f8585e88bed532a6195b5454a180:736b696c6c732f726562656c79746963732f7461736b2d6f62736572766572:9444ddec704fa6a5a7e9ab079e184b40","risk_level":"critical","is_blocked":true,"safe_to_publish":false,"analysis_status":"ok","agent_auto_install_policy":"blocked","manual_install_policy":"allowed_with_warning","summary":"Of 400 supplied findings, 399 are false positives; one release command exposes shell injection through direct tag interpolation. A critical semantic finding identifies instructions to retry denied writes through another tool. No evidence found of credential exfiltration; 228 omitted static matches remain unconfirmed and require manual review before automatic publication. Static review was capped at 400/628 representative findings; omitted static matches are unconfirmed, so automatic publishing stays disabled until manual review.","remediation":[{"issue":"Static review capped","severity":"medium","suggestion":"Manually review the omitted 228 static analyzer matches or reduce bundled generated/vendor/reference content before enabling automatic publication."},{"issue":"The core instructs agents to retry permission-denied writes through alternate tools.","severity":"critical","suggestion":"Remove alternate-tool retries after permission denials. Stop the denied operation and use the harness approval path when explicitly available."},{"issue":"The release upload interpolates the release tag directly into shell source.","severity":"high","suggestion":"Pass github.event.release.tag_name through an environment variable and expand that variable as a quoted argument. Do not interpolate event values into run scripts."},{"issue":"The static analyzer omitted 228 repeated or lower-priority matches from the supplied adjudication catalog.","severity":"medium","suggestion":"Review the omitted matches before automatic publication. Keep that review limitation visible without inferring their verdicts from this catalog."}],"risk_factor_evidence":[{"factor":"network","evidence":[{"file":".claude-plugin/marketplace.json","line_end":2,"line_start":2},{"file":".claude-plugin/marketplace.json","line_end":6,"line_start":6},{"file":".claude-plugin/plugin.json","line_end":2,"line_start":2},{"file":".claude-plugin/plugin.json","line_end":8,"line_start":8},{"file":".claude-plugin/plugin.json","line_end":10,"line_start":10},{"file":".claude-plugin/plugin.json","line_end":11,"line_start":11},{"file":".github/ISSUE_TEMPLATE/config.yml","line_end":4,"line_start":4},{"file":"README.md","line_end":9,"line_start":9},{"file":"references/skill-authoring.md","line_end":1278,"line_start":1278},{"file":"references/weekly-review.md","line_end":968,"line_start":968}]},{"factor":"filesystem","evidence":[{"file":".github/workflows/release-bundle.yml","line_end":18,"line_start":18},{"file":".github/workflows/release-bundle.yml","line_end":19,"line_start":19},{"file":".github/workflows/release-bundle.yml","line_end":20,"line_start":20},{"file":".github/workflows/release-bundle.yml","line_end":21,"line_start":21},{"file":".github/workflows/release-bundle.yml","line_end":23,"line_start":23},{"file":".github/workflows/release-bundle.yml","line_end":27,"line_start":27},{"file":".github/workflows/tessl-publish.yml","line_end":51,"line_start":51},{"file":".github/workflows/tessl-publish.yml","line_end":54,"line_start":54},{"file":"references/environments.md","line_end":503,"line_start":503},{"file":"references/environments.md","line_end":506,"line_start":506},{"file":"references/environments.md","line_end":517,"line_start":517},{"file":"references/environments.md","line_end":533,"line_start":533},{"file":"references/environments.md","line_end":513,"line_start":513},{"file":"references/environments.md","line_end":517,"line_start":517},{"file":"references/environments.md","line_end":536,"line_start":536},{"file":"references/environments.md","line_end":503,"line_start":503},{"file":"references/environments.md","line_end":506,"line_start":506},{"file":"references/environments.md","line_end":517,"line_start":517},{"file":"references/environments.md","line_end":365,"line_start":365},{"file":"references/environments.md","line_end":723,"line_start":723},{"file":"references/environments.md","line_end":1017,"line_start":1017},{"file":"references/environments.md","line_end":365,"line_start":365},{"file":"references/environments.md","line_end":723,"line_start":723},{"file":"references/environments.md","line_end":1017,"line_start":1017},{"file":"references/environments.md","line_end":160,"line_start":160},{"file":"references/environments.md","line_end":458,"line_start":458},{"file":"references/environments.md","line_end":459,"line_start":459},{"file":"references/environments.md","line_end":907,"line_start":907},{"file":"references/environments.md","line_end":908,"line_start":908},{"file":"references/environments.md","line_end":909,"line_start":909},{"file":"references/environments.md","line_end":512,"line_start":512},{"file":"references/environments.md","line_end":928,"line_start":928},{"file":"references/migration.md","line_end":158,"line_start":158},{"file":"references/migration.md","line_end":179,"line_start":179},{"file":"references/migration.md","line_end":46,"line_start":46},{"file":"references/migration.md","line_end":179,"line_start":179},{"file":"references/migration.md","line_end":153,"line_start":153},{"file":"references/observation-log.md","line_end":744,"line_start":744},{"file":"references/observation-log.md","line_end":887,"line_start":887},{"file":"references/observation-log.md","line_end":949,"line_start":949},{"file":"references/observation-log.md","line_end":971,"line_start":971},{"file":"references/observation-log.md","line_end":980,"line_start":980},{"file":"references/observation-log.md","line_end":1200,"line_start":1200},{"file":"references/observation-log.md","line_end":385,"line_start":385},{"file":"references/observation-log.md","line_end":965,"line_start":965},{"file":"references/observation-log.md","line_end":970,"line_start":970},{"file":"references/observation-log.md","line_end":971,"line_start":971},{"file":"references/observation-log.md","line_end":1200,"line_start":1200},{"file":"references/skill-authoring.md","line_end":739,"line_start":739},{"file":"references/skill-authoring.md","line_end":739,"line_start":739}]},{"factor":"env_access","evidence":[{"file":".github/workflows/release-bundle.yml","line_end":26,"line_start":26},{"file":"references/skill-authoring.md","line_end":1277,"line_start":1277},{"file":"references/weekly-review.md","line_end":487,"line_start":487},{"file":"references/weekly-review.md","line_end":500,"line_start":500},{"file":"references/weekly-review.md","line_end":501,"line_start":501},{"file":"scripts/migrate-log.py","line_end":365,"line_start":365}]},{"factor":"external_commands","evidence":[{"file":".github/workflows/tessl-publish.yml","line_end":37,"line_start":37},{"file":"references/environments.md","line_end":542,"line_start":512},{"file":"references/environments.md","line_end":1374,"line_start":1364},{"file":"references/environments.md","line_end":458,"line_start":458},{"file":"references/environments.md","line_end":459,"line_start":459},{"file":"references/environments.md","line_end":1043,"line_start":1043},{"file":"references/environments.md","line_end":898,"line_start":898},{"file":"references/environments.md","line_end":908,"line_start":908},{"file":"references/environments.md","line_end":909,"line_start":909},{"file":"references/environments.md","line_end":961,"line_start":961},{"file":"references/environments.md","line_end":967,"line_start":967},{"file":"references/environments.md","line_end":455,"line_start":455},{"file":"references/migration.md","line_end":137,"line_start":137},{"file":"references/migration.md","line_end":139,"line_start":139},{"file":"references/observation-log.md","line_end":92,"line_start":86},{"file":"references/observation-log.md","line_end":391,"line_start":376},{"file":"references/observation-log.md","line_end":981,"line_start":972},{"file":"references/observation-log.md","line_end":1365,"line_start":1363},{"file":"references/observation-log.md","line_end":91,"line_start":91},{"file":"references/observation-log.md","line_end":367,"line_start":367},{"file":"references/observation-log.md","line_end":368,"line_start":368},{"file":"references/observation-log.md","line_end":376,"line_start":376},{"file":"references/observation-log.md","line_end":377,"line_start":377},{"file":"references/observation-log.md","line_end":383,"line_start":383},{"file":"references/observation-log.md","line_end":385,"line_start":385},{"file":"references/observation-log.md","line_end":887,"line_start":887},{"file":"references/observation-log.md","line_end":888,"line_start":888},{"file":"references/observation-log.md","line_end":963,"line_start":963},{"file":"references/observation-log.md","line_end":964,"line_start":964},{"file":"references/observation-log.md","line_end":965,"line_start":965},{"file":"references/observation-log.md","line_end":971,"line_start":971},{"file":"references/observation-log.md","line_end":972,"line_start":972},{"file":"references/observation-log.md","line_end":973,"line_start":973},{"file":"references/observation-log.md","line_end":974,"line_start":974},{"file":"references/observation-log.md","line_end":976,"line_start":976},{"file":"references/observation-log.md","line_end":977,"line_start":977},{"file":"references/observation-log.md","line_end":978,"line_start":978},{"file":"references/observation-log.md","line_end":1200,"line_start":1200},{"file":"references/observation-log.md","line_end":1201,"line_start":1201},{"file":"references/observation-log.md","line_end":1202,"line_start":1202},{"file":"references/observation-log.md","line_end":1361,"line_start":1361},{"file":"references/observation-log.md","line_end":1363,"line_start":1363},{"file":"references/observation-log.md","line_end":1556,"line_start":1556},{"file":"references/observation-log.md","line_end":1557,"line_start":1557},{"file":"references/observation-log.md","line_end":1559,"line_start":1559},{"file":"references/observation-log.md","line_end":1571,"line_start":1571},{"file":"references/observation-log.md","line_end":1572,"line_start":1572},{"file":"references/observation-log.md","line_end":92,"line_start":86},{"file":"references/observation-log.md","line_end":391,"line_start":376},{"file":"references/observation-log.md","line_end":981,"line_start":972}]}],"critical_findings":[{"title":"Prompt Injection Attempt Detected","locations":[{"file":"SKILL.md","line_end":362,"line_start":356},{"file":"SKILL.md","line_end":119,"line_start":112},{"file":"references/environments.md","line_end":820,"line_start":810}],"confidence":0.98,"description":"The core says \"a classifier can deny one interface while allowing another\" and directs agents to \"try a second tool reaching the same path\". This instruction encourages completing denied writes through another interface, treating permission decisions as noise rather than authorization boundaries. It conflicts with the reference guidance that prohibits alternate-tool retries for denied hook installs.","review_kind":"security","source_category":"semantic","source_severity":"critical","confidence_reasoning":"The core explicitly links denied writes to alternate-tool retries and dismisses classifier denials as noise. Separate no-bypass guidance does not remove this conflicting instruction."}],"high_findings":[{"title":"Temp directory access","locations":[{"file":".github/workflows/release-bundle.yml","line_end":27,"line_start":27}],"confidence":0.96,"description":"run: gh release upload \"${{ github.event.release.tag_name }}\" /tmp/bundle/task-observer.skill --clob","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The release tag is interpolated directly into shell source, so a tag containing command substitution executes commands with the release token. Temporary staging is ordinary, but this upload command exposes a release-workflow injection risk."}],"medium_findings":[],"low_findings":[],"dangerous_patterns":[],"files_scanned":27,"total_lines":10516,"audit_model":"codex","audited_at":"2026-10-04T13:37:47.16+00:00","created_at":"2026-10-05T12:41:13.014051+00:00","static_findings":[{"id":"obfuscation:references/observation-log.md:1:heuristic-multiple-bracket-chains-37-jsfuck-obfu","file":"references/observation-log.md","pattern":"[HEURISTIC] Multiple bracket chains (37) - JSFuck/obfuscation pattern","snippet":"]][[, ]][[, ]][[","category":"obfuscation","line_end":1,"severity":"high","line_start":1},{"id":"obfuscation:SKILL.md:1:heuristic-multiple-bracket-chains-37-jsfuck-obfu","file":"SKILL.md","pattern":"[HEURISTIC] Multiple bracket chains (37) - JSFuck/obfuscation pattern","snippet":"]][[, ]][[, ]][[","category":"obfuscation","line_end":1,"severity":"high","line_start":1},{"id":"obfuscation:scripts/validate-skill-bundle.py:781:hex-encoded-characters","file":"scripts/validate-skill-bundle.py","pattern":"Hex-encoded characters","snippet":"i = data.find(b\"PK\\x01\\x02\", i)","category":"obfuscation","line_end":781,"severity":"high","line_start":781},{"id":"obfuscation:scripts/validate-skill-bundle.py:787:hex-encoded-characters","file":"scripts/validate-skill-bundle.py","pattern":"Hex-encoded characters","snippet":"if b\"\\x5c\" in name:","category":"obfuscation","line_end":787,"severity":"high","line_start":787},{"id":"env_access:references/skill-authoring.md:1277:generic-api-secret-keys","file":"references/skill-authoring.md","pattern":"Generic API/secret keys","snippet":"- env: OPENAI_API_KEY     # set and non-empty","category":"env_access","line_end":1277,"severity":"high","line_start":1277},{"id":"env_access:.github/workflows/release-bundle.yml:26:git-platform-tokens","file":".github/workflows/release-bundle.yml","pattern":"Git platform tokens","snippet":"GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}","category":"env_access","line_end":26,"severity":"high","line_start":26},{"id":"filesystem:references/environments.md:365:hidden-file-in-home-directory","file":"references/environments.md","pattern":"Hidden file in home directory","snippet":"workspace under `~/.claude`, `skill-observations` and `skill-updates` both","category":"filesystem","line_end":365,"severity":"high","line_start":365},{"id":"filesystem:references/environments.md:723:hidden-file-in-home-directory","file":"references/environments.md","pattern":"Hidden file in home directory","snippet":"`cp -r ~/.claude/skills/task-observer ~/.claude/skills/.task-observer-backup`","category":"filesystem","line_end":723,"severity":"high","line_start":723},{"id":"filesystem:references/environments.md:1017:hidden-file-in-home-directory","file":"references/environments.md","pattern":"Hidden file in home directory","snippet":"| Live skill files | `.claude/skills/{skill}/` on a read-only mount (writes fail with EROFS) | `~/.c","category":"filesystem","line_end":1017,"severity":"high","line_start":1017},{"id":"filesystem:references/migration.md:179:hidden-file-in-home-directory","file":"references/migration.md","pattern":"Hidden file in home directory","snippet":"find ~/.claude/projects -name log.md -path '*/skill-observations/*'","category":"filesystem","line_end":179,"severity":"high","line_start":179},{"id":"filesystem:references/skill-authoring.md:739:hidden-file-in-home-directory","file":"references/skill-authoring.md","pattern":"Hidden file in home directory","snippet":"`~/.claude/skills/{skill}/SKILL.md`; in Cowork, a read-only mount at","category":"filesystem","line_end":739,"severity":"high","line_start":739},{"id":"filesystem:SKILL.md:28:hidden-file-in-home-directory","file":"SKILL.md","pattern":"Hidden file in home directory","snippet":"`~/.claude/projects/<project-id>/`), NOT the current working directory. A","category":"filesystem","line_end":28,"severity":"high","line_start":28},{"id":"filesystem:SKILL.md:33:hidden-file-in-home-directory","file":"SKILL.md","pattern":"Hidden file in home directory","snippet":"user-scope path (`~/.claude/skill-observations/` or the equivalent outside","category":"filesystem","line_end":33,"severity":"high","line_start":33},{"id":"filesystem:references/environments.md:907:non-standard-device-file-access","file":"references/environments.md","pattern":"Non-standard device file access","snippet":"(`/c/dev/<repo>`) passes every pre-flight in Git Bash and fails in the","category":"filesystem","line_end":907,"severity":"high","line_start":907},{"id":"filesystem:references/environments.md:908:non-standard-device-file-access","file":"references/environments.md","pattern":"Non-standard device file access","snippet":"PowerShell the user opens (`fatal: cannot change to '/c/dev/<repo>'`);","category":"filesystem","line_end":908,"severity":"high","line_start":908},{"id":"filesystem:references/environments.md:909:non-standard-device-file-access","file":"references/environments.md","pattern":"Non-standard device file access","snippet":"`\"C:/dev/<repo>\"` works in PowerShell, cmd and Git Bash alike. The same","category":"filesystem","line_end":909,"severity":"high","line_start":909},{"id":"filesystem:references/migration.md:158:path-traversal-sequence","file":"references/migration.md","pattern":"Path traversal sequence","snippet":"bare `mv .../*.md` that matches nothing passes the literal pattern to","category":"filesystem","line_end":158,"severity":"high","line_start":158},{"id":"filesystem:scripts/validate-skill-bundle.py:373:path-traversal-sequence","file":"scripts/validate-skill-bundle.py","pattern":"Path traversal sequence","snippet":"manifest (.../.claude-plugin/plugin.json). Remove it, or upload this content","category":"filesystem","line_end":373,"severity":"high","line_start":373},{"id":"external_commands:references/environments.md:898:powershell-invocation","file":"references/environments.md","pattern":"PowerShell invocation","snippet":"check the agent runs — bash, PowerShell, Python — finds the config file","category":"external_commands","line_end":898,"severity":"high","line_start":898},{"id":"external_commands:references/environments.md:908:powershell-invocation","file":"references/environments.md","pattern":"PowerShell invocation","snippet":"PowerShell the user opens (`fatal: cannot change to '/c/dev/<repo>'`);","category":"external_commands","line_end":908,"severity":"high","line_start":908},{"id":"external_commands:references/environments.md:909:powershell-invocation","file":"references/environments.md","pattern":"PowerShell invocation","snippet":"`\"C:/dev/<repo>\"` works in PowerShell, cmd and Git Bash alike. The same","category":"external_commands","line_end":909,"severity":"high","line_start":909},{"id":"external_commands:references/environments.md:961:powershell-invocation","file":"references/environments.md","pattern":"PowerShell invocation","snippet":"**A byte order mark from Windows PowerShell.** PowerShell 5.1 writes UTF-8","category":"external_commands","line_end":961,"severity":"high","line_start":961},{"id":"external_commands:references/environments.md:967:powershell-invocation","file":"references/environments.md","pattern":"PowerShell invocation","snippet":"PowerShell 7, `-Encoding utf8NoBOM`.","category":"external_commands","line_end":967,"severity":"high","line_start":967},{"id":"external_commands:references/weekly-review.md:299:powershell-invocation","file":"references/weekly-review.md","pattern":"PowerShell invocation","snippet":"list` on macOS where launchd is used; `Get-ScheduledTask` in PowerShell","category":"external_commands","line_end":299,"severity":"high","line_start":299},{"id":"filesystem:scripts/migrate-log.py:124:hard-link-creation","file":"scripts/migrate-log.py","pattern":"Hard link creation","snippet":"starts = [i for i, ln in enumerate(lines) if ENTRY_RE.match(ln)]","category":"filesystem","line_end":124,"severity":"medium","line_start":124},{"id":"filesystem:scripts/migrate-log.py:144:hard-link-creation","file":"scripts/migrate-log.py","pattern":"Hard link creation","snippet":"for ln in block:","category":"filesystem","line_end":144,"severity":"medium","line_start":144},{"id":"filesystem:scripts/migrate-log.py:393:hard-link-creation","file":"scripts/migrate-log.py","pattern":"Hard link creation","snippet":"for ln in fh:","category":"filesystem","line_end":393,"severity":"medium","line_start":393},{"id":"filesystem:references/environments.md:365:hidden-file-access","file":"references/environments.md","pattern":"Hidden file access","snippet":"workspace under `~/.claude`, `skill-observations` and `skill-updates` both","category":"filesystem","line_end":365,"severity":"medium","line_start":365},{"id":"filesystem:references/environments.md:723:hidden-file-access","file":"references/environments.md","pattern":"Hidden file access","snippet":"`cp -r ~/.claude/skills/task-observer ~/.claude/skills/.task-observer-backup`","category":"filesystem","line_end":723,"severity":"medium","line_start":723},{"id":"filesystem:references/environments.md:1017:hidden-file-access","file":"references/environments.md","pattern":"Hidden file access","snippet":"| Live skill files | `.claude/skills/{skill}/` on a read-only mount (writes fail with EROFS) | `~/.c","category":"filesystem","line_end":1017,"severity":"medium","line_start":1017},{"id":"filesystem:references/migration.md:46:hidden-file-access","file":"references/migration.md","pattern":"Hidden file access","snippet":"It also writes `observation-log/archive/.id-floor` with the highest id it","category":"filesystem","line_end":46,"severity":"medium","line_start":46},{"id":"filesystem:references/migration.md:179:hidden-file-access","file":"references/migration.md","pattern":"Hidden file access","snippet":"find ~/.claude/projects -name log.md -path '*/skill-observations/*'","category":"filesystem","line_end":179,"severity":"medium","line_start":179},{"id":"filesystem:references/observation-log.md:744:hidden-file-access","file":"references/observation-log.md","pattern":"Hidden file access","snippet":"cat \"[ABSOLUTE PATH]/skill-observations/observation-log/archive/.id-floor\"","category":"filesystem","line_end":744,"severity":"medium","line_start":744},{"id":"filesystem:references/observation-log.md:887:hidden-file-access","file":"references/observation-log.md","pattern":"Hidden file access","snippet":"list=$(for d in \"$root\"/*/.claude/skills/*/ \"$root\"/*/*/.claude/skills/*/; do [ -f \"$d/SKILL.md\" ] &","category":"filesystem","line_end":887,"severity":"medium","line_start":887},{"id":"filesystem:references/observation-log.md:949:hidden-file-access","file":"references/observation-log.md","pattern":"Hidden file access","snippet":"`observation-log/archive/.id-floor`. The floor file holds the highest id","category":"filesystem","line_end":949,"severity":"medium","line_start":949},{"id":"filesystem:references/observation-log.md:971:hidden-file-access","file":"references/observation-log.md","pattern":"Hidden file access","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null); floor=$((10#${floor:-0}))   # di","category":"filesystem","line_end":971,"severity":"medium","line_start":971},{"id":"filesystem:references/observation-log.md:980:hidden-file-access","file":"references/observation-log.md","pattern":"Hidden file access","snippet":"printf '%s\\n' \"$next_id\" > \"$d/archive/.id-floor\"   # AFTER the create: an id check that writes no f","category":"filesystem","line_end":980,"severity":"medium","line_start":980},{"id":"filesystem:references/observation-log.md:1200:hidden-file-access","file":"references/observation-log.md","pattern":"Hidden file access","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null)","category":"filesystem","line_end":1200,"severity":"medium","line_start":1200},{"id":"filesystem:references/skill-authoring.md:739:hidden-file-access","file":"references/skill-authoring.md","pattern":"Hidden file access","snippet":"`~/.claude/skills/{skill}/SKILL.md`; in Cowork, a read-only mount at","category":"filesystem","line_end":739,"severity":"medium","line_start":739},{"id":"filesystem:references/weekly-review.md:447:hidden-file-access","file":"references/weekly-review.md","pattern":"Hidden file access","snippet":"top=$(find \"$d\" \"$d/archive\" -maxdepth 1 -name '[0-9]*.md' | sed 's|.*/||' | grep -oE '^[0-9]+' | so","category":"filesystem","line_end":447,"severity":"medium","line_start":447},{"id":"filesystem:scripts/new-observation.sh:85:hidden-file-access","file":"scripts/new-observation.sh","pattern":"Hidden file access","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null); floor=$((10#${floor:-0}))","category":"filesystem","line_end":85,"severity":"medium","line_start":85},{"id":"filesystem:scripts/new-observation.sh:102:hidden-file-access","file":"scripts/new-observation.sh","pattern":"Hidden file access","snippet":"if [ -s \"$d/archive/.id-floor\" ] && [ -n \"${top_active:-}\" ] && [ \"$floor\" -lt \"$((10#$top_active))\"","category":"filesystem","line_end":102,"severity":"medium","line_start":102},{"id":"filesystem:scripts/new-observation.sh:121:hidden-file-access","file":"scripts/new-observation.sh","pattern":"Hidden file access","snippet":"printf '%s\\n' \"$next_id\" > \"$d/archive/.id-floor\" || { echo \"FLOOR WRITE FAILED — $d/archive/.id-flo","category":"filesystem","line_end":121,"severity":"medium","line_start":121},{"id":"filesystem:scripts/validate-skill-bundle.py:373:hidden-file-access","file":"scripts/validate-skill-bundle.py","pattern":"Hidden file access","snippet":"manifest (.../.claude-plugin/plugin.json). Remove it, or upload this content","category":"filesystem","line_end":373,"severity":"medium","line_start":373},{"id":"filesystem:SKILL.md:28:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"`~/.claude/projects/<project-id>/`), NOT the current working directory. A","category":"filesystem","line_end":28,"severity":"medium","line_start":28},{"id":"filesystem:SKILL.md:33:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"user-scope path (`~/.claude/skill-observations/` or the equivalent outside","category":"filesystem","line_end":33,"severity":"medium","line_start":33},{"id":"filesystem:SKILL.md:394:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"`observation-log/archive/.id-floor` (the highest id ever issued — update it","category":"filesystem","line_end":394,"severity":"medium","line_start":394},{"id":"filesystem:SKILL.md:410:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null); floor=$((10#${floor:-0}))   # di","category":"filesystem","line_end":410,"severity":"medium","line_start":410},{"id":"filesystem:SKILL.md:419:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"printf '%s\\n' \"$next_id\" > \"$d/archive/.id-floor\"   # AFTER the create: an id check that writes no f","category":"filesystem","line_end":419,"severity":"medium","line_start":419},{"id":"filesystem:references/environments.md:503:node-js-fs-operations","file":"references/environments.md","pattern":"Node.js fs operations","snippet":"const block = (reason) => { fs.writeFileSync(marker, new Date().toISOString()); console.log(JSON.str","category":"filesystem","line_end":503,"severity":"medium","line_start":503},{"id":"filesystem:references/environments.md:506:node-js-fs-operations","file":"references/environments.md","pattern":"Node.js fs operations","snippet":"try { input = JSON.parse(fs.readFileSync(0, 'utf8') || '{}'); } catch { process.exit(0); }","category":"filesystem","line_end":506,"severity":"medium","line_start":506},{"id":"filesystem:references/environments.md:517:node-js-fs-operations","file":"references/environments.md","pattern":"Node.js fs operations","snippet":"const st = fs.statSync(transcript), text = fs.readFileSync(transcript, 'utf8');","category":"filesystem","line_end":517,"severity":"medium","line_start":517},{"id":"filesystem:references/environments.md:533:node-js-fs-operations","file":"references/environments.md","pattern":"Node.js fs operations","snippet":"for (const n of fs.readdirSync(path.join(base, 'observation-log')))","category":"filesystem","line_end":533,"severity":"medium","line_start":533},{"id":"filesystem:references/skill-authoring.md:855:python-archive-libraries","file":"references/skill-authoring.md","pattern":"Python archive libraries","snippet":"RAW central-directory bytes, because CPython's `zipfile` normalises","category":"filesystem","line_end":855,"severity":"medium","line_start":855},{"id":"filesystem:scripts/validate-skill-bundle.py:47:python-archive-libraries","file":"scripts/validate-skill-bundle.py","pattern":"Python archive libraries","snippet":"import zipfile","category":"filesystem","line_end":47,"severity":"medium","line_start":47},{"id":"filesystem:scripts/validate-skill-bundle.py:769:python-archive-libraries","file":"scripts/validate-skill-bundle.py","pattern":"Python archive libraries","snippet":"with zipfile.ZipFile(out, \"w\", zipfile.ZIP_DEFLATED) as z:","category":"filesystem","line_end":769,"severity":"medium","line_start":769},{"id":"filesystem:scripts/validate-skill-bundle.py:777:python-archive-libraries","file":"scripts/validate-skill-bundle.py","pattern":"Python archive libraries","snippet":"\"\"\"Central directory as raw bytes: a convenience reader (zipfile.namelist)","category":"filesystem","line_end":777,"severity":"medium","line_start":777},{"id":"filesystem:scripts/migrate-log.py:487:python-os-file-operations","file":"scripts/migrate-log.py","pattern":"Python os file operations","snippet":"os.makedirs(out, exist_ok=True)","category":"filesystem","line_end":487,"severity":"medium","line_start":487},{"id":"filesystem:scripts/migrate-log.py:495:python-os-file-operations","file":"scripts/migrate-log.py","pattern":"Python os file operations","snippet":"os.makedirs(arch, exist_ok=True)","category":"filesystem","line_end":495,"severity":"medium","line_start":495},{"id":"external_commands:references/environments.md:512:ruby-shell-backtick-execution","file":"references/environments.md","pattern":"Ruby/shell backtick execution","snippet":"const marker = path.join(os.tmpdir(), `task-observer-backstop-${session}`);","category":"external_commands","line_end":542,"severity":"medium","line_start":512},{"id":"external_commands:references/environments.md:1364:ruby-shell-backtick-execution","file":"references/environments.md","pattern":"Ruby/shell backtick execution","snippet":"next session writes each as its own file in `observation-log/`]","category":"external_commands","line_end":1374,"severity":"medium","line_start":1364},{"id":"external_commands:references/observation-log.md:86:ruby-shell-backtick-execution","file":"references/observation-log.md","pattern":"Ruby/shell backtick execution","snippet":"[ -e \"$d/last-review-date.txt\" ] || printf 'never\\n' > \"$d/last-review-date.txt\"   # the literal `ne","category":"external_commands","line_end":92,"severity":"medium","line_start":86},{"id":"external_commands:references/observation-log.md:376:ruby-shell-backtick-execution","file":"references/observation-log.md","pattern":"Ruby/shell backtick execution","snippet":"suspect=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk \"$sus\" {} + | wc -l | tr -d ' ')   # invalid ","category":"external_commands","line_end":391,"severity":"medium","line_start":376},{"id":"external_commands:references/observation-log.md:972:ruby-shell-backtick-execution","file":"references/observation-log.md","pattern":"Ruby/shell backtick execution","snippet":"ids=$(for p in \"$d\"/[0-9]*.md \"$d\"/archive/[0-9]*.md; do [ -e \"$p\" ] && printf '%s\\n' \"${p##*/}\"; do","category":"external_commands","line_end":981,"severity":"medium","line_start":972},{"id":"external_commands:references/observation-log.md:1363:ruby-shell-backtick-execution","file":"references/observation-log.md","pattern":"Ruby/shell backtick execution","snippet":"**Issue:** ... `find -exec` ... $(date) ... written literally, none of it run","category":"external_commands","line_end":1365,"severity":"medium","line_start":1363},{"id":"external_commands:scripts/migrate-log.py:24:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"* `skill` is ALWAYS a list, even with one entry, so consumers never branch on","category":"external_commands","line_end":24,"severity":"medium","line_start":24},{"id":"external_commands:scripts/migrate-log.py:27:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"about is written into the file as `migration_note` and listed in the report.","category":"external_commands","line_end":27,"severity":"medium","line_start":27},{"id":"external_commands:scripts/migrate-log.py:50:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"# worth recording. Only the former earn a `migration_note` in the file —","category":"external_commands","line_end":50,"severity":"medium","line_start":50},{"id":"external_commands:scripts/migrate-log.py:77:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"# A skill name is a bare token or a scoped `plugin:skill` identifier — the","category":"external_commands","line_end":77,"severity":"medium","line_start":77},{"id":"external_commands:scripts/migrate-log.py:79:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"# skills (e.g. `dev-workflow:next`). The colon is part of the name.","category":"external_commands","line_end":79,"severity":"medium","line_start":79},{"id":"external_commands:scripts/migrate-log.py:84:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"\"\"\"Split on any char in `seps`, but not inside parentheses or brackets.\"\"\"","category":"external_commands","line_end":84,"severity":"medium","line_start":84},{"id":"external_commands:scripts/migrate-log.py:105:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"into thirteen `untitled` files. Latin accents are folded to their base","category":"external_commands","line_end":105,"severity":"medium","line_start":105},{"id":"external_commands:scripts/migrate-log.py:191:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"# `resolved` value for 356 archived entries during testing.","category":"external_commands","line_end":191,"severity":"medium","line_start":191},{"id":"external_commands:scripts/migrate-log.py:225:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"`skill` = existing skill(s) this observation improves.","category":"external_commands","line_end":225,"severity":"medium","line_start":225},{"id":"external_commands:scripts/migrate-log.py:226:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"`proposes_skill` = new skill(s) it argues for.","category":"external_commands","line_end":226,"severity":"medium","line_start":226},{"id":"external_commands:scripts/migrate-log.py:312:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"# note, not a resolution. Keep it, but never under `resolution`, which","category":"external_commands","line_end":312,"severity":"medium","line_start":312},{"id":"external_commands:scripts/migrate-log.py:515:ruby-shell-backtick-execution","file":"scripts/migrate-log.py","pattern":"Ruby/shell backtick execution","snippet":"f\"skill qualifiers preserved in `skill_qualifiers`\")","category":"external_commands","line_end":515,"severity":"medium","line_start":515},{"id":"external_commands:scripts/new-observation.sh:17:ruby-shell-backtick-execution","file":"scripts/new-observation.sh","pattern":"Ruby/shell backtick execution","snippet":"# from its NNNN- prefix in the `id:` field — copied, never retyped.","category":"external_commands","line_end":17,"severity":"medium","line_start":17},{"id":"external_commands:scripts/new-observation.sh:34:ruby-shell-backtick-execution","file":"scripts/new-observation.sh","pattern":"Ruby/shell backtick execution","snippet":"# bash, not sh: the `10#` arithmetic is a bash extension. Runs on bash 3.2","category":"external_commands","line_end":34,"severity":"medium","line_start":34},{"id":"external_commands:scripts/new-observation.sh:82:ruby-shell-backtick-execution","file":"scripts/new-observation.sh","pattern":"Ruby/shell backtick execution","snippet":"# Globs and builtins list the files, never `ls`: a profile alias or function","category":"external_commands","line_end":82,"severity":"medium","line_start":82},{"id":"external_commands:scripts/validate-skill-bundle.py:18:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"unquoted frontmatter `name:` is rewritten to the quoted form","category":"external_commands","line_end":18,"severity":"medium","line_start":18},{"id":"external_commands:scripts/validate-skill-bundle.py:27:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"(`SKILL.md` at the top level), the two check sets contradict each other.","category":"external_commands","line_end":27,"severity":"medium","line_start":27},{"id":"external_commands:scripts/validate-skill-bundle.py:28:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"The skill checks require the directory name to equal the frontmatter `name`","category":"external_commands","line_end":28,"severity":"medium","line_start":28},{"id":"external_commands:scripts/validate-skill-bundle.py:33:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"`--repo-only` at the repo.","category":"external_commands","line_end":33,"severity":"medium","line_start":33},{"id":"external_commands:scripts/validate-skill-bundle.py:70:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"# the skill under test — `core_max_lines:` in SKILL.md frontmatter, or a","category":"external_commands","line_end":70,"severity":"medium","line_start":70},{"id":"external_commands:scripts/validate-skill-bundle.py:71:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"# `.core-ceiling` file beside it holding the number. A skill that declares","category":"external_commands","line_end":71,"severity":"medium","line_start":71},{"id":"external_commands:scripts/validate-skill-bundle.py:85:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"PATH_RE = re.compile(r\"`((?:references|scripts|assets)/[^`\\s*?]+\\.[A-Za-z0-9]+)`\")","category":"external_commands","line_end":85,"severity":"medium","line_start":85},{"id":"external_commands:scripts/validate-skill-bundle.py:91:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"# example (`scripts/x/generate.py --logo ...`) out. Measured over 127 local","category":"external_commands","line_end":93,"severity":"medium","line_start":91},{"id":"external_commands:scripts/validate-skill-bundle.py:103:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"(re.compile(r\"(?<![\\w`])\\\\[1-9](?![\\w])\"), \"literal regex backreference in prose\"),","category":"external_commands","line_end":128,"severity":"medium","line_start":103},{"id":"external_commands:scripts/validate-skill-bundle.py:128:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"Folded (`>`) joins its lines with spaces; literal (`|`) keeps the line","category":"external_commands","line_end":128,"severity":"medium","line_start":128},{"id":"external_commands:scripts/validate-skill-bundle.py:129:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"breaks. Both accept a chomping indicator (`-`, `+`) and an explicit indent","category":"external_commands","line_end":129,"severity":"medium","line_start":129},{"id":"external_commands:scripts/validate-skill-bundle.py:130:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"digit. Matching only `>` meant a `|` description fell through to the","category":"external_commands","line_end":130,"severity":"medium","line_start":130},{"id":"external_commands:scripts/validate-skill-bundle.py:147:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"\"\"\"`name` as a YAML parser reads it, for the no-PyYAML branch.","category":"external_commands","line_end":150,"severity":"medium","line_start":147},{"id":"external_commands:scripts/validate-skill-bundle.py:150:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"for `name: \"x\"`), and neither is a trailing comment: PyYAML ends the","category":"external_commands","line_end":151,"severity":"medium","line_start":150},{"id":"external_commands:scripts/validate-skill-bundle.py:151:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"value at `#` after a closing quote, and at ` #` after a plain scalar.","category":"external_commands","line_end":151,"severity":"medium","line_start":151},{"id":"external_commands:scripts/validate-skill-bundle.py:153:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"`name: 'x' # c` failing here while the parser passed it. A tab","category":"external_commands","line_end":154,"severity":"medium","line_start":153},{"id":"external_commands:scripts/validate-skill-bundle.py:154:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"before `#` is a scanner error to PyYAML, so it is left in and fails too.","category":"external_commands","line_end":161,"severity":"medium","line_start":154},{"id":"external_commands:scripts/validate-skill-bundle.py:161:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"# (frontmatter `name:` value, kebab verdict the fallback must give) — each","category":"external_commands","line_end":173,"severity":"medium","line_start":161},{"id":"external_commands:scripts/validate-skill-bundle.py:173:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"The gate's `frontmatter parses` item degrades to a regex when PyYAML is","category":"external_commands","line_end":176,"severity":"medium","line_start":173},{"id":"external_commands:scripts/validate-skill-bundle.py:176:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"`description:` into a key line followed by UNINDENTED continuation lines.","category":"external_commands","line_end":181,"severity":"medium","line_start":176},{"id":"external_commands:scripts/validate-skill-bundle.py:181:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"which branch ran, because `OK` from the regex branch and `OK` from the","category":"external_commands","line_end":181,"severity":"medium","line_start":181},{"id":"external_commands:scripts/validate-skill-bundle.py:195:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"# the block, and since it is not a `key:` line either, it is the","category":"external_commands","line_end":203,"severity":"medium","line_start":195},{"id":"external_commands:scripts/validate-skill-bundle.py:203:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"f\"frontmatter:{n}: line is neither `key: value` nor an indented \"","category":"external_commands","line_end":214,"severity":"medium","line_start":203},{"id":"external_commands:scripts/validate-skill-bundle.py:214:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"Two sources, frontmatter first: `core_max_lines: N` in SKILL.md, else a","category":"external_commands","line_end":215,"severity":"medium","line_start":214},{"id":"external_commands:scripts/validate-skill-bundle.py:215:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"`.core-ceiling` file beside it containing the number. None means the skill","category":"external_commands","line_end":244,"severity":"medium","line_start":215},{"id":"external_commands:scripts/validate-skill-bundle.py:244:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"Counted with splitlines() so the number matches `wc -l` on a","category":"external_commands","line_end":275,"severity":"medium","line_start":244},{"id":"external_commands:scripts/validate-skill-bundle.py:275:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"The per-file `## Contents` index exists so a reader can see what the file","category":"external_commands","line_end":290,"severity":"medium","line_start":275},{"id":"external_commands:scripts/validate-skill-bundle.py:290:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"\"\"\"Blank fenced blocks, keeping line count, so a `##` inside a","category":"external_commands","line_end":343,"severity":"medium","line_start":290},{"id":"external_commands:scripts/validate-skill-bundle.py:343:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"for m in re.finditer(r'`references/([a-z-]+\\.md)`[^(]{0,40}\\(\"([^\"]+)\"\\)', core, re.S):","category":"external_commands","line_end":357,"severity":"medium","line_start":343},{"id":"external_commands:scripts/validate-skill-bundle.py:357:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"for m in re.finditer(r'`references/([a-z-]+\\.md)`[^(]{0,40}\\(\"([^\"]+)\"\\)', core, re.S):","category":"external_commands","line_end":383,"severity":"medium","line_start":357},{"id":"external_commands:scripts/validate-skill-bundle.py:383:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"manifest is therefore repo-only, and `check_repo_versions` validates it","category":"external_commands","line_end":387,"severity":"medium","line_start":383},{"id":"external_commands:scripts/validate-skill-bundle.py:387:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"user who installs the `.skill` gets a skill, not a plugin. Only the","category":"external_commands","line_end":411,"severity":"medium","line_start":387},{"id":"external_commands:scripts/validate-skill-bundle.py:411:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"# `yaml_available` is about the LIBRARY, not about this file parsing. A","category":"external_commands","line_end":424,"severity":"medium","line_start":411},{"id":"external_commands:scripts/validate-skill-bundle.py:424:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"# for `name: \"x\"`, a real parser never sees the quote characters as","category":"external_commands","line_end":430,"severity":"medium","line_start":424},{"id":"external_commands:scripts/validate-skill-bundle.py:430:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"# fails to find: an unquoted `: ` inside a description is the common","category":"external_commands","line_end":434,"severity":"medium","line_start":430},{"id":"external_commands:scripts/validate-skill-bundle.py:434:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"f\"frontmatter did not parse (likely an unquoted `: ` in a value — \"","category":"external_commands","line_end":441,"severity":"medium","line_start":434},{"id":"external_commands:scripts/validate-skill-bundle.py:441:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"fails.append(\"frontmatter: `name` missing\")","category":"external_commands","line_end":443,"severity":"medium","line_start":441},{"id":"external_commands:scripts/validate-skill-bundle.py:443:ruby-shell-backtick-execution","file":"scripts/validate-skill-bundle.py","pattern":"Ruby/shell backtick execution","snippet":"fails.append(f\"frontmatter: `name` not kebab-case: {name!r}\")","category":"external_commands","line_end":445,"severity":"medium","line_start":443},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"both started by the user, are in `references/skill-authoring.md`: the","category":"external_commands","line_end":20,"severity":"medium","line_start":20},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`[workspace folder]` = the persistent workspace, anchored on ONE STABLE","category":"external_commands","line_end":24,"severity":"medium","line_start":24},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"activation config (see `references/environments.md`): in Cowork, the","category":"external_commands","line_end":26,"severity":"medium","line_start":26},{"id":"external_commands:SKILL.md:28:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`~/.claude/projects/<project-id>/`), NOT the current working directory. A","category":"external_commands","line_end":28,"severity":"medium","line_start":28},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`.claude/worktrees/`, a temporary clone — is torn down with the checkout","category":"external_commands","line_end":30,"severity":"medium","line_start":30},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"user-scope path (`~/.claude/skill-observations/` or the equivalent outside","category":"external_commands","line_end":33,"severity":"medium","line_start":33},{"id":"external_commands:SKILL.md:40:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`references/environments.md` (\"Anchoring the workspace\") before pinning,","category":"external_commands","line_end":40,"severity":"medium","line_start":40},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`[workspace folder]/skill-observations/observation-log/`, one Markdown file","category":"external_commands","line_end":43,"severity":"medium","line_start":43},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`observation-log/archive/` — unless the user's configuration pins it","category":"external_commands","line_end":45,"severity":"medium","line_start":45},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`[ABSOLUTE PATH]` — substitute it when installing, exactly as in the","category":"external_commands","line_end":49,"severity":"medium","line_start":49},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"no snippet may feed it through word splitting (`for f in $(find ...)`): a","category":"external_commands","line_end":55,"severity":"medium","line_start":55},{"id":"external_commands:SKILL.md:58:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Every snippet here is bash, not POSIX `sh`** — the id snippet's `10#`","category":"external_commands","line_end":58,"severity":"medium","line_start":58},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"arithmetic is a bash extension `dash` and `ash` reject, so under `sh` the","category":"external_commands","line_end":59,"severity":"medium","line_start":59},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"more quietly than that. A `bash` code fence states that to a human reader","category":"external_commands","line_end":61,"severity":"medium","line_start":61},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"skill\" (some upload paths keep only `SKILL.md`); its episodes do not run.","category":"external_commands","line_end":73,"severity":"medium","line_start":73},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `references/weekly-review.md` — the comprehensive review procedure,","category":"external_commands","line_end":75,"severity":"medium","line_start":75},{"id":"external_commands:SKILL.md:78:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `references/skill-authoring.md` — taxonomy, structure, licensing,","category":"external_commands","line_end":78,"severity":"medium","line_start":78},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Load before writing any `SKILL.md` or skill file, setup work included.**","category":"external_commands","line_end":80,"severity":"medium","line_start":80},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `references/observation-log.md` — storage layout, frontmatter fields,","category":"external_commands","line_end":81,"severity":"medium","line_start":81},{"id":"external_commands:SKILL.md:86:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `references/signals.md` — what is and isn't worth logging. **Load when","category":"external_commands","line_end":86,"severity":"medium","line_start":86},{"id":"external_commands:SKILL.md:88:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `references/environments.md` — activation and config setup, compaction","category":"external_commands","line_end":88,"severity":"medium","line_start":88},{"id":"external_commands:SKILL.md:92:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `references/migration.md` — the one-time scripted conversion of a","category":"external_commands","line_end":92,"severity":"medium","line_start":92},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"pre-3.0 single-file `log.md`. **Load only when the Session Start","category":"external_commands","line_end":93,"severity":"medium","line_start":93},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `references/starter-principles.md` — an optional, provenance-stripped","category":"external_commands","line_end":95,"severity":"medium","line_start":95},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`starter-principles-reviewed.txt` marker is absent or names an older","category":"external_commands","line_end":98,"severity":"medium","line_start":98},{"id":"external_commands:SKILL.md:103:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. **Storage.** The existence check for `skill-observations/` is also","category":"external_commands","line_end":103,"severity":"medium","line_start":103},{"id":"external_commands:SKILL.md:104:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"the workspace-mount probe — one `ls` of the pinned path, carried INSIDE","category":"external_commands","line_end":104,"severity":"medium","line_start":104},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"that same batch, never in an earlier one (`references/environments.md`,","category":"external_commands","line_end":106,"severity":"medium","line_start":106},{"id":"external_commands:SKILL.md:109:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`request_cowork_directory`; elsewhere, its equivalent), not the \"no","category":"external_commands","line_end":109,"severity":"medium","line_start":109},{"id":"external_commands:SKILL.md:110:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"filesystem\" branch: handoff-doc mode (`references/environments.md`) is","category":"external_commands","line_end":110,"severity":"medium","line_start":110},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"one belongs, is in `references/environments.md` (\"Activation config —","category":"external_commands","line_end":127,"severity":"medium","line_start":127},{"id":"external_commands:SKILL.md:131:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"(`.claude/worktrees/`, a temporary clone), warn and re-anchor on the","category":"external_commands","line_end":131,"severity":"medium","line_start":131},{"id":"external_commands:SKILL.md:134:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`references/environments.md` (\"Claude Code Projects\"). Then RUN the one","category":"external_commands","line_end":134,"severity":"medium","line_start":134},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"idempotent command in `references/observation-log.md` (\"Workspace","category":"external_commands","line_end":135,"severity":"medium","line_start":135},{"id":"external_commands:SKILL.md:137:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"and refuses a pre-3.0 `log.md` layout (load `references/migration.md`","category":"external_commands","line_end":137,"severity":"medium","line_start":137},{"id":"external_commands:SKILL.md:140:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`skill-observations/starter-principles-reviewed.txt` is absent or holds","category":"external_commands","line_end":140,"severity":"medium","line_start":140},{"id":"external_commands:SKILL.md:142:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`references/starter-principles.md` — a fresh install, an upgrade to a","category":"external_commands","line_end":142,"severity":"medium","line_start":142},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"skill's frontmatter `version:` in the start-up lines — read from the","category":"external_commands","line_end":148,"severity":"medium","line_start":148},{"id":"external_commands:SKILL.md:150:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. **Scan.** Read only the frontmatter of each file in `observation-log/`","category":"external_commands","line_end":150,"severity":"medium","line_start":150},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"— the header block between the first two `---` lines, never the bodies","category":"external_commands","line_end":151,"severity":"medium","line_start":151},{"id":"external_commands:SKILL.md:152:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"— and build awareness from `status`, `skill`, `proposes_skill` and","category":"external_commands","line_end":152,"severity":"medium","line_start":152},{"id":"external_commands:SKILL.md:153:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`title`; also read the active principles. Hold them in awareness, don't","category":"external_commands","line_end":153,"severity":"medium","line_start":153},{"id":"external_commands:SKILL.md:159:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`references/observation-log.md` (\"Why the session-start scan does not","category":"external_commands","line_end":159,"severity":"medium","line_start":159},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"fires, or before adapting the snippet, load `references/observation-log.md`","category":"external_commands","line_end":164,"severity":"medium","line_start":164},{"id":"external_commands:SKILL.md:167:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":175,"severity":"medium","line_start":167},{"id":"external_commands:SKILL.md:178:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"suspect=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk \"$sus\" {} + | wc -l | tr -d ' ')   # invalid ","category":"external_commands","line_end":193,"severity":"medium","line_start":178},{"id":"external_commands:SKILL.md:193:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":196,"severity":"medium","line_start":193},{"id":"external_commands:SKILL.md:196:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"never an empty log: load `references/observation-log.md` (\"A refused","category":"external_commands","line_end":198,"severity":"medium","line_start":196},{"id":"external_commands:SKILL.md:198:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"3. **Review trigger.** Read `skill-observations/last-review-date.txt`. The","category":"external_commands","line_end":200,"severity":"medium","line_start":198},{"id":"external_commands:SKILL.md:200:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`never` = no review has run yet. A missing file is abnormal (step 1","category":"external_commands","line_end":201,"severity":"medium","line_start":200},{"id":"external_commands:SKILL.md:201:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"creates it) — recreate it with `never`, don't invent a date. An existing","category":"external_commands","line_end":202,"severity":"medium","line_start":201},{"id":"external_commands:SKILL.md:202:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`skill-observations/review-started.txt` not reading `completed`, or a","category":"external_commands","line_end":202,"severity":"medium","line_start":202},{"id":"external_commands:SKILL.md:205:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"review as due. If the value is `never` or 7 or more days old AND there","category":"external_commands","line_end":215,"severity":"medium","line_start":205},{"id":"external_commands:.github/workflows/tessl-publish.yml:37:shell-command-substitution","file":".github/workflows/tessl-publish.yml","pattern":"Shell command substitution","snippet":"ver=\"$(python3 -c \"import json,sys; print(json.load(open('.tessl-plugin/plugin.json'))['version'])\")","category":"external_commands","line_end":37,"severity":"medium","line_start":37},{"id":"external_commands:references/environments.md:458:shell-command-substitution","file":"references/environments.md","pattern":"Shell command substitution","snippet":"open=$(find \"$d/observation-log\" -maxdepth 1 -name '*.md' -exec grep -l '^status: open$' {} + 2>/dev","category":"external_commands","line_end":458,"severity":"medium","line_start":458},{"id":"external_commands:references/environments.md:459:shell-command-substitution","file":"references/environments.md","pattern":"Shell command substitution","snippet":"last=$(cat \"$d/last-review-date.txt\" 2>/dev/null || echo never)","category":"external_commands","line_end":459,"severity":"medium","line_start":459},{"id":"external_commands:references/environments.md:1043:shell-command-substitution","file":"references/environments.md","pattern":"Shell command substitution","snippet":"printf '%s\\n' \"$(date '+%F %H:%M')\" > \"[ABSOLUTE PATH]/skill-observations/review-started.txt\"","category":"external_commands","line_end":1043,"severity":"medium","line_start":1043},{"id":"external_commands:references/migration.md:137:shell-command-substitution","file":"references/migration.md","pattern":"Shell command substitution","snippet":"n=$(find \"$o\" -maxdepth 1 -name '*.md' | wc -l | tr -d ' ')","category":"external_commands","line_end":137,"severity":"medium","line_start":137},{"id":"external_commands:references/migration.md:139:shell-command-substitution","file":"references/migration.md","pattern":"Shell command substitution","snippet":"have=$(find \"$o\" -maxdepth 1 -name '*.md' -exec grep -l \"^$field:\" {} + | wc -l | tr -d ' ')","category":"external_commands","line_end":139,"severity":"medium","line_start":139},{"id":"external_commands:references/observation-log.md:91:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"printf '%s [%s] workspace: created=%s\\n' \"$(date '+%F %H:%M')\" \"${PWD##*/}\" \"${c:-none}\" >> \"$d/chec","category":"external_commands","line_end":91,"severity":"medium","line_start":91},{"id":"external_commands:references/observation-log.md:367:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"n=$(find \"[ABSOLUTE PATH]/skill-observations/observation-log\" -maxdepth 1 -name '*.md' | wc -l | tr ","category":"external_commands","line_end":367,"severity":"medium","line_start":367},{"id":"external_commands:references/observation-log.md:368:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"parsed=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk 'FNR==1 {if (/^---[[:space:]]*$/) print FILENA","category":"external_commands","line_end":368,"severity":"medium","line_start":368},{"id":"external_commands:references/observation-log.md:376:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"suspect=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk \"$sus\" {} + | wc -l | tr -d ' ')   # invalid ","category":"external_commands","line_end":376,"severity":"medium","line_start":376},{"id":"external_commands:references/observation-log.md:377:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"a_sus=0; [ -d \"$d/archive\" ] && a_sus=$(find \"$d/archive\" -maxdepth 1 -name '*.md' -exec awk \"$sus\" ","category":"external_commands","line_end":377,"severity":"medium","line_start":377},{"id":"external_commands:references/observation-log.md:383:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"printf '%s [%s] session-start scan: files=%s parsed=%s\\n' \"$(date '+%F %H:%M')\" \"${PWD##*/}\" \"$n\" \"$","category":"external_commands","line_end":383,"severity":"medium","line_start":383},{"id":"external_commands:references/observation-log.md:385:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"find \"$(dirname \"[ABSOLUTE PATH]\")\" -maxdepth 3 -type d -path '*/skill-observations/observation-log'","category":"external_commands","line_end":385,"severity":"medium","line_start":385},{"id":"external_commands:references/observation-log.md:887:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"list=$(for d in \"$root\"/*/.claude/skills/*/ \"$root\"/*/*/.claude/skills/*/; do [ -f \"$d/SKILL.md\" ] &","category":"external_commands","line_end":887,"severity":"medium","line_start":887},{"id":"external_commands:references/observation-log.md:888:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"n=$(printf '%s\\n' \"$list\" | grep -c .); p=$(for d in \"$root\"/*/ \"$root\"/*/*/; do [ -d \"$d\" ] && echo","category":"external_commands","line_end":888,"severity":"medium","line_start":888},{"id":"external_commands:references/observation-log.md:963:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"today=$(date +%F)          # archival rides inside this command (see below):","category":"external_commands","line_end":963,"severity":"medium","line_start":963},{"id":"external_commands:references/observation-log.md:964:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"n_files=$(find \"$d\" -maxdepth 1 -name '*.md' ! -empty | wc -l | tr -d ' ')   # a zero-byte file give","category":"external_commands","line_end":964,"severity":"medium","line_start":964},{"id":"external_commands:references/observation-log.md:965:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"seen=$(cd \"$d\" && awk 'FNR==1 {n++; nextfile} END {print n+0}' *.md 2>/dev/null)   # files the sweep","category":"external_commands","line_end":965,"severity":"medium","line_start":965},{"id":"external_commands:references/observation-log.md:971:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null); floor=$((10#${floor:-0}))   # di","category":"external_commands","line_end":971,"severity":"medium","line_start":971},{"id":"external_commands:references/observation-log.md:972:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"ids=$(for p in \"$d\"/[0-9]*.md \"$d\"/archive/[0-9]*.md; do [ -e \"$p\" ] && printf '%s\\n' \"${p##*/}\"; do","category":"external_commands","line_end":972,"severity":"medium","line_start":972},{"id":"external_commands:references/observation-log.md:973:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"[ \"$(printf '%s' \"$ids\" | grep -c .)\" -eq \"$(find \"$d\" \"$d/archive\" -maxdepth 1 -name '[0-9]*.md' | ","category":"external_commands","line_end":973,"severity":"medium","line_start":973},{"id":"external_commands:references/observation-log.md:974:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"hi=$(printf '%s\\n' \"$ids\" | sort -n | tail -1); hi=$((10#${hi:-0}))   # from the files alone; 10#: a","category":"external_commands","line_end":974,"severity":"medium","line_start":974},{"id":"external_commands:references/observation-log.md:976:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"next_id=$(( (hi > floor ? hi : floor) + 1 ))      # never below the floor, whatever the listing saw","category":"external_commands","line_end":976,"severity":"medium","line_start":976},{"id":"external_commands:references/observation-log.md:977:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"f=\"$d/$(printf '%04d' \"$next_id\")-<slug>.md\"      # the target path, built from the id just derived","category":"external_commands","line_end":977,"severity":"medium","line_start":977},{"id":"external_commands:references/observation-log.md:978:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"[ -n \"$(find \"$d\" -maxdepth 2 -name \"$(printf '%04d' \"$next_id\")-*.md\")\" ] && { echo \"COLLISION — id","category":"external_commands","line_end":978,"severity":"medium","line_start":978},{"id":"external_commands:references/observation-log.md:1200:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null)","category":"external_commands","line_end":1200,"severity":"medium","line_start":1200},{"id":"external_commands:references/observation-log.md:1201:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"top=$(for p in \"$d\"/[0-9]*.md; do [ -e \"$p\" ] && printf '%s\\n' \"${p##*/}\"; done | grep -oE '^[0-9]+'","category":"external_commands","line_end":1201,"severity":"medium","line_start":1201},{"id":"external_commands:references/observation-log.md:1202:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"[ -n \"${floor:-}\" ] && [ -n \"${top:-}\" ] && [ \"$((10#$floor))\" -lt \"$((10#$top))\" ] && echo \"NOTE: .","category":"external_commands","line_end":1202,"severity":"medium","line_start":1202},{"id":"external_commands:references/observation-log.md:1361:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"printf -- '---\\nid: %s\\ntitle: \"%s\"\\nstatus: open\\ndate: %s\\n' \"$next_id\" \"$title\" \"$(date +%F)\" > \"","category":"external_commands","line_end":1361,"severity":"medium","line_start":1361},{"id":"external_commands:references/observation-log.md:1363:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"**Issue:** ... `find -exec` ... $(date) ... written literally, none of it run","category":"external_commands","line_end":1363,"severity":"medium","line_start":1363},{"id":"external_commands:references/observation-log.md:1556:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"total() { echo $(( $(find \"$d\" -maxdepth 1 -name '*.md' | wc -l) + $(find \"$d/archive\" -maxdepth 1 -","category":"external_commands","line_end":1556,"severity":"medium","line_start":1556},{"id":"external_commands:references/observation-log.md:1557:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"before=$(total)","category":"external_commands","line_end":1557,"severity":"medium","line_start":1557},{"id":"external_commands:references/observation-log.md:1559:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"after=$(total)","category":"external_commands","line_end":1559,"severity":"medium","line_start":1559},{"id":"external_commands:references/observation-log.md:1571:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"today=$(date +%F)","category":"external_commands","line_end":1571,"severity":"medium","line_start":1571},{"id":"external_commands:references/observation-log.md:1572:shell-command-substitution","file":"references/observation-log.md","pattern":"Shell command substitution","snippet":"[ \"$(printf '%s\\n%s\\n' \"$1\" \"$today\" | sort | head -1)\" = \"$1\" ] \\","category":"external_commands","line_end":1572,"severity":"medium","line_start":1572},{"id":"external_commands:references/weekly-review.md:447:shell-command-substitution","file":"references/weekly-review.md","pattern":"Shell command substitution","snippet":"top=$(find \"$d\" \"$d/archive\" -maxdepth 1 -name '[0-9]*.md' | sed 's|.*/||' | grep -oE '^[0-9]+' | so","category":"external_commands","line_end":447,"severity":"medium","line_start":447},{"id":"external_commands:references/weekly-review.md:487:shell-command-substitution","file":"references/weekly-review.md","pattern":"Shell command substitution","snippet":"nonconf=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk '","category":"external_commands","line_end":488,"severity":"medium","line_start":487},{"id":"external_commands:references/weekly-review.md:500:shell-command-substitution","file":"references/weekly-review.md","pattern":"Shell command substitution","snippet":"n_nc=$(printf '%s' \"$nonconf\" | grep -c .)","category":"external_commands","line_end":500,"severity":"medium","line_start":500},{"id":"external_commands:references/weekly-review.md:1170:shell-command-substitution","file":"references/weekly-review.md","pattern":"Shell command substitution","snippet":"live=$(cd \"$live\" && pwd -P) || exit 1   # a symlinked skills entry: find descends nothing, cp -R co","category":"external_commands","line_end":1170,"severity":"medium","line_start":1170},{"id":"external_commands:references/weekly-review.md:1177:shell-command-substitution","file":"references/weekly-review.md","pattern":"Shell command substitution","snippet":"[ ! -L \"$s\" ] && [ \"$(stat -c %i \"$live/SKILL.md\" 2>/dev/null || stat -f %i \"$live/SKILL.md\")\" != \"$","category":"external_commands","line_end":1177,"severity":"medium","line_start":1177},{"id":"external_commands:references/weekly-review.md:1438:shell-command-substitution","file":"references/weekly-review.md","pattern":"Shell command substitution","snippet":"n_now=$(find \"[ABSOLUTE PATH]/skill-observations/observation-log\" -maxdepth 1 -name '*.md' | wc -l |","category":"external_commands","line_end":1438,"severity":"medium","line_start":1438},{"id":"external_commands:references/weekly-review.md:1439:shell-command-substitution","file":"references/weekly-review.md","pattern":"Shell command substitution","snippet":"n_list=$(wc -l < \"$now\" | tr -d ' ')","category":"external_commands","line_end":1439,"severity":"medium","line_start":1439},{"id":"external_commands:scripts/new-observation.sh:66:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"today=$(date +%F)","category":"external_commands","line_end":66,"severity":"medium","line_start":66},{"id":"external_commands:scripts/new-observation.sh:69:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"n_files=$(find \"$d\" -maxdepth 1 -name '*.md' ! -empty | wc -l | tr -d ' ')   # a zero-byte file give","category":"external_commands","line_end":69,"severity":"medium","line_start":69},{"id":"external_commands:scripts/new-observation.sh:70:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"seen=$(cd \"$d\" && awk 'FNR==1 {n++; nextfile} END {print n+0}' *.md 2>/dev/null)   # files the sweep","category":"external_commands","line_end":70,"severity":"medium","line_start":70},{"id":"external_commands:scripts/new-observation.sh:85:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null); floor=$((10#${floor:-0}))","category":"external_commands","line_end":85,"severity":"medium","line_start":85},{"id":"external_commands:scripts/new-observation.sh:86:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"ids=$(for p in \"$d\"/[0-9]*.md \"$d\"/archive/[0-9]*.md; do [ -e \"$p\" ] && printf '%s\\n' \"${p##*/}\"; do","category":"external_commands","line_end":86,"severity":"medium","line_start":86},{"id":"external_commands:scripts/new-observation.sh:87:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"if [ \"$(printf '%s' \"$ids\" | grep -c .)\" -ne \"$(find \"$d\" \"$d/archive\" -maxdepth 1 -name '[0-9]*.md'","category":"external_commands","line_end":87,"severity":"medium","line_start":87},{"id":"external_commands:scripts/new-observation.sh:90:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"hi=$(printf '%s\\n' \"$ids\" | sort -n | tail -1); hi=$((10#${hi:-0}))","category":"external_commands","line_end":90,"severity":"medium","line_start":90},{"id":"external_commands:scripts/new-observation.sh:94:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"next_id=$(( (hi > floor ? hi : floor) + 1 ))","category":"external_commands","line_end":94,"severity":"medium","line_start":94},{"id":"external_commands:scripts/new-observation.sh:95:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"prefix=$(printf '%04d' \"$next_id\")","category":"external_commands","line_end":95,"severity":"medium","line_start":95},{"id":"external_commands:scripts/new-observation.sh:101:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"top_active=$(for p in \"$d\"/[0-9]*.md; do [ -e \"$p\" ] && printf '%s\\n' \"${p##*/}\"; done | grep -oE '^","category":"external_commands","line_end":101,"severity":"medium","line_start":101},{"id":"external_commands:scripts/new-observation.sh:102:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"if [ -s \"$d/archive/.id-floor\" ] && [ -n \"${top_active:-}\" ] && [ \"$floor\" -lt \"$((10#$top_active))\"","category":"external_commands","line_end":102,"severity":"medium","line_start":102},{"id":"external_commands:scripts/new-observation.sh:103:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"echo \"NOTE: .id-floor ($floor) is below the highest active id ($((10#$top_active))) — an issuer skip","category":"external_commands","line_end":103,"severity":"medium","line_start":103},{"id":"external_commands:scripts/new-observation.sh:110:shell-command-substitution","file":"scripts/new-observation.sh","pattern":"Shell command substitution","snippet":"if [ -n \"$(find \"$d\" -maxdepth 2 -name \"${prefix}-*.md\")\" ]; then","category":"external_commands","line_end":110,"severity":"medium","line_start":110},{"id":"external_commands:SKILL.md:55:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"no snippet may feed it through word splitting (`for f in $(find ...)`): a","category":"external_commands","line_end":55,"severity":"medium","line_start":55},{"id":"external_commands:SKILL.md:169:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"n=$(find \"[ABSOLUTE PATH]/skill-observations/observation-log\" -maxdepth 1 -name '*.md' | wc -l | tr ","category":"external_commands","line_end":169,"severity":"medium","line_start":169},{"id":"external_commands:SKILL.md:170:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"parsed=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk 'FNR==1 {if (/^---[[:space:]]*$/) print FILENA","category":"external_commands","line_end":170,"severity":"medium","line_start":170},{"id":"external_commands:SKILL.md:178:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"suspect=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk \"$sus\" {} + | wc -l | tr -d ' ')   # invalid ","category":"external_commands","line_end":178,"severity":"medium","line_start":178},{"id":"external_commands:SKILL.md:179:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"a_sus=0; [ -d \"$d/archive\" ] && a_sus=$(find \"$d/archive\" -maxdepth 1 -name '*.md' -exec awk \"$sus\" ","category":"external_commands","line_end":179,"severity":"medium","line_start":179},{"id":"external_commands:SKILL.md:185:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"printf '%s [%s] session-start scan: files=%s parsed=%s\\n' \"$(date '+%F %H:%M')\" \"${PWD##*/}\" \"$n\" \"$","category":"external_commands","line_end":185,"severity":"medium","line_start":185},{"id":"external_commands:SKILL.md:187:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"find \"$(dirname \"[ABSOLUTE PATH]\")\" -maxdepth 3 -type d -path '*/skill-observations/observation-log'","category":"external_commands","line_end":187,"severity":"medium","line_start":187},{"id":"external_commands:SKILL.md:402:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"today=$(date +%F)          # archival rides inside this command (see below):","category":"external_commands","line_end":402,"severity":"medium","line_start":402},{"id":"external_commands:SKILL.md:403:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"n_files=$(find \"$d\" -maxdepth 1 -name '*.md' ! -empty | wc -l | tr -d ' ')   # a zero-byte file give","category":"external_commands","line_end":403,"severity":"medium","line_start":403},{"id":"external_commands:SKILL.md:404:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"seen=$(cd \"$d\" && awk 'FNR==1 {n++; nextfile} END {print n+0}' *.md 2>/dev/null)   # files the sweep","category":"external_commands","line_end":404,"severity":"medium","line_start":404},{"id":"external_commands:SKILL.md:410:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null); floor=$((10#${floor:-0}))   # di","category":"external_commands","line_end":410,"severity":"medium","line_start":410},{"id":"external_commands:SKILL.md:411:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"ids=$(for p in \"$d\"/[0-9]*.md \"$d\"/archive/[0-9]*.md; do [ -e \"$p\" ] && printf '%s\\n' \"${p##*/}\"; do","category":"external_commands","line_end":411,"severity":"medium","line_start":411},{"id":"external_commands:SKILL.md:412:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"[ \"$(printf '%s' \"$ids\" | grep -c .)\" -eq \"$(find \"$d\" \"$d/archive\" -maxdepth 1 -name '[0-9]*.md' | ","category":"external_commands","line_end":412,"severity":"medium","line_start":412},{"id":"external_commands:SKILL.md:413:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"hi=$(printf '%s\\n' \"$ids\" | sort -n | tail -1); hi=$((10#${hi:-0}))   # from the files alone; 10#: a","category":"external_commands","line_end":413,"severity":"medium","line_start":413},{"id":"external_commands:SKILL.md:415:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"next_id=$(( (hi > floor ? hi : floor) + 1 ))      # never below the floor, whatever the listing saw","category":"external_commands","line_end":415,"severity":"medium","line_start":415},{"id":"external_commands:SKILL.md:416:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"f=\"$d/$(printf '%04d' \"$next_id\")-<slug>.md\"      # the target path, built from the id just derived","category":"external_commands","line_end":416,"severity":"medium","line_start":416},{"id":"external_commands:SKILL.md:417:shell-command-substitution","file":"SKILL.md","pattern":"Shell command substitution","snippet":"[ -n \"$(find \"$d\" -maxdepth 2 -name \"$(printf '%04d' \"$next_id\")-*.md\")\" ] && { echo \"COLLISION — id","category":"external_commands","line_end":417,"severity":"medium","line_start":417},{"id":"filesystem:references/environments.md:503:synchronous-file-operations","file":"references/environments.md","pattern":"Synchronous file operations","snippet":"const block = (reason) => { fs.writeFileSync(marker, new Date().toISOString()); console.log(JSON.str","category":"filesystem","line_end":503,"severity":"medium","line_start":503},{"id":"filesystem:references/environments.md:506:synchronous-file-operations","file":"references/environments.md","pattern":"Synchronous file operations","snippet":"try { input = JSON.parse(fs.readFileSync(0, 'utf8') || '{}'); } catch { process.exit(0); }","category":"filesystem","line_end":506,"severity":"medium","line_start":506},{"id":"filesystem:references/environments.md:517:synchronous-file-operations","file":"references/environments.md","pattern":"Synchronous file operations","snippet":"const st = fs.statSync(transcript), text = fs.readFileSync(transcript, 'utf8');","category":"filesystem","line_end":517,"severity":"medium","line_start":517},{"id":"filesystem:.github/workflows/release-bundle.yml:18:temp-directory-access","file":".github/workflows/release-bundle.yml","pattern":"Temp directory access","snippet":"mkdir -p /tmp/bundle/task-observer","category":"filesystem","line_end":18,"severity":"medium","line_start":18},{"id":"filesystem:.github/workflows/release-bundle.yml:19:temp-directory-access","file":".github/workflows/release-bundle.yml","pattern":"Temp directory access","snippet":"cp SKILL.md /tmp/bundle/task-observer/","category":"filesystem","line_end":19,"severity":"medium","line_start":19},{"id":"filesystem:.github/workflows/release-bundle.yml:20:temp-directory-access","file":".github/workflows/release-bundle.yml","pattern":"Temp directory access","snippet":"cp -r references scripts /tmp/bundle/task-observer/","category":"filesystem","line_end":20,"severity":"medium","line_start":20},{"id":"filesystem:.github/workflows/release-bundle.yml:21:temp-directory-access","file":".github/workflows/release-bundle.yml","pattern":"Temp directory access","snippet":"python3 scripts/validate-skill-bundle.py /tmp/bundle/task-observer --pack /tmp/bundle/task-observer.","category":"filesystem","line_end":21,"severity":"medium","line_start":21},{"id":"filesystem:.github/workflows/release-bundle.yml:23:temp-directory-access","file":".github/workflows/release-bundle.yml","pattern":"Temp directory access","snippet":"python3 -c \"import sys, runpy; sys.modules['yaml'] = None; sys.argv = ['validate-skill-bundle.py', '","category":"filesystem","line_end":23,"severity":"medium","line_start":23},{"id":"filesystem:.github/workflows/release-bundle.yml:27:temp-directory-access","file":".github/workflows/release-bundle.yml","pattern":"Temp directory access","snippet":"run: gh release upload \"${{ github.event.release.tag_name }}\" /tmp/bundle/task-observer.skill --clob","category":"filesystem","line_end":27,"severity":"medium","line_start":27},{"id":"filesystem:.github/workflows/tessl-publish.yml:51:temp-directory-access","file":".github/workflows/tessl-publish.yml","pattern":"Temp directory access","snippet":"if tessl plugin publish 2>&1 | tee /tmp/publish.log; then","category":"filesystem","line_end":51,"severity":"medium","line_start":51},{"id":"filesystem:.github/workflows/tessl-publish.yml:54:temp-directory-access","file":".github/workflows/tessl-publish.yml","pattern":"Temp directory access","snippet":"if grep -qi \"already exists\" /tmp/publish.log; then","category":"filesystem","line_end":54,"severity":"medium","line_start":54},{"id":"filesystem:references/environments.md:512:temp-directory-access","file":"references/environments.md","pattern":"Temp directory access","snippet":"const marker = path.join(os.tmpdir(), `task-observer-backstop-${session}`);","category":"filesystem","line_end":512,"severity":"medium","line_start":512},{"id":"filesystem:references/environments.md:928:temp-directory-access","file":"references/environments.md","pattern":"Temp directory access","snippet":"`AppData` path is redirected (`%TEMP%`, under `AppData\\Local`, was not on","category":"filesystem","line_end":928,"severity":"medium","line_start":928},{"id":"external_commands:references/observation-log.md:86:template-literal-with-command-substitution","file":"references/observation-log.md","pattern":"Template literal with command substitution","snippet":"[ -e \"$d/last-review-date.txt\" ] || printf 'never\\n' > \"$d/last-review-date.txt\"   # the literal `ne","category":"external_commands","line_end":92,"severity":"medium","line_start":86},{"id":"external_commands:references/observation-log.md:376:template-literal-with-command-substitution","file":"references/observation-log.md","pattern":"Template literal with command substitution","snippet":"suspect=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk \"$sus\" {} + | wc -l | tr -d ' ')   # invalid ","category":"external_commands","line_end":391,"severity":"medium","line_start":376},{"id":"external_commands:references/observation-log.md:972:template-literal-with-command-substitution","file":"references/observation-log.md","pattern":"Template literal with command substitution","snippet":"ids=$(for p in \"$d\"/[0-9]*.md \"$d\"/archive/[0-9]*.md; do [ -e \"$p\" ] && printf '%s\\n' \"${p##*/}\"; do","category":"external_commands","line_end":981,"severity":"medium","line_start":972},{"id":"external_commands:references/observation-log.md:1363:template-literal-with-command-substitution","file":"references/observation-log.md","pattern":"Template literal with command substitution","snippet":"**Issue:** ... `find -exec` ... $(date) ... written literally, none of it run","category":"external_commands","line_end":1365,"severity":"medium","line_start":1363},{"id":"external_commands:scripts/new-observation.sh:34:template-literal-with-command-substitution","file":"scripts/new-observation.sh","pattern":"Template literal with command substitution","snippet":"# bash, not sh: the `10#` arithmetic is a bash extension. Runs on bash 3.2","category":"external_commands","line_end":82,"severity":"medium","line_start":34},{"id":"external_commands:SKILL.md:55:template-literal-with-command-substitution","file":"SKILL.md","pattern":"Template literal with command substitution","snippet":"no snippet may feed it through word splitting (`for f in $(find ...)`): a","category":"external_commands","line_end":55,"severity":"medium","line_start":55},{"id":"external_commands:SKILL.md:167:template-literal-with-command-substitution","file":"SKILL.md","pattern":"Template literal with command substitution","snippet":"```bash","category":"external_commands","line_end":175,"severity":"medium","line_start":167},{"id":"external_commands:SKILL.md:178:template-literal-with-command-substitution","file":"SKILL.md","pattern":"Template literal with command substitution","snippet":"suspect=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk \"$sus\" {} + | wc -l | tr -d ' ')   # invalid ","category":"external_commands","line_end":193,"severity":"medium","line_start":178},{"id":"external_commands:SKILL.md:400:template-literal-with-command-substitution","file":"SKILL.md","pattern":"Template literal with command substitution","snippet":"```bash","category":"external_commands","line_end":411,"severity":"medium","line_start":400},{"id":"external_commands:SKILL.md:411:template-literal-with-command-substitution","file":"SKILL.md","pattern":"Template literal with command substitution","snippet":"ids=$(for p in \"$d\"/[0-9]*.md \"$d\"/archive/[0-9]*.md; do [ -e \"$p\" ] && printf '%s\\n' \"${p##*/}\"; do","category":"external_commands","line_end":420,"severity":"medium","line_start":411},{"id":"external_commands:references/environments.md:455:unix-shell-invocation","file":"references/environments.md","pattern":"Unix shell invocation","snippet":"#!/bin/sh","category":"external_commands","line_end":455,"severity":"medium","line_start":455},{"id":"external_commands:references/observation-log.md:1050:unix-shell-invocation","file":"references/observation-log.md","pattern":"Unix shell invocation","snippet":"Bash 3.2 — which is what `/bin/bash` still is on a stock macOS install — ends","category":"external_commands","line_end":1050,"severity":"medium","line_start":1050},{"id":"external_commands:references/observation-log.md:1064:unix-shell-invocation","file":"references/observation-log.md","pattern":"Unix shell invocation","snippet":"`/bin/bash` on macOS, not only under the shell your session happens to have.","category":"external_commands","line_end":1064,"severity":"medium","line_start":1064},{"id":"external_commands:references/observation-log.md:416:xargs-command-can-execute-arbitrary-commands","file":"references/observation-log.md","pattern":"xargs command (can execute arbitrary commands)","snippet":"loop's `sort` did. Do not rebuild the file list with `$(ls ... | xargs ...)`:","category":"external_commands","line_end":416,"severity":"medium","line_start":416},{"id":"blocker:.github/ISSUE_TEMPLATE/report-a-failure.md:10:system-reconnaissance","file":".github/ISSUE_TEMPLATE/report-a-failure.md","pattern":"System reconnaissance","snippet":"**Why the current text did not prevent it**","category":"blocker","line_end":10,"severity":"low","line_start":10},{"id":"blocker:CONTRIBUTING.md:14:system-reconnaissance","file":"CONTRIBUTING.md","pattern":"System reconnaissance","snippet":"current text did not prevent it, and — if you have one — what you think","category":"blocker","line_end":14,"severity":"low","line_start":14},{"id":"blocker:LICENSE.txt:160:system-reconnaissance","file":"LICENSE.txt","pattern":"System reconnaissance","snippet":"authority to forbid You from making technical modifications","category":"blocker","line_end":160,"severity":"low","line_start":160},{"id":"blocker:references/environments.md:103:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"**The block has a per-session cost, paid knowingly.** Every session it","category":"blocker","line_end":103,"severity":"low","line_start":103},{"id":"blocker:references/environments.md:204:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"controller writes it, running the id snippet per write. A start-up rule","category":"blocker","line_end":204,"severity":"low","line_start":204},{"id":"blocker:references/environments.md:217:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"paragraph and keep the rest — the inline id snippet in SKILL.md is then","category":"blocker","line_end":217,"severity":"low","line_start":217},{"id":"blocker:references/environments.md:319:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"the target may hold too — re-issue each id from the target log's own","category":"blocker","line_end":319,"severity":"low","line_start":319},{"id":"blocker:references/environments.md:508:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"const session = String(input.session_id || '').replace(/[^A-Za-z0-9_-]/g, '');","category":"blocker","line_end":508,"severity":"low","line_start":508},{"id":"blocker:references/environments.md:572:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"listed, protocol ran, hook emits valid JSON) while the one thing that","category":"blocker","line_end":572,"severity":"low","line_start":572},{"id":"blocker:references/environments.md:609:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"turn 4, with no change in the workspace link and nothing the session did to","category":"blocker","line_end":609,"severity":"low","line_start":609},{"id":"blocker:references/environments.md:676:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"did not register as violated, because the load had discharged the felt","category":"blocker","line_end":676,"severity":"low","line_start":676},{"id":"blocker:references/environments.md:775:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"there does not fail loudly; it produces a valid file with the other","category":"blocker","line_end":775,"severity":"low","line_start":775},{"id":"blocker:references/environments.md:866:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"In the reported case the user was given the block, said they had pasted it,","category":"blocker","line_end":866,"severity":"low","line_start":866},{"id":"blocker:references/environments.md:1005:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"shell running the id snippet (SKILL.md, How to Log) — or","category":"blocker","line_end":1005,"severity":"low","line_start":1005},{"id":"blocker:references/environments.md:1010:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"carries an id derived from a listing taken earlier, and the prefix guard","category":"blocker","line_end":1010,"severity":"low","line_start":1010},{"id":"blocker:references/environments.md:1012:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"`.id-floor` appears first and the duplicate id at the next review.","category":"blocker","line_end":1012,"severity":"low","line_start":1012},{"id":"blocker:references/environments.md:1190:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"\"decisions the brief did not cover\" section.)","category":"blocker","line_end":1190,"severity":"low","line_start":1190},{"id":"blocker:references/environments.md:1209:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"retrospectively\" and \"the one where we did X\" name a finished session,","category":"blocker","line_end":1209,"severity":"low","line_start":1209},{"id":"blocker:references/environments.md:1225:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"evidenced observations — the right move, improvised because nothing said","category":"blocker","line_end":1226,"severity":"low","line_start":1225},{"id":"blocker:references/environments.md:1281:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"frontmatter and taking the next number from a directory listing. The id","category":"blocker","line_end":1282,"severity":"low","line_start":1281},{"id":"blocker:references/environments.md:1312:system-reconnaissance","file":"references/environments.md","pattern":"System reconnaissance","snippet":"under the same `observation-log/` directory, each with its own id (the id","category":"blocker","line_end":1312,"severity":"low","line_start":1312},{"id":"blocker:references/migration.md:46:system-reconnaissance","file":"references/migration.md","pattern":"System reconnaissance","snippet":"It also writes `observation-log/archive/.id-floor` with the highest id it","category":"blocker","line_end":46,"severity":"low","line_start":46},{"id":"blocker:references/migration.md:186:system-reconnaissance","file":"references/migration.md","pattern":"System reconnaissance","snippet":"agents\"). Converting each in place preserves that fork, with two id","category":"blocker","line_end":187,"severity":"low","line_start":186},{"id":"blocker:references/observation-log.md:12:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"instrument over the log, and whenever a scan, sweep or id probe comes back","category":"blocker","line_end":12,"severity":"low","line_start":12},{"id":"blocker:references/observation-log.md:32:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"- Assigning an id","category":"blocker","line_end":33,"severity":"low","line_start":32},{"id":"blocker:references/observation-log.md:33:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"- Shell portability of the id snippet — why the case patterns are parenthesised","category":"blocker","line_end":33,"severity":"low","line_start":33},{"id":"blocker:references/observation-log.md:36:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"- Resolve each id at its own write time","category":"blocker","line_end":36,"severity":"low","line_start":36},{"id":"blocker:references/observation-log.md:59:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":".id-floor          # highest id ever issued; the counter never drops below it","category":"blocker","line_end":59,"severity":"low","line_start":59},{"id":"blocker:references/observation-log.md:138:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"| `archive/` | at the first write, when the id snippet reads `.id-floor` or `mv`s into it |","category":"blocker","line_end":138,"severity":"low","line_start":138},{"id":"blocker:references/observation-log.md:153:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"| `id` | Integer; matches the `NNNN-` filename prefix — four digits, zero-padded (`printf '%04d'`, a","category":"blocker","line_end":153,"severity":"low","line_start":153},{"id":"blocker:references/observation-log.md:199:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"An unquoted `: ` inside a free-text value is invalid YAML. The frontmatter","category":"blocker","line_end":199,"severity":"low","line_start":199},{"id":"blocker:references/observation-log.md:215:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"look invalid by shape — an unquoted `: `, text after a closing quote","category":"blocker","line_end":215,"severity":"low","line_start":215},{"id":"blocker:references/observation-log.md:253:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"valid nor invalid on its own — it is not portable. Measured on one","category":"blocker","line_end":253,"severity":"low","line_start":253},{"id":"blocker:references/observation-log.md:275:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"accepted false positive, `[a: b]` — valid YAML under both readings, a","category":"blocker","line_end":275,"severity":"low","line_start":275},{"id":"blocker:references/observation-log.md:376:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"suspect=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk \"$sus\" {} + | wc -l | tr -d ' ')   # invalid ","category":"blocker","line_end":376,"severity":"low","line_start":376},{"id":"blocker:references/observation-log.md:381:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"[ \"$suspect\" -gt 0 ] || [ \"$a_sus\" -gt 0 ] && echo \"NOTE: $suspect of $n headers (and $a_sus in arch","category":"blocker","line_end":381,"severity":"low","line_start":381},{"id":"blocker:references/observation-log.md:502:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"two instances of one rule, not two rules — a frontmatter scan, an id","category":"blocker","line_end":503,"severity":"low","line_start":502},{"id":"blocker:references/observation-log.md:518:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"— the id snippet counts the prefixes it listed against `find`'s count of","category":"blocker","line_end":518,"severity":"low","line_start":518},{"id":"blocker:references/observation-log.md:521:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"the highest id *issued*, but an id can be issued without its file ever","category":"blocker","line_end":521,"severity":"low","line_start":521},{"id":"blocker:references/observation-log.md:524:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"maximum below the floor is reported, and the id taken above the floor,","category":"blocker","line_end":524,"severity":"low","line_start":524},{"id":"blocker:references/observation-log.md:569:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"valid result, an invalid one and no result alike, byte-identical to a","category":"blocker","line_end":569,"severity":"low","line_start":569},{"id":"blocker:references/observation-log.md:577:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"of \"no sessions\"; the same subcommand with an invalid id also returned","category":"blocker","line_end":577,"severity":"low","line_start":577},{"id":"blocker:references/observation-log.md:674:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"like invalid YAML. The trailing loop asks for","category":"blocker","line_end":674,"severity":"low","line_start":674},{"id":"blocker:references/observation-log.md:749:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"`id:` line for, and the id maximum the largest prefix across both","category":"blocker","line_end":749,"severity":"low","line_start":749},{"id":"blocker:references/observation-log.md:757:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"an id the `cat` reports the same: each pair is the expected answer, not","category":"blocker","line_end":757,"severity":"low","line_start":757},{"id":"blocker:references/observation-log.md:773:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"some members simply grew and others did not.","category":"blocker","line_end":773,"severity":"low","line_start":773},{"id":"blocker:references/observation-log.md:944:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"## Assigning an id","category":"blocker","line_end":946,"severity":"low","line_start":944},{"id":"blocker:references/observation-log.md:946:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"The id is the highest of three values, plus one: the highest numeric","category":"blocker","line_end":946,"severity":"low","line_start":946},{"id":"blocker:references/observation-log.md:949:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"`observation-log/archive/.id-floor`. The floor file holds the highest id","category":"blocker","line_end":950,"severity":"low","line_start":949},{"id":"blocker:references/observation-log.md:952:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"it whenever you issue an id above it. The archival sweep (see Archival","category":"blocker","line_end":952,"severity":"low","line_start":952},{"id":"blocker:references/observation-log.md:953:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"below) is folded into this same command: every id derivation first moves","category":"blocker","line_end":953,"severity":"low","line_start":953},{"id":"blocker:references/observation-log.md:975:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"[ \"$hi\" -lt \"$floor\" ] && echo \"NOTE: highest file id $hi is below .id-floor $floor — ids issued wit","category":"blocker","line_end":975,"severity":"low","line_start":975},{"id":"blocker:references/observation-log.md:977:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"f=\"$d/$(printf '%04d' \"$next_id\")-<slug>.md\"      # the target path, built from the id just derived","category":"blocker","line_end":977,"severity":"low","line_start":977},{"id":"blocker:references/observation-log.md:978:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"[ -n \"$(find \"$d\" -maxdepth 2 -name \"$(printf '%04d' \"$next_id\")-*.md\")\" ] && { echo \"COLLISION — id","category":"blocker","line_end":978,"severity":"low","line_start":978},{"id":"blocker:references/observation-log.md:980:system-reconnaissance","file":"references/observation-log.md","pattern":"System reconnaissance","snippet":"printf '%s\\n' \"$next_id\" > \"$d/archive/.id-floor\"   # AFTER the create: an id check that writes no f","category":"blocker","line_end":980,"severity":"low","line_start":980},{"id":"blocker:scripts/migrate-log.py:340:system-reconnaissance","file":"scripts/migrate-log.py","pattern":"System reconnaissance","snippet":"\"\"\"Emit a YAML scalar. JSON string syntax is a valid YAML subset.\"\"\"","category":"blocker","line_end":340,"severity":"low","line_start":340},{"id":"blocker:scripts/migrate-log.py:505:system-reconnaissance","file":"scripts/migrate-log.py","pattern":"System reconnaissance","snippet":"print(f\"id floor: {floor}  (-> {os.path.join(arch, '.id-floor')})\")","category":"blocker","line_end":505,"severity":"low","line_start":505},{"id":"blocker:scripts/new-observation.sh:2:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"# new-observation.sh — derive the next observation id AND create the file,","category":"blocker","line_end":2,"severity":"low","line_start":2},{"id":"blocker:scripts/new-observation.sh:8:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"#   <slug>            kebab-case, no id prefix, no extension (\"short-slug\")","category":"blocker","line_end":8,"severity":"low","line_start":8},{"id":"blocker:scripts/new-observation.sh:16:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"# created. Write the observation body into the printed path, with the id","category":"blocker","line_end":17,"severity":"low","line_start":16},{"id":"blocker:scripts/new-observation.sh:21:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"# from the moment of writing: an id derived at session start and carried in","category":"blocker","line_end":21,"severity":"low","line_start":21},{"id":"blocker:scripts/new-observation.sh:27:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"# deriving the id, never a separate duty) → id = max(active prefixes,","category":"blocker","line_end":27,"severity":"low","line_start":27},{"id":"blocker:scripts/new-observation.sh:50:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"([0-9][0-9][0-9][0-9]-*) echo \"slug must not start with an id prefix: got '$slug'\" >&2; exit 1 ;;","category":"blocker","line_end":50,"severity":"low","line_start":50},{"id":"blocker:scripts/new-observation.sh:68:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"# --- archival sweep: stale resolved files move before the id is read --------","category":"blocker","line_end":68,"severity":"low","line_start":68},{"id":"blocker:scripts/new-observation.sh:92:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"echo \"NOTE: highest file id $hi is below .id-floor $floor — ids issued without a file; the new id go","category":"blocker","line_end":92,"severity":"low","line_start":92},{"id":"blocker:scripts/new-observation.sh:103:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"echo \"NOTE: .id-floor ($floor) is below the highest active id ($((10#$top_active))) — an issuer skip","category":"blocker","line_end":103,"severity":"low","line_start":103},{"id":"blocker:scripts/new-observation.sh:106:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"# --- collision guard on the id PREFIX, across active and archive ------------","category":"blocker","line_end":106,"severity":"low","line_start":106},{"id":"blocker:scripts/new-observation.sh:111:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"echo \"COLLISION — id $next_id already used; re-derive (re-run this script)\" >&2; exit 1","category":"blocker","line_end":111,"severity":"low","line_start":111},{"id":"blocker:scripts/new-observation.sh:120:system-reconnaissance","file":"scripts/new-observation.sh","pattern":"System reconnaissance","snippet":"# --- floor write, after the create: never lower (next_id > floor) ------------","category":"blocker","line_end":120,"severity":"low","line_start":120},{"id":"blocker:scripts/validate-skill-bundle.py:29:system-reconnaissance","file":"scripts/validate-skill-bundle.py","pattern":"System reconnaissance","snippet":"and forbid a plugin manifest; the repo is named after the repository, not","category":"blocker","line_end":29,"severity":"low","line_start":29},{"id":"blocker:scripts/validate-skill-bundle.py:434:system-reconnaissance","file":"scripts/validate-skill-bundle.py","pattern":"System reconnaissance","snippet":"f\"frontmatter did not parse (likely an unquoted `: ` in a value — \"","category":"blocker","line_end":434,"severity":"low","line_start":434},{"id":"blocker:SKILL.md:58:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"**Every snippet here is bash, not POSIX `sh`** — the id snippet's `10#`","category":"blocker","line_end":58,"severity":"low","line_start":58},{"id":"blocker:SKILL.md:84:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"an id or frontmatter looks wrong, or before changing how anything reads","category":"blocker","line_end":84,"severity":"low","line_start":84},{"id":"blocker:SKILL.md:178:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"suspect=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk \"$sus\" {} + | wc -l | tr -d ' ')   # invalid ","category":"blocker","line_end":178,"severity":"low","line_start":178},{"id":"blocker:SKILL.md:183:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"[ \"$suspect\" -gt 0 ] || [ \"$a_sus\" -gt 0 ] && echo \"NOTE: $suspect of $n headers (and $a_sus in arch","category":"blocker","line_end":183,"severity":"low","line_start":183},{"id":"blocker:SKILL.md:391:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"id + a kebab-case slug from the title). The id is the highest of three","category":"blocker","line_end":391,"severity":"low","line_start":391},{"id":"blocker:SKILL.md:394:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"`observation-log/archive/.id-floor` (the highest id ever issued — update it","category":"blocker","line_end":394,"severity":"low","line_start":394},{"id":"blocker:SKILL.md:395:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"whenever you issue an id above it, so the counter can never restart from 1","category":"blocker","line_end":395,"severity":"low","line_start":395},{"id":"blocker:SKILL.md:414:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"[ \"$hi\" -lt \"$floor\" ] && echo \"NOTE: highest file id $hi is below .id-floor $floor — ids issued wit","category":"blocker","line_end":414,"severity":"low","line_start":414},{"id":"blocker:SKILL.md:416:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"f=\"$d/$(printf '%04d' \"$next_id\")-<slug>.md\"      # the target path, built from the id just derived","category":"blocker","line_end":416,"severity":"low","line_start":416},{"id":"blocker:SKILL.md:417:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"[ -n \"$(find \"$d\" -maxdepth 2 -name \"$(printf '%04d' \"$next_id\")-*.md\")\" ] && { echo \"COLLISION — id","category":"blocker","line_end":417,"severity":"low","line_start":417},{"id":"blocker:SKILL.md:419:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"printf '%s\\n' \"$next_id\" > \"$d/archive/.id-floor\"   # AFTER the create: an id check that writes no f","category":"blocker","line_end":419,"severity":"low","line_start":419},{"id":"blocker:SKILL.md:433:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"and the id the session-start scan printed is never an input to a write.","category":"blocker","line_end":433,"severity":"low","line_start":433},{"id":"blocker:SKILL.md:441:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"**Resolve each id at its own write time** — run the snippet before EACH","category":"blocker","line_end":441,"severity":"low","line_start":441},{"id":"blocker:SKILL.md:444:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"(\"Resolve each id at its own write time\") before batching or parallelising.","category":"blocker","line_end":444,"severity":"low","line_start":444},{"id":"blocker:SKILL.md:509:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"text contains `: ` as the common case; unquoted, that is invalid YAML —","category":"blocker","line_end":509,"severity":"low","line_start":509},{"id":"blocker:SKILL.md:541:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"metadata, not identifiers. A cited id must fall inside the range across","category":"blocker","line_end":541,"severity":"low","line_start":541},{"id":"blocker:SKILL.md:560:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"next id first `mv`s already-resolved files from `observation-log/` to","category":"blocker","line_end":560,"severity":"low","line_start":560},{"id":"blocker:SKILL.md:561:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"`observation-log/archive/`, so the sweep runs whenever an id is issued and","category":"blocker","line_end":561,"severity":"low","line_start":561},{"id":"blocker:SKILL.md:595:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"friction, and if a user has said they always defer, suppress it entirely.","category":"blocker","line_end":595,"severity":"low","line_start":595},{"id":"blocker:SKILL.md:617:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"it, do the sibling check now, never back-fill `none`); every id the summary","category":"blocker","line_end":617,"severity":"low","line_start":617},{"id":"blocker:SKILL.md:653:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"title is an index entry, not content. **A change you did not make resolves","category":"blocker","line_end":653,"severity":"low","line_start":653},{"id":"blocker:SKILL.md:705:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"| How do I log? | Immediately, without interrupting the user's task, as one file per observation nam","category":"blocker","line_end":705,"severity":"low","line_start":705},{"id":"obfuscation:.tessl-plugin/plugin.json:3:unicode-escape-sequence","file":".tessl-plugin/plugin.json","pattern":"Unicode escape sequence","snippet":"\"description\": \"Monitors task execution for skill improvement opportunities. Use during ANY multi-st","category":"obfuscation","line_end":3,"severity":"low","line_start":3},{"id":"env_access:references/weekly-review.md:487:configuration-library","file":"references/weekly-review.md","pattern":"Configuration library","snippet":"nonconf=$(find \"$d\" -maxdepth 1 -name '*.md' -exec awk '","category":"env_access","line_end":487,"severity":"low","line_start":487},{"id":"env_access:references/weekly-review.md:500:configuration-library","file":"references/weekly-review.md","pattern":"Configuration library","snippet":"n_nc=$(printf '%s' \"$nonconf\" | grep -c .)","category":"env_access","line_end":500,"severity":"low","line_start":500},{"id":"env_access:references/weekly-review.md:501:configuration-library","file":"references/weekly-review.md","pattern":"Configuration library","snippet":"if [ \"$n_nc\" -gt 0 ]; then printf 'NOTE: %s non-conforming headers (id / status / siblings_checked /","category":"env_access","line_end":501,"severity":"low","line_start":501},{"id":"env_access:scripts/migrate-log.py:365:configuration-library","file":"scripts/migrate-log.py","pattern":"Configuration library","snippet":"fm.append(f\"resolved: null   # candidate from body text: {rec['resolved_hint']} — unconfirmed\")","category":"env_access","line_end":365,"severity":"low","line_start":365},{"id":"network:.claude-plugin/marketplace.json:2:hardcoded-url","file":".claude-plugin/marketplace.json","pattern":"Hardcoded URL","snippet":"\"$schema\": \"https://json.schemastore.org/claude-code-marketplace.json\",","category":"network","line_end":2,"severity":"low","line_start":2},{"id":"network:.claude-plugin/marketplace.json:6:hardcoded-url","file":".claude-plugin/marketplace.json","pattern":"Hardcoded URL","snippet":"\"url\": \"https://rebelytics.com\"","category":"network","line_end":6,"severity":"low","line_start":6},{"id":"network:.claude-plugin/plugin.json:2:hardcoded-url","file":".claude-plugin/plugin.json","pattern":"Hardcoded URL","snippet":"\"$schema\": \"https://json.schemastore.org/claude-code-plugin-manifest.json\",","category":"network","line_end":2,"severity":"low","line_start":2},{"id":"network:.claude-plugin/plugin.json:8:hardcoded-url","file":".claude-plugin/plugin.json","pattern":"Hardcoded URL","snippet":"\"url\": \"https://rebelytics.com\"","category":"network","line_end":8,"severity":"low","line_start":8},{"id":"network:.claude-plugin/plugin.json:10:hardcoded-url","file":".claude-plugin/plugin.json","pattern":"Hardcoded URL","snippet":"\"homepage\": \"https://github.com/rebelytics/one-skill-to-rule-them-all\",","category":"network","line_end":10,"severity":"low","line_start":10},{"id":"network:.claude-plugin/plugin.json:11:hardcoded-url","file":".claude-plugin/plugin.json","pattern":"Hardcoded URL","snippet":"\"repository\": \"https://github.com/rebelytics/one-skill-to-rule-them-all\",","category":"network","line_end":11,"severity":"low","line_start":11},{"id":"network:.github/ISSUE_TEMPLATE/config.yml:4:hardcoded-url","file":".github/ISSUE_TEMPLATE/config.yml","pattern":"Hardcoded URL","snippet":"url: https://github.com/rebelytics/one-skill-to-rule-them-all/blob/main/SECURITY.md","category":"network","line_end":4,"severity":"low","line_start":4},{"id":"network:references/skill-authoring.md:1278:hardcoded-url","file":"references/skill-authoring.md","pattern":"Hardcoded URL","snippet":"- service: http://localhost:11434   # reachable","category":"network","line_end":1278,"severity":"low","line_start":1278},{"id":"filesystem:references/environments.md:513:node-js-fs-stat-operations","file":"references/environments.md","pattern":"Node.js fs stat operations","snippet":"if (fs.existsSync(marker)) process.exit(0);             // once per session","category":"filesystem","line_end":513,"severity":"low","line_start":513},{"id":"filesystem:references/environments.md:517:node-js-fs-stat-operations","file":"references/environments.md","pattern":"Node.js fs stat operations","snippet":"const st = fs.statSync(transcript), text = fs.readFileSync(transcript, 'utf8');","category":"filesystem","line_end":517,"severity":"low","line_start":517},{"id":"filesystem:references/environments.md:536:node-js-fs-stat-operations","file":"references/environments.md","pattern":"Node.js fs stat operations","snippet":"const touched = files.some((f) => { try { return fs.statSync(f).mtimeMs > started; } catch { return ","category":"filesystem","line_end":536,"severity":"low","line_start":536},{"id":"network:README.md:9:python-http-libraries","file":"README.md","pattern":"Python HTTP libraries","snippet":"The current version of task-observer also includes improvements from 69 different contributors, each","category":"network","line_end":9,"severity":"low","line_start":9},{"id":"network:references/weekly-review.md:968:python-http-libraries","file":"references/weekly-review.md","pattern":"Python HTTP libraries","snippet":"2. **Read the repo's open issues and pull requests.** They are review","category":"network","line_end":968,"severity":"low","line_start":968},{"id":"filesystem:references/environments.md:160:standard-device-file-access","file":"references/environments.md","pattern":"Standard device file access","snippet":"and 2>/dev/null does not help, because the redirection belongs to a","category":"filesystem","line_end":160,"severity":"low","line_start":160},{"id":"filesystem:references/environments.md:458:standard-device-file-access","file":"references/environments.md","pattern":"Standard device file access","snippet":"open=$(find \"$d/observation-log\" -maxdepth 1 -name '*.md' -exec grep -l '^status: open$' {} + 2>/dev","category":"filesystem","line_end":458,"severity":"low","line_start":458},{"id":"filesystem:references/environments.md:459:standard-device-file-access","file":"references/environments.md","pattern":"Standard device file access","snippet":"last=$(cat \"$d/last-review-date.txt\" 2>/dev/null || echo never)","category":"filesystem","line_end":459,"severity":"low","line_start":459},{"id":"filesystem:references/migration.md:153:standard-device-file-access","file":"references/migration.md","pattern":"Standard device file access","snippet":"rmdir skill-observations/archive 2>/dev/null","category":"filesystem","line_end":153,"severity":"low","line_start":153},{"id":"filesystem:references/observation-log.md:385:standard-device-file-access","file":"references/observation-log.md","pattern":"Standard device file access","snippet":"find \"$(dirname \"[ABSOLUTE PATH]\")\" -maxdepth 3 -type d -path '*/skill-observations/observation-log'","category":"filesystem","line_end":385,"severity":"low","line_start":385},{"id":"filesystem:references/observation-log.md:965:standard-device-file-access","file":"references/observation-log.md","pattern":"Standard device file access","snippet":"seen=$(cd \"$d\" && awk 'FNR==1 {n++; nextfile} END {print n+0}' *.md 2>/dev/null)   # files the sweep","category":"filesystem","line_end":965,"severity":"low","line_start":965},{"id":"filesystem:references/observation-log.md:970:standard-device-file-access","file":"references/observation-log.md","pattern":"Standard device file access","snippet":"fm && /^resolved:/ {r=$2}' *.md 2>/dev/null | while IFS= read -r x; do mv \"$x\" archive/; done )   # ","category":"filesystem","line_end":970,"severity":"low","line_start":970},{"id":"filesystem:references/observation-log.md:971:standard-device-file-access","file":"references/observation-log.md","pattern":"Standard device file access","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null); floor=$((10#${floor:-0}))   # di","category":"filesystem","line_end":971,"severity":"low","line_start":971},{"id":"filesystem:references/observation-log.md:1200:standard-device-file-access","file":"references/observation-log.md","pattern":"Standard device file access","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null)","category":"filesystem","line_end":1200,"severity":"low","line_start":1200},{"id":"filesystem:references/weekly-review.md:447:standard-device-file-access","file":"references/weekly-review.md","pattern":"Standard device file access","snippet":"top=$(find \"$d\" \"$d/archive\" -maxdepth 1 -name '[0-9]*.md' | sed 's|.*/||' | grep -oE '^[0-9]+' | so","category":"filesystem","line_end":447,"severity":"low","line_start":447},{"id":"filesystem:references/weekly-review.md:1177:standard-device-file-access","file":"references/weekly-review.md","pattern":"Standard device file access","snippet":"[ ! -L \"$s\" ] && [ \"$(stat -c %i \"$live/SKILL.md\" 2>/dev/null || stat -f %i \"$live/SKILL.md\")\" != \"$","category":"filesystem","line_end":1177,"severity":"low","line_start":1177},{"id":"filesystem:scripts/new-observation.sh:70:standard-device-file-access","file":"scripts/new-observation.sh","pattern":"Standard device file access","snippet":"seen=$(cd \"$d\" && awk 'FNR==1 {n++; nextfile} END {print n+0}' *.md 2>/dev/null)   # files the sweep","category":"filesystem","line_end":70,"severity":"low","line_start":70},{"id":"filesystem:scripts/new-observation.sh:79:standard-device-file-access","file":"scripts/new-observation.sh","pattern":"Standard device file access","snippet":"fm && /^resolved:/ {r=$2}' *.md 2>/dev/null | while IFS= read -r x; do mv \"$x\" archive/; done )","category":"filesystem","line_end":79,"severity":"low","line_start":79},{"id":"filesystem:scripts/new-observation.sh:85:standard-device-file-access","file":"scripts/new-observation.sh","pattern":"Standard device file access","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null); floor=$((10#${floor:-0}))","category":"filesystem","line_end":85,"severity":"low","line_start":85},{"id":"filesystem:scripts/new-observation.sh:116:standard-device-file-access","file":"scripts/new-observation.sh","pattern":"Standard device file access","snippet":"if ! (set -C; : > \"$f\") 2>/dev/null; then","category":"filesystem","line_end":116,"severity":"low","line_start":116},{"id":"filesystem:SKILL.md:187:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"find \"$(dirname \"[ABSOLUTE PATH]\")\" -maxdepth 3 -type d -path '*/skill-observations/observation-log'","category":"filesystem","line_end":187,"severity":"low","line_start":187},{"id":"filesystem:SKILL.md:404:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"seen=$(cd \"$d\" && awk 'FNR==1 {n++; nextfile} END {print n+0}' *.md 2>/dev/null)   # files the sweep","category":"filesystem","line_end":404,"severity":"low","line_start":404},{"id":"filesystem:SKILL.md:409:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"fm && /^resolved:/ {r=$2}' *.md 2>/dev/null | while IFS= read -r x; do mv \"$x\" archive/; done )   # ","category":"filesystem","line_end":409,"severity":"low","line_start":409},{"id":"filesystem:SKILL.md:410:standard-device-file-access","file":"SKILL.md","pattern":"Standard device file access","snippet":"floor=$(sed '1!d; s/[^0-9]//g' \"$d/archive/.id-floor\" 2>/dev/null); floor=$((10#${floor:-0}))   # di","category":"filesystem","line_end":410,"severity":"low","line_start":410}],"finding_verdicts":[{"id":"obfuscation:references/observation-log.md:1:heuristic-multiple-bracket-chains-37-jsfuck-obfu","reason":"Repeated brackets occur in the documented awk regular expressions that check YAML frontmatter. They are parser character classes, not executable JavaScript or hidden payloads.","verdict":"false_positive","confidence":0.99},{"id":"obfuscation:SKILL.md:1:heuristic-multiple-bracket-chains-37-jsfuck-obfu","reason":"Repeated brackets occur in the documented awk regular expressions that check YAML frontmatter. They are parser character classes, not executable JavaScript or hidden payloads.","verdict":"false_positive","confidence":0.99},{"id":"obfuscation:scripts/validate-skill-bundle.py:781:hex-encoded-characters","reason":"The byte sequence is the ZIP central-directory signature used to locate archive member records. It is a format constant, not an encoded executable payload.","verdict":"false_positive","confidence":0.99},{"id":"obfuscation:scripts/validate-skill-bundle.py:787:hex-encoded-characters","reason":"The hexadecimal byte represents a backslash checked in ZIP member names. The validator rejects malformed archive paths rather than decoding hidden instructions.","verdict":"false_positive","confidence":0.99},{"id":"env_access:references/skill-authoring.md:1277:generic-api-secret-keys","reason":"OPENAI_API_KEY appears in an illustrative prerequisites declaration for externally dependent skills. This example contains no credential value or secret transmission.","verdict":"false_positive","confidence":0.99},{"id":"env_access:.github/workflows/release-bundle.yml:26:git-platform-tokens","reason":"The release workflow supplies the standard GitHub token to authenticate its release upload. That authorized use is legitimate; the upload command injection is adjudicated separately.","verdict":"false_positive","confidence":0.96},{"id":"filesystem:references/environments.md:365:hidden-file-in-home-directory","reason":"The passage names standard Claude skill or observation workspace directories. These locations support the declared workflow and do not indicate credential harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/environments.md:723:hidden-file-in-home-directory","reason":"The command backs up the installed task-observer skill before an update. The hidden destination is an explicit local backup, not a credential store.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/environments.md:1017:hidden-file-in-home-directory","reason":"The passage names standard Claude skill or observation workspace directories. These locations support the declared workflow and do not indicate credential harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/migration.md:179:hidden-file-in-home-directory","reason":"The documented migration search finds legacy observation logs under Claude project storage. Its scope matches migration needs and does not target credentials.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/skill-authoring.md:739:hidden-file-in-home-directory","reason":"The passage names standard Claude skill or observation workspace directories. These locations support the declared workflow and do not indicate credential harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:28:hidden-file-in-home-directory","reason":"The passage names standard Claude skill or observation workspace directories. These locations support the declared workflow and do not indicate credential harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:33:hidden-file-in-home-directory","reason":"The passage names standard Claude skill or observation workspace directories. These locations support the declared workflow and do not indicate credential harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/environments.md:907:non-standard-device-file-access","reason":"The dev segment belongs to example Windows repository paths such as C:/dev/<repo>. The surrounding text explains cross-shell path portability, not access to device nodes.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/environments.md:908:non-standard-device-file-access","reason":"The dev segment belongs to example Windows repository paths such as C:/dev/<repo>. The surrounding text explains cross-shell path portability, not access to device nodes.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/environments.md:909:non-standard-device-file-access","reason":"The dev segment belongs to example Windows repository paths such as C:/dev/<repo>. The surrounding text explains cross-shell path portability, not access to device nodes.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/migration.md:158:path-traversal-sequence","reason":"The ellipsis abbreviates an example path or command in explanatory text. It is not a parent-directory traversal segment used to escape a filesystem boundary.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:scripts/validate-skill-bundle.py:373:path-traversal-sequence","reason":"The ellipsis abbreviates an example path or command in explanatory text. It is not a parent-directory traversal segment used to escape a filesystem boundary.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/environments.md:898:powershell-invocation","reason":"This passage explains Windows path or text-encoding compatibility. Mentioning PowerShell and encoding options does not invoke a shell or execute a payload.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/environments.md:908:powershell-invocation","reason":"This passage explains Windows path or text-encoding compatibility. Mentioning PowerShell and encoding options does not invoke a shell or execute a payload.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/environments.md:909:powershell-invocation","reason":"This passage explains Windows path or text-encoding compatibility. Mentioning PowerShell and encoding options does not invoke a shell or execute a payload.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/environments.md:961:powershell-invocation","reason":"This passage explains Windows path or text-encoding compatibility. Mentioning PowerShell and encoding options does not invoke a shell or execute a payload.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/environments.md:967:powershell-invocation","reason":"This passage explains Windows path or text-encoding compatibility. Mentioning PowerShell and encoding options does not invoke a shell or execute a payload.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/weekly-review.md:299:powershell-invocation","reason":"Get-ScheduledTask is documented as a platform-specific scheduler inventory check. The reference does not request elevated privileges or execute untrusted PowerShell content.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:scripts/migrate-log.py:124:hard-link-creation","reason":"The matched ln is a Python loop variable containing a text line. The surrounding parser iterates log text and never invokes a hard-link command.","verdict":"false_positive","confidence":1},{"id":"filesystem:scripts/migrate-log.py:144:hard-link-creation","reason":"The matched ln is a Python loop variable containing a text line. The surrounding parser iterates log text and never invokes a hard-link command.","verdict":"false_positive","confidence":1},{"id":"filesystem:scripts/migrate-log.py:393:hard-link-creation","reason":"The matched ln is a Python loop variable containing a text line. The surrounding parser iterates log text and never invokes a hard-link command.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/environments.md:365:hidden-file-access","reason":"The passage names standard Claude skill or observation workspace directories. These locations support the declared workflow and do not indicate credential harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/environments.md:723:hidden-file-access","reason":"The command backs up the installed task-observer skill before an update. The hidden destination is an explicit local backup, not a credential store.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/environments.md:1017:hidden-file-access","reason":"The passage names standard Claude skill or observation workspace directories. These locations support the declared workflow and do not indicate credential harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/migration.md:46:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/migration.md:179:hidden-file-access","reason":"The documented migration search finds legacy observation logs under Claude project storage. Its scope matches migration needs and does not target credentials.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/observation-log.md:744:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/observation-log.md:887:hidden-file-access","reason":"The inventory enumerates installed SKILL.md files in project skill directories. Hidden directory names identify the normal installation layout, not secret harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/observation-log.md:949:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/observation-log.md:971:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/observation-log.md:980:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/observation-log.md:1200:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/skill-authoring.md:739:hidden-file-access","reason":"The passage names standard Claude skill or observation workspace directories. These locations support the declared workflow and do not indicate credential harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/weekly-review.md:447:hidden-file-access","reason":"The passage names standard Claude skill or observation workspace directories. These locations support the declared workflow and do not indicate credential harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:scripts/new-observation.sh:85:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:scripts/new-observation.sh:102:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:scripts/new-observation.sh:121:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:scripts/validate-skill-bundle.py:373:hidden-file-access","reason":"The hidden plugin-manifest path appears in a validator diagnostic explaining an unsupported bundle layout. It does not access private home-directory files.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:28:hidden-file-access","reason":"The passage names standard Claude skill or observation workspace directories. These locations support the declared workflow and do not indicate credential harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:33:hidden-file-access","reason":"The passage names standard Claude skill or observation workspace directories. These locations support the declared workflow and do not indicate credential harvesting.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:394:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:410:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:419:hidden-file-access","reason":"The hidden .id-floor file stores the highest issued observation identifier inside the configured log archive. Reading or updating this numeric state is ordinary workspace bookkeeping.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/environments.md:503:node-js-fs-operations","reason":"The optional stop hook writes a per-session timestamp marker before emitting its one-time backstop decision. This is documented hook state, not an arbitrary file-modification payload.","verdict":"false_positive","confidence":0.95},{"id":"filesystem:references/environments.md:506:node-js-fs-operations","reason":"The hook reads JSON input from standard input and exits on malformed input. This is the harness event interface, not a read of secret files.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/environments.md:517:node-js-fs-operations","reason":"The optional hook reads the harness-supplied transcript to count tool uses and determine session start time. The displayed code does not transmit transcript content.","verdict":"false_positive","confidence":0.95},{"id":"filesystem:references/environments.md:533:node-js-fs-operations","reason":"The optional hook lists observation files or compares modification times with session start time. These bounded local checks implement its documented checkpoint backstop.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/skill-authoring.md:855:python-archive-libraries","reason":"The validator creates a skill ZIP bundle or inspects archive member-name bytes. It does not extract untrusted entries into arbitrary paths or execute archived content.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:scripts/validate-skill-bundle.py:47:python-archive-libraries","reason":"The validator creates a skill ZIP bundle or inspects archive member-name bytes. It does not extract untrusted entries into arbitrary paths or execute archived content.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:scripts/validate-skill-bundle.py:769:python-archive-libraries","reason":"The validator creates a skill ZIP bundle or inspects archive member-name bytes. It does not extract untrusted entries into arbitrary paths or execute archived content.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:scripts/validate-skill-bundle.py:777:python-archive-libraries","reason":"The validator creates a skill ZIP bundle or inspects archive member-name bytes. It does not extract untrusted entries into arbitrary paths or execute archived content.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:scripts/migrate-log.py:487:python-os-file-operations","reason":"The migration command creates its selected output directory or archive directory before writing converted observations. This matches the explicit conversion workflow, not an unauthorized filesystem operation.","verdict":"false_positive","confidence":0.96},{"id":"filesystem:scripts/migrate-log.py:495:python-os-file-operations","reason":"The migration command creates its selected output directory or archive directory before writing converted observations. This matches the explicit conversion workflow, not an unauthorized filesystem operation.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:references/environments.md:512:ruby-shell-backtick-execution","reason":"The backticks form a JavaScript template string for a sanitized session marker filename. They do not execute shell commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/environments.md:1364:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/observation-log.md:86:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/observation-log.md:376:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/observation-log.md:972:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:references/observation-log.md:1363:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:24:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:27:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:50:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:77:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:79:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:84:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:105:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:191:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:225:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:226:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:312:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/migrate-log.py:515:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/new-observation.sh:17:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/new-observation.sh:34:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/new-observation.sh:82:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:18:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:27:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:28:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:33:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:70:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:71:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:85:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:91:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:103:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:128:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:129:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:130:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:147:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:150:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:151:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:153:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:154:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:161:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:173:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:176:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:181:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:195:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:203:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:214:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:215:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:244:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:275:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:290:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:343:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:357:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:383:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:387:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:411:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:424:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:430:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:434:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:441:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/validate-skill-bundle.py:443:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:28:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:40:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:58:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:78:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:86:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:88:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:92:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:103:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:104:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:109:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:110:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:131:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:134:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:137:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:140:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:142:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:150:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:152:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:153:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:159:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:167:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:178:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:193:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:196:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:198:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:200:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:201:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:202:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:205:ruby-shell-backtick-execution","reason":"The matched backticks are Markdown formatting, documentation comments, code fences, or regular-expression literals. The surrounding code does not use Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:.github/workflows/tessl-publish.yml:37:shell-command-substitution","reason":"The fixed Python command parses the local plugin manifest version for comparison with the release tag. Parsed data is not executed as shell source.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/environments.md:458:shell-command-substitution","reason":"The optional session-start hook counts open observations and reads the local review date. Fixed commands and quoted paths do not evaluate log content as shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/environments.md:459:shell-command-substitution","reason":"The optional session-start hook counts open observations and reads the local review date. Fixed commands and quoted paths do not evaluate log content as shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/environments.md:1043:shell-command-substitution","reason":"The fixed date command supplies a timestamp to the review marker in the configured workspace. It does not execute external or observation-provided instructions.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/migration.md:137:shell-command-substitution","reason":"The migration check counts files or mandatory metadata fields within the selected observation directory. Fixed command substitution collects counts without executing observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/migration.md:139:shell-command-substitution","reason":"The migration check counts files or mandatory metadata fields within the selected observation directory. Fixed command substitution collects counts without executing observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:91:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:367:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:368:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:376:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:377:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:383:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:385:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:887:shell-command-substitution","reason":"The documented inventory lists installed skill files under the selected repository root and counts the results. Quoted paths are passed as data to fixed commands.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:888:shell-command-substitution","reason":"The documented inventory lists installed skill files under the selected repository root and counts the results. Quoted paths are passed as data to fixed commands.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:963:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:964:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:965:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:971:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:972:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:973:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:974:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:976:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:977:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:978:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:1200:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:1201:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:1202:shell-command-substitution","reason":"Fixed workspace commands collect counts, timestamps, frontmatter, or numeric identifier state. Quoted paths and fixed parsing programs do not execute observation content.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:1361:shell-command-substitution","reason":"The fixed date command supplies metadata through a constant printf format. The following quoted heredoc prevents command-looking observation text from executing.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:1363:shell-command-substitution","reason":"This example places command-looking observation text inside a quoted heredoc. The accompanying instruction explicitly keeps the text literal rather than executing it.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:1556:shell-command-substitution","reason":"The archival helpers count active and archived observations or compare dates. Fixed commands verify local bookkeeping without evaluating observation text as instructions.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:1557:shell-command-substitution","reason":"The archival helpers count active and archived observations or compare dates. Fixed commands verify local bookkeeping without evaluating observation text as instructions.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:1559:shell-command-substitution","reason":"The archival helpers count active and archived observations or compare dates. Fixed commands verify local bookkeeping without evaluating observation text as instructions.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:1571:shell-command-substitution","reason":"The archival helpers count active and archived observations or compare dates. Fixed commands verify local bookkeeping without evaluating observation text as instructions.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/observation-log.md:1572:shell-command-substitution","reason":"The archival helpers count active and archived observations or compare dates. Fixed commands verify local bookkeeping without evaluating observation text as instructions.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/weekly-review.md:447:shell-command-substitution","reason":"The review checks identifier floors or required frontmatter fields in workspace observation files. Fixed parsing commands collect metadata without evaluating it as executable code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/weekly-review.md:487:shell-command-substitution","reason":"The review checks identifier floors or required frontmatter fields in workspace observation files. Fixed parsing commands collect metadata without evaluating it as executable code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/weekly-review.md:500:shell-command-substitution","reason":"The review checks identifier floors or required frontmatter fields in workspace observation files. Fixed parsing commands collect metadata without evaluating it as executable code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/weekly-review.md:1170:shell-command-substitution","reason":"The staging procedure resolves a physical directory or compares file identifiers to avoid editing the live copy. Fixed commands consume quoted paths, not executable input.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/weekly-review.md:1177:shell-command-substitution","reason":"The staging procedure resolves a physical directory or compares file identifiers to avoid editing the live copy. Fixed commands consume quoted paths, not executable input.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/weekly-review.md:1438:shell-command-substitution","reason":"The review compares current file counts with its saved listing to detect concurrent log changes. Command substitution only captures fixed counting commands.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:references/weekly-review.md:1439:shell-command-substitution","reason":"The review compares current file counts with its saved listing to detect concurrent log changes. Command substitution only captures fixed counting commands.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:66:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:69:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:70:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:85:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:86:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:87:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:90:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:94:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:95:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:101:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:102:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:103:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:scripts/new-observation.sh:110:shell-command-substitution","reason":"These fixed commands count workspace files, read numeric identifiers, or derive a validated observation filename. Quoted expansions carry data, not dynamically evaluated shell code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:55:shell-command-substitution","reason":"The text explicitly prohibits the word-splitting command example. It is an unsafe-pattern warning, not an instruction to execute that command.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:169:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:170:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:178:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:179:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:185:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:187:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:402:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:403:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:404:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:410:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:411:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:412:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:413:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:415:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:416:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:417:shell-command-substitution","reason":"The documented scan and identifier procedures use fixed local commands and quoted workspace paths. Command substitution collects metadata rather than evaluating observation text as code.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/environments.md:503:synchronous-file-operations","reason":"The optional stop hook writes a per-session timestamp marker before emitting its one-time backstop decision. This is documented hook state, not an arbitrary file-modification payload.","verdict":"false_positive","confidence":0.95},{"id":"filesystem:references/environments.md:506:synchronous-file-operations","reason":"The hook reads JSON input from standard input and exits on malformed input. This is the harness event interface, not a read of secret files.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/environments.md:517:synchronous-file-operations","reason":"The optional hook reads the harness-supplied transcript to count tool uses and determine session start time. The displayed code does not transmit transcript content.","verdict":"false_positive","confidence":0.95},{"id":"filesystem:.github/workflows/release-bundle.yml:18:temp-directory-access","reason":"The workflow uses runner-local temporary paths for bundle staging or publication logs. These are expected release artifacts, not temporary payload downloads or execution staging.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:.github/workflows/release-bundle.yml:19:temp-directory-access","reason":"The workflow uses runner-local temporary paths for bundle staging or publication logs. These are expected release artifacts, not temporary payload downloads or execution staging.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:.github/workflows/release-bundle.yml:20:temp-directory-access","reason":"The workflow uses runner-local temporary paths for bundle staging or publication logs. These are expected release artifacts, not temporary payload downloads or execution staging.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:.github/workflows/release-bundle.yml:21:temp-directory-access","reason":"The workflow uses runner-local temporary paths for bundle staging or publication logs. These are expected release artifacts, not temporary payload downloads or execution staging.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:.github/workflows/release-bundle.yml:23:temp-directory-access","reason":"The workflow uses runner-local temporary paths for bundle staging or publication logs. These are expected release artifacts, not temporary payload downloads or execution staging.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:.github/workflows/release-bundle.yml:27:temp-directory-access","reason":"The release tag is interpolated directly into shell source, so a tag containing command substitution executes commands with the release token. Temporary staging is ordinary, but this upload command exposes a release-workflow injection risk.","verdict":"confirmed","severity":"high","confidence":0.96},{"id":"filesystem:.github/workflows/tessl-publish.yml:51:temp-directory-access","reason":"The workflow uses runner-local temporary paths for bundle staging or publication logs. These are expected release artifacts, not temporary payload downloads or execution staging.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:.github/workflows/tessl-publish.yml:54:temp-directory-access","reason":"The workflow uses runner-local temporary paths for bundle staging or publication logs. These are expected release artifacts, not temporary payload downloads or execution staging.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/environments.md:512:temp-directory-access","reason":"The optional hook stores its one-time session marker in the operating system temporary directory. The path contains a sanitized session identifier and no downloaded payload.","verdict":"false_positive","confidence":0.96},{"id":"filesystem:references/environments.md:928:temp-directory-access","reason":"The passage describes redirected Windows temporary-directory paths when diagnosing configuration discovery. It does not instruct access to sensitive system files.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:references/observation-log.md:86:template-literal-with-command-substitution","reason":"The match combines Markdown backticks with ordinary documented Bash syntax or comments. It does not create a JavaScript template that executes untrusted command text.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/observation-log.md:376:template-literal-with-command-substitution","reason":"The match combines Markdown backticks with ordinary documented Bash syntax or comments. It does not create a JavaScript template that executes untrusted command text.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/observation-log.md:972:template-literal-with-command-substitution","reason":"The match combines Markdown backticks with ordinary documented Bash syntax or comments. It does not create a JavaScript template that executes untrusted command text.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/observation-log.md:1363:template-literal-with-command-substitution","reason":"The command-looking text is inside a quoted heredoc example and is explicitly described as literal. It is not executed as command substitution.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:scripts/new-observation.sh:34:template-literal-with-command-substitution","reason":"The match combines Markdown backticks with ordinary documented Bash syntax or comments. It does not create a JavaScript template that executes untrusted command text.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:55:template-literal-with-command-substitution","reason":"The match combines Markdown backticks with ordinary documented Bash syntax or comments. It does not create a JavaScript template that executes untrusted command text.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:167:template-literal-with-command-substitution","reason":"The match combines Markdown backticks with ordinary documented Bash syntax or comments. It does not create a JavaScript template that executes untrusted command text.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:178:template-literal-with-command-substitution","reason":"The match combines Markdown backticks with ordinary documented Bash syntax or comments. It does not create a JavaScript template that executes untrusted command text.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:400:template-literal-with-command-substitution","reason":"The match combines Markdown backticks with ordinary documented Bash syntax or comments. It does not create a JavaScript template that executes untrusted command text.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:411:template-literal-with-command-substitution","reason":"The match combines Markdown backticks with ordinary documented Bash syntax or comments. It does not create a JavaScript template that executes untrusted command text.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/environments.md:455:unix-shell-invocation","reason":"The shebang declares the interpreter for an optional, user-installed session-start hook. The example performs local observation checks, not remote or arbitrary code execution.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/observation-log.md:1050:unix-shell-invocation","reason":"The passage documents Bash version compatibility and testing on macOS. Naming /bin/bash does not itself execute untrusted commands.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/observation-log.md:1064:unix-shell-invocation","reason":"The passage documents Bash version compatibility and testing on macOS. Naming /bin/bash does not itself execute untrusted commands.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:references/observation-log.md:416:xargs-command-can-execute-arbitrary-commands","reason":"The reference explicitly says not to rebuild the file list using the xargs example. This is a warning against unsafe path splitting, not an execution request.","verdict":"false_positive","confidence":0.99},{"id":"blocker:.github/ISSUE_TEMPLATE/report-a-failure.md:10:system-reconnaissance","reason":"The match is prose asking contributors to explain why existing text did not prevent a failure. It does not invoke a system identification command.","verdict":"false_positive","confidence":0.99},{"id":"blocker:CONTRIBUTING.md:14:system-reconnaissance","reason":"The match is prose asking contributors to explain why existing text did not prevent a failure. It does not invoke a system identification command.","verdict":"false_positive","confidence":0.99},{"id":"blocker:LICENSE.txt:160:system-reconnaissance","reason":"The match occurs in the license clause about technical modifications and legal authority. It contains no system reconnaissance command.","verdict":"false_positive","confidence":1},{"id":"blocker:references/environments.md:103:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:204:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:217:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:319:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:508:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:572:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:609:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:676:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:775:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:866:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:1005:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:1010:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:1012:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:1190:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:1209:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:1225:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:1281:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/environments.md:1312:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/migration.md:46:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/migration.md:186:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:12:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:32:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:33:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:36:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:59:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:138:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:153:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:199:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:215:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:253:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:275:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:376:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:381:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:502:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:518:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:521:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:524:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:569:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:577:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:674:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:749:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:757:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:773:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:944:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:946:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:949:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:952:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:953:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:975:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:977:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:978:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:references/observation-log.md:980:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/migrate-log.py:340:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/migrate-log.py:505:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:2:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:8:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:16:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:21:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:27:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:50:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:68:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:92:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:103:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:106:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:111:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/new-observation.sh:120:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/validate-skill-bundle.py:29:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:scripts/validate-skill-bundle.py:434:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:58:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:84:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:178:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:183:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:391:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:394:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:395:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:414:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:416:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:417:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:419:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:433:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:441:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:444:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:509:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:541:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:560:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:561:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:595:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:617:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:653:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:705:system-reconnaissance","reason":"The match occurs in observation identifier bookkeeping, session metadata, or prose discussing valid data. It does not invoke the Unix id command or collect host identity.","verdict":"false_positive","confidence":0.99},{"id":"obfuscation:.tessl-plugin/plugin.json:3:unicode-escape-sequence","reason":"The plugin description uses standard JSON Unicode escapes for human-readable punctuation. There is no decoded executable payload in this metadata field.","verdict":"false_positive","confidence":0.99},{"id":"env_access:references/weekly-review.md:487:configuration-library","reason":"The match is part of nonconf, non-conforming, or unconfirmed metadata wording. The displayed code does not load a configuration library or access secret environment values.","verdict":"false_positive","confidence":0.99},{"id":"env_access:references/weekly-review.md:500:configuration-library","reason":"The match is part of nonconf, non-conforming, or unconfirmed metadata wording. The displayed code does not load a configuration library or access secret environment values.","verdict":"false_positive","confidence":0.99},{"id":"env_access:references/weekly-review.md:501:configuration-library","reason":"The match is part of nonconf, non-conforming, or unconfirmed metadata wording. The displayed code does not load a configuration library or access secret environment values.","verdict":"false_positive","confidence":0.99},{"id":"env_access:scripts/migrate-log.py:365:configuration-library","reason":"The match is part of nonconf, non-conforming, or unconfirmed metadata wording. The displayed code does not load a configuration library or access secret environment values.","verdict":"false_positive","confidence":0.99},{"id":"network:.claude-plugin/marketplace.json:2:hardcoded-url","reason":"The URL identifies a JSON schema, project repository, author website, or security-reporting document. Static metadata links do not themselves transmit user data.","verdict":"false_positive","confidence":0.99},{"id":"network:.claude-plugin/marketplace.json:6:hardcoded-url","reason":"The URL identifies a JSON schema, project repository, author website, or security-reporting document. Static metadata links do not themselves transmit user data.","verdict":"false_positive","confidence":0.99},{"id":"network:.claude-plugin/plugin.json:2:hardcoded-url","reason":"The URL identifies a JSON schema, project repository, author website, or security-reporting document. Static metadata links do not themselves transmit user data.","verdict":"false_positive","confidence":0.99},{"id":"network:.claude-plugin/plugin.json:8:hardcoded-url","reason":"The URL identifies a JSON schema, project repository, author website, or security-reporting document. Static metadata links do not themselves transmit user data.","verdict":"false_positive","confidence":0.99},{"id":"network:.claude-plugin/plugin.json:10:hardcoded-url","reason":"The URL identifies a JSON schema, project repository, author website, or security-reporting document. Static metadata links do not themselves transmit user data.","verdict":"false_positive","confidence":0.99},{"id":"network:.claude-plugin/plugin.json:11:hardcoded-url","reason":"The URL identifies a JSON schema, project repository, author website, or security-reporting document. Static metadata links do not themselves transmit user data.","verdict":"false_positive","confidence":0.99},{"id":"network:.github/ISSUE_TEMPLATE/config.yml:4:hardcoded-url","reason":"The URL identifies a JSON schema, project repository, author website, or security-reporting document. Static metadata links do not themselves transmit user data.","verdict":"false_positive","confidence":0.99},{"id":"network:references/skill-authoring.md:1278:hardcoded-url","reason":"The localhost URL illustrates a checkable runtime service prerequisite. It is not a data-exfiltration destination or an executed network request.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/environments.md:513:node-js-fs-stat-operations","reason":"The existence check limits the optional stop-hook backstop to once per session. It checks its own marker rather than probing private data.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:references/environments.md:517:node-js-fs-stat-operations","reason":"The optional hook reads the harness-supplied transcript to count tool uses and determine session start time. The displayed code does not transmit transcript content.","verdict":"false_positive","confidence":0.95},{"id":"filesystem:references/environments.md:536:node-js-fs-stat-operations","reason":"The optional hook lists observation files or compares modification times with session start time. These bounded local checks implement its documented checkpoint backstop.","verdict":"false_positive","confidence":0.97},{"id":"network:README.md:9:python-http-libraries","reason":"The README discusses project contributors rather than importing or invoking a Python HTTP library. No evidence found of a network operation in this matched text.","verdict":"false_positive","confidence":0.98},{"id":"network:references/weekly-review.md:968:python-http-libraries","reason":"The review procedure reads public repository issues and pull requests as contribution inputs. It does not import a Python HTTP library or instruct secret transmission.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:references/environments.md:160:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/environments.md:458:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/environments.md:459:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/migration.md:153:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/observation-log.md:385:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/observation-log.md:965:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/observation-log.md:970:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/observation-log.md:971:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/observation-log.md:1200:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/weekly-review.md:447:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/weekly-review.md:1177:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:scripts/new-observation.sh:70:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:scripts/new-observation.sh:79:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:scripts/new-observation.sh:85:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:scripts/new-observation.sh:116:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:187:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:404:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:409:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:410:standard-device-file-access","reason":"The matched /dev/null redirection suppresses expected diagnostics during local bookkeeping or platform checks. It does not access a sensitive device or transmit data.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[{"title":"Prompt Injection Attempt Detected","severity":"critical","locations":[{"file":"SKILL.md","line_end":362,"line_start":356},{"file":"SKILL.md","line_end":119,"line_start":112},{"file":"references/environments.md","line_end":820,"line_start":810}],"confidence":0.98,"description":"The core says \"a classifier can deny one interface while allowing another\" and directs agents to \"try a second tool reaching the same path\". This instruction encourages completing denied writes through another interface, treating permission decisions as noise rather than authorization boundaries. It conflicts with the reference guidance that prohibits alternate-tool retries for denied hook installs.","confidence_reasoning":"The core explicitly links denied writes to alternate-tool retries and dismisses classifier denials as noise. Separate no-bypass guidance does not remove this conflicting instruction."}],"subject_marketplace_commit_sha":"ebde31dd87e995952f287ead2e304320ba5fefce","subject_content_hash":"0294c3ee7d9d7691f6ae190c7eb0718be67126ff454ab070bde868e91dbcfb68","subject_tree_hash":"c249c33e2414ccf0115eab9aa8f3d248b1b7f8585e88bed532a6195b5454a180","subject_plugin_path":"skills/rebelytics/task-observer","audit_payload_hash":"9444ddec704fa6a5a7e9ab079e184b40","confirmed_risk_level":"critical","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"ebde31dd87e995952f287ead2e304320ba5fefce","contentHash":"0294c3ee7d9d7691f6ae190c7eb0718be67126ff454ab070bde868e91dbcfb68","treeHash":"c249c33e2414ccf0115eab9aa8f3d248b1b7f8585e88bed532a6195b5454a180","pluginPath":"skills/rebelytics/task-observer","auditPayloadHash":"9444ddec704fa6a5a7e9ab079e184b40"},"scannerVersion":"3.0.0","policyVersion":"skillstore-security-audit-policy-v1"},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"issued","url":"/api/skills/rebelytics-task-observer/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"critical","confirmedFindingCount":1,"capabilityReviewCount":1,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"blocked","manualInstallPolicy":"allowed_with_warning","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}