You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
chore(process): retire forum/ + PLAN/ROADMAP/PROGRESS + per-role STATUS files (#72)
Migrates all status / planning / coordination artifacts from committed
markdown to GitHub primitives, ahead of the repository going public.
What is removed:
- `forum/` (80 files) — all agent claims, role reviews, post-mortems,
process posts. The two recent process posts already moved to
Discussions #70 + #71; the rest is historical PR review content
that the merged PR list now carries.
- `PLAN.md`, `ROADMAP.md`, `PROGRESS.md` — planning + status. The
Project board (https://github.com/users/MartinCastroAlvarez/projects/3)
carries the live what; the docs that remain carry the why.
- `docs/agents/changelog.md`, `docs/agents/handoff.md` — running log
+ handoff queue. The merged-PR list is the changelog; Issues + the
board are the handoff queue.
- Per-role `STATUS.md` and `NEXT_STEPS.md` under
`docs/agents/{product-manager,security-expert,software-architect}/`
— status snapshots. The role's `AGENT.md`, `SKILLS.md`,
`DECISIONS.md`, `OPEN_QUESTIONS.md`, and `REVIEW_CHECKLIST.md`
stay (durable contracts).
- Two unreferenced historical artifacts:
`docs/pm-decisions-resolved.md`, `docs/architect-verdict-2026-05-26.md`.
What is updated:
- `CLAUDE.md` — required-reading list now points at the board +
Issues + Discussions instead of `PLAN.md` / `changelog.md` /
`forum/`. Multi-agent coordination section rewritten: agents
claim board cards, reviews happen as PR review comments,
announcements live in Discussions.
- `CONTRIBUTING.md` — same rewrite for human contributors.
- `SECURITY.md` — secret-leak procedure now opens an
`incident:secret-leak` Issue (was `forum/INCIDENT-*.md`).
- `docs/agents/pr-workflow.md` — Author / Reviewer / Merger
workflows rewritten: declare role in PR description, claim issue
before branching, review on the PR, Merger moves the card on
merge. **Approvals happen as PR review comments — never as
committed markdown files.**
- `docs/agents/autonomy-policy.md` — kill switch #4 is now an open
`incident:*` Issue; audit trail lives on the PR itself.
- `docs/agents/README.md`, `docs/README.md` — folder docs reflect
the new model (durable contracts here; status on GitHub).
- ~25 other files — broken references to deleted files stripped or
replaced with project-board / issue / Discussion links.
- `.github/PULL_REQUEST_TEMPLATE.md` — replaces "PLAN.md slot" with
"Project board card + driving Issue"; drops "I claimed scope in
forum/" + "I updated changelog.md".
- `.github/ISSUE_TEMPLATE/agent_question.md` — drops `PLAN.md` from
required-reading list.
- `.pre-commit-config.yaml` — drops `forum/` from the exclude list
(the folder no longer exists).
- `.gitignore` — drops `forum/_drafts/`; adds `.claude/` (agent
scratch dirs).
What stays:
- All architectural / security / API contracts (`ARCHITECTURE.md`,
`SECURITY.md`, `CLAUDE.md`, `CONTRIBUTING.md`, `docs/api-contract.md`,
`docs/threat-model.md`, `docs/ux/**`, `ACCEPTANCE.md` spec text).
- All durable per-role state (`docs/agents/<role>/AGENT.md`,
`SKILLS.md`, `DECISIONS.md`, `OPEN_QUESTIONS.md`,
`REVIEW_CHECKLIST.md`).
- `docs/agents/decisions.md`, `docs/agents/open-questions.md`
(the durable ADR + question log).
- `docs/consumer/` (consumer-feedback drops as specific
deliverables).
Co-authored-by: Martin Castro Laminrs <mcastro@laminr.ai>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 extensibility directive ((documented in `docs/ux/extensibility.md`)).
141
141
Architect + Security co-sign before each row turns live (gates
142
142
called out per row).
143
143
@@ -158,7 +158,7 @@ called out per row).
158
158
| E-8a | Returning a non-empty `get_detail_blocks(request, obj)` from a `ModelAdmin` causes the SPA detail page to render the blocks in their declared `placement` slot. (X-5.) | Add a `stats` block; observe. *Architect signed off (2026-05-26) on the block schema enum.*|
159
159
| E-8b | A block of an unrecognised `type` is silently dropped client-side and logged server-side. (X-5.) | Push a fake `type` in an example; observe console + server log. |
160
160
| E-8c | A block whose server-side computation fails renders an `ErrorState` scoped to that block; sibling blocks keep rendering. (X-5.) | Force a block to raise; observe. |
161
-
| E-9 | A `type: "html"` block runs through the configured server-side sanitiser (`nh3`) before reaching the SPA; `<script>` tags and inline event handlers never survive the round-trip. (X-6.) | Try to slip a `<script>` through; observe stripped output. **Security signed off (2026-05-26) conditional on C-1..C-10 in [`forum/REVIEW-security-pr-ux-extensibility-contract.md`](forum/REVIEW-security-pr-ux-extensibility-contract.md) §3.X-6.2** — the original `allow_unsafe_html=True` boolean was rejected, replaced with the constrained `trusted_html` block-type path (v1.x at earliest; PM/UX recommends no escape hatch in v1). E-9 stays **drafted, not live, until the Security follow-up PRs land** (sanitiser spec + implementation + CSP defaults). v0.1 ships with X-1..X-5 + X-7; X-6 is post-v0.1. |
161
+
| E-9 | A `type: "html"` block runs through the configured server-side sanitiser (`nh3`) before reaching the SPA; `<script>` tags and inline event handlers never survive the round-trip. (X-6.) | Try to slip a `<script>` through; observe stripped output. **Security signed off (2026-05-26) conditional on C-1..C-10 in the Security PR review comments §3.X-6.2** — the original `allow_unsafe_html=True` boolean was rejected, replaced with the constrained `trusted_html` block-type path (v1.x at earliest; PM/UX recommends no escape hatch in v1). E-9 stays **drafted, not live, until the Security follow-up PRs land** (sanitiser spec + implementation + CSP defaults). v0.1 ships with X-1..X-5 + X-7; X-6 is post-v0.1. |
162
162
163
163
### 2.10 v1 non-goals
164
164
@@ -227,7 +227,7 @@ deliverables. The PM/UX role does **not** sign these off alone.
[`TESTING.md`](TESTING.md) (to land in a follow-up PR),
232
232
[`API_CONTRACT.md`](API_CONTRACT.md) (or
233
233
[`docs/api-contract.md`](docs/api-contract.md) — top-level pointer to
@@ -338,10 +338,10 @@ Merger runs the pipeline locally before squash-merge.
338
338
339
339
| # | Criterion | How to verify |
340
340
| - | --------- | ------------- |
341
-
| Doc-A | The required-reading set is present and consistent: [`README.md`](README.md), [`ARCHITECTURE.md`](ARCHITECTURE.md), [`PLAN.md`](PLAN.md), [`PROGRESS.md`](PROGRESS.md), [`SECURITY.md`](SECURITY.md), [`CONTRIBUTING.md`](CONTRIBUTING.md), [`CLAUDE.md`](CLAUDE.md), [`TESTING.md`](TESTING.md), [`API_CONTRACT.md`](API_CONTRACT.md) (or a top-level pointer to `docs/api-contract.md`), [`ACCEPTANCE.md`](ACCEPTANCE.md). |`ls` of repo root. |
341
+
| Doc-A | The required-reading set is present and consistent: [`README.md`](README.md), [`ARCHITECTURE.md`](ARCHITECTURE.md), [`SECURITY.md`(SECURITY.md), [`CONTRIBUTING.md`](CONTRIBUTING.md), [`CLAUDE.md`](CLAUDE.md), [`TESTING.md`](TESTING.md), [`API_CONTRACT.md`](API_CONTRACT.md) (or a top-level pointer to `docs/api-contract.md`), [`ACCEPTANCE.md`](ACCEPTANCE.md). |`ls` of repo root. |
342
342
| Doc-B | Every folder has a `README.md` (per [`CLAUDE.md`](CLAUDE.md) §1). |`find . -type d -not -path './.git*' -not -path './node_modules*' -not -path './.venv*' -not -path './dist*'` followed by per-dir `README.md` check. |
343
343
| Doc-C | Every architectural decision is recorded in [`docs/agents/decisions.md`](docs/agents/decisions.md) within the same PR. | PR diff review. |
344
-
| Doc-D | Every meaningful merge appends a one-liner to [`docs/agents/changelog.md`](docs/agents/changelog.md). | Diff review. |
344
+
| Doc-D | Every meaningful merge is a closed PR with a Closes #N reference; the PR list is the changelog. | Diff review. |
345
345
| Doc-E | All internal markdown links resolve. |`lychee` or `markdown-link-check` is added to `./scripts/lint.sh` no later than `0.1.0` and runs against tracked `*.md` files. |
| S-39 | A pre-commit hook (`.pre-commit-config.yaml`) runs `gitleaks` + a custom regex grep for `ghp_/gho_/ghs_/aws_secret_access_key/BEGIN.*PRIVATE KEY`. Devs are documented to enable it in `CONTRIBUTING.md` § "Pre-commit". | File exists; `pre-commit run --all-files` passes locally on a clean repo. |
502
502
| S-40 | Issue, PR, and forum templates explicitly warn against pasting secrets. |`.github/PULL_REQUEST_TEMPLATE.md` and `.github/ISSUE_TEMPLATE/*` contain the warning. |
503
-
| S-41 | If a secret leak is discovered (active or historical), a `forum/INCIDENT-*.md` is opened, the secret is rotated **first**, and history rewrite is gated by explicit human approval. | Procedure documented in [`SECURITY.md`](SECURITY.md) §5. |
503
+
| S-41 | If a secret leak is discovered (active or historical), an Issue labelled `incident:secret-leak` is opened, the secret is rotated **first**, and history rewrite is gated by explicit human approval. | Procedure documented in [`SECURITY.md`](SECURITY.md) §5. |
504
504
505
505
### 4.9 Dependency security
506
506
507
507
| # | Criterion | How to verify |
508
508
| - | --------- | ------------- |
509
509
| S-42 | Every new third-party Python dependency in `pyproject.toml` has a corresponding entry in `docs/agents/decisions.md` explaining why it's needed and what alternative was rejected. | Diff review on every PR that touches `[tool.poetry.dependencies]` or dev deps. |
510
510
| S-43 | Every new third-party JS dependency in any `frontend/**/package.json` has a corresponding entry in `docs/agents/decisions.md`. | Same as S-42, on JS side. |
511
-
| S-44 |`poetry run pip-audit` returns 0 findings of severity ≥ HIGH at release time. | Run inside `scripts/audit-deps.sh` (planned); record in `PROGRESS.md` quality-gate table. |
511
+
| S-44 |`poetry run pip-audit` returns 0 findings of severity ≥ HIGH at release time. | Run inside `scripts/audit-deps.sh` (planned); comment on the release PR with the result. |
512
512
| S-45 |`pnpm audit --prod` returns 0 findings of severity ≥ HIGH at release time. | Same as S-44 on JS side. |
513
513
| S-46 |`bandit -r django_admin_react` returns 0 findings of severity ≥ HIGH at release time. | Already wired in `scripts/lint.sh`. |
514
514
| S-47 | The package has **no runtime dependency** on `djangorestframework`, an OAuth/JWT library, or any auth framework other than Django itself. The only runtime dependency is Django 5.x. |`poetry export -f requirements.txt` shows Django + transitive only. |
@@ -543,7 +543,7 @@ owner only.
543
543
| - | --------- | ------------- |
544
544
| S-57 | PyPI publishing requires `POETRY_PYPI_TOKEN_PYPI` in env. `scripts/deploy.sh` refuses to run if the token is missing or empty. |`bash -c 'unset POETRY_PYPI_TOKEN_PYPI; ./scripts/deploy.sh'` exits non-zero with a clear error. |
545
545
| S-58 | The PyPI token is **never** echoed, stored in any file in the repo, or printed to any log. The `scripts/deploy.sh` code does not echo `$POETRY_PYPI_TOKEN_PYPI`. | Manual review of `scripts/deploy.sh`. |
546
-
| S-59 | A release tag is **never** pushed by an agent without explicit human approval. Tier 6 in [`docs/agents/autonomy-policy.md`](docs/agents/autonomy-policy.md). | Confirm by audit-trail: `forum/AGENT-*-pr-*-audit.md` for any release PR shows a human approver. |
546
+
| S-59 | A release tag is **never** pushed by an agent without explicit human approval. Tier 6 in [`docs/agents/autonomy-policy.md`](docs/agents/autonomy-policy.md). | Confirm by audit-trail: the merge close-out comment on the PR for any release PR shows a human approver. |
547
547
| S-60 |`pyproject.toml` version is not `0.0.0` at release time; an SBOM (CycloneDX or equivalent) is produced for each release. |`scripts/build.sh` + a small SBOM step (planned). |
548
548
| S-61 | Released wheels embed the pre-built React SPA, **not** sources. The wheel contains hashed `django_admin_react/static/admin_react/*` and `templates/admin_react/index.html`; it does **not** contain `frontend/`, `node_modules/`, or any source `.ts` / `.tsx`. |`unzip -l dist/*.whl` shows static + templates, not frontend source. |
549
549
@@ -633,7 +633,7 @@ in §2, §3, and §4 is ✅ for the milestone being released.
633
633
-[ ] §2.9 E-1 through E-5 ✅
634
634
-[ ] §3 ✅ (entire section; Architect role)
635
635
-[ ] §4 ✅ (entire section; Security role)
636
-
-[ ]`PROGRESS.md` quality-gates table all-green
636
+
-[ ]Quality-gates check pass (recorded in the release PR comment)
637
637
-[ ] Repo owner has provided the PyPI token and explicit go-ahead
638
638
639
639
If any line is not ✅, the release is **not v1**. The next release
@@ -646,8 +646,8 @@ candidate is `0.1.0rcN` or the milestone is renamed.
646
646
-[`PRODUCT_VISION.md`](PRODUCT_VISION.md) — the why.
647
647
-[`ARCHITECTURE.md`](ARCHITECTURE.md) — the system contract.
0 commit comments