一键导入
awcms-mini-document-infrastructure
Kerjakan bagian mana pun dari modul document_infrastructure AWCMS-Mini (Issue
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Kerjakan bagian mana pun dari modul document_infrastructure 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-document-infrastructure |
| description | Kerjakan bagian mana pun dari modul document_infrastructure AWCMS-Mini (Issue |
document_infrastructure (src/modules/document-infrastructure, Issue #751,
epic platform-evolution #738 Wave 3, admission decision
docs/adr/0017-document-infrastructure-module-admission.md) adalah
Official Optional Module — infrastruktur metadata dokumen generik,
tenant-scoped, opt-in per tenant, dipakai ulang oleh modul/aplikasi turunan
mana pun. Baca src/modules/document-infrastructure/README.md untuk detail
lengkap tiap tabel/endpoint; skill ini merangkum invariant yang tidak
jelas dari membaca satu file — konkurensi numbering, confidentiality-tier
gating, dan idempotency-hash binding (bug class yang sempat lolos 2 ronde
security-review berbeda di modul ini sendiri).
Skill ini melengkapi (bukan menggantikan) awcms-mini-new-endpoint,
awcms-mini-new-migration, awcms-mini-idempotency, awcms-mini-abac-guard.
Pakai skill ini untuk konteks domain document_infrastructure spesifik:
kapan pakai capability port vs kapan bikin tabel relasi baru, invariant
numbering, dan daftar endpoint yang WAJIB idempotency-hash resource binding.
content_reference/content_reference_kind hanya menunjuk ke kontrak
managed-object storage yang sudah disetujui (mis. sync_storage's object
queue key, atau URL/system reference eksternal).retention_reference
adalah teks bebas dipetakan manual ke data_lifecycle, ADR-0017 §4 — bukan
FK/capability call).document_resource_relations
(lihat di bawah). Tidak ada consumes — lihat ADR-0017 §4/§10 untuk
alasan tidak ada hard-dependency ke data_lifecycle/workflow_approval/
sync_storage.sql/066–068)awcms_mini_document_classifications — katalog klasifikasi tenant-scoped
(code/name/confidentiality_level/retention_reference).awcms_mini_documents — registry dokumen: owner_module_key/document_type
(string opaque, modul ini TIDAK PERNAH membaca tabel modul lain), status
(active/superseded/archived/void), confidentiality level,
referensi resource generik PRIMER (resource_type+resource_id).
current_version_number adalah cache denormalisasi yang HANYA diperbarui
application/document-version-service.ts.awcms_mini_document_versions — IMMUTABLE, APPEND-ONLY (tidak ada
kolom updated_at/deleted_at, tidak ada UPDATE/DELETE terhadap
tabel ini di seluruh modul). Koreksi = versi baru dengan
previous_version_id menunjuk mundur.awcms_mini_document_resource_relations — relasi typed TAMBAHAN dari
dokumen ke resource modul lain, di LUAR referensi primer di atas.
Ditulis HANYA lewat capability port.awcms_mini_document_number_sequences — definisi sequence penomoran,
effective-dated (SCD Type 2, pola sama awcms_mini_organization_unit_hierarchies)
— merevisi format TIDAK PERNAH mereset/menggunakan-ulang counter.awcms_mini_document_number_reservations — satu baris per nomor yang
pernah dialokasikan (reserved -> committed ATAU canceled).
UNIQUE (tenant_id, sequence_id, reserved_number) menjamin "tidak
pernah reuse nomor" secara struktural.awcms_mini_document_evidence — jejak evidence APPEND-ONLY untuk event
numbering/versi/lifecycle dokumen.Ketujuh tabel: tenant_id + ENABLE+FORCE ROW LEVEL SECURITY + index
tenant-first + grant awcms_mini_worker read-only.
application/document-number-reservation-service.ts's reserveNumber
mengunci baris definisi sequence yang SEDANG TERBUKA
(SELECT ... FOR UPDATE ... WHERE effective_to IS NULL) sebelum
membaca/menaikkan current_value. Dua pemanggil konkuren pada sequence
YANG SAMA otomatis diserialisasi oleh row lock Postgres — pemanggil kedua
baru bisa membaca setelah transaksi pertama commit/rollback.
UNIQUE (tenant_id, sequence_id, reserved_number) adalah backstop level
database: bahkan jika lock entah bagaimana terlewati, duplikat akan gagal
dengan unique-violation, bukan diam-diam mengalokasikan dua kali.
Dibuktikan lewat test konkurensi NYATA (bukan cuma didokumentasikan) di
tests/integration/document-infrastructure.integration.test.ts — beberapa
request paralel benar-benar dikirim ke handler API yang sama, hasilnya
diverifikasi tidak ada nomor duplikat. Jangan ganti SELECT ... FOR UPDATE dengan optimistic locking (version column check) untuk
"performa" — serialisasi pesimistik di sini disengaja, sequence numbering
adalah kasus di mana kehilangan satu update berarti nomor dokumen
duplikat/hilang, bukan sekadar stale read.
Format nomor (format_template, mis. INV/{YYYY}/{SEQ:6}) divalidasi
lewat grammar token TERBATAS (domain/number-format-template.ts) — parser
scan karakter tunggal manual, bukan eval/regex bebas/dynamic code. Token
yang didukung: {SEQ}/{SEQ:n} (n=1-12), {YYYY}, {YY}, {MM}, {DD}.
document_resource_relationsapplication/document-resource-relation-port.ts mengekspor
linkDocumentToResource/unlinkDocumentFromResource/
listRelationsForResource/listRelationsForDocument — modul LAIN
meng-IMPOR dan MEMANGGIL fungsi ini langsung (in-process, pola ADR-0011
yang sama dengan blog_content↔news_portal) untuk menautkan dokumen ke
resource milik mereka sendiri. Modul ini tidak pernah membaca/menulis
tabel modul pemanggil, dan modul pemanggil tidak pernah menulis langsung
ke awcms_mini_document_resource_relations (ADR-0013 §6
no-shared-table-write). ownerModuleKey/resourceType/resourceId
adalah string OPAQUE bagi modul ini — modul PEMANGGIL bertanggung jawab
hanya pernah mengoper id yang sudah divalidasi milik tenant-nya sendiri.
Terbukti reusable: tests/integration/document-infrastructure.integration.test.ts
mendemonstrasikan modul ini dipakai ulang untuk LIMA skenario domain
BERBEDA (correspondence evidence, contract attachment, invoice reference,
approval evidence, asset-disposal evidence) tanpa modul ini pernah
mengetahui/mengimpor aturan domain apa pun — hanya string
ownerModuleKey/documentType/resourceType yang berbeda, bukan
skema/tabel berbeda.
GET /documents, GET /documents/{id}, GET /documents/{id}/versions,
GET /documents/{id}/relations, GET /evidence, GET /reservations
semuanya menegakkan confidentiality_level — permission dasar
(documents.read/dst.) hanya memberi akses ke baris public/internal;
membaca confidential/restricted butuh permission tambahan ADDITIF
documents_confidential.read/documents_restricted.read
(068_awcms_mini_document_infrastructure_confidentiality_permissions.sql,
pola sama visitor_analytics.raw_detail.read). Baris di luar clearance
caller mengembalikan hasil IDENTIK dengan "tidak ditemukan" (dihilangkan
dari list, 404 untuk fetch tunggal) — tidak pernah mengonfirmasi
keberadaannya. Sejak Issue #787, endpoint MUTASI (void/restore/
reclassify/versions.create/relations.assign/relations.revoke) JUGA
mensyaratkan clearance tier terhadap confidentiality level SAAT INI
dokumen SEBAGAI PRECONDITION (bukan permission write-tier baru — ADR-0017
§7) sebelum permission action-spesifik dievaluasi lebih lanjut. Endpoint
baru yang membaca/memutasi dokumen wajib mengikuti pola tier-check ini
— jangan hanya cek permission action tanpa cek tier.
Bug class recurring (lihat juga skill awcms-mini-idempotency §CRITICAL):
computeRequestHash untuk 11 endpoint di modul ini — documents/{id}/restore,
classifications/{id}/restore, documents/{id} DELETE, classifications/{id}
DELETE, documents/{id}/relations/{relationId} DELETE,
reservations/{id}/cancel, reservations/{id}/commit, documents/{id}/void,
documents/{id}/reclassify, documents/{id}/versions POST, dan
documents/{id}/relations POST — awalnya di-hash TANPA menyertakan path
param identitas resource (id/relationId) DAN literal action eksplisit.
Karena request_scope idempotency dibagi lintas SEMUA resource bertipe
sama dalam satu tenant, ini memungkinkan reuse Idempotency-Key lintas DUA
dokumen berbeda mereplay respons dokumen pertama untuk request yang
seharusnya memutasi dokumen kedua. 4 dari 11 endpoint (void/reclassify/
versions.create/relations.assign) BARU ditemukan oleh independent
security-auditor pass lewat re-grep wajib SELURUH modul setelah pass
pertama hanya menyasar 7 endpoint — pelajaran: jangan percaya daftar
endpoint "yang kelihatan mencurigakan" sebagai lengkap.
sequences/revise/restore/deactivate DIPERIKSA dan TIDAK rentan —
endpoint index-level ini mengidentifikasi resource lewat
scopeType+scopeId+sequenceKey yang sudah bagian dari body mentah
yang di-hash; endpoint create murni (documents/classifications/
sequences POST, reservations/reserve) juga TIDAK rentan (tidak ada
resource pra-eksisting untuk diikat). Diuji adversarial di
tests/integration/document-infrastructure.integration.test.ts untuk
seluruh 11 endpoint yang diperbaiki. Endpoint baru di modul ini yang
punya path param [id]/[relationId] wajib mengikuti pola yang sama:
const requestHash = computeRequestHash({
...body,
id: documentId,
action: "void"
});
documents.create/versions.create sengaja idempotency-gated MESKI
create/update tidak ada di HIGH_RISK_ACTIONS — Issue #751 sendiri
memperingatkan eksplisit bahwa PR sibling di epic ini butuh ronde
perbaikan tambahan karena pass idempotency pertamanya melewatkan endpoint
create. Empat action baru ditambahkan ke AccessAction/HIGH_RISK_ACTIONS
untuk modul ini: void, reclassify, reserve, commit — cancel
(reservation) reuse literal yang sudah ada TANPA ditambahkan ke
HIGH_RISK_ACTIONS (menghindari mengubah blast radius cancel di modul
lain); endpoint cancel reservasi tetap mewajibkan Idempotency-Key di
level route secara independen.
document.created, document.voided, document.restored,
document.reclassified, version.created, number.reserved,
number.committed, number.canceled — semua diterbitkan di transaksi
yang sama dengan perubahan state (appendDomainEvent, domain_event_runtime).
/admin/document-infrastructure/classifications,
/admin/document-infrastructure/documents (+ detail: versi/relasi/
reclassify/evidence), /admin/document-infrastructure/sequences (definisi
sequence + reservasi: reserve/commit/cancel reachable dari layar ini —
commit prompt id dokumen bebas teks, tidak ada picker lintas modul).
INSERT langsung
ke awcms_mini_document_resource_relations — selalu lewat capability
port linkDocumentToResource.UPDATE/DELETE baris awcms_mini_document_versions — append-only,
koreksi selalu versi baru.tests/integration/document-infrastructure.integration.test.ts — negative
test confidentiality-tier untuk KEEMPAT jalur baca asli, test konkurensi
numbering nyata, DAN (Issue #787) dua test tambahan: satu meng-cover keenam
endpoint mutasi (deny dengan action-permission saja, allow setelah tier
permission ditambahkan), satu lagi meng-cover GET /evidence/
GET /reservations. Jalankan bun test dengan DATABASE_URL — bun run check tanpa DATABASE_URL melewatkan semua test integration secara diam-diam.
Capability edge nyata ke data_lifecycle untuk retensi (kolom
retention_reference tetap teks bebas sampai ada admission decision
terpisah).