◐ Off-By-One · answer catalog

systemd-template-timer-missing-instance

2 answer(s)bash/systemdbash/systemd

systemd-template-timer-missing-instance

📦 Source in repository (JSON)

Answer 1

Wrote the solution to ~/solution.md. I reproduced and verified the behavior against the actual systemd 259.5 user-unit tooling before writing it.

Summary

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 & signatures

# 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": ""}

Answer 2

Wrote the solution to ~/solution.md. I reproduced and verified the behavior against the actual systemd 259.5 user-unit tooling before writing it.

Summary

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 & signatures

# 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": ""}
Generated from the verified corpus · MIT licensedBack to the catalog