claude-skills/engineering
Claude a227b06e6f
fix(engineering): anchor scheduler.py's project marker match (round-9 bug)
A ninth review pass found scheduler.py's schedule()/unschedule() both
located "this project's" managed cron line via marker not in ln, a
bare substring test, not an exact-match or delimiter-anchored check.

Failure scenario: two projects scheduled where one path is a literal
prefix of the other (e.g. /home/user/app and /home/user/app-v2) --
"# project=/home/user/app" is itself a substring of
"# project=/home/user/app-v2"'s line. Running schedule() or
unschedule() for /home/user/app would silently drop app-v2's cron
entry too, with no error or warning.

harvest.py's _project_matches() (added in this same PR) already gets
this right via delimiter-anchored comparison; scheduler.py's marker
matching didn't follow the same discipline.

Fixed: added _line_matches_project(), anchored on
ln.rstrip().endswith(marker) since the marker is always the last token
of a generated line -- used at both call sites.

Also fixed the related minor nit: install-cron.sh's printed --backend
value was unquoted next to otherwise-quoted ${RUNNER}/${PROJECT} in
its heredoc (low risk since that script only prints a line for the
user to copy, never executes anything itself, but inconsistent with
the quoting discipline everywhere else).

Verified two ways: a standalone reproduction confirmed the bug before
the fix and its absence after, and a full schedule()/unschedule()
round-trip through the actual public API (crontab -l/crontab - swapped
for an in-memory fake) confirmed scheduling both /home/user/app and
/home/user/app-v2, then unscheduling only app, correctly leaves
app-v2's line intact.

Added as README deviations #20-21 and reconciled the count across all
three documents to 21 (6 cosmetic, 15 safety/hardening) across nine
review rounds -- cross-checked with grep.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TX374i2YGrjNV4Yi3AmaKS
2026-07-11 19:32:33 +00:00
..
.claude-plugin feat(skills): wave-3 optimization — domain overhauls per newgen audit 2026-06-11 03:58:41 +00:00
.codex feat(skills): wave-3 optimization — domain overhauls per newgen audit 2026-06-11 03:58:41 +00:00
agent-harness Merge pull request #893 from alirezarezvani/claude/pm-audit-agentic-loops-jxurlq 2026-07-03 15:41:40 +02:00
agenthub feat(skills): wave-3 optimization — domain overhauls per newgen audit 2026-06-11 03:58:41 +00:00
autoresearch-agent feat(skills): wave-3 optimization — domain overhauls per newgen audit 2026-06-11 03:58:41 +00:00
behuman chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
caveman chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
chaos-engineering feat(tooling): JSON-output sample gate (G9) + --sample fixtures (#654) 2026-06-11 15:29:39 +00:00
claude-coach feat(tooling): JSON-output sample gate (G9) + --sample fixtures (#654) 2026-06-11 15:29:39 +00:00
code-tour chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
collab-proof fix(collab-proof): add trailing newline + attribution block to plugin.json 2026-06-07 04:09:37 +00:00
data-quality-auditor feat(skills): wave-3 optimization — domain overhauls per newgen audit 2026-06-11 03:58:41 +00:00
demo-video chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
docker-development chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
feature-flags-architect chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
grill-me chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
grill-with-docs chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
handoff chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
helm-chart-builder chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
karpathy-coder fix: phantom-path sweep — 888 unresolvable references to zero 2026-06-10 14:33:00 +00:00
kubernetes-operator chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
llm-cost-optimizer chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
llm-wiki fix: phantom-path sweep — 888 unresolvable references to zero 2026-06-10 14:33:00 +00:00
minimalist feat(engineering): add minimalist and strict-api skills 2026-07-06 13:05:12 +05:30
prompt-governance chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
security-guidance chore(versioning): unify remaining 20 plugins to 2.9.0 2026-05-27 14:25:08 +00:00
skillopt-sleep fix(engineering): anchor scheduler.py's project marker match (round-9 bug) 2026-07-11 19:32:33 +00:00
skills refactor(skills): #655 tranche 2 — performance-profiler under the 100-line ceiling 2026-06-12 05:21:35 +00:00
slo-architect feat(tooling): JSON-output sample gate (G9) + --sample fixtures (#654) 2026-06-11 15:29:39 +00:00
statistical-analyst chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
strict-api feat(engineering): add minimalist and strict-api skills 2026-07-06 13:05:12 +05:30
terraform-patterns chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
universal-scraping-architect polish: PR #838 second-pass nits (non-blocking) 2026-06-11 15:40:45 +00:00
workflow-builder chore(workflow-builder): apply plugin-audit fixes 2026-05-27 14:47:00 +00:00
write-a-skill chore(versioning,docs): normalize stale versions to 2.9.0 + refresh counts 2026-05-27 05:22:59 +00:00
zero-hallucination-coder feat(engineering): add zero-hallucination-coder (hardened from #854) 2026-07-01 02:22:24 +00:00