systemd-template-timer-missing-instance
Wrote the solution to ~/solution.md. I reproduced and verified the behavior against the actual systemd 259.5 user-unit tooling before writing it.
Root cause: canopy-deploy-check@.timer is an uninstantiated template (@ makes a unit a template; text after @ is the instance). With [Install] WantedBy=timers.target, systemctl enable tries to install a template source into a concrete non-template destination, which systemd refuses. systemd-analyze verify only checks unit syntax, never install logic, so it exits 0 and masks the problem.
Fix: The pair has no instance dimension, so drop @:
mv canopy-deploy-check@.service canopy-deploy-check.service
mv canopy-deploy-check@.timer canopy-deploy-check.timer
systemctl --user daemon-reload
systemctl --user enable --now canopy-deploy-check.timer
If instances are genuinely needed, keep the template but enable a concrete instance (<email>); DefaultInstance= does not make bare-template enable legal.
Verified facts captured in the doc:
- systemctl enable canopy-deploy-check@.timer → exact reported error; verify → rc=0.
- Concrete rename → enable succeeds, symlink created, is-enabled → enabled.
- DefaultInstance=prod + bare-template enable still fails.
- systemctl --user enable --dry-run did create the symlink, so the doc includes mandatory cleanup between test cases.
# Evidence - Problem class: systemd-template-timer-missing-instance - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-11T20:43:43.828Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "A timer/service pair with @ template names but no instance or DefaultInstance passes systemd-analyze verify yet systemctl enable fails. Use concrete unit names when there is no instance dimension, then verify enableability; note systemctl --dry-run may still create symlinks and must be cleaned during tests.", "environment": "systemd 259.5 user units", "language": "bash/systemd", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "systemd-template-timer-missing-instance", "provider": "openrouter", "solved_at": "2026-09-11T20:43:43.828Z", "version": ""}Wrote the solution to ~/solution.md. I reproduced and verified the behavior against the actual systemd 259.5 user-unit tooling before writing it.
Root cause: canopy-deploy-check@.timer is an uninstantiated template (@ makes a unit a template; text after @ is the instance). With [Install] WantedBy=timers.target, systemctl enable tries to install a template source into a concrete non-template destination, which systemd refuses. systemd-analyze verify only checks unit syntax, never install logic, so it exits 0 and masks the problem.
Fix: The pair has no instance dimension, so drop @:
mv canopy-deploy-check@.service canopy-deploy-check.service
mv canopy-deploy-check@.timer canopy-deploy-check.timer
systemctl --user daemon-reload
systemctl --user enable --now canopy-deploy-check.timer
If instances are genuinely needed, keep the template but enable a concrete instance (<email>); DefaultInstance= does not make bare-template enable legal.
Verified facts captured in the doc:
- systemctl enable canopy-deploy-check@.timer → exact reported error; verify → rc=0.
- Concrete rename → enable succeeds, symlink created, is-enabled → enabled.
- DefaultInstance=prod + bare-template enable still fails.
- systemctl --user enable --dry-run did create the symlink, so the doc includes mandatory cleanup between test cases.
# Evidence - Problem class: systemd-template-timer-missing-instance - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-11T20:43:43.828Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "A timer/service pair with @ template names but no instance or DefaultInstance passes systemd-analyze verify yet systemctl enable fails. Use concrete unit names when there is no instance dimension, then verify enableability; note systemctl --dry-run may still create symlinks and must be cleaned during tests.", "environment": "systemd 259.5 user units", "language": "bash/systemd", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "systemd-template-timer-missing-instance", "provider": "openrouter", "solved_at": "2026-09-11T20:43:43.828Z", "version": ""}