Skip to the content.

Prompt log

Raw record of conversations driving FotA system design. Newest at the bottom. Excludes secrets and tokens.

Each entry: date / context / what was decided.

→ Back to Initial review of the operating system.


2026-05-02 — Initial planning + Phase 0 + Phase 1

Context

First conversation. Trevor sketched the system on paper (initial plan + master plan). Goals:

  1. Master Gantt sheet (Dream Team, structured task list with bar visualization)
  2. HTML dashboard (SLT, “where are the numbers and what are we planning”, Thursday weekly)
  3. Data hygiene on master enrollment sheet (paying weeks per segment)

What was decided in this conversation

Artifacts created (Phase 0 + Phase 1)

Still to come

Notable surfaced corrections


2026-05-02 (continued) — Phase 1 execution

Done

Confirmed limitation

Pending Trevor action (blocks Phase 2)

  1. Create empty Google Sheet titled “FotA Gantt Master 2026”.
  2. File → Import → Upload seed/gantt-seed.tsv from this repo → “Replace current sheet”.
  3. Verify column headers match schemas/gantt.schema.json.
  4. Share sheet with edit access (Apps Script will run as Trevor’s account).
  5. Paste sheet ID into the next session.

What Phase 2 covers (after gantt_master exists)


2026-05-02 (continued) — gantt_master live

gantt_master Google Sheet now exists with all 26 seed tasks imported. ID: 1F06eNR3jFuNAAUoGMQzZgD0U-dyYt5NxqPH9b_9puE8 Verified via gdrive_read_file: headers match schemas/gantt.schema.json, 26 rows present.

MCP gotcha logged

Trevor handed off to run Matt Pocock skills

Pause here. Resume Phase 2 after skills runs land any reframing or doc updates.


2026-05-02 (continued) — Phase 2 design grilling + ops scaffold

Long session. Restarted Claude Code mid-way to activate caveman + Matt Pocock skills. Trevor invoked /grill-me to stress-test the Phase 2 plan before any code.

Major design shift: 4 products × 9 segments

Original (ADR-0002): 2 products, 5 segments. New (ADR-0009, supersedes 0002): 4 products, 9 segments + Dove placeholder.

Other locked decisions

Renamed: enrollment_master → fota_master

Same Sheet ID. Trevor preferred a name aligned with how the team refers to it day-to-day.

Vocabulary system

Two-layer artifact strategy locked because most SLT are teachers (limited experience with software jargon). Tauquil + Adam + Melissa + Federico + Poom can read the technical layer; rest of SLT see only simplified language. Translation map in docs/vocab.md.

Org map locked

docs/staff.md captures 18 people: Dream Team (Trevor, Mark, Sarah, Neung, Marissa), product owners (Sumeet/Amanda for PE39, Isabella for Samakee, April for Dove), school SLT (Tauquil, Payal, Heather, Jem, Melissa, Adam, Poom, Federico), and Anat (IT).

Important relationship: Trevor wants Melissa “in the lead at the front” with him; Tauquil + Adam are final approvers; Sarah shields Federico so he stays focused on broader marketing.

Engineering-skills setup

/setup-matt-pocock-skills ran for this repo:

Architecture-deepening sweep (/improve-codebase-architecture)

Two passes. First surfaced 6 candidates; CONTEXT.md (ARCH-3), hygiene.schema.json (ARCH-2), and test infra (ARCH-6) folded into Phase 2 implementation. Second sweep surfaced 4 more friction points, of which parking-lot drift, HANDOFF staleness, architecture↔CONTEXT duplication, and config module fold-in landed this session. Vendoring CI (ARCH-1), gantt_migrations (ARCH-4), and audit-log split (ARCH-5) deferred per priority lean.

PRD published

/to-prd ran. PRD captured with 36 user stories, full implementation + testing decisions, schema migration sequence. Published as fota-ops#1.

22 vertical slices + prereqs published

/to-issues decomposed PRD into 14 vertical slices (#2, #11-#18, #20-#23) and 8 external-owner prerequisites (#3-#10, #19). Critical-path graph in HANDOFF.md.

Triage state

/triage walked all 23 issues. 13 marked ready-for-agent with Agent Brief comments (scope boundaries, key interfaces, module depth, cross-cutting context). 10 marked ready-for-human (PRD parent, 8 external prereqs, 1 acceptance test).

MVP 0.1 deliverables

For Tauquil + Adam Tuesday review:

Acceptance test reassigned

Originally Marissa hand-counts on 2026-05-23. Trevor corrected: Neung hand-counts; Marissa supports (scope to be defined).

Trevor handoff

Asked for one commit + push to share with a fellow dev, plus an email to Tauquil + Adam summarizing the system in his voice. Sharing this prompt log too — transparency of work + democratization of practice.


2026-05-03 — Brand guideline + 16-item idea dump

Brand guideline .pptx shared at C:\Users\trevo\Desktop\FotA\ELC brand guideline_shared .pptx (45 MB). External marketing aesthetic; intended as reference for internal-tool aesthetic (same language, internal purpose) when dashboard reaches aesthetic-design phase.

Trevor dumped 16 ideas for the backlog — all logged in docs/parking-lot.md under “Ideas backlog (added 2026-05-03)” with IDEA-01 through IDEA-16. No triage; revisit when ready.

Notable threads:

Trevor reframed Section 5 of the Pages one-pager: dropped the “millions of baht” line, replaced with: “The Festival of the Arts has three primary goals: increase revenue at a time of low cashflow, build brand reputation, and deliver great educational experiences.” PR #25 merged.


2026-05-04 — Phase 2 full build + go-live

The big one. Entire Phase 2 built and deployed in one session. Dashboard is live.

Timeline reframe

Trevor clarified the build deadline: not two months of work — Wednesday ops meeting and Thursday SLT view are the launch targets. Everything ships this week.

Apps Script (fota-dashboard)

All code written and deployed via clasp to trevorc@elc.ac.th Apps Script project:

Key parser decisions locked in session

Dashboard features

Deployment

Grill session (10 questions)

  1. Access — Anat contacted, editor access workaround; /exec blocked by domain admin
  2. Week structure — 6-week PE39, 4-week ELC confirmed correct; S2W1/S2W2 = naming-only hygiene fix
  3. Banner — “+50% better” stays
  4. Gantt hygiene — Trevor does Mon-Wed; Thursday shows real tasks
  5. PE39-External-Local = the funnel — most important segment, T1/T2 N/A students are hot leads for K1 conversion
  6. Pre-registration tab — different structure, not parsed; Issue #44 created; blocked on Sarah+Mel cleanup
  7. Samakee TBD — P0 Tuesday; Sarah→Isabella→Neung cadence is the unlock
  8. Triggers — installed
  9. Thursday review — Trevor 08:30 spot-check; Anat dead-man’s switch
  10. Booking-weeks vs headcount — renamed section + per-week strip added

Data source discovery

Renames + housekeeping

Pending before Wednesday


2026-05-04 — v3 design handoff

Design session: two new surfaces designed and handed off for implementation.

What was designed

Gantt — timeline-first (option B) Swimlane Gantt with collapsible rows, today-line, weekend shading. Group by Product | Owner | Phase. Zoom Day | Week | Month. Bar status encoded as fill (solid/hatched/outlined/checked). Hover → full task card. Theme toggle.

SLT Dashboard v2 Seven sections top-to-bottom: Masthead (weekOf + phase pill + refresh marker), North-star row (Tauquil +50% callout, committed paying-weeks, vs 2025 placeholder), Numbers Grid (4×3 + Dove placeholder + _pending_dove bucket), Activity (3 pivots: Timeline / By owner / By dept), Open dependencies table, Retrospective (gated on phase === "inaugural"), Footer (schema version citations).

Two-way sync activity surface (headline change in v0.3) Every task in the Activity section now carries a SyncBadge (● SHEET in info-blue / ● DASH in gold) derived from audit_log last entry, falling back to source. Filter chip narrows the whole section by write direction. Dept pivot shows counterparty arrow for SLT-touch tasks. Edit count shown when audit_log.length > 1.

Design tokens locked

tokens.css is the single source of truth. Key additions vs Phase 2: --gold (#AC9D71, inaugural/dash badge), --info (#4D6B86, sheet badge), product tints (four pastel fills). Type: Inter Tight 300–700 + Fraunces display-only. Spacing: 4px baseline, --s-1 through --s-10. Radii: 3/6/10/pill. Shadow: one quiet shadow only.

Artifacts created

Bundle added to both repos: fota-dashboard/design_handoff_v3/ (primary) and fota-ops/design_handoff_v3/ (reference copy).

Issues created

Open questions deferred to v3 implementation

Samakee segments (#4 · Sarah · 6 May), Dove segments (#5 + #28 · April · TBD), 2025 backfill (#6 · Mark + Neung · 15 May), INTL Y/N column (#3 · Neung · ASAP), source-of-truth lock (#7 · Trevor + Sumeet/Amanda + Neung), OAuth (#47 · Anat post-MVP).

Next step

Open fota-dashboard/ in Claude Code, paste design_handoff_v3/CLAUDE_CODE_PROMPT.md, implement. Target: Thursday before SLT or Friday after.


2026-05-05 — Historical ELC data folded in

Trevor shared the Summer Revenue 2023-2025 sheet (1T07DYVXB2uMBM5lKakYqUybJy8TkNvLkJ2wp5zDL6lM). Contains ELC paying-weeks by grade (K1-Y6) per week across 2022-2025.

What was derived

ELC year totals: 2022=466 / 2023=339 / 2024=400 / 2025=293. The 92 K1 drop (176→84) is confirmed from primary data. Weekly breakdown for 2024 and 2025 captured.

Segment mapping from this data:

What was built

Issues

Still open

ELC-External split + PE39 history still needs Mark + Neung (#6, due 2026-05-15). When that lands, update HISTORICAL_2025 in config.gs and deltaLastYear populates automatically.


2026-05-04 — v2 merge recovery + bug fixes + “The Bar” target metric

Same session, later in the day. Three issues surfaced and fixed.

Bug 1: Gantt reading wrong sheet

readTasks() was calling getActiveSheet(), which is editor-state-dependent in a web-app context (returns whichever tab the script editor had open last, not reliably the data sheet). Fixed to getSheets()[0].

Bug 2: clasp push overwrote live v2 dashboard

Local main branch had the older ~265-line dashboard.html; the live Apps Script project had been running the full v2 facelift (~1500 lines). Running clasp push from main overwrote it.

Fix: git merge origin/v2, resolved conflicts by taking v2’s dashboard.html wholesale and manually merging the historical-data additions into api.gs and config.gs. Clasp pushed all 12 files. Dashboard restored.

Bug 3: deltaLastYear not rendering

metricCellHtml() in dashboard.html had the delta-last-year span hardcoded to . Wired it up to read seg.deltaLastYear from the payload: positive = green, negative = red, null = dash.

“The Bar” north-star target metric

Added a target block to the north-star section: 440 = round(293 × 1.5) (ELC 2025 realized × +50% Tauquil target). Shows:

Numerator uses totalCommit (all products, committed payingWeeks) — not ELC-only — because the goal is to celebrate all bookings as they land. Finance-lag reasoning: Trevor’s position is show committed and then chase finance to collect; don’t gate the dashboard headline on payment speed. Memory saved.

Deployed state

Clasp pushed 12 files. Live at /dev endpoint. No new issues created (all fixes in-flight on existing work).


2026-05-07 — V2 launch day

New laptop pickup + V2 SLT-ready batch + Todoist dump. SLT meeting at 13:30 Bangkok was the first time the V2 surface was seen externally.

Context

Trevor on a fresh MacBook with no Homebrew, no gh, no clasp, no .clasp.json, no Node. Goal: ship V2 dashboard live before 13:30 SLT meeting. Constraint: Workspace admin policy disables ANYONE and ANYONE_ANONYMOUS web-app deployment access — the Apps Script editor’s Deploy dialog rejects every save.

What was decided + built

Setup gap (laptop migration).

Per-repo skill config (mattpocock skills). /setup-matt-pocock-skills ran in fota-dashboard for the first time. Wrote docs/agents/issue-tracker.md (GitHub on Tr3v0r86/fota-dashboard, implementation issues only), docs/agents/triage-labels.md (defaults), docs/agents/domain.md (redirects skills to ../fota-ops/ for CONTEXT.md + ADRs since fota-dashboard intentionally has none locally per ADR-0001). Added ## Agent skills block to fota-dashboard CLAUDE.md.

2025 ELC audience baselines wired (issue #6 / T-NEW-I closed).

Realization that drove IDEA-17. Trevor surfaced the structural reality: there was no FotA tracking system, no live commitment counts, no audience field anywhere in 2025. This means historical 2025 numbers are anchors (where last year landed), never a pace reference. deltaLastYear semantic of current − 2025_total is therefore structurally meaningless during build phase — it would read ▼ ~200 vs '25 all summer. Captured in parking-lot IDEA-17 with three options; recommended option (d): hide the YoY chip during build phase, restore at inaugural. Implemented in V2. Same-week-of-season parity (option c) was previously listed but is structurally impossible — that data never existed.

Schema renames landed in canonical source. counterparty → others (#27) and PE39 label → Thonglor PEs (#29) had been applied to fota-dashboard’s vendored schemas at the time of the 2026-05-04 grill but never propagated back to fota-ops as the canonical source. Fixed: updated fota-ops/schemas/gantt.schema.json, seed/gantt-seed.tsv, docs/staff.md, and schemas/segments.json (label-only rename for PE39, internal keys stay). Also caught a separate gantt.schema.json v1.1.0 vendoring drift (fota-dashboard had bumped to v1.1.0 with the dept column per ADR-0010, fota-ops never received it) and synced. #29 closed; #27 moved to ready-for-human for Trevor’s manual gantt_master Sheet header rename.

Domain auth. Workspace admin disabled ANYONE web-app access. Trevor’s existing /dev URL was being shared with SLT, which doesn’t work for non-editors. Resolution path:

  1. Switched deployment “Who has access” to “Anyone within ELC International Schools”.
  2. Manifest required webapp.access: DOMAIN (was ANYONE_ANONYMOUS — admin policy rejection).
  3. Switched executeAs: USER_DEPLOYING (Trevor) so script reads fota_master/gantt_master with Trevor’s permissions.
  4. Existing 1.9.9 deployment had ANYONE persisted in its config — couldn’t be edited (admin block). Created a fresh deployment with explicit DOMAIN settings; old one archived. Updated index.html (root + dashboard/) to redirect to the new /exec URL.
  5. Documented clasp deploy -i <deploymentId> as the canonical deploy path; Apps Script editor UI is now permanently unusable for this project. Codified in fota-dashboard/CLAUDE.md + a feedback-style memory.

Live /exec deployment ID: AKfycbwqnU-iy23rq_3ZO476A7l62HWaixiY-4MaT8WR775Wm_VDGEWfXk_UvmxaJ_kU7Rha

SLT-ready dashboard polish (16 fota-dashboard versions today, v1.9.7 → v1.9.17).

Todoist one-shot dump. New sendTasksToTodoist(targetName, token) server function. User pastes their Todoist API token (one-time per session; no persistence), button POSTs each open task to their Inbox via the v2 REST API. Each task gets [FotA] content prefix, due_date if present, notes as description. Token never logged or stored; audit row records count + first error only. Uses existing script.external_request scope. No per-user reauth.

Triage cleanup.

Schema bumps

Issues touched

Still open

Deployed state

Live at the new /exec URL @18 (clasp deploy version 18). Domain auth on. SLT meeting at 13:30 today is the first external view of V2. Default deploy workflow going forward is fota-deploy "<description>" — no editor UI.


2026-05-08 — V2.1 PM-tool pivot + dashboard development door closed

Day after V2 launch. Trevor pivoted the dashboard’s role.

Context

V2 SLT meeting went well. Trevor reframed: dashboard = PM tool for him, not a team operating surface. People won’t email themselves tasks; people won’t link Todoist. Last/this/next week is good. New requirement: list tasks per user, email-with-note. Sarah on holiday after EOD 5/8 for 2 weeks. PE Heads (Sumeet + Amanda) treated as a single entity. April leads Dove with Mark supporting; Neung point on Isabella for Samakee. Trevor’s framing: “the dashboard is not the work, the work is the work.” V2.1 closes dashboard development.

What was decided + built

Grilled the pivot via /grill-with-docs. 9 design-tree branches resolved one at a time:

  1. Audience — single dashboard, full content for all (SLT keeps task visibility), condensed presentation. No role-gated views. CONTEXT.md updated.
  2. PE Heads — coined as canonical term for Sumeet + Amanda jointly. Server-side OWNER_ALIASES collapses Sumeet/Amanda/Sumeet/Amanda → “PE Heads” in per-owner views; gantt rows keep their literal owner string (no historical retag).
  3. YouSection repurpose — same physical location, eyebrow “What needs you” → “Per-person view”; h2 from “{name}’s desk” → just “{name}”. Drop email-self / Todoist; add email-with-note.
  4. Email-with-note design — textarea + this-week tasks (overdue + due-within-7d, drop backlog) + inline HTML body + server-side recipient lookup via STAFF_EMAILS (PE Heads → Sumeet + Amanda; @elc.ac.th validation server-side) + cc-toggle off-by-default.
  5. Decision log → IDEA-19 (deferred — not enough decisions to justify; ties into existing retrospective surface when ripe).
  6. Sarah-out coverage → time-bounded notes in docs/staff.md (5/22 checkpoint task), not permanent CONTEXT changes. April + Mark on Dove; Neung point on Isabella; Mark covers Mel reconciliation; Trevor + Mark cover parent comms.
  7. Sprint cadence not seeded in gantt — Trevor’s PM rhythm lives in his calendar, invisible to SLT by design. seedSprintCadence() deleted from seed-tasks.gs.
  8. UI compaction (a) merge North star + The Bar into a single row (saves ~120px); (d) Overdue collapsed-when-empty to a single muted line; (e) Retrospective wrapped in <details> at the bottom — closed by default.
  9. Ideas redesign — scrollable list (max-height 340px, all ideas visible not top-6) + inline-expand <details> per row exposing owner picker + due-date input + Promote button. New promoteIdea(taskId, owner, due) server function: atomic status=’idea’ → ‘not-started’ with owner/due/updated_at write, single audit row.

Dashboard surfaces touched (apps-script/dashboard.html):

Removed:

STAFF_EMAILS table added to dept-mapper.gs. Confirmed entries: Trevor, Mark, Adam, PE Heads (→ both). Other entries are guesses pending verification — won’t break anything (server validates @elc.ac.th + manual override is always available in the form).

Schema bumps

metrics.schema.json v1.2.0 → v1.3.0 (already landed previous session): adds historicalTotals.productRef25, top-level deltaBaseline, documents previously-undocumented payload fields.

Issues touched

V2.1 deploy

Live at /exec deploy version @19. Clasp-deployed via fota-deploy flow. Same URL across versions.

Door closed

Trevor explicit: “The dashboard is not the work, the work is the work.” V2.1 is the final dashboard ship for FotA Summer 2026. Going forward, dev attention reallocates to:

Dashboard receives no new features without an explicit reopen decision. Bug fixes only.


2026-05-09 — V2.2 final lock; the dashboard is the rolling document

Same-day continuation after V2.1 ship. Trevor closed all remaining gaps + locked V2.2 as the final dashboard ship.

Trevor’s framing

“The work is the work now. Dev ideas stay hidden on the dashboard but logged in the git. Only a few tweaks to make as data gets cleaned but this is the rolling document until FotA ends. Daily touches by me. Pushes to get the ball rolling. Work visible, data is the anchor.”

What landed in V2.2

Per-person view extensions

The Bar reworked

Wk-over-wk delta — anchor-always

Numbers grid — visible accountability

Refresh + email + log

UI cleanup

Public site ingest

Decisions locked

Deployed state

Live at /exec deploy version @35. Domain auth on. Same URL across all V2.x versions.


2026-05-12 — V2.2.20 lock; What is FotA narrative + strategy critique loop + done-week visibility + 2025 PE baselines

V2.2 was supposed to be the final ship, but five days of dashboard touches surfaced enough operational polish that V2.2.20 becomes the new lock point. Same freeze rule applies: bug fixes only after this.

Trevor’s framing

Two-week sprint of operational tightening. The strategy page “what is fota” is the spine; the dashboard surfaces are the rhythm. Status chips open to everyone so people close their own work. The work is the work; the dashboard supports the work, it is not the work.

The strategy spine — What is FotA + Data Pack pages

Three new gated surfaces alongside the dashboard, all DOMAIN-auth, served via Apps Script’s HtmlService.

Strategy critique widget (server pipe + side rail)

Anyone signed in with an @elc.ac.th account can submit a strategy critique from the What is FotA page.

Parser bugs (P0) caught in deployment

Hygiene loud-fail email

Each rebuild compares derived per-week column-sums against each grade tab’s “Total Students Per Week” footer row. Mismatches written to _hygiene as a JSON sidecar and emailed to trevorc@elc.ac.th with Subject: [FotA Dashboard] hygiene FAIL · N mismatches · YYYY-MM-DD. Silent when totals agree. First-fire diagnosis: row-76 formula counts ENG only, not MAN — to be fixed sheet-side.

Calendar-week semantics for “Done this week”

Switched from rolling 7-day window to true calendar week (Monday 00:00 BKK onward) per Trevor: “This week is this week.”

Status chips opened to all domain users

writeTaskField permission gate now branches on field:

Client: status chips always clickable now (no canEdit gate). New .clickable class. Audit log captures the user email on every write, so non-editors closing their own work have full traceability.

Date editing reliability

Original invisible-overlay pattern (opacity-0 input on top of friendly chip) stopped reliably opening native picker in the timeline this-week lane after the lane restructure. Two failed attempts:

  1. v2.2.18 — added onDateChipClick handler with input.showPicker() + z-index: 1 on the overlay. Still flaky.
  2. v2.2.20 — replaced overlay with explicit modal date picker. Click on .date-display opens existing modal with a real visible <input type="date"> inside. Native picker opens on direct click in the modal. “Save / Clear / Cancel” buttons commit through the existing callWriteWithRetry path. Works reliably across the timeline pivot, dept pivot, owner pivot, YouSection, and past-due surfaces.

2025 PE audience baselines

Adam-style per-cell baseline → target chips now render on all three Thonglor PEs audience cells.

What’s locked at v2.2.20

Decisions locked

Deployed state

Live at /exec deployment @56. Domain auth on. Same URL across all v2.x versions.