Pedantic Diversio backend dev workflow Skill that enforces ClickUp-linked branch/PR naming, PR hygiene, safe Django migrations, and downtime-safe schema changes for Django4Lyfe-style backends.
This skill is limited to using the following tools:
Use this Skill whenever you are:
If local AGENTS.md / CLAUDE.md in the target repo conflict with anything
here, treat those files as the source of truth and use this Skill as the
default baseline.
backend-pr-workflow skill to review this Django4Lyfe PR’s branch name, ClickUp linkage, migrations, and downtime-safety. Here are the branch name, base branch, and PR title: …”backend-pr-workflow on my planned title, description, and migration summary and tell me all [BLOCKING] and [SHOULD_FIX] issues.”backend-pr-workflow to check that my base branch, title, and release plan follow our backend workflow.”backend-pr-workflow to verify that my migrations and rollout plan are downtime-safe.”When this Skill reviews a PR or workflow plan, the response must be structured and tagged:
What’s aligned – bullets of things that follow the workflow.Needs changes – bullets with severity tags:
[BLOCKING] – must fix before merge or deploy.[SHOULD_FIX] – important but not strictly blocking for merge.[NIT] – minor consistency or documentation suggestions.Each bullet in Needs changes should:
Example bullet:
[BLOCKING] Branch name 'feature/my-thing' does not follow the required 'clickup_<ticket_id>' convention, and CI may not run. Rename to something like 'clickup_GH-1234_my-thing'.Before giving a full review, this Skill should gather:
release, master, etc.).If any of these are missing or unclear, ask the user to provide them before doing a full workflow review.
This Skill treats ClickUp linkage as non-negotiable.
Check the branch name:
clickup_<custom_ticket_id>:
clickup_GH-785clickup_GH-785_world_dominationGH-785),
not the numeric internal ID.clickup_.If the branch does not follow this pattern, emit:
[BLOCKING] – with a suggested corrected branch name.When a feature spans multiple repositories, enforce:
GH-2961GH-2962GH-2963GH-2964Explain risks of reusing the same ID across repos:
If the user appears to be reusing the same ID across repos, emit:
[SHOULD_FIX] – recommending sub-tickets and distinct branch/PR naming.Check or remind the user that:
GH-785: Find another meaning of lifecommit_msg_hook.py and pre-commit hooks, but the
Skill should still call out obvious violations.If commit messages clearly lack ticket IDs (based on user input), emit:
[SHOULD_FIX] – asking the author to fix future commits and, where
practical, to rewrite recent history before merge.The PR title must:
[<clickup_ticket_id>].
[GH-785] Found meaning of lifeIf not, emit:
[BLOCKING] – and propose a corrected title that includes the ticket ID.Remind the user that:
Check whether the work is still in progress:
WIP / [WIP].If not, emit:
[SHOULD_FIX] – asking the author to convert to draft or annotate the PR as
WIP to avoid premature review.Confirm the base branch matches the project’s release workflow:
release (for repos following the Django4Lyfe
pattern).release contents:
master.If a PR targets the wrong base branch:
[BLOCKING] and recommend the correct base, explaining whether the
change belongs in release or should be a master hotfix.If the repo’s docs specify a different default (e.g. custom long-lived branches
documented in CLAUDE.md), follow that instead.
This Skill expects PR authors to be their own first reviewer.
Check that the description (or planned description):
If key context is missing, emit:
[SHOULD_FIX] – listing the missing items and suggesting how to include
them.Prompt the author to confirm they have checked:
print() / ipdb / pdb left behind.If any of these fail obviously based on the PR description or user input, emit
appropriate [SHOULD_FIX] or [BLOCKING] bullets.
This Skill enforces a clean release flow.
release branch)For normal deployments, check that:
release.pyproject.toml) is bumped to the intended release
version, using CalVer (e.g. 2025-08-19).release are not allowed, a small PR is created to
bump the version on release.release → master with a title like:
Release: 2025-08-19Release 2: 2025-08-19 (for multiple releases in one day).Post-deployment:
master.YYYY-MM-DD or YYYY-MM-DD-2.If any of these are obviously missing from the plan, emit [SHOULD_FIX].
For hotfixes, enforce:
master (not release).Hotfix release: 2025-08-19release so it stays ahead of or equal to
master.If a supposed hotfix PR is targeting release, or a hotfix is not planned to
be merged back into release, emit [BLOCKING].
When the PR includes Django model changes, this Skill should be pedantic about migrations.
If the PR has multiple intermediate migrations for the same feature
(...x1.py, ...x2.py, ...x3.py, etc.), recommend cleaning them up before
merge:
Never recommend deleting migrations that are already on production.
If the PR clearly contains many iterative migrations for one feature, emit:
[SHOULD_FIX] – asking the author to collapse them into a clean final
migration set.When suggesting commands, align with the repo’s tooling:
uv run / .bin/django wrappers as documented in AGENTS.md / CLAUDE.md.This Skill should conceptually describe the migration cleanup steps, not hard code commands that may become outdated.
This is the most critical part of the Skill for production stability.
If the PR both:
then:
Enforce the safe two-step pattern:
If a single PR contains both the schema drop and remaining code references, or removes code and schema at once in a way that risks downtime, emit:
[BLOCKING] – and explicitly recommend splitting into two PRs as above.For a new column on a large / hot table with a static default (e.g.
is_active = True):
AddField with default can cause a long-running table rewrite and
lock, blocking writes and potentially causing errors.Enforce a safe pattern:
null=True and no default.ALTER TABLE ... ADD COLUMN is fast.RunSQL to set the default for new rows only, avoiding a full
table rewrite.atomic = False for large
operations.If the PR adds a non-nullable column with a default on a table that likely has many rows, emit:
[SHOULD_FIX] or [BLOCKING] depending on table size and risk, and
describe the two-step pattern above.For defaults that require dynamic values (e.g. generate UUIDs, timestamps):
Recommend:
If a PR uses a volatile default in a way that will backfill a large table inside an atomic migration, emit:
[BLOCKING] – and propose the batched, non-atomic backfill approach.When invoked, this Skill should:
What’s aligned bullets.Needs changes bullets with [BLOCKING], [SHOULD_FIX], [NIT].