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