Imported from natescherer/postmodern-repo-copiertemplate-integration-test-1792938644-b (
AGENTS.md). Install upstream withnpx skills add natescherer/postmodern-repo-copiertemplate-integration-test-1792938644-b. Copyright stays with the author.
Notes for AI Agents
Git workflow
- Commit message style:
type: summaryas the first line (Conventional Commits, enforced by.config/committed.toml-- keep the subject at or under 72 characters). A short body paragraph explaining non-obvious rationale is fine when it adds real context; don't pad a trivial change with one just to have one. - Never push a git tag to this repo without explicit user approval for that
specific tag, and never push one shaped like a version number (e.g.
v99.0.0) even as a throwaway testing workaround -- this repo's tags are visible to any downstream project that copies from it, and a real one could resolve against a stray tag. A non-version-shaped tag for local testing is fine to create without asking, but delete it immediately once the test that needed it is done.
Render-validation test suite
Location: template/{% if is_template %}tests{% endif %}/. Run via:
mise x -- pytest "template/{% if is_template %}tests{% endif %}/"
Files: conftest.py (shared fixtures), test_render.py (structural
validation across answer_matrix.py's ANSWER_MATRIX, including an
update-from-last-tag path), test_content.py (config/content consistency,
e.g. nav completeness, hook-tool availability), test_validators.py (asserts
copier.yml.jinja's validator: blocks actually reject what they claim to,
via INVALID_ANSWER_MATRIX), test_answer_matrix_coverage.py (audits
answer_matrix.py itself against the real question set). Update
answer_matrix.py whenever a Copier question is added, removed, or renamed,
or a new validator: constraint is added.
Setup checklist
setup_checklist in copier.yml.jinja (opened as a GitHub Issue, or printed, on
copier copy) is the single source of truth for what a new project's owner needs to
manually finish. Update its default list whenever a new template feature requires
the end user to manually configure, replace, or complete something after copying.
Manual verification checklist
docs/manual-verification-github.md and docs/manual-verification-azdo.md (both
static, unconditional -- a template author tests every feature this template offers on
both platforms, not just whichever one this repo's own answers happen to use) cover
what a fresh copier copy can't verify on its own: whether a pipeline/workflow
actually authenticates, triggers, and does what it claims, not just that it's
registered with the right name. Update the relevant file whenever a new or changed
pipeline/workflow needs its own real-world behavior hand-verified, the same way a
new template feature gets added to
the setup checklist above.
Renovate schedule cron syntax is not standard cron
Renovate's schedule option (see renovate.json / template/renovate.json.jinja)
looks like 5-field cron but isn't interpreted the same way -- this applies to
any platform Renovate runs on:
- The minutes field must be
*-- Renovate doesn't support minute-level granularity, and a schedule that restricts it is invalid. - A cron schedule defines an allowed time window, not an exact trigger instant -- Renovate itself runs on its own polling cadence (external to this project) and only acts during the window the schedule describes.
So "* 0 1 * *" is the correct idiomatic form for "once a month, on the
1st, during hour 0" -- it is not a bug, even though it looks like a broken
"every minute" cron at a glance. Do not change it to "0 0 1 * *" (a
standard-cron-style fix) -- that's invalid for Renovate specifically, since it
constrains the minutes field.
Reference: https://docs.renovatebot.com/key-concepts/scheduling/
