بنقرة واحدة
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.