Faculty onboarding · walkthrough
From “yes I'll review” to your first signed entry — in 30 minutes.
ทุก canonical entry บน source.cuvetsmo.com ต้องมีอาจารย์ผู้เชี่ยวชาญลงนาม Ed25519. หน้านี้คือ flow จริง — มี $ prompt + sample output + อธิบายว่าแต่ละขั้นตอนทำอะไร.
First-time setup
~30 min
generate key, register PR, install Node
Per entry after
~5 min
read, edit, sign, PR
Hardware needed
None
laptop with Node 20+ and Git
Before you start
What signing means
When you sign an entry, you publicly attest that you personally read every clinical sentence, cross-checked at least one dose against an independent authoritative source, and stand behind the content. Your signature is verifiable by any reader in the world, forever, with no central authority needed. It is structurally stronger than any reviewing relationship in print — Plumb's citations point at a Plumb's edition; here, your name is on the byte-level hash of the exact entry you reviewed.
The flow
5 steps to your first signed entry
Clone the repo + install
2 minคุณต้องมี Node.js 20+ และ Git. ไม่ต้องมี server, ไม่ต้องสมัครบัญชี.
$ git clone https://github.com/palmzamak2547/cuvetsmo-source.git $ cd cuvetsmo-source $ npm install added 247 packages in 12s
Generate your signing key
3 minเลือก kid (key id) ที่สั้น เสถียร และเป็น kebab-case. Convention: firstname.lastname.
$ node scripts/keygen.mjs ekkapol.akb --display "ผศ.น.สพ.ดร. เอกพล อัครพุทธิพร" ✓ Ed25519 keypair generated kid: ekkapol.akb display: ผศ.น.สพ.ดร. เอกพล อัครพุทธิพร fingerprint: ed25519:7c2b9e4f1a3d0c87 public: content/keys/ekkapol.akb.pub.json (COMMIT this) private: ~/.cuvetsmo-keys/ekkapol.akb.priv.json (NEVER commit — outside repo)
key-rotationissue and we'll revoke + reissue.Register your public key (one-time PR)
5 minCreate a PR titled keys: register ekkapol.akb. The maintainer merges after verifying your name + affiliation against the faculty directory.
$ git checkout -b keys/ekkapol-akb $ git add content/keys/ekkapol.akb.pub.json $ git commit -m "keys: register ekkapol.akb" $ git push origin keys/ekkapol-akb $ gh pr create --title "keys: register ekkapol.akb" ✓ PR opened: github.com/palmzamak2547/cuvetsmo-source/pull/N
Pick an entry, review, sign
5–10 min per entryเปิด content/drugs/<slug>.json — read every clinical section, strip TEMPLATE markers, add Thai translations, cross-check at least one dose against an independent source. Then add your reviewer block:
json"reviewedBy": {
"name": "ผศ.น.สพ.ดร. เอกพล อัครพุทธิพร",
"title": "ผู้ช่วยศาสตราจารย์",
"department": "ภาควิชาเภสัชวิทยา",
"affiliation": "คณะสัตวแพทยศาสตร์ จุฬาลงกรณ์มหาวิทยาลัย",
"date": "2026-06-15",
"did": "did:web:source.cuvetsmo.com:faculty:ekkapol-akb",
"signerKeyId": "ed25519:7c2b9e4f1a3d0c87"
}Then sign:
$ npm run check ✓ All 175 content units pass Iron Rule 0 $ node scripts/sign.mjs meloxicam --signer ekkapol.akb ✓ Signed meloxicam signer: ผศ.น.สพ.ดร. เอกพล อัครพุทธิพร (kid: ekkapol.akb) fingerprint: ed25519:7c2b9e4f1a3d0c87 contentHash: 10d5c44cc278d863f9d4b8ee1ed669bcc40baceaa6f74bad78ff10c3d859b033 signature: bm5Hb55PtAwQd/Udiue+IyPTjhJ3... (base64, 88 chars) version: 2 log seq: 2 Verify it: npm run verify (CLI lint, crypto-verifies all signatures) http://localhost:3000/verify/meloxicam (browser-side verify, no server trust)
Open the PR, the entry goes canonical
3 minFinal PR for the signed entry:
$ git checkout -b sign/meloxicam $ git add content/drugs/meloxicam.json content/log/transparency-log.jsonl $ git commit -m "Sign meloxicam after editorial review" $ git push origin sign/meloxicam $ gh pr create --title "Sign meloxicam — first faculty review" --fill
Once a maintainer merges, the entry flips from amber pending to emerald canonicalon the live site, and your name + title + date show up in the trust stamp + the transparency log + the chain of trust visualization. Anyone who fetches the entry — now or 10 years from now — can verify in their browser that you specifically vouched for it on this date.
Quick reference
Pre-signing checklist
- ✓I read every clinical section in full (not skimmed)
- ✓I cross-checked at least one dosage against an independent authoritative source
- ✓I stripped every
TEMPLATEplaceholder - ✓I corrected any Thai phrasing that read awkwardly to a Thai vet practitioner
- ✓If AI assisted the draft,
drafting.humanEditsRatioreflects my edits honestly (> 0.1) - ✓
npm run checkpasses locally with no errors - ✓I added myself to
reviewedBywith full title + affiliation - ✓I am signing for content I reviewed — not delegating to a student or RA
Boundaries
When NOT to sign
- ✗You skimmed instead of reading every line
- ✗AI drafted and you rubber-stamped —
humanEditsRatio < 0.1 - ✗A student helped translate but you didn't re-read after their edits
- ✗You're uncertain about a specific dose — flag the cell as needing further review instead
- ✗You feel pressure from the maintainer team — let them know rather than sign reluctantly