crucible wiki deploy-wiki --stale-policy purge cannot delete any page on a NodeBB running nodebb-plugin-westgate-wiki. It calls the core topic API, which the plugin blocks by design, so every purge fails with HTTP 400 and the deploy exits 1.
Reproduction
sow-topdata deploy-wiki run on 2026-08-05, stale_policy=purge, reset_managed_namespaces=true, dry_run=false. The dry-run preview planned 1213 purges, then the live phase died on the first one:
deploy wiki page "classes:reset-topic-2366": purge NodeBB topic 2366:
NodeBB DELETE /api/v3/topics/2366 failed: HTTP 400:
{"status":{"code":"bad-request","message":"Use the wiki page actions to delete, restore, or purge wiki pages."}}
Error: Process completed with exit code 1.
Cause
purgeTopic in internal/topdata/wiki_deploy.go:1614-1618 issues DELETE /api/v3/topics/{tid}.
nodebb-plugin-westgate-wiki refuses native mutations on topics in wiki categories — lib/pages/wiki-native-mutation-guards.js:22-24 raises exactly the message above. That guard is deliberate and ADR-backed (sow-nodebb ADR-0006, "wiki revision history is plugin-owned"), so the plugin is not the side that should change.
The plugin's own routes are registered in library.js:200-225:
Note the ordering constraint: lib/controllers/wiki-manage.js:67-69 reports "Tombstone this page before it can be purged", so hard-purge is not a one-shot replacement for the core delete — a page must be tombstoned first. The wiki home topic is excluded from tombstone, restore, and purge alike and will need special-casing.
archive policy deserves the same audit; it is presumably routed through the same native calls.
Why the tests did not catch it
Every deploy test stands up a fake NodeBB that answers the core API — internal/topdata/wiki_deploy_test.go:2022 asserts DELETE /api/v3/topics/7 and returns success. The fake accepts what the real plugin rejects, so the purge path is green in CI and broken in production. Whatever the fix is, the fake needs to reject native topic mutation the way the plugin does, otherwise the next regression lands the same way.
Impact
--stale-policy purge has never worked against this NodeBB. It fails closed and loudly, so no data was lost, but any run that reaches a non-empty purge set exits 1 and the deploy does not complete. Blocks ShadowsOverWestgate/sow-topdata#198.
`crucible wiki deploy-wiki --stale-policy purge` cannot delete any page on a NodeBB running `nodebb-plugin-westgate-wiki`. It calls the core topic API, which the plugin blocks by design, so every purge fails with HTTP 400 and the deploy exits 1.
## Reproduction
sow-topdata `deploy-wiki` run on 2026-08-05, `stale_policy=purge`, `reset_managed_namespaces=true`, `dry_run=false`. The dry-run preview planned 1213 purges, then the live phase died on the first one:
```
deploy wiki page "classes:reset-topic-2366": purge NodeBB topic 2366:
NodeBB DELETE /api/v3/topics/2366 failed: HTTP 400:
{"status":{"code":"bad-request","message":"Use the wiki page actions to delete, restore, or purge wiki pages."}}
Error: Process completed with exit code 1.
```
## Cause
`purgeTopic` in `internal/topdata/wiki_deploy.go:1614-1618` issues `DELETE /api/v3/topics/{tid}`.
`nodebb-plugin-westgate-wiki` refuses native mutations on topics in wiki categories — `lib/pages/wiki-native-mutation-guards.js:22-24` raises exactly the message above. That guard is deliberate and ADR-backed (sow-nodebb ADR-0006, "wiki revision history is plugin-owned"), so the plugin is not the side that should change.
The plugin's own routes are registered in `library.js:200-225`:
| Action | Method | Route |
| --- | --- | --- |
| Tombstone a page | PUT | `/api/v3/plugins/westgate-wiki/page/tombstone` |
| Restore a page | PUT | `/api/v3/plugins/westgate-wiki/page/restore` |
| Hard-purge one page | DELETE | `/api/v3/plugins/westgate-wiki/page/hard-purge` |
| Purge tombstoned in bulk | DELETE | `/api/v3/plugins/westgate-wiki/pages/purge-tombstoned` |
Note the ordering constraint: `lib/controllers/wiki-manage.js:67-69` reports "Tombstone this page before it can be purged", so hard-purge is not a one-shot replacement for the core delete — a page must be tombstoned first. The wiki home topic is excluded from tombstone, restore, and purge alike and will need special-casing.
`archive` policy deserves the same audit; it is presumably routed through the same native calls.
## Why the tests did not catch it
Every deploy test stands up a fake NodeBB that answers the core API — `internal/topdata/wiki_deploy_test.go:2022` asserts `DELETE /api/v3/topics/7` and returns success. The fake accepts what the real plugin rejects, so the purge path is green in CI and broken in production. Whatever the fix is, the fake needs to reject native topic mutation the way the plugin does, otherwise the next regression lands the same way.
## Impact
`--stale-policy purge` has never worked against this NodeBB. It fails closed and loudly, so no data was lost, but any run that reaches a non-empty purge set exits 1 and the deploy does not complete. Blocks ShadowsOverWestgate/sow-topdata#198.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
crucible wiki deploy-wiki --stale-policy purgecannot delete any page on a NodeBB runningnodebb-plugin-westgate-wiki. It calls the core topic API, which the plugin blocks by design, so every purge fails with HTTP 400 and the deploy exits 1.Reproduction
sow-topdata
deploy-wikirun on 2026-08-05,stale_policy=purge,reset_managed_namespaces=true,dry_run=false. The dry-run preview planned 1213 purges, then the live phase died on the first one:Cause
purgeTopicininternal/topdata/wiki_deploy.go:1614-1618issuesDELETE /api/v3/topics/{tid}.nodebb-plugin-westgate-wikirefuses native mutations on topics in wiki categories —lib/pages/wiki-native-mutation-guards.js:22-24raises exactly the message above. That guard is deliberate and ADR-backed (sow-nodebb ADR-0006, "wiki revision history is plugin-owned"), so the plugin is not the side that should change.The plugin's own routes are registered in
library.js:200-225:/api/v3/plugins/westgate-wiki/page/tombstone/api/v3/plugins/westgate-wiki/page/restore/api/v3/plugins/westgate-wiki/page/hard-purge/api/v3/plugins/westgate-wiki/pages/purge-tombstonedNote the ordering constraint:
lib/controllers/wiki-manage.js:67-69reports "Tombstone this page before it can be purged", so hard-purge is not a one-shot replacement for the core delete — a page must be tombstoned first. The wiki home topic is excluded from tombstone, restore, and purge alike and will need special-casing.archivepolicy deserves the same audit; it is presumably routed through the same native calls.Why the tests did not catch it
Every deploy test stands up a fake NodeBB that answers the core API —
internal/topdata/wiki_deploy_test.go:2022assertsDELETE /api/v3/topics/7and returns success. The fake accepts what the real plugin rejects, so the purge path is green in CI and broken in production. Whatever the fix is, the fake needs to reject native topic mutation the way the plugin does, otherwise the next regression lands the same way.Impact
--stale-policy purgehas never worked against this NodeBB. It fails closed and loudly, so no data was lost, but any run that reaches a non-empty purge set exits 1 and the deploy does not complete. Blocks ShadowsOverWestgate/sow-topdata#198.