一键导入
awcms-mini-tenant-lifecycle
Kerjakan bagian mana pun dari modul tenant_lifecycle AWCMS-Mini (Issue
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Kerjakan bagian mana pun dari modul tenant_lifecycle AWCMS-Mini (Issue
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Kelola/konsumsi sistem Module Management AWCMS-Mini (registry, validasi komposisi registry base, tenant lifecycle enable/disable, settings, permission sync/status, navigation, job registry, health/readiness). Gunakan saat menambah field descriptor baru (permissions/navigation/settings/jobs/health) di modul lain, saat menambah modul domain baru langsung di `src/modules/` dan perlu memverifikasi registry base tetap valid (`bun run modules:compose:check`), saat menyelidiki kenapa suatu modul terlihat degraded/orphaned, atau saat mengubah perilaku enable/disable/settings/health module_management sendiri. Sesuai src/modules/module-management/README.md, epic
Pilih dan jalankan profil deployment AWCMS-Mini (development/staging/production/offline-LAN). Gunakan saat menyiapkan deployment baru, memutuskan LAN-first vs registry-based, atau deploy ke Coolify. Sesuai doc 18 dan deployment-profiles.md/deploy-coolify.md.
Kelola sistem log/audit/metrics AWCMS-Mini yang sudah aktif — correlation ID lintas hop, retensi/purge audit log, extension point untuk consumer eksternal (alerting/export/SIEM), dan metrics port (counter/histogram/gauge berkardinalitas rendah untuk request/pool/job/provider). Gunakan saat menambah endpoint baru (correlation ID otomatis), menjadwalkan purge audit log, memasang consumer log/audit di aplikasi turunan, atau menambah/mengonsumsi metrik operasional. Berbeda dari awcms-mini-audit-log (APA yang wajib diaudit) — skill ini tentang BAGAIMANA sistem log/audit/metrics itu sendiri dikelola, sesuai Issue
Kerjakan bagian mana pun dari modul tenant_provisioning AWCMS-Mini (Issue
Triase dan perbaiki temuan CodeQL code scanning AWCMS-Mini (github.com/ahliweb/awcms-mini/security/code-scanning). Gunakan saat diminta "analisis code scanning"/"perbaiki CodeQL", saat sebuah PR gagal check CodeQL, atau saat menemukan alert baru. Mendokumentasikan satu TRUE-positive terkonfirmasi (password sungguhan → digest cepat yang dipersist = oracle cracking offline, plus dua "fix" yang membungkam alert tanpa memperbaiki apa pun) dan lima false-positive nyata (name-heuristic password, incompatible-types typeof/null, URL substring-sanitization di test mock, dua kasus dismiss resmi tanpa reformulasi kode, dan Bun.SQL tagged-template null-cast) plus pola "unused-local-variable di test kadang menandai coverage gap" — supaya tidak diinvestigasi ulang dari nol.
Daftarkan tabel bervolume tinggi ke registry lifecycle AWCMS-Mini (retensi/partisi/arsip/legal hold/purge), atau kerjakan bagian mana pun modul data_lifecycle sendiri. Gunakan saat menambah tabel baru yang tumbuh besar (log, telemetry, outbox, queue, provider attempt) dan butuh kebijakan retensi/purge aman, saat membuat/melepas legal hold, atau saat mengubah engine dry-run/archive/purge/archive-port. Sesuai Issue
| name | awcms-mini-tenant-lifecycle |
| description | Kerjakan bagian mana pun dari modul tenant_lifecycle AWCMS-Mini (Issue |
tenant_lifecycle (src/modules/tenant-lifecycle, Issue #873, epic #868 SaaS
control plane Wave 1, ADR-0022) adalah modul control-plane KEEMPAT —
Official Optional Business Foundation, opt-in per tenant, default-disabled,
tenant-scoped. Ia mencatat state siklus hidup SaaS sebuah tenant,
memvalidasi transisi forward-legal dengan optimistic-version guard, menyimpan
history append-only, menjadwalkan transisi masa depan (trial/grace expiry) yang
di-apply idempoten oleh worker, dan menurunkan (bukan menyimpan sebagai
kebenaran) restriksi akses fail-closed yang diberlakukan lintas empat
surface. PROVIDES tenant_restrictions (read-only) + lifecycle_transition
(write, di-consume #876); CONSUMES effective_entitlement (#871) +
provisioning_status (#872).
Lifecycle BUKAN entitlement dan BUKAN permission:
tenant_id (no soft
super-tenant; no OR is_platform). Operator kelola tenant target lewat
konteks per-tenant (SET LOCAL app.current_tenant_id), tiap command audited.awcms_mini_setup_state.tenant_id), di _support.ts authorizeOperator.authorizeInTransaction membaca lifecycle via _shared policy/reader; public
host routing + background worker via projeksi awcms_mini_tenants.status yang
di-set same-commit. Suspend TAK bisa di-bypass via direct API / stale session
/ public host / worker.defaultTenantState:"disabled"; gated
tests/unit/module-governance-default-disabled.test.ts (key sudah termasuk
tenant_lifecycle). Tenant tanpa baris lifecycle = TAK diatur (ALLOW_ALL,
offline-safe) — restriction hanya berlaku bila ada baris.tenant-lifecycle/app| domain (tests/unit/module-boundary.test.ts); no-shared-table-write
(awcms_mini_tenant_lifecycle_* hanya ditulis modul ini — chokepoint neutral
hanya SELECT); cross-module via port + injeksi di _support.ts. Policy
kanonik ada di _shared/tenant-lifecycle-policy.ts supaya
identity_access bisa MENEGAKKAN tanpa import modul (no reverse-dep/cycle).loadStateForUpdate (row-lock) →
validasi legal + optimistic version di app → applyTransition ter-predikat
state=? AND version=? (0-row = 409 deterministik). Scheduled apply idempoten
di bawah worker konkuren (row-lock + state+version-predicate; worker kedua
temukan schedule sudah clear = no-op). Idempotency-Key + replay winner di
route. JANGAN Promise.all pada satu tx.domain/lifecycle-state.ts; version +1 tepat per transisi; canceled hanya
boleh ke restoring; downgrade/suspend/cancel TIDAK PERNAH DELETE.application/request-parsing.ts: absent=
default aman (source→operator, confirmUnresolved→false), present-wrong-type=
400 (validator), expectedVersion nullable tri-state._shared/tenant-lifecycle-policy.ts)| state | admin | write | public | jobs | provider | export/recovery |
|---|---|---|---|---|---|---|
| provisioning | ✓ | ✓ | ✗ | ✗ | ✗ | ✓ |
| trial / active / renewal_due / grace | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| past_due | ✓ | ✗ (read-only) | ✓ | ✓ | ✓ | ✓ |
| suspended / canceled / blocked | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ (separately authz) |
| restoring | ✓ | ✗ | ✗ | ✗ | ✗ | ✓ |
governing:false (tak ada baris) → ALLOW_ALL. Error saat governed →
DENY_ALL. Projeksi tenant.status = active IFF publicSiteAllowed.moduleKey==='tenant_lifecycle' supaya operator/owner
tetap bisa read/restore/recovery saat restricted.GET /api/v1/tenant-lifecycle/tenants/{id} — state + restrictions + timeline.POST .../initialize — buat record (idempoten).POST .../transition — transisi tervalidasi (409 ilegal/version).POST .../schedule + DELETE .../schedule — set/cancel transisi terjadwal.POST .../downgrade — turunkan entitlement (#871), TANPA hapus data.POST .../restore — reactivate ter-rekonsiliasi (provisioning_status #872);
confirmUnresolved wajib bila belum ready.bun run tenant-lifecycle:run-scheduled <tenantId> — apply transisi terjadwal
due untuk SATU tenant (idempoten). Fleet-wide batch DEFERRED ke #880.
bun run db:migrate (089/090), bun run api:spec:check, bun test,
bun run build. Test per AC: transition matrix (unit), RLS/concurrency/
idempotent-scheduled/event-same-commit (integration), cross-surface saat
suspended (API/SSR/public/worker), mutation test (cabut satu surface → parity
GAGAL). Lihat src/modules/tenant-lifecycle/README.md.