This is a pre-release. djust 1.0.0 has shipped since: read the djust 1.0.0 release notes.
Before you upgrade, read the upgrade guide.
Added
scripts/check-adr-status.py— ADR status/version-line consistency audit (#1501). A new pre-commit/CI gate that enforces an invariant the #1493 cleanup established: an ADR with**Status**: Acceptedmust record where it shipped via a**Shipped in**: vX.Y.Zline, not a forward-looking**Target version**:line (aTarget versionon an Accepted ADR is stale metadata — the ADR is no longer targeting, it has shipped). The script hard-fails (exit 1) on any Accepted ADR still carrying aTarget versionline, and emits a soft warning for the inverse drift (aProposed/DraftADR that already names aShipped inversion). Wired into.pre-commit-config.yaml(runs when anydocs/adr/file is staged),.github/workflows/test.yml, and amake check-adr-statustarget. Covered bytests/test_check_adr_status.py— 11 tests.scripts/check-doc-snippets.py— doc-snippet smoke test + mechanically-derivable claim assertions (#1500). A new pre-commit/CI gate that AST/import-checks every fenced Python code block inREADME.mdandQUICKSTART.md— catching malformed snippets (syntax errors) and phantom imports (animportof a name djust does not export) before they reach a reader. It also asserts two mechanically-derivable doc claims against their source of truth: the Django minimum-version claim is checked againstpyproject.toml, and the JS client-bundle-size claim is checked against the actual bundle (±3 KB tolerance). Wired into.pre-commit-config.yaml,.github/workflows/test.yml, and amake check-doc-snippetstarget. Covered bytests/test_check_doc_snippets.py— 14 tests. (Doc-example security/style linting is deferred to a follow-up issue.)scripts/check-lockfile-versions.py— lockfile self-entry version audit (#1498, closes #1487). A new pre-commit/CI gate that asserts thedjustself-entry recorded insideCargo.lockanduv.lockmatches the version declared in the corresponding manifest (Cargo.toml/pyproject.toml). A stale lockfile self-entry is a silent class of release bug — the manifest bumps but the lockfile keeps the old version, so a fresh resolve installs a mismatched package metadata version. Wired into themake version,make release, andmake version-checktargets,.github/workflows/test.yml, a.pre-commit-config.yamlhook (runs when a lockfile or manifest is staged), and documented inRELEASING.md. Covered bytests/test_check_lockfile_versions.py— 6 tests.- Two
mandatory:falseStage-4 plan-template rules added to.pipeline-templates/feature-state.json+bugfix-state.json(#1502). Plan authors are now prompted to describe ARIA intent rather than pinning specificrolevalues, and to grep constraint tables before labeling dependencies — both internal contributor-process guidance. - Two new
Yaccessibility system checks —Y003/Y004(#1496). Extends theYcategory (a11Y) shipped in 1.0.0rc1 with two more regex template-scan checks. Y003 flags an<input>/<select>/<textarea>form control with no associated label (WCAG 1.3.1 / 3.3.2, Level A) — a control counts as labelled by a<label for>, a wrapping<label>, anaria-label, or anaria-labelledby; hidden/submit/button/reset/image input types are skipped, and controls with dynamically-injected ({% %}/{{ }}) attributes are treated conservatively as "label may be present" and not flagged (adata-typeattribute is not mistaken for the inputtype). Y004 flags a positivetabindexvalue — a WCAG 2.4.3 focus-order anti-pattern;tabindex="0"/tabindex="-1"and interpolated values are valid and not flagged (adata-tabindexattribute is not mistaken fortabindex). Both emit aDjustWarning(never an error) and are suppressible viaDJUST_CONFIG['suppress_checks']orSILENCED_SYSTEM_CHECKS. Implemented inpython/djust/checks.py; covered by theTestY003CheckIntegrationandTestY004CheckIntegrationclasses inpython/djust/tests/test_accessibility_checks.py— 26 tests.
Fixed
- 12 ADRs' stale
Target versionmetadata corrected to match reconciledStatus(#1493). ADRsdocs/adr/002–008and013–017carried**Target version**:lines that no longer matched their reconciled**Status**:lines. Accepted ADRs that have shipped were relabelled**Shipped in**: vX.Y.Z; deferred ADRs were markedpost-1.0 (deferred). The metadata now accurately reflects each ADR's lifecycle state — Accepted ADRs name where they landed, deferred ADRs are no longer mislabelled as targeting a near-term version. The newscripts/check-adr-status.pyaudit (see Added) prevents this drift class from recurring. - Orphaned
TARBALL_EXCLUDESconstant wired into_create_tarball— CodeQL #2330py/unused-global-variable(#1495).python/djust/deploy_cli.pydefined aTARBALL_EXCLUDESconstant with a# Default patterns to exclude from tarballcomment, but_create_tarballignored it and hardcoded two separate inline pattern lists — leaving the constant with zero call sites. The constant is now the single source of truth, consulted for both the directory filter and the file filter. Its glob-prefixed entries (*.pyc,*.pyo,*.egg-info,*.log) were normalized to substring form (the function matches byin, not glob — a leading*would never match). This is an intended behavior change: deploy tarballs created by_create_tarballnow also exclude.hgand.svndirectories,logs/,media/, andstaticfiles/directories, and.logfiles (the old inline*.logentry never matched, due to the literal*, so.logfiles were silently shipped before). Nothing previously excluded becomes included. These are build/runtime artifacts (SCM metadata, collectstatic output, user uploads, runtime logs) that should be regenerated server-side rather than shipped in a source deploy tarball. Regression coverage in the newTestCreateTarballclass (python/tests/test_deploy_cli.py) — 3 tests, all of which fail if the constant wiring is reverted. - Empty
except: passincheck_psycopg3_for_pg_notifydocumented — CodeQL #2334py/empty-except(#1495). A bareexcept Exception: passinpython/djust/checks.py(the psycopg2__version__read guard) was the only pass-onlyexceptin the file lacking an explanatory comment. It is now replaced with an explicitpsycopg2_version = ""fallback assignment plus a comment explaining the guard:getattralready supplies a""default, so the block only fires on a pathological__version__descriptor, andpsycopg2_versionkeeping its""("version unknown") value is the correct, intentional fallback. No behavior change. - README roadmap reconciliation — 2 stale checkboxes flipped + a broken
register_componentexample corrected (#1497). The README roadmap had two unchecked items — Redis-backed session storage and horizontal scaling — that both shipped viaRedisStateBackend; their checkboxes are now ticked. Aregister_componentexample snippet was also broken: it imported from the wrong package and used aComponentbase class thatregister_componentrejects. The snippet is corrected to import and subclassLiveComponent(execution-verified).docs/roadmap.mdcarried no mechanical rot and is left unchanged. - Stale
djustself-entry inuv.lockcorrected0.9.7→1.0.0rc1(#1498, #1487). Theuv.lockdjustpackage self-entry still recorded0.9.7after thepyproject.tomlbump to1.0.0rc1, so a fresh resolve installed mismatched package metadata. The newscripts/check-lockfile-versions.pyaudit (see Added) prevents this drift class from recurring.