بنقرة واحدة
awcms-mini-reference-data
Kerjakan bagian mana pun dari modul reference_data AWCMS-Mini (Issue
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Kerjakan bagian mana pun dari modul reference_data 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-reference-data |
| description | Kerjakan bagian mana pun dari modul reference_data AWCMS-Mini (Issue |
reference_data (src/modules/reference-data, Issue #750, epic
platform-evolution #738 Wave 3, admission decision
docs/adr/0021-reference-data-module-admission.md — dinomori ulang dari
ADR-0018 untuk menyelesaikan tabrakan penomoran lintas-PR, lihat index
docs/adr/README.md) adalah Official Optional Business Foundation
(ADR-0013 §1) — fondasi reference data provider-neutral, opt-in per tenant,
generik untuk setiap aplikasi turunan.
Baca src/modules/reference-data/README.md untuk peta tabel/endpoint.
Skill ini merangkum yang tidak jelas dari membaca satu file: batas
global-vs-tenant-scoped (satu-satunya modul opsional di repo ini yang punya
tabel GLOBAL tanpa RLS), alur import 3-fase, dan semantik PATCH parsial.
Melengkapi (bukan menggantikan) awcms-mini-new-endpoint,
awcms-mini-new-migration, awcms-mini-idempotency,
awcms-mini-abac-guard. Pakai skill ini untuk konteks
reference_data spesifik: kapan sebuah katalog jadi module-contributed vs
platform-curated, aturan override tenant, dan invariant import.
awcms_mini_reference_value_sets) — katalog bernama
stabil (mis. "currency", "unit_of_measure", "fiscal_calendar").
scope membedakan module_contributed (dideklarasikan statis di
module.ts modul lain, disinkronkan application/contribution-sync.ts)
dari platform_curated (dibuat lewat API modul ini sendiri).
overridePolicy mengatur apa yang boleh dilakukan tenant.awcms_mini_reference_codes + _code_translations) — satu
baris per kode dalam value set, effective-dated, terlokalisasi, dengan
provenance + deprecation/supersession. Tidak pernah hard-delete sekali
direferensikan override/extension tenant.awcms_mini_reference_imports) — satu baris per batch
dry-run/commit.awcms_mini_reference_tenant_codes +
_tenant_code_translations) — TENANT-SCOPED. Override (baseCodeId diisi)
menyatakan ulang atribut kode baseline untuk satu tenant saja; extension
(baseCodeId null) adalah kode baru definisi tenant. Tidak pernah
menulis ke tabel baseline global.Empat tabel pertama di atas GLOBAL: tidak ada kolom tenant_id, tidak
ada RLS — identik untuk setiap tenant secara desain, pola reviewed-exempt
yang sama dengan awcms_mini_permissions/awcms_mini_modules/
awcms_mini_idn_admin_regions (terdaftar di
scripts/security-readiness.ts's RLS_FREE_TABLES dan
ALLOWED_GLOBAL_TABLE_GRANTS).
Konsekuensi operasional yang HARUS dipahami sebelum menyentuh modul ini:
codebase ini tidak punya konsep "platform superadmin" terpisah. Memutasi
tabel global tetap lewat request tenant-authenticated biasa dengan permission
reference_data.* yang tepat. Jadi reference_data.value_sets.*/.codes.*/
.imports.* harus diberikan sangat sempit — aksi-aksi itu mempengaruhi
baseline yang dipakai SETIAP tenant, bukan cuma tenant si caller. Jangan
tambahkan endpoint baru yang memutasi tabel global tanpa menyadari ini.
Dua tabel tenant-scoped memakai ENABLE+FORCE ROW LEVEL SECURITY dengan
predikat yang selalu dan hanya tenant_id.
PATCH /tenant-codes/{id} dan PATCH /value-sets/{key}/codes/{code} dulu
berperilaku sebagai PUT: field yang dihilangkan dari body direset diam-diam
ke default (sortOrder → 0, metadata → {}, validFrom → now(),
validTo → null), menjawab 200 tanpa peringatan. Klien yang mengirim PATCH
parsial — semantik normatif PATCH — kehilangan data. Ini reference data yang
bisa jadi acuan dokumen/transaksi turunan, sehingga validFrom/validTo
bersifat load-bearing.
Sekarang ditangani domain/code-patch.ts — pakai ini, jangan parse body
manual di route:
parseReferenceCodePatchInput(body) — per field: absen = pertahankan
nilai tersimpan, null eksplisit = kosongkan ke nilai kosong field itu
(sortOrder → 0, metadata → {}, validTo → null), nilai lain =
ganti. validFrom (NOT NULL di schema) dan labels (selalu butuh minimal
satu entri) menolak null eksplisit, bukan diam-diam di-default.mergeReferenceCodePatchInput(existing, patch) — field absen dibawa
verbatim dari record tersimpan.KNOWN_PATCH_FIELDS). Kedua schema PATCH
additionalProperties: false, tapi parser yang membaca key yang dikenal dan
mengabaikan sisanya mengubah typo klien (validUntil untuk validTo) jadi
patch kosong — digabung cabang no-op empty-patch, typo itu menjawab 200
dan tidak mengubah apa pun: request TERLIHAT diterima sambil tidak
melakukan apa-apa (temuan review PR #839).KNOWN_PATCH_FIELDS sengaja diletakkan di sebelah blok per-field: menambah
field tanpa mendaftarkannya di situ membuat test field itu langsung gagal
(ditolak sebagai unknown), bukan diabaikan diam-diam.Saat merapikan route ini, jangan ubah
computeRequestHash({ ...body, id, action: "update" }) — pengikatan id ke
hash idempotency itu sudah benar dan wajib (lihat awcms-mini-idempotency
§CRITICAL).
Pola "default-in-parse" yang sama layak di-grep di endpoint PATCH lain:
: new Date() dan ?? {} di parse body.
Modul lain mendeklarasikan katalognya sendiri secara statis di module.ts-nya:
export const myModule = defineModule({
// ...
referenceData: {
contributesValueSets: [
{
key: "my_value_set",
name: "My Value Set",
description: "...",
overridePolicy: "tenant_extend",
codes: [{ code: "A", labels: [{ locale: "en", label: "A" }] }]
}
]
}
});
Divalidasi domain/contribution-registry.ts
(bun run reference-data:contributions:check, tersambung ke bun run check
dan CI) dan disinkronkan ke tabel modul ini oleh
application/contribution-sync.ts (bun run reference-data:contributions:sync)
— langkah operasional eksplisit, tidak pernah dipanggil otomatis oleh kode
modul lain. Modul ini mengapalkan kontribusi contohnya sendiri
(currency/unit-of-measure/fiscal-calendar, application/seed-contributions.ts)
lewat mekanisme yang sama persis, sebagai demonstrasi netral — baca header file
itu untuk caveat "tidak komprehensif, bukan otoritas regulasi". Jangan
perlakukan seed itu sebagai daftar authoritative.
application/import-service.ts)POST /value-sets/{key}/imports) — menghitung diff terhadap
baseline code provenance = "import" yang ada. Tidak pernah memutasi
awcms_mini_reference_codes. Mempersist baris
awcms_mini_reference_imports (status: "validated"/"rejected") dengan
ringkasan diff + checksum.POST /imports/{id}/commit) — memverifikasi ulang checksum
dan menjalankan ulang perhitungan diff penuh DI DALAM transaksi yang sama
dengan write. Jangan "optimasi" ini jadi percaya hasil dry-run saja —
data bisa berubah sejak dry-run. Menolak (seluruh transaksi, tanpa
partial write) setiap entri payload yang meminta replace: true terhadap
kode yang sudah direferensikan override/extension tenant.POST /imports/{id}/rollback) — membalik efek kumulatif batch
yang sudah di-commit: menghapus kode yang dibuatnya (hanya bila masih tidak
direferensikan — menolak bila tidak, ini limitation yang terdokumentasi di
recovery notes, bukan bypass diam-diam), memulihkan snapshot atribut
sebelumnya untuk kode yang diupdate, dan meng-undeprecate kode yang
dideprecate.Bandingkan domain/import-diff.ts + tests/unit/reference-data-import-diff.test.ts.
Setiap endpoint create/update/deprecate/restore/import-dry-run/import-commit/
import-rollback mewajibkan Idempotency-Key dan diaudit — aturan blanket
yang disengaja (bukan subset bernama) setelah PR-PR sebelumnya di epic ini
menemukan celah dari coverage parsial. commit/rollback diklasifikasikan
HIGH_RISK_ACTIONS di identity-access/domain/access-control.ts, bersama
delete/restore yang sudah ada. Endpoint mutasi BARU di modul ini wajib
mengikuti aturan blanket ini — jangan berargumen "yang ini rendah risiko".
_shared/ports/reference-data-port.ts (ReferenceDataPort) — me-resolve satu
kode atau snapshot value set untuk sebuah tenant, menggabungkan baseline +
override tenant dengan presedens deterministik (domain/resolution.ts).
Diimplementasikan application/reference-data-port-adapter.ts. Belum ada
modul di repo ini yang mengonsumsinya (extension seam, preseden "provides
sebelum consumer nyata ada" yang sama dengan BusinessScopeHierarchyPort
milik organization_structure).
idn_admin_regionsidn_admin_regions tidak diduplikasi/dimigrasikan ke modul ini (ADR-0021
§4) — skema hierarkis 4-level-nya tidak memetakan bersih ke model flat
value-set/code di sini. Ia BOLEH, di issue tersendiri kelak, ikut mendaftarkan
diri sebagai module-contributed value set lewat mekanisme di atas — seam
opsional murni, bukan keharusan.
/api/v1/reference-data/value-sets, .../{key}[/restore],
.../{key}/codes[/{code}][/restore], .../{key}/imports[/{importId}] [/commit|/rollback], /api/v1/reference-data/tenant-codes[/{id}][/restore]
— tag Reference Data di openapi/awcms-mini-public-api.openapi.yaml.awcms-mini.reference-data.value-set.{created,updated,deprecated},
.code.{created,updated,deprecated}, .import.{committed,rolled-back},
.tenant-code.{created,deprecated}./admin/reference-data/value-sets, /admin/reference-data/codes
(+ panel import tervalidasi, ?valueSet=<key>),
/admin/reference-data/tenant-codes.domain/code-patch.ts.Idempotency-Key + audit.Katalog produk/item, chart of accounts, aturan pajak/payroll, atau master data
domain lain; menggantikan idn_admin_regions; panggilan provider eksternal
real-time saat resolusi (import adalah payload tervalidasi yang disubmit
operator, bukan fetch eksternal live).
tests/unit/reference-data-{code-patch,contribution-registry,domain,import-diff,resolution}.test.ts
dan tests/integration/reference-data.integration.test.ts. Jalankan bun test
dengan DATABASE_URL — tanpa itu seluruh test integration dilewati diam-diam.
Plus gate CLI: bun run reference-data:contributions:check.