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

Chan Ho Yin

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

📧 oscarhychan@gmail.com · 🔗 github.com/oscarhyc

AVAILABLE · OPEN TO AGENTIC-AI / PLATFORM ROLES
📧 Email owner@example.com
🔑 Password test123
Agentic Systems System Architecture Agentic Engineering Agent Guardrails & HITL TDD Agent Harness Design AgentOps
01 / 18

/01· THE AGENT STACK

Four pillars of my agentic runtime.

The agent is a teammate with permissions, not a tool I prompt. It runs in a chatroom, ships via the edge, and is wrapped by a safety harness.

[ 🤖 ]

AGENT

  • Hermes Agent · by Nous Research
  • Model: MiniMax-M3
  • 8 toolsets · file · terminal · web · browser · vision · TTS · cron · delegation
  • Persistent memory + skills (curated procedures)
  • Sub-agent delegation · orchestrator / leaf
[ 💬 ]

MESSAGING

  • Discord 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
[ 🛠 ]

WORKSPACE

  • 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
[ ☁️ ]

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

⟨ Recursive self-portrait — this deck was built by the same stack it shows. ⟩

02 / 18

/02 · AGENTIC ARCHITECTURE

The Cloudflare edge, as agent control plane.

One live production topology. Two actors — the operator (human) and Hermes (AI) — share the same role-gated runtime.

⟨ Same runtime. Two actors. The role-gate doesn't care which one knocks. ⟩

flowchart TD %% Two parallel actors at top — same runtime, two actors OP["👤 Operator / Owner
(via Discord prompt)"]:::actor AI["🤖 Hermes AI Agent
(via tool-use)"]:::actor OP -->|"HTTPS
login · Vite bundle"| BR AI -->|"tool-call
MCP-style"| BR subgraph EDGE["⚡ Cloudflare Edge · role-aware entry"] BR["🌐 Browser · React + Vite
Login → JWT → zh-HK + en"]:::ui end BR -->|"HTTPS ↓
Vite bundle"| PAGES["📦 Pages + SPA
React + Vite
role-gated UI"]:::ui BR -->|"/api/* ↓
Hono + Zod"| WORKER["⚙️ Agent Worker
Tool Executor
(Hermes runtime)"]:::worker WORKER -->|"role-gate"| HARNESS["🧠 Agent Harness
Tools + Memory + Eval
+ RBAC (augmented LLM)"]:::rbac PAGES -->|"static"| HARNESS HARNESS -->|"SELECT · read"| D1[("💾 D1 · SQLite
users(16) · taxis(11)
rental_slots(N)")]:::data HARNESS -->|"write · audit"| R2[("🪣 R2 · logs/audit
receipts")]:::data HARNESS -.->|"trace"| OBS["📊 Eval & Obs
trace to R2/Logs"]:::obs CRON["⏰ cron 19:00 HKT daily"]:::cron D1 --> CRON CRON --> NT["🔔 scheduled task
(in-app notify)"]:::terminal %% Styling — match deck palette classDef actor fill:#1f2937,stroke:#f48225,stroke-width:2px,color:#fff classDef ui fill:#0d1117,stroke:#58a6ff,stroke-width:1.5px,color:#c9d1d9 classDef worker fill:#1c1917,stroke:#f48225,stroke-width:2px,color:#fef3c7 classDef rbac fill:#7f1d1d,stroke:#ef4444,stroke-width:2.5px,color:#fff classDef data fill:#0c4a6e,stroke:#38bdf8,stroke-width:1.5px,color:#fff classDef obs fill:#581c87,stroke:#a855f7,stroke-width:1px,color:#fff classDef cron fill:#365314,stroke:#84cc16,stroke-width:1px,color:#fff classDef terminal fill:#0d1117,stroke:#84cc16,stroke-width:1px,color:#fff linkStyle default stroke:#8b949e,stroke-width:1.5px

The shape. Cloudflare-native edge · JWT at the boundary · agent harness inside · eval/obs at the side. Every layer earns its place — and the harness never trusts the actor.

03 / 18

/03· 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
04 / 18

/04· 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.

⟨ Same runtime. Two actors. The role-gate doesn't care which one knocks. ⟩

flowchart TD %% Top — both actors converge on the runtime USER["👤 Operator / Owner
Driver / Driver-app
(via Discord or browser)"]:::actor AI["🤖 Hermes AI Agent
(prompt in Discord
executes via tool-use)"]:::actor USER -->|"HTTPS
login · Vite bundle"| BR AI -->|"tool-call
MCP-style"| BR subgraph EDGE["⚡ Cloudflare Edge · role-aware entry"] BR["🌐 Browser · React + Vite
Login → JWT → zh-HK + en"]:::ui end BR -->|"HTTPS ↓
Vite bundle"| PAGES["📦 Pages + SPA
React + Vite
role-gated UI"]:::ui BR -->|"/api/* ↓
Hono + Zod"| WORKER["⚙️ Worker (Hono)
+ Tool Executor
(Hermes runtime)"]:::worker WORKER -->|"role-gate"| RBAC["🔒 RBAC middleware
owner · operator · driver
(augmented LLM)"]:::rbac PAGES -->|"static"| RBAC RBAC -->|"SELECT · read"| D1[("💾 D1 (SQLite)
users(16) · taxis(11)
rental_slots(N)")]:::data RBAC -->|"write · audit"| R2[("🪣 R2 (files)
receipts · logs")]:::data CRON["⏰ cron 19:00 HKT daily"]:::cron D1 --> CRON CRON --> NT["🔔 scheduled task
(in-app notify)"]:::terminal %% Styling — match deck palette classDef actor fill:#1f2937,stroke:#f48225,stroke-width:2px,color:#fff classDef ui fill:#0d1117,stroke:#58a6ff,stroke-width:1.5px,color:#c9d1d9 classDef worker fill:#1c1917,stroke:#f48225,stroke-width:2px,color:#fef3c7 classDef rbac fill:#7f1d1d,stroke:#ef4444,stroke-width:2.5px,color:#fff classDef data fill:#0c4a6e,stroke:#38bdf8,stroke-width:1.5px,color:#fff classDef cron fill:#365314,stroke:#84cc16,stroke-width:1px,color:#fff classDef terminal fill:#0d1117,stroke:#84cc16,stroke-width:1px,color:#fff linkStyle default stroke:#8b949e,stroke-width:1.5px

The shape. Cloudflare-native edge · JWT at the boundary · agent harness inside · RBAC + R2 attached at the side. Every layer earns its place — and the harness never trusts the actor.

05 / 18

/05· STRENGTH 2 · AGENTIC ENGINEERING (VS VIBE CODING)

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

Vibe coding = AI types for you, you trust the diff. Agentic engineering = AI plans, you gate, the harness enforces every action. I do the second.

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.

06 / 18

/06· STRENGTH 3 · AGENT GUARDRAILS & HITL

AI can ship to my repo. Production needs receipts.

Human-in-the-loop + parallelized guardrails (Anthropic pattern). Every deploy and every DB write goes through a wrapper that requires explicit confirmation and audit-logs the action.

① Rules (HITL)

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

Explain before answer. Plausible output is a bug.

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

Human-in-the-loop on deploy. AI plans, human approves, harness executes.

② 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.

07 / 18

/07· 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.

08 / 18

/08· STRENGTH 5 · AGENT HARNESS DESIGN

I author the rules the AI must follow.

Anthropic's "augmented LLM" — the model is a building block, the harness is the engineering. 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.

09 / 18

/09· STRENGTH 6 · AGENTOPS · DEPLOY / OBSERVE / ROLLBACK

A pipeline I can actually verify.

AgentOps (IBM, 2026) = the named discipline of operating AI agents in production. 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.

10 / 18

/10· 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
11 / 18

/11· 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
12 / 18

/12· AGENTIC BUILD SESSION · LIVE WALKTHROUGH

A real session. ~3 hours. From "blank file" to "verified live."

v1.41.x driver-pool day-conflict filter — full agentic lifecycle, with parallel sub-agents and human-in-the-loop gates.

PHASE 1
UNDERSTAND
  • Read 47 files
  • Trace dataflow
  • Map contracts
workflow
PHASE 2
PLAN (parallel)
  • spec author
  • risk auditor
  • test author
3 sub-agents
PHASE 3
BUILD (TDD)
  • 8 RED → GREEN
  • Reconcile prior contracts
  • Update stale assertions
workflow
PHASE 4
GATE (human)
  • I read the diff
  • Reject 2 of 3 sub-plans
  • Approve one
HITL gate
PHASE 5
DEPLOY (audit)
  • bin/deploy-staging.sh
  • --confirm required
  • audit-log write
wrapper
PHASE 6
VERIFY (5 src)
  • git log / reflog
  • ls-remote + CF API
  • curl + grep
receipts
475 / 475
web tests pass
0
regressions
index-D49IMDRo.js
bundle live
5/5
receipts match

⟨ Phases 1-3 are workflows. Phase 4 is where the human redirects. Phases 5-6 are receipts. ⟩

13 / 18

/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.

14 / 18

/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 ↑.

15 / 18

/14· FRAMEWORKS I WORK IN

I don't reinvent. I cite the literature.

These are the canonical patterns I implement in my work — from the canonical sources that defined them.

Framework Source Where it lives in my work
Workflows vs Agents Anthropic, "Building Effective Agents" (Dec 2024) Slide 13 — phases 1-3 are workflows; phase 4 is where the agent redirects itself
Augmented LLM
(model + tools + memory + retrieval)
Anthropic, same article Slide 9 — the agent harness is the augmented LLM
Agent Loop
(prompt → tool → observe → repeat)
Cursor · Hermes · Claude Code · Aider Slide 2 — Hermes persistent state + memory
Sub-Agent Delegation
(orchestrator / leaf pattern)
LangGraph · AutoGen · Hermes delegate_task Slide 13 phase 2 — 3 parallel sub-agents (spec / risk / test)
MCP — Model Context Protocol Anthropic, MCP announcement (2024) Slide 3 — the Agent Worker / Tool Executor is an MCP-style catalog
AgentOps
(deploy / observe / rollback)
IBM, "What is agentic engineering?" (Feb 2026) Slide 10 — the 5-source receipt chain IS AgentOps
Agent Eval Harness Anthropic evaluator-optimizer · IBM agent evaluation Slide 8 — TDD as the eval harness; tests are golden traces
Parallelized Guardrails Anthropic, "Building Effective Agents" Slide 7 — HITL on deploy + audit log = guardrails
Agentic RAG IBM, "What is agentic RAG?" Future: my agent will query past sessions before acting
Recursive Self-Portrait
(the deck proves the agent)
This deck · slide 2 line 52 Built by the same stack it shows — strongest agentic test

Anthropic · IBM · LangChain · MCP · Hermes docs — all read, none reinvented.

16 / 18

/16· RECEIPTS

How to verify this isn't hype.

Every claim on this deck points at a verifiable artifact. Open the receipts — don't trust the slide.

REPO
github.com/oscarhyc/
244 commits · 22 releases
TESTS
Vitest + Playwright
475 / 475 web · 1,130 total · 0 flaky
LIVE
staging.taxi-rental.pages.dev
200 OK · verified this session
EDGE
cv-deck.pages.dev
this deck · live
AGENT
Hermes Agent + MiniMax-M3
documented · slide 2
HARNESS
bin/deploy-staging.sh
bin/d1-safe.sh · AGENTS.md
RECEIPTS
5-source deploy chain
git + reflog + ls-remote + CF API + curl
FABRICATION
Caught + disclosed
honesty over plausible output

⟨ Trust with receipts. Not "trust me." Open the git log. ⟩

17 / 18

/17· CONTACT

Let's talk.

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

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

18 / 18
01 / 18 F fullscreen S scanlines