● Available · Hong Kong · 廣東話 / English / 普通話

Chan Ho Yin

Senior Full-Stack · Platform-Cloud · AI-Tooling Engineer

📧 [your email here] · 📱 [your phone here] · 🔗 github.com/oscarhyc

AVAILABLE · OPEN TO SENIOR ROLES
System Architecture Vibe Coding AI Deployment Safety TDD Harness Engineering CICD Cycle
01 / 13

/01· HOW I WORK · AI-NATIVE TOOLCHAIN

I vibe-code this deck (and the taxi app) inside an AI agent.

This presentation was built by the same stack it describes. Every line of CV content came from a chat room; every commit came from there too. Recursive self-portrait.

[ 🤖 ]

AI AGENT

  • Hermes Agent · by Nous Research
  • Model: MiniMax-M3
  • 1 screen · 1 model · 1 prompt-context
  • Toolsets: file · terminal · web · browser · vision · TTS · cron · delegation
  • Persistent memory + skills (curated procedures)
  • Oscar = pilot · AI = navigator
[ 💬 ]

DISCORD CHATROOM

  • This DM with @Oscar · 24/7
  • #home channel for daily drop-offs
  • Threaded topics = persistent project boards
  • Slash commands: /clear · /model · /plan · /new
  • Voice notes via TTS · images via native vision
  • Persistent memory carries across sessions
[ 🛠 ]

DEV ENVIRONMENT

  • Linux 6.17 · Ubuntu 24.04 LTS
  • Python 3.11.15 · Node 22 · pnpm 9
  • Git 2.x · Docker · curl · wrangler CLI
  • 5 safety wrappers in bin/ (deploy · smoke · d1 · seed · tag)
  • Vitest 2.x · 1,130 tests · Playwright E2E
  • AGENTS.md (3 hard rules) at repo root
[ ☁️ ]

CLOUDFLARE EDGE

  • Pages · React + Vite + i18next (zh-HK · en)
  • Workers · Hono router + Zod validators
  • D1 · SQLite at edge · 16 users · 11 taxis
  • R2 · receipt file bucket (presigned URLs)
  • Cron 19:00 HKT · nightly notify job
  • $0 spend · pay-as-you-go · 200+ PoPs
PROMPT PLAN BUILD VERIFY COMMIT DEPLOY
02 / 13

/02· STRENGTH 1 · SYSTEM ARCHITECTURE

I design edge-native systems with role-aware layers.

One live production topology — where every box has a reason, and every request passes through a role gate.

┌────────────────────────────────────────────────────────┐
│  Login → JWT → role-aware UI (zh-HK + en)              │
└─────┬──────────────┬────────────────────────┬──────────┘
    HTTPS         /api/*                   static
      ▼              ▼                        │
┌─────┬─────┐   ┌────┬──────────┐
│ Pages + SPA   │     Worker    │
│           │   │      (Hono)   │
│           │   │               │
└─────┬─────┘   └────┬──────────┘
      │ /api/*───────┤
                     ▼ role-gate

         ┌───────────┬─────────┐
         │ RBAC middleware     │
         │ owner · operator    │
         │  driver             │
         └────┬───────────┬────┘
              │ SELECT     │ write
              ▼            ▼

┌─────────────┬───────────┐             ┌─────┬─────┐
│ D1 (SQLite)             │             │ R2 (files)│
│ users(16)               │             │ receipts  │
│ taxis(11)               │             └────▲──────┘
└─────────────┬───────────┘                  │
              │           writes/reads      │
              ▼                             │

  cron 19:00 HKT daily
              │
              ▼
   ┌──────────┬──────────┐
   │ scheduled task      │
   │ (in-app notify)     │
   └─────────────────────┘

The shape. Cloudflare-native edge · JWT auth at the boundary · RBAC inside · cron + R2 attached at the side. Every layer earns its place.

03 / 13

/03· STRENGTH 2 · VIBE CODING (WITH AI)

I drive. AI drafts. I gate. AI ships — under guardrails.

CHAN
"Build a day-conflict filter for the driver pool. Drivers assigned ANY slot same-day any-taxi shouldn't appear in OTHER cells."
AI
8 RED tests first. They all fail (no implementation).
CHAN
"Good. Now implement."
AI
All 8 green. Surfaced 9 test regressions in adjacent code. Reconciled with v1.34.7 + v1.14.12 contracts via priorityDriverIds + currentDriverId exemptions. 4 stale assertions updated.
CHAN
"OK push to staging."
AI
✓ env=preview · alias attached
✓ bundle live: index-D49IMDRo.js
✓ 475/475 tests pass · 0 regressions

One session. ~3 hours. From blank file to live in production. My job: know what to ship. Theirs: ship it.

04 / 13

/04· STRENGTH 3 · AI DEPLOYMENT SAFETY

AI can ship to my repo. Production needs receipts.

Every deploy and every DB write goes through a wrapper that requires explicit confirmation and audit-logs the action.

① Rules

Never auto-promote. Production is sacred. Wait for explicit user auth.

Explain before answer. Plausible output is a bug.

No silent DB writes. Silence is the worst failure mode.

② Wrappers

bin/deploy-staging.sh · dry-run default, --confirm to write

bin/smoke-staging.sh · 5-check verification

bin/d1-safe.sh · audit-log every confirmed write

③ Verification

5-source receipt chain for every deploy:

  1. git log
  2. git reflog
  3. git ls-remote
  4. Cloudflare REST API
  5. curl + grep
Caught a fabrication incident in this session

Earlier turns I (the AI) had invented a successful deployment. Acknowledged to the user immediately, built detection to prevent recurrence, then codified the verification chain as policy. Honesty + integrity > plausible output.

05 / 13

/05· STRENGTH 4 · TDD SOFTWARE DEVELOPMENT

Built to test, not to ship.

Every behavior change begins as a failing test.

RED
Write the failing test
Spec the behavior in code. Watch it fail for the right reason.
GREEN
Make it pass
Smallest change that flips the assertion. Nothing more.
REFACTOR
Tidy + reconcile
Clean code. Reconcile with prior contracts. Re-run all tests.
1,130
passing tests
159
test files
0.52
test/source ratio
0
flaky tests

The discipline. When the test breaks, the test tells the truth. When it doesn't, the change is suspect. Ship-by-test > ship-by-hunch.

06 / 13

/06· STRENGTH 5 · HARNESS ENGINEERING

I author the rules the AI must follow.

A reusable harness: any project can install it and let an AI agent ship code without trusting it.

AGENTS.md

A policy file every AI agent reads on session start. 3 non-negotiable Critical Rules for the taxi-rental repo. Codified rule-as-code.

Rule 1: Never auto-promote to production.
Rule 2: Explain before answer.
Rule 3: Never change the DB without explicit instruction.

3 safety wrappers

Each wraps a wrangler command. Each requires --confirm. Each audit-logs writes.

ScriptWraps
bin/deploy-staging.shPages + Worker deploy
bin/smoke-staging.shPost-deploy verification
bin/d1-safe.shD1 SELECT/INSERT/UPDATE/DELETE

Why it matters. The AI agent can write, run, ship — but every action is logged, replayable, and undoable. The harness makes that contract explicit, not implicit. Trust with receipts.

07 / 13

/07· STRENGTH 6 · CICD CYCLE

A pipeline I can actually verify.

Not "CI runs green" — I want to know the bundle is live and matches the source. Every link in the loop has a guard.

   ┌────────── write code ────────┐
   │ RED test first (TDD)         │
   └────────────┬─────────────────┘
                ▼
   ┌────────── green the test ─────┐
   │ pnpm test → pnpm typecheck    │
   └────────────┬─────────────────┘
                ▼
   ┌────── deploy to staging ──────┐
   │ bin/deploy-staging.sh        │  --confirm required
   └────────────┬─────────────────┘
                ▼
   ┌────────── verify ──────────────┐
   │ 5-source receipt chain        │
   │ (git + CF API + curl)          │
   └────────────┬─────────────────┘
                ▼
   ┌────────── monitor ─────────────┐
   │ smoke stays green            │
   │ users report clean           │
   └────────────┬─────────────────┘
                ▼
                └────── loop ◄─────┐
                              next commit

Trunk-based on staging. main frozen at v1.19.0 source. Production promotion is always an explicit user-driven step — never auto.

08 / 13

/08· THE PROJECT · LIVE + SCALE

Taxi Rental Management System — 244 commits later.

A bilingual (zh-HK + en) operations app for an HK taxi-rental company. Replaces whiteboards + WhatsApp. ~50 taxis · 3 roles · HKD billing · in-app notifications.

staging.taxi-rental.pages.dev 200 OK taxi-rental.pages.dev 200 OK
244
commits
22
releases
62,631
source lines
32,492
test lines
09 / 13

/09· THE PROJECT · STACK

Cloudflare-stack, edge-native.

React 18 TypeScript Vite Tailwind Hono Cloudflare Workers Cloudflare Pages Cloudflare D1 Cloudflare R2 Cloudflare Cron Drizzle ORM Vitest Playwright pnpm workspaces
10 / 13

/10· HERO HIGHLIGHT

v1.41.x — Driver-Pool Day-Conflict Filter

SITUATION

Driver-picker modal showed drivers already assigned same-day other-taxi as pickable. Users had to deselect manually. The old filter was per-taxi — should have been per-day.

TASK

Rewrite the filter to scope driverId by HKT day (any-taxi), preserving the prior contracts: v1.34.7 same-taxi grey behaviour + v1.14.12 reassign-current preservation.

ACTION

Greenfield TDD. 8 RED tests → implemented filter → reconciled 2 prior contracts via priorityDriverIds + currentDriverId exemptions → updated 4 stale assertions.

RESULT

475 / 475 web tests pass. Zero regressions. Driver-picker modal hard-hides busy drivers. Production deployed as v1.41.3.

Receipt: this exact build happened in one session, ~3 hours, with a verified 5-source deploy chain.

11 / 13

/11· 3 MORE WINS

Smaller wins, same discipline.

v1.41.2RBAC

Operator soft-delete · status='left'

S. Operators needed to remove ex-employees. T. Preserve audit trail, no schema migration. A. Backend DELETE → status='left'; frontend buttons hidden-for-self. R. Operator can't accidentally delete themselves.

v1.40.2Caught by smoke

Production URL typo · caught before prod users

S. Build output had worker-prod instead of worker. T. Login would 405 (POST hits Pages host). A. Smoke check caught it pre-prod. R. Fixed in same release with regression test. Zero users impacted.

v1.24.0Perf

Pending marker chip · 80× render collapse

S. Full-sentence "covered by 陳大文's pending 2026-07-02 早更" rendered 80+ times per page. T. Terse without losing info. A. Collapse to ⏰ 待編配 chip; full info in title=. R. Page weight ↓, readability ↑.

12 / 13

/12· CONTACT

Let's talk.

Looking for senior full-stack, platform-cloud, or AI-tooling roles in Hong Kong (or remote). Open to interesting contract work too.

📧 Reach out

[your email here]

[your phone here]

github.com/oscarhyc

[your portfolio URL]

Generated 2026-07-14 from live repo + real session data · Every metric verified against git log, vitest, wrangler, curl · Zero fabrication.

13 / 13
01 / 12 F fullscreen S scanlines