Zoth rapid-fire — 25 questions, answer outlines
Every question your resume invites, with the answer shape — practise aloud, not silently.
Know your own system
Read the question, answer out loud in 60–90 seconds, then compare with the outline. Mark the ones you fumble and revisit them tomorrow.
- What is Zoth in one sentence? → JIT access governance platform: request → policy → approval → time-bound grant → auto-revoke, across GitHub/Azure/Notion, with tamper-evident audit.
- Why Go? → static binary for a 1-node cluster, goroutines for loops/consumers, SQLC for explicit SQL, K8s-native lifecycle.
- Why Postgres only? → single source of truth; recursive CTE replaced Neo4j; JSONB for policy flexibility; pgvector for RAG; no dual-write.
- Why RabbitMQ, not Kafka? → work-queue semantics + outbox durability (Day 59).
- Why an outbox? → atomicity of state change + event; broker becomes non-critical (Day 59/62).
- Walk the 6-state lifecycle. → PENDING → APPROVED → ACTIVE → EXPIRED/REVOKED/DENIED, who transitions each, CAS enforcement (Day 12).
- How do you prevent double-approval? → conditional update; loser gets 0 rows → 409 (Day 31).
- How does approval routing work? → recursive CTE manager chain, closest manager, UNROUTED fallback, self-approval blocked (Day 38).
- Why is the RAG layer not a security risk? → advisory columns only, reachable only via matched policy, validation of any generated policy JSON (Day 68).
- What does auto-approve require? → tenant opt-in, LOW sensitivity, >95% historical approval rate; recorded as decision_source (Day 12).
- How do you dedup events? → processed_events insert-on-conflict with routingKey:id keys (Day 20).
- What if GitHub is down? → retries with jitter → DLQ; drift detection reconciles within 5 min; provisioning delayed, never lost (Day 48).
- How is the audit log tamper-evident? → hash chain; VerifyChain; known race + fix (Day 56).
- How do tenants stay isolated? → tenant in every query, resources via integration join, encrypted credentials, C-4 remediation story (Day 40).
- Why is your rate limiter not mounted? → honest: built and tested, not enabled at demo scale (Day 24).
- What breaks at 3 replicas? → the audit chain first; everything else is claim-based (Day 50).
- Why is liveness shallow? → restart storms; readiness absorbs dependency health (Day 22).
- What's your biggest weakness? → the audit-chain race + no backup story; fixes scoped (Day 90/88).
- Why not gRPC between services? → no synchronous inter-service calls exist (Day 17).
- How does the emitter handle a bad credential? → classified errors: auth failures don't retry, they surface (Day 19).
- What happens on SIGTERM? → graceful drain 10 s, OTel flush 5 s, publisher/consumer/DB close (Day 8).
- How do migrations run? → embedded goose at boot under advisory lock, fatal on failure (Day 36).
- Why no cache? → nothing hot; Postgres indexes suffice; measured decision (Day 43).
- What did you remove and why? → Neo4j (Day 6) — the best answer in the set.
- What would you do differently? → persistent delivery mode + confirms from day one; transactional audit chain; mount the limiter; per-tenant KMS.
Bulletproof your resume
Say these answers aloud before moving on
These are the follow-ups an interviewer will actually ask about your projects.
Which of these answers is weakest right now, and what's the fix?
Honestly, #15 and #18 — the unmounted limiter and the audit-chain race — because they're implemented-but-not-finished rather than deliberate scope. The fix for both is small and scoped (mount one middleware; sequence-order the chain), and I'd ship them before an interview cycle rather than explain them. The stronger weakness to keep is 'no backup story in zoth', because that one is a justified allocation of budget to a demo-scale system — defensible as a decision, not a gap.
How do you answer #4 without sounding rehearsed?
By grounding it in the specific system rather than reciting a comparison: 'my events are side-effect triggers whose truth is in Postgres — the outbox already gives durability, so the broker only needs work-queue semantics: claim once, retry with accounting, dead-letter. Kafka's replay and partition ordering solve problems I engineered away (idempotent per-event processing, drift reconciliation), and it costs a broker fleet I'd be running on a $30 cluster for one event a minute.' The specificity is what makes it sound like a decision I made rather than a comparison I memorized.
Which answer wins you the most credit in a 60-minute interview?
The Neo4j removal (#24). It shows: I chose a technology that seemed right for the domain, measured the actual access pattern, discovered the relational answer was better, and executed a migration with a documented rationale. Interviewers are looking for judgment and reversibility — most candidates only talk about things they added. A close second is the outbox explanation, because it demonstrates that I understand where correctness lives in a distributed system.