ADR-006: No runtime values in the template context¶
Status: accepted
Context¶
Templates commonly want the current year for a copyright header, the author's name from Git configuration, or the platform. Copier and Cookiecutter provide these.
But the rendered tree becomes a Git commit (ADR-001), and update only commits
when the tree changed (ADR-005). A context value that varies by machine or by
moment breaks that: everyone who runs update produces a different tree, the ref
grows a commit every time anyone looks at it, and each one is a merge the user
has to perform for no benefit.
Decision¶
There is no runtime context. No now(), no git.user.name, no platform.os,
no environment access.
The context contains answers, computed values, loaded data and template metadata. Nothing else.
Consequences¶
Rendering is deterministic by construction rather than by convention. There is no way for a template author to accidentally make their template non-reproducible, because the tools to do so are absent.
update on an unchanged template is genuinely a no-op, so a clean git tpl
status means something.
The use cases have better answers. A copyright year should be asked for, or
omitted — Copyright (c) Acme is correct every year. An author name should be a
question whose default the CLI fills from Git configuration: the user presses
Enter, and the value is then recorded in .config/git.tpl.toml, shared with the
project, and identical for everyone who renders it. Which is what you wanted.
That is now implemented as
default_from = "git:user.name",
and it upholds this decision rather than relaxing it: the key is read only when a
human is going to be asked, it seeds the prompt and never the context, and a
non-interactive render never reads it at all.
That is the general shape: a value that varies by machine belongs in the answers, where it is recorded and reviewed, not in the context, where it is invisible.
If a compelling case appears, it arrives as a per-template opt-in that marks the template non-deterministic and records that in the commit trailers — never as an ambient global. The template metadata deliberately excludes the template's own revision for the same reason: a file containing its own template's SHA would change on every template commit.