From 91fac7fd67d919dbdcc5c7995b1d8b24d06e0323 Mon Sep 17 00:00:00 2001 From: retoor Date: Sun, 9 Aug 2026 11:25:57 +0200 Subject: [PATCH] Gate blocked actions behind an in-place terms acceptance dialog A member whose account has not accepted the terms in force now gets one dialog on the action they attempted instead of a dead-end refusal. The client handler is the single TermsGate, wired into every Http POST helper so the four optimistic controllers cannot swallow the gate into an error flash, and the original request is replayed once the acceptance is recorded. Reading the site and deleting an account stay unblocked. apple.md is the source brief the compliance research documents reference. Co-Authored-By: Claude Opus 5 (1M context) --- .claude/agents/audit-maintainer.md | 2 +- .claude/agents/background-maintainer.md | 6 +- .claude/agents/devii-maintainer.md | 2 +- .claude/agents/docs-maintainer.md | 2 +- .claude/agents/dry-maintainer.md | 2 +- .claude/agents/fanout-maintainer.md | 2 +- .claude/agents/feature-builder.md | 6 +- .claude/agents/frontend-maintainer.md | 2 +- .claude/agents/security-maintainer.md | 2 +- .claude/agents/seo-maintainer.md | 2 +- .claude/agents/style-maintainer.md | 2 +- .claude/commands/audit-event.md | 2 +- .claude/commands/docs-page.md | 2 +- .claude/commands/maintenance.md | 2 +- .claude/commands/service.md | 2 +- .claude/commands/validate.md | 6 +- .claude/workflows/devii-tool.js | 6 +- .claude/workflows/endpoint.js | 6 +- .claude/workflows/feature.js | 6 +- .claude/workflows/job-service.js | 6 +- apple.md | 1 + devplacepy/routers/auth/terms.py | 2 + devplacepy/services/containers/files/bot.py | 8 +- devplacepy/services/containers/files/d.py | 8 +- devplacepy/services/containers/files/pagent | 8 +- devplacepy/services/moderation/CLAUDE.md | 15 +++ devplacepy/static/css/components.css | 14 +++ devplacepy/static/js/Application.js | 2 + devplacepy/static/js/CLAUDE.md | 3 + devplacepy/static/js/Http.js | 33 ++++- devplacepy/static/js/TermsGate.js | 79 ++++++++++++ devplacepy/static/js/components/AppDialog.js | 19 +++ devplacepy/static/js/components/AppUpload.js | 6 +- devplacepy/templates/docs/claude-agents.html | 4 +- .../templates/docs/component-dp-dialog.html | 6 +- .../templates/docs/getting-started.html | 9 +- tests/api/auth/terms.py | 51 ++++++++ tests/e2e/auth/terms.py | 115 ++++++++++++++++++ 38 files changed, 393 insertions(+), 58 deletions(-) create mode 100644 apple.md create mode 100644 devplacepy/static/js/TermsGate.js create mode 100644 tests/e2e/auth/terms.py diff --git a/.claude/agents/audit-maintainer.md b/.claude/agents/audit-maintainer.md index b9cb4e46..772c03ad 100644 --- a/.claude/agents/audit-maintainer.md +++ b/.claude/agents/audit-maintainer.md @@ -30,7 +30,7 @@ All application code is under `devplacepy/`: `devplacepy/routers/`, `devplacepy/ - **F. Verify your own work.** After each edit, re-read the changed region and re-check the consumers. ## Mode -Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then run `hawk .` and confirm it passes. Never run the test suite; never perform any git write operation. +Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then re-validate every file you touched with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates) and confirm `python -c "from devplacepy.main import app"` still imports clean. Never run the test suite; never perform any git write operation. ## Obey the rules you enforce No comments or docstrings in source you author; no em-dashes (use a hyphen); keep `retoor ` as the first line of any file you create. diff --git a/.claude/agents/background-maintainer.md b/.claude/agents/background-maintainer.md index 1e9930a1..b3ad9117 100644 --- a/.claude/agents/background-maintainer.md +++ b/.claude/agents/background-maintainer.md @@ -40,10 +40,10 @@ The already-established **choke points** (the public function is a thin wrapper - **C. Cross-reference before every change.** A funnel is called from many sites; deferring inside it changes ALL of them. Find every caller and confirm none depends on the side-effect's result synchronously. If even one does, do not defer the funnel. - **D. Zero degradation.** A fix must never reduce functionality, weaken a check, or change observable behavior beyond moving WHEN a side-effect runs. Deferral is best-effort and must NEVER raise into the caller. If the only fix would degrade or risk stale reads, record it unfixed with the safe path forward. - **E. Dig deep.** Pursue the root cause; gather more evidence rather than guessing or bailing. -- **F. Verify your own work.** After each edit, re-read the changed region, re-check the callers, confirm `python -c "from devplacepy.main import app"` still imports clean, and run `hawk .`. +- **F. Verify your own work.** After each edit, re-read the changed region, re-check the callers, confirm `python -c "from devplacepy.main import app"` still imports clean, and re-validate every file you touched with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates). ## Mode -Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, confirm the app imports clean, then run `hawk .` and confirm it passes. **HARD GUARDRAIL: never run the test suite (no `make test`, no `pytest`); never perform any git write operation.** Validate by clean import + hawk + an em-dash scan only. +Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, confirm the app imports clean, then re-validate every file you touched with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates) and confirm they pass. **HARD GUARDRAIL: never run the test suite (no `make test`, no `pytest`); never perform any git write operation.** Validate by clean import + the per-language checks + an em-dash scan only. ## Obey the rules you enforce No comments or docstrings in source you author; no em-dashes (use a hyphen); full typing on functions you add; keep `retoor ` as the first line of any source file you create. @@ -78,4 +78,4 @@ FIX: move the side-effect into a thin public wrapper that `background.submit(_wo - **wrong-tool**: grep `background.submit(` for any argument that is an `async def`/coroutine function, and any external-client call (gitea/push/AI) deferred via the sync queue. ## Output -Return a markdown report: a one-line summary, then one bullet per finding with severity (`error`/`warning`/`info`), `file:line`, the rule name (e.g. `missing-deferral`, `double-wrap`, `unsafe-deferral`, `bypass-funnel`, `wrong-tool`, `captured-request`, `broken-wiring`), the message, and (in fix mode) whether it was fixed. End with the verification you ran (clean import, `hawk .`, em-dash scan) and its result. Never claim the test suite was run. +Return a markdown report: a one-line summary, then one bullet per finding with severity (`error`/`warning`/`info`), `file:line`, the rule name (e.g. `missing-deferral`, `double-wrap`, `unsafe-deferral`, `bypass-funnel`, `wrong-tool`, `captured-request`, `broken-wiring`), the message, and (in fix mode) whether it was fixed. End with the verification you ran (clean import, the per-language checks, em-dash scan) and its result. Never claim the test suite was run. diff --git a/.claude/agents/devii-maintainer.md b/.claude/agents/devii-maintainer.md index c9c536ff..086de279 100644 --- a/.claude/agents/devii-maintainer.md +++ b/.claude/agents/devii-maintainer.md @@ -30,7 +30,7 @@ All application code is under `devplacepy/`: `devplacepy/routers/`, `devplacepy/ - **F. Verify your own work.** After each edit, re-read the changed region and re-check the consumers. ## Mode -Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then run `hawk .` and confirm it passes. Never run the test suite; never perform any git write operation. +Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then re-validate every file you touched with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates) and confirm `python -c "from devplacepy.main import app"` still imports clean. Never run the test suite; never perform any git write operation. ## Obey the rules you enforce No comments or docstrings in source you author; no em-dashes (use a hyphen); keep `retoor ` as the first line of any file you create. diff --git a/.claude/agents/docs-maintainer.md b/.claude/agents/docs-maintainer.md index a9949e18..5d2c3bbd 100644 --- a/.claude/agents/docs-maintainer.md +++ b/.claude/agents/docs-maintainer.md @@ -30,7 +30,7 @@ All application code is under `devplacepy/`: `devplacepy/routers/`, `devplacepy/ - **F. Verify your own work.** After each edit, re-read the changed region and re-check the consumers. ## Mode -Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then run `hawk .` and confirm it passes. Never run the test suite; never perform any git write operation. +Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then re-validate every file you touched with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates) and confirm `python -c "from devplacepy.main import app"` still imports clean. Never run the test suite; never perform any git write operation. ## Obey the rules you enforce No comments or docstrings in source you author; no em-dashes (use a hyphen); keep `retoor ` as the first line of any file you create. diff --git a/.claude/agents/dry-maintainer.md b/.claude/agents/dry-maintainer.md index 36397afa..ff9322fe 100644 --- a/.claude/agents/dry-maintainer.md +++ b/.claude/agents/dry-maintainer.md @@ -30,7 +30,7 @@ All application code is under `devplacepy/`: `devplacepy/routers/`, `devplacepy/ - **F. Verify your own work.** After each edit, re-read the changed region and re-check the consumers. ## Mode -Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then run `hawk .` and confirm it passes. Never run the test suite; never perform any git write operation. +Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then re-validate every file you touched with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates) and confirm `python -c "from devplacepy.main import app"` still imports clean. Never run the test suite; never perform any git write operation. ## Obey the rules you enforce No comments or docstrings in source you author; no em-dashes (use a hyphen); keep `retoor ` as the first line of any file you create. diff --git a/.claude/agents/fanout-maintainer.md b/.claude/agents/fanout-maintainer.md index 32a9359e..00df0372 100644 --- a/.claude/agents/fanout-maintainer.md +++ b/.claude/agents/fanout-maintainer.md @@ -30,7 +30,7 @@ All application code is under `devplacepy/`: `devplacepy/routers/`, `devplacepy/ - **F. Verify your own work.** After each edit, re-read the changed region and re-check the consumers. ## Mode -Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then run `hawk .` and confirm it passes. Never run the test suite; never perform any git write operation. +Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then re-validate every file you touched with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates) and confirm `python -c "from devplacepy.main import app"` still imports clean. Never run the test suite; never perform any git write operation. ## Obey the rules you enforce No comments or docstrings in source you author; no em-dashes (use a hyphen); keep `retoor ` as the first line of any file you create. diff --git a/.claude/agents/feature-builder.md b/.claude/agents/feature-builder.md index eaaa843d..1abe4188 100644 --- a/.claude/agents/feature-builder.md +++ b/.claude/agents/feature-builder.md @@ -56,11 +56,11 @@ When a layer is intentionally absent (an internal route with no public docs, a r No comments or docstrings in source you author; full typing on every signature and variable; `pathlib` over `os`; dataclasses over fixed-key dicts; no magic numbers; no version pinning; no em-dashes anywhere (use a hyphen) in any file you touch. Keep `retoor ` as the first line (correct comment style for the language) of any NEW source file you create - never of the existing files you edit, and never inside a `.md` with YAML frontmatter. ## Validation (after implementing; never skip) -There is NO `hawk` or validator binary in this environment - validate each touched file directly, using the Python interpreter where `import devplacepy` resolves its dependencies (verify that first; the repo `.venv` may be incomplete). Then: confirm `python -c "from devplacepy.main import app"` imports clean; compile or parse every touched language (`python -m py_compile ` for Python, `node --check ` for JS, brace balance for CSS, tag and `{% %}`/`{{ }}` balance for templates); and grep every touched file for em-dashes - the character AND the entity forms `—`/`—`/`—` - confirming none. For any new `*Out` schema, `model_validate` it against a representative context dict so a key mismatch surfaces now, not at request time. Do NOT run the test suite. Then hand off: name which maintainer dimensions are most relevant to the change (e.g. fanout, security, dry, docs, seo, audit, frontend, style, test) so the fleet can verify it. +There is NO validator binary in this environment - validate each touched file directly, using the Python interpreter where `import devplacepy` resolves its dependencies (verify that first; the repo `.venv` may be incomplete). Then: confirm `python -c "from devplacepy.main import app"` imports clean; compile or parse every touched language (`python -m py_compile ` for Python, `node --check ` for JS, brace balance for CSS, tag and `{% %}`/`{{ }}` balance for templates); and grep every touched file for em-dashes - the character AND the entity forms `—`/`—`/`—` - confirming none. For any new `*Out` schema, `model_validate` it against a representative context dict so a key mismatch surfaces now, not at request time. Do NOT run the test suite. Then hand off: name which maintainer dimensions are most relevant to the change (e.g. fanout, security, dry, docs, seo, audit, frontend, style, test) so the fleet can verify it. ## Live verification of UI/API changes (mandatory for visual work) -A structurally valid template can still render broken - `hawk` and the import check never open a browser. Per CLAUDE.md this project treats live verification as non-negotiable for any layout, styling, component, responsive, or backend change: -- Do not assume any verification CLI is installed (`hawk`, `mole`, `falcon`, `hound` are NOT present here); check with `command -v` first and fall back to the steps below or the project's `screenshot`/`serve`/`validate` skills when they exist. +A structurally valid template can still render broken - the static checks and the import check never open a browser. Per CLAUDE.md this project treats live verification as non-negotiable for any layout, styling, component, responsive, or backend change: +- Do not assume any verification CLI is installed (`mole`, `falcon`, `hound` are NOT present here); check with `command -v` first and fall back to the steps below or the project's `screenshot`/`serve`/`validate` skills when they exist. - When your change touches `templates/` or `static/`, the rendered result MUST be visually verified: start the dev server (`make dev` in the background; confirm it is healthy on `http://localhost:10500`), capture each new/changed route with headless Playwright (`wait_until="domcontentloaded"`), and inspect the screenshot against the intended UI and the surrounding design system (tokens, spacing, responsiveness). Tear down any server you started. - When your change touches `routers/`, verify the endpoints over HTTP against the live server (an api-spec runner if available, otherwise `curl`/`httpx` asserting the status and a body fragment). - The `/feature` workflow performs this live `Verify` phase for you automatically; when you are invoked standalone for UI/API work, perform it yourself before declaring the work complete, or explicitly state it is the caller's responsibility and name the routes to check. diff --git a/.claude/agents/frontend-maintainer.md b/.claude/agents/frontend-maintainer.md index 53254ef5..7d824a64 100644 --- a/.claude/agents/frontend-maintainer.md +++ b/.claude/agents/frontend-maintainer.md @@ -30,7 +30,7 @@ All application code is under `devplacepy/`: `devplacepy/routers/`, `devplacepy/ - **F. Verify your own work.** After each edit, re-read the changed region and re-check the consumers. ## Mode -Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then run `hawk .` and confirm it passes. Visual judgement is out of scope for auto-fix and is recorded as a finding. Never run the test suite; never perform any git write operation. +Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then re-validate every file you touched with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates) and confirm `python -c "from devplacepy.main import app"` still imports clean. Visual judgement is out of scope for auto-fix and is recorded as a finding. Never run the test suite; never perform any git write operation. ## Obey the rules you enforce No comments or docstrings in source you author; no em-dashes (use a hyphen); keep `retoor ` as the first line of any file you create. diff --git a/.claude/agents/security-maintainer.md b/.claude/agents/security-maintainer.md index 102685f9..2750d628 100644 --- a/.claude/agents/security-maintainer.md +++ b/.claude/agents/security-maintainer.md @@ -30,7 +30,7 @@ All application code is under `devplacepy/`: `devplacepy/routers/`, `devplacepy/ - **F. Verify your own work.** After each edit, re-read the changed region and re-check the consumers. ## Mode -Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then run `hawk .` and confirm it passes. Never run the test suite; never perform any git write operation. +Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then re-validate every file you touched with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates) and confirm `python -c "from devplacepy.main import app"` still imports clean. Never run the test suite; never perform any git write operation. ## Obey the rules you enforce No comments or docstrings in source you author; no em-dashes (use a hyphen); keep `retoor ` as the first line of any file you create. diff --git a/.claude/agents/seo-maintainer.md b/.claude/agents/seo-maintainer.md index 24c8c806..dcc03fa0 100644 --- a/.claude/agents/seo-maintainer.md +++ b/.claude/agents/seo-maintainer.md @@ -30,7 +30,7 @@ All application code is under `devplacepy/`: `devplacepy/routers/`, `devplacepy/ - **F. Verify your own work.** After each edit, re-read the changed region and re-check the consumers. ## Mode -Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then run `hawk .` and confirm it passes. Never run the test suite; never perform any git write operation. +Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then re-validate every file you touched with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates) and confirm `python -c "from devplacepy.main import app"` still imports clean. Never run the test suite; never perform any git write operation. ## Obey the rules you enforce No comments or docstrings in source you author; no em-dashes (use a hyphen); keep `retoor ` as the first line of any file you create. diff --git a/.claude/agents/style-maintainer.md b/.claude/agents/style-maintainer.md index 0c4874e7..b21a23c2 100644 --- a/.claude/agents/style-maintainer.md +++ b/.claude/agents/style-maintainer.md @@ -30,7 +30,7 @@ All application code is under `devplacepy/`: `devplacepy/routers/`, `devplacepy/ - **F. Verify your own work.** After each edit, re-read the changed region and re-check the consumers. ## Mode -Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then run `hawk .` and confirm it passes. A rename is auto-applied ONLY for a confirmed local/private name that passed the decision algorithm AND only after you grep and update every reference in the same run. Never run the test suite; never perform any git write operation. +Default to **REPORT** mode: record findings, do NOT modify files. Apply **FIX** mode only when the invocation explicitly asks you to fix. In FIX mode: reconfirm each finding survives refutation, run the cross-reference impact check, apply a minimal idiomatic root-cause fix, re-read the change, then re-validate every file you touched with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates) and confirm `python -c "from devplacepy.main import app"` still imports clean. A rename is auto-applied ONLY for a confirmed local/private name that passed the decision algorithm AND only after you grep and update every reference in the same run. Never run the test suite; never perform any git write operation. ## Obey the rules you enforce No comments or docstrings in source you author; no em-dashes (use a hyphen); keep `retoor ` as the first line of any file you create. diff --git a/.claude/commands/audit-event.md b/.claude/commands/audit-event.md index 5ef9d555..b5a89860 100644 --- a/.claude/commands/audit-event.md +++ b/.claude/commands/audit-event.md @@ -12,4 +12,4 @@ Follow the audit-log design (`devplacepy/services/audit/`); confirm against the 3. Call the recorder on the mutation's success path: `audit.record(request, event_key, ...)` in HTTP or WebSocket handlers, or `audit.record_system(event_key, ...)` in request-less contexts (services, jobs, CLI). On a guard or denial branch pass `result="denied"`; on a failure branch pass `result="failure"`. 4. Route through the existing DRY choke point when one applies (`content.py`, the `project_files.py` helpers, `routers/containers.py` `_audit_instance`, the Devii dispatcher `_audit_mechanic`) instead of scattering call sites. The HTTP path and the Devii path for one mutation must stay disjoint (no double counting). 5. Recording is best-effort: wrap nothing the caller depends on, and NEVER gate the audited action on the record succeeding. -6. Validate with `hawk` on the touched files and `python -c "from devplacepy.main import app"`. +6. Validate the touched files with the per-language checks (`python -m py_compile` + `pyflakes` for Python, `node --check` for JS, brace balance for CSS, tag and `{% %}` balance for templates) and `python -c "from devplacepy.main import app"`. diff --git a/.claude/commands/docs-page.md b/.claude/commands/docs-page.md index 9cffa5b1..f999b79e 100644 --- a/.claude/commands/docs-page.md +++ b/.claude/commands/docs-page.md @@ -10,4 +10,4 @@ Follow the docs convention exactly (confirm against `devplacepy/routers/docs/pag 1. Create `devplacepy/templates/docs/.html` as a prose page: one `
...
` containing GitHub-flavored markdown. The page is rendered server-side. Any example component markup INSIDE the data-render block must be HTML-escaped (`<dp-...>`); a live demo, if any, goes in a SEPARATE block OUTSIDE the data-render div with its own `