Proof of Work

The hash-chained billing ledger, newest first
Chain intact. All 25 entries verify against their predecessor. Every hash was recomputed from the entry's own fields at build time β€” not read from the file.
$35/hr
Rate
Recorded on each entry, not assumed
52.37
Hours logged
25 entries across the engagement
40.37
Billable hours
12.00h logged unbilled
$1412.83
Billable value
At the rate recorded on each entry
110
Artifacts linked
Docs, commits and files produced

Invoices

Listed from worklog/invoices/register.jsonl, the append-only record of what has actually been issued β€” not from whatever files happen to sit in the directory. Each PDF is rebuilt from the ledger and served from this hostname behind sign-in. Payroll runs Monday to Sunday; each invoice is prepared the following Monday and due that Wednesday.

InvoicePeriodHoursAmountDueDocument
INV-2026-08-032026-08-03 β†’ 2026-08-0938.33$1341.672026-08-12
PDF not generatedπŸ“„ Markdown

$1341.67 invoiced across 1 invoice. The register is hash-chained the same way the ledger is β€” npm run invoice:verify walks it.

Where the time went

engineering
30.83h
59% of logged time
strategy
10.75h
21% of logged time
meetings
7.25h
14% of logged time
research
3.53h
7% of logged time

The ledger

Newest first. Each row carries its own hash and its predecessor's, so the chain is auditable from the table itself. Rendered as rows rather than cards: as a card stack this page grew without limit and took progressively longer to load, which is the opposite of what a proof needs to be.

When (ET)HoursCategoryWhatArtifactsValueChain
Aug 10, 2026, 12:51 AM0.18engineeringCarry-forward billing, so late-logged work is never stranded and never billed twice
4 details
  • Built the carry rule: an entry bills on the earliest-issued invoice not before its own week and not issued before it was logged (#136)
  • Made rebuilds faithful β€” an issued invoice now reconstructs as of the instant it was issued, fixing a false mismatch warning
  • Closed a config-drift hole: the register now records the parties and commit as issued, so a job-title change cannot restyle a sent invoice
  • Logged the two previously unlogged blocks and pruned 7 superseded branches and 12 merged remote refs
$6.42#25 3e3e169b…
Aug 10, 2026, 12:18 AM0.55engineeringWeekly invoicing shipped end to end: the system, the first invoice, the PDF, and three corrections
6 details
  • Shipped the weekly invoice system β€” payroll calendar, builder, hash-chained register, CLI and Monday cron β€” with 33 tests (#131)
  • Issued INV-2026-08-03: 38.33h, $1,341.67, due 2026-08-12, and installed the Monday cron
  • Fixed a refused re-issue that was overwriting the invoice it refused to reissue (#132)
  • Corrected the name to Mickell John everywhere it was not cryptographically signed (#133)
  • Added PDF export with a where-the-time-went summary, and a download link on Proof of Work (#134)
  • Renamed the role to Lead AI Engineer, from this date forward (#135)
$19.25#24 b02b8ce3…
Aug 9, 2026, 8:09 PM1.30engineeringThe 08-09 late block: the missing hours logged, dates fixed across three surfaces, and the weekly invoice tooling drafted
4 details
  • Logged the three previously unbilled blocks β€” 08-08 late, and both 08-09 sessions
  • Fixed dates running backwards in the report, the invoice and the ledger page
  • Gave the Content Engine a layout that matches what it does (#129)
  • Drafted the weekly invoice tooling β€” the payroll calendar, the builder, the register and the CLI β€” left uncommitted at session end
$45.50#23 d5cd5f11…
Aug 9, 2026, 4:21 PM3.80engineeringThe long 08-09 block: typography and cross-browser fixes, the $300 credit retired from consumer copy, the fact guard built and then measured against its own criteria
13 details
  • Gave the landing pages a typographic system and finished wiring it through (#103); shipped the font licence, since naming one is not shipping one (#106)
  • The dashboard's four charts had never once rendered (#104); type-checked the half of every page tsc had never read (#105)
  • Retired the $300 credit from consumer copy in the four places it survived (#107), then the one instance that would have had a permanent public URL (#108)
  • Loaded the site in three browsers and fixed the two contrast failures that found (#109)
  • Refused to build a page whose TODO a prospect could read (#110); made the failures announce themselves instead of passing silently (#115)
  • Content generation was rejecting 100% of what it generated (#111) β€” diagnosed and fixed; closed the Anthropic key gap on the edge Worker (#112)
  • Landing page drafts now generate as files with the unknowns routed out of the copy (#116), and every number in a generated page gets reported (#117)
  • Lane C b-roll prompts with the lane boundary enforced mechanically (#118), then three fixes the checker itself needed: rejected shots returned for diagnosis (#119), a check matching the word inside its own exclusion (#120), and dolly being treated as zoom (#121). Both generators put on a screen (#122)
  • PE Readiness had a status board and no plan; gave it one (#124)
  • Specced the fact guard for the failure the compliance linter does not look at (#113, #125), built it (#126), and made a repeated mistake report once (#127)
  • Measured Stage 2 against its own criteria and did NOT flip it: 20 topics, 60 ideas, 31 warnings, two thirds of them a number about the reader read as a claim about the club. Pruned the blocks lists, added a reader/club discriminator, 31 warnings became 3, and recorded the remaining gap as a named test rather than a commit message (#128)
  • Suite went 232 to 237 tests, all green
  • Span is commit-bounded β€” 16:21 to 20:09 β€” so the measurement runs and the reading that preceded them are under-claimed
$133.00#22 d7a64bcd…
Aug 9, 2026, 12:11 PM1.40engineeringMedia library specced and built, the workflow audit, and eight landing pages with their ad, SMS and email copy
9 details
  • Stopped the daily briefing dying on its own output (#86) β€” it choked on the bundle it had just written
  • Specced the media library, the question of where footage actually goes (#84), then built it: a home in the Content Engine (#89), a display that showed nothing and listed fonts (#90), and a filter that forgets the 80 files that are not footage (#91)
  • Added Reports and put the money first on the dashboard (#92); replaced a bespoke pager with the one the hub already had (#93)
  • Audited the 170 published GoHighLevel workflows into something reviewable (#95), then recorded the finding that matters β€” the API cannot fix any of it, so every repair is manual (#96)
  • Six modality landing pages (#97), plus top-of-funnel and seasonal (#98) β€” eight in total for campaign traffic
  • Wrote the matching Meta ad creative (#99) and the SMS and email sequences (#100) for all eight
  • Caught two tools quietly lying: lint-cli reported clean on files it never opened, and the landing page index listed pages that did not exist (#101)
  • Gave the pages a hero, a CTA reachable without scrolling, and a trust strip that only claims what we can support (#102)
  • Span is commit-bounded β€” 12:11 to 13:35 β€” and excludes the research and drafting that preceded the first commit
$49.00#21 69f9a862…
Aug 8, 2026, 10:40 PM0.98engineeringThe 08-08 late block: Cerebral gets memory and a voice, the dashboard gets real charts, and the Content Engine goes end to end
9 details
  • Hub UI pass: loading states, accordions, focus and hover treatments, and a nav drawer that actually closes (#73)
  • Gave Cerebral a memory plus a tool to write to it (#74), then speech in and speech out (#76)
  • Drew the dashboard properly β€” donut, trend line, ranked bars, all inline SVG, no chart library (#75)
  • Shipped the Content Engine: brief, compliance check, publish (#78), then made it actually cook content rather than return stubs (#80)
  • Scheduled the daily briefing for real (#79) after finding it was only ever run by hand
  • Stopped /privacy and /terms 404ing β€” those two pages take paid traffic (#77)
  • Stopped throwing away leads when GoHighLevel is down (#81) β€” the failure path discarded the payload instead of queueing it
  • Made the squad cards check rather than claim (#82), and moved the new endpoints to where Access can actually reach them (#83)
  • Span is commit-bounded β€” first commit 22:40, last 23:39 β€” so it under-claims the lead-in before the first commit
$34.42#20 0ded137c…
Aug 8, 2026, 9:54 PM0.75engineeringEngagement audit shipped, the dashboard's silent-loading bug fixed, and Open Items rebuilt around recorded outcomes
7 details
  • Audited the whole engagement 08-04 to 08-09; the finding that reframes it is 50 of 59 open items owned by the client, 8 by the CTO, 1 by counsel β€” engineering has run ahead of its inputs
  • Turned that into tools/build-plan/plan.mjs β€” the plan as data, tested, rendered at /dashboard/build-plan; roadmap.md demoted to phase framing, ENGAGEMENT.md restated as 'platform built, outbound blocked, nothing sent'
  • Diagnosed the dashboard stuck on 'Loading…': index.astro was the only screen still calling fetch itself instead of load(), so an expired Access session on the /api/dashboard app came back as a cross-origin redirect the browser would not expose. Shipped and deployed
  • Rebuilt Open Items around recorded outcomes: tools/open-items/actions.mjs holds the plan, the picklist and the rule mapping an outcome to a status, blocked-on, chase date and trail sentence. 27 tests, shared between the Node suite and the browser
  • Every outcome that leaves an item waiting now requires a date it comes back β€” the rule that would have surfaced the 50-item client pile. Two KPIs added: no plan recorded, and due now
  • Wording pass: six statuses in plain English, trail as sentences not database diffs, Warden relabelled (it is on β€” its being on IS the write flag reading false), Posting Engine's expired 'not in the public API' reason replaced, Content Engine given the sidebar entry it never had
  • CI switched to d1 migrations apply β€” the old step named one file, so migration 0002 would have shipped a Worker whose every write referenced columns that did not exist
$26.25#19 1e255986…
Aug 8, 2026, 9:30 PM0.40engineeringUGC machine: spec, lane model, compliance gates, shot grammar
7 details
  • Identified and researched both reference videos (Claude+Seedance 2.0 UGC pipeline; camera movement prompts) β€” YouTube blocked this IP, reconstructed the method from primary sources
  • Wrote platform/ugc-machine-spec.md: raw-content ingest, lane model, pipeline, stack, cost, build order
  • Wrote platform/shot-grammar.md: camera vocabulary with the ffmpeg-synthesisable column
  • Built tools/ugc/lanes.mjs and lint.mjs β€” provenance and consent gates against 16 CFR Part 465, plus transcript linting
  • 34 new tests, 99 across the suite
  • Found GHL Social Planner IS in API v2 β€” the premise that shelved the posting engine has expired
  • Installed ffmpeg 6.1.1 on the VPS, unblocking ingest and repurposing
$14.00#18 85d5c809…
Aug 7, 2026, 1:06 PM3.15engineeringPer-sweep cron triggers, the daily briefing, the Open Items board, and the email-authentication measurement
6 details
  • Gave every sweep its own cron trigger and made CI actually apply them
  • Built daily briefing collection and fixed the watchdog that had never fired
  • Finished the Open Items board: the /dashboard/open-items screen, 39 tests, and the deploy path β€” wwc-state had zero tables, so the endpoint would have 503'd on first contact (PR #56)
  • Fixed unassignment leaving status stuck at 'assigned', and the 'decided, then changed' KPI pointing at a view that hid every row it counted
  • Measured email authentication and found staff mail failing too: MX is Microsoft 365 but SPF authorises GoDaddy only and ends -all, so every Outlook message is published as unauthorised. No DKIM at any selector, _dmarc NXDOMAIN (PR #62)
  • Built npm run dns:email, wrote the runbook, and filed issues #57-#61 for Cole with exact records and the verification command
$110.25#14 d88709f6…
Aug 6, 2026, 8:36 PM3.33engineeringThe Growth Hub evening build: Zero Trust, CI/CD, the workflow audit, the contact-base correction, and the hub screens
7 details
  • Turned Zero Trust on and closed the open dashboard; added sign-out and fixed an expired Access session reporting as an unreachable endpoint
  • Wired deploy-on-push to main and moved CI to Node 22 β€” GitHub and Cloudflare had never been connected
  • Audited the 170 published GHL workflows empirically: contact creation fires SMS, voicemail, email and calls
  • Corrected the '784 leads' premise across 39 files; wrote docs/research/contact-base.md as the measured source of truth
  • Built the rest of the hub: dashboard screens, work queue, Cerebral, Proof of Work, PE Readiness, cohort tracking, Stripe, KPI/QA/QI, dark theme and pagination
  • Fixed attribution measurement and capture, and restructured Proof of Work
  • CORRECTION to entry #11: that entry's 3h05 span (00:50-03:55) covers the early-morning 2026-08-06 session β€” the VPS runbook correction, the identity-table fixes, the consultation vocabulary and the Cloudflare Pages deploy layer. Its summary and its 8b5b416 artifact instead describe THIS evening session, which had never been clocked. This entry bills the evening only; #11's hours are not duplicated here.
$116.67#13 402982ad…
Aug 6, 2026, 1:58 PM2.87engineeringReports view, the real billing rate, the GHL scope request, the intake form, and the app subdomain
6 details
  • Added the Reports & Analytics view to the Growth Hub
  • Logged the two pre-engagement days at zero and set the real $35 rate; added declared backdating so late entries stay on the record instead of breaking the chain
  • Wrote the GoHighLevel scope request, and corrected the API v3 claim it rested on
  • Built the weight-loss intake form, and made the build refuse to silently drop content
  • Stood up app.worldwellnessclubs.com and fixed three things the first deploy exposed
  • Span reconstructed from commit timestamps on 2026-08-07; logged late because the session was never clocked in
$100.33#12 4abc714d…
Aug 6, 2026, 12:50 AM3.08engineeringBuilt the Growth Hub: dashboard, Cerebral, PE readiness, cohort tracking, Stripe
9 details
  • Stood up the hub on app.worldwellnessclubs.com behind Cloudflare Access (Zero Trust org, one app, 9 gated paths, one-time PIN)
  • Built CI/CD: push to main now deploys and verifies production β€” GitHub and Cloudflare had never been connected
  • Audited the GHL account empirically: 13,331 contacts, only ~1,144 inbound; ~10,875 are cold prospecting lists that must never be sent to
  • Answered the workflow audit by measurement rather than UI review β€” contact creation fires automated SMS, voicemail, email and calls
  • Found every automated email failing (36 of 36) and ~23% of SMS undelivered β€” both live, both independent of the write flag
  • Corrected the '784 leads' premise across 39 files and wrote docs/research/contact-base.md as the measured source of truth
  • Started cohort retention tracking β€” append-only, the one thing in the PE readiness doc that cannot be built retroactively
  • Connected Stripe for revenue quality, MRR and involuntary churn (awaiting the API key)
  • Built Cerebral on claude-opus-5, PE Readiness scoring, KPI/QA/QI, Work Queue, Proof of Work, dark theme and pagination
$107.92#11 7a362490…

Showing the 12 most recent of 25 entries. The remaining 13 stay in the ledger and still verify β€” they are simply not rendered here, because the page should stay fast as the ledger grows. Browse the full ledger.

Rendered from worklog/entries/ at build time. Rebuilt on every push to main.