Project Overview Board
Target milestone
Full contract flow — 24 Apr
Next milestone
UAT — ~8 May
Following milestone
Beta launch — mid-May
Developer availability
Pablo — contracted to mid-Jun
Complete
On track
Needs focus
Blocked / late
Not started
↩ click any item to cycle status
Design & Build
Rulebook v0.152a
LCL v0.20
LCL v0.203 (deferred items)
Rulebook v0.153 (deferred)
Full contract flow (Pablo)
PAT structured input forms
PATReconciled flags audit
CRM API import (Monday.com)
Pablo currently off sick — monitor closely
Testing
UAT
UAT testers confirmed
UAT plan & scripts
UAT execution (~8 May)
Beta
Beta testers confirmed
Beta plan & scripts
Beta execution (mid-May)
Gabby: full lifecycle test
Grimaldi (Slide) flagged by Alex for beta
Marketing
One Pager (live)
Pricing Sheet (live)
Comparison Matrix (live)
Logo / branding (Jacob)
Web page (Jacob / Charlie)
CBA email accounts
Slack / WhatsApp comms setup
One Pager → Matt Hayes
Contracts SME sourcing
Legal & IP
IP Protection Guide
Pablo: IP actions pre-beta
Terms of Service (solicitor)
Legal disclaimer (Tom / James)
NDA for SME / Matt Hayes review
SME / LCL expert review
Companies House verification
ToS must be in place before beta
Revenue & Pricing
Revenue Forecast
Pricing model (tiers)
Free trial / annual discount
Referral scheme
OPEX model
AI / LLM cost model
Beta / influencer pricing
Year-1 ramp pricing (v1.1)
Release Prep & Ops
Before launch
Production environment setup
Pablo: post-MVP support plan
Champions: warranty / handover
External IT / low-cost support
Governance
BoW v3.1 — open items
IT costs baseline
Negotiation advice (v1.1)
Tom param thresholds (v1.1)
Pablo contract end ~mid-Jun — decision needed soon
For Pablo — Tier 2 upgrade: Cloudflare Workers + KV (shared live state)

Currently the board saves state into the URL hash. To upgrade to a proper shared live board (one URL, auto-saves, both users see the same state in real time), the recommended approach is a Cloudflare Worker with KV storage. Estimated setup time: 30–45 mins.

Steps:
1. In the Cloudflare dashboard, create a KV namespace called CBA_BOARD.
2. Create a new Worker with the following code:
export default {
  async fetch(req, env) {
    const cors = {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
      'Access-Control-Allow-Headers': 'Content-Type',
    };
    if (req.method === 'OPTIONS') return new Response(null, { headers: cors });
    const url = new URL(req.url);
    const key = 'board_state';
    if (req.method === 'POST') {
      const body = await req.text();
      await env.CBA_BOARD.put(key, body);
      return new Response('ok', { headers: cors });
    }
    const state = await env.CBA_BOARD.get(key);
    return new Response(state || '{}', {
      headers: { ...cors, 'Content-Type': 'application/json' }
    });
  }
};
3. Bind CBA_BOARD KV namespace to the Worker (in Worker settings → Variables → KV Namespace Bindings).
4. Replace the saveState() and loadState() functions in this HTML file with fetch() calls to the Worker URL.
5. Add a 30-second setInterval poll on loadState() so both users auto-refresh.

Security: Add a shared secret header check in the Worker if you don’t want the endpoint publicly writable.