Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .okf/design/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ GENERATE). Surface-to-source table and the review contract:
* [Cover pipeline](cover-pipeline.md) - rebuilding course covers from the design spec
* [Course typography](course-typography.md) - the course-scoped reading scale and the specificity trap
* [Course-landing component rules](course-landing-components.md) - one loud element, 3 dark zones, and why the post-hero slot is not a router
* [Landing anatomy is settled; register is the variable](landing-anatomy.md) - the shared skeleton, and the register-pilot mechanics: copy stays identical, the accent dies on the inverted band, pinned gates stop guarding
* [Landing anatomy is settled; register is the variable](landing-anatomy.md) - the shared skeleton, and the register-pilot mechanics: copy stays identical, the template's own classes lose to your tag-scoped defaults, measure the accent on the inverted band, pinned gates stop guarding
25 changes: 24 additions & 1 deletion .okf/design/landing-anatomy.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,35 @@ with the "found nothing" assertion inside the shared helper so no caller can
iterate zero pages and report green. Widen these when adding a pilot, and prove
it by breaking the new pilot's copy and watching the failure name that file.

**A class the shared template hands you can be silently outranked by your own
tag-scoped default.** `landing.html` marks the comparison's "theirs" column
`.rr-td-muted` (0,1,0), but a register that sets `.rr-table tbody td` (0,1,2)
for its body colour beats it, and the column renders in full ink - the
comparison stops comparing while the CSS still READS correct. Found in pilot C
by walking computed colours (`oursColor !== theirsColor` per row); the same
shape is live in `next-editorial.css`, so pilot B's muted column is its body
tone. Scope the override past the default (`.rr-table tbody .rr-td-muted`).
Applies to every class the template supplies: assert the computed value, never
the declaration.

**The accent does not always die on the inverted band - measure YOUR cut.**
Pilot B's deep red is 2.31:1 on ink and had to invert to paper. The standard
ruby `#cc342d` is 3.46:1 on `#18181b`: still under the 4.5:1 text floor, but
over the 3:1 a filled button's edge needs, with white on ruby at 5.13:1
inside it - so pilot C's closing CTA stays ruby. The rule is "no accent TEXT
on ink", not "no accent on ink". A register drawn in hairlines must also step
its structural rules up when the ground inverts (`#71717a`, 3.67:1) or the
geometry that IS the design dissolves.

**Self-hosted faces: one file per REGISTER when a register needs several.**
The stub's `font:` key carries one stylesheet and one preload, so a three-family
register ships `static/css/fonts-<register>.css` rather than three
`fonts-<family>.css` files and an edited shared template. Variable families
serve every declared weight from ONE latin binary, which is why two
`@font-face` rules can point at the same URL.
`@font-face` rules can point at the same URL. A register-keyed stylesheet may
also point at a binary ANOTHER register already shipped - pilot C declares its
own JetBrains Mono face against pilot B's `/fonts/jetbrains-mono-latin.woff2`
rather than committing a second copy of the same bytes.

Ship only the weights the artifact actually uses - then **walk computed
`font-weight` in the rendered page**, because a declaration grep cannot see
Expand Down
33 changes: 33 additions & 0 deletions .okf/log.md
Original file line number Diff line number Diff line change
Expand Up @@ -2839,3 +2839,36 @@ cached marketplaces use. This repo's delivery prompt became a 241-line repo
binding (was 662): SHIP gate matrix, canon/OKF/memory contract additions,
reviewer routing, Appendices A-C; generic par.1-9 deleted per the ADR's
net-deletion rule; repo /deliver command deleted (plugin provides it).

## 2026-08-21 - Register pilot C "Engineered Precision" completes the three-way

/next/pilots/precision/fractional-cto/ built from the 10.01 column-C spec
(the other two pilots each translated a Claude Design artifact; this register
had none). Cool white/#fafafa panels, 1px #e4e4e7/#d4d4d8 structural borders
carrying the design, zero radius, Inter 400/500/600/700 over JetBrains Mono
400. Stub is a cp of pilot B's with six lines changed - title, description,
register, font - so the demo still varies only the skin.

Two defects the browser caught that the source could not. (1) The comparison
table's "theirs" column rendered in full ink: `.rr-table tbody td` (0,1,2)
outranks the template's `.rr-td-muted` (0,1,0), so the comparison stopped
comparing while the CSS read correct - the same shape is live in
next-editorial.css. (2) A `gap:1px over a line-coloured ground` grid shows
that ground as an empty cell whenever the final row is partial; `auto-fit`
collapses only tracks empty in EVERY row, so three stats in two phone-width
tracks left a grey block.

Register fidelity note worth keeping: the accent does NOT automatically die on
the inverted band. Ruby #cc342d is 3.46:1 on #18181b - under the text floor,
over the 3:1 a filled button edge needs, white-on-ruby 5.13:1 inside - so this
CTA stays ruby where pilot B's had to invert to paper.

Gates: hugo-build clean; test:unit 292 runs / 6164 assertions / 0 failures;
the pilot-glob gates were proven to reach the new path by smoothing its quote
and watching the failure name next/pilots/precision/fractional-cto/index.html;
PurgeCSS set-diff empty over 56 selectors, and an injected orphan rule was
stripped, so the diff bites; computed font-weight walk 123 elements / 0
synthesized; contrast walk 122 elements / 0 failures at 1440 and 390 (worst
4.63:1), proven live by an injected 1.67:1 probe; all four buttons clear
3:1 edge / 4.5:1 label; zero console messages, zero non-2xx, zero third-party
hosts.
1 change: 1 addition & 0 deletions bin/qtest
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ PAGE_TESTS = {
# Design-register pilots on the same rail: pages/next-<register>.css
"next-rescue-room" => "next_rescue_room",
"next-editorial" => "next_editorial",
"next-precision" => "next_precision",
"simple-page" => "privacy_policy",
# critical/privacy-policy-critical.css maps by basename; alias it to the
# simple-page tests so a touch there doesn't abort as an unknown key
Expand Down
170 changes: 170 additions & 0 deletions content/next/pilots/precision/fractional-cto.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
---
title: Fractional CTO (Precision pilot)
description: Design-register pilot C - "Engineered Precision" skin over the settled fractional-CTO landing anatomy. Same copy as pilots A and B; only the register differs.
layout: landing
type: next
# Drives both the CSS file and the bundle name in layouts/next/landing.html,
# so pilots B and C reuse this template by changing one line.
register: precision
# Self-hosted display faces for this register (themes/beaver/static/). Another
# register omits this key and ships no webfont at all.
font:
css: /css/fonts-precision.css
preload: /fonts/inter-latin.woff2

nav:
links:
- name: Services
url: /services/
- name: Use Cases
url: /use-cases/
- name: Blog
url: /blog/
- name: Course
url: /course/tech-for-non-technical-founders-2026/
- name: Clients
url: /clients/
cta:
name: Book a free consultation
url: /free-consultation/

hero:
eyebrow: Fractional CTO
headline: A technical partner in days, not months of hiring
subhead: Your dev shop isn't working. Your investors want a technical update. You need someone who can audit the code, fix the team, and give you a straight answer.
primary:
name: Book a free consultation
url: /free-consultation/
secondary:
name: Book a 30-min call
url: /contact-us/
derisk: You keep the written assessment whether or not we work together.
# Markdown, rendered inline - the bold carries the emphasis the blueprint
# gave <strong>. Clutch rating is linked to the profile (claims-canon).
stats:
- Starts in **days**
- No equity, no lock-in
- "[**4.8**/5 on Clutch](https://clutch.co/profile/jetthoughts)"

monthOne:
headline: What a fractional CTO does in month one
items:
- Reads the codebase and tells you what state it's actually in
- Sits in on your standups and tells you which ones are theatre
- Writes the technical section of your investor update
- Decides what gets rebuilt and what you can live with
- Sends you the Friday report from week one

comparison:
eyebrow: The maths
headline: What you're comparing it against
fractionalLabel: Fractional CTO
fulltimeLabel: Full-time CTO
rows:
- label: Cost
fractional: A fraction of a full-time hire
fulltime: Full salary, benefits, and equity
- label: Equity
fractional: None
fulltime: Typically required
- label: Time to start
fractional: Days
fulltime: Months of hiring
- label: If it isn't working
fractional: You stop. No severance, no re-hire.
fulltime: Severance and a re-hire
- label: Best when
fractional: Pre-Series A, or stabilising after a bad build
fulltime: Post-Series A, with a team to own

steps:
eyebrow: How it starts
headline: Four weeks from first email to a plan you can act on
intro: You don't sign a retainer to find out what's wrong. The assessment comes first.
list:
- title: Code review first
body: "You send access. You get a written assessment: what's solid, what's fragile, what's going to cost you."
- title: A 30-minute call
body: We walk you through the assessment in plain English. Most founders take the document to their board whether or not they hire us.
- title: Week one on the ground
body: Your fractional CTO joins standups, reads the backlog, and sends the first Friday report.
- title: Month one plan
body: What gets rebuilt, what gets left alone, what it costs, in what order. You own the code and the plan.

clients:
eyebrow: Clients + case studies
headline: Clients stay for years, not quarters.
stats:
# `derived: tenure` is what makes the template compute the value from
# site.Params.foundingYear. Keyed on its own field, not on the label -
# a label-keyed branch falls back silently when someone rewords it.
- derived: tenure
label: Years of industry experience
- value: "5"
label: Years of average client relationship
- value: 8+
label: Years of average developer experience
cases:
- name: Agent Inbox
body: Hired us to build their real-estate communication platform, get it market-ready, and grow the team around it.
tech: [Rails, React, Node.js]
url: /clients/agent-inbox/
- name: Open Apply
body: Hired us to debug their school-admissions product, optimize the user experience, and streamline internal project management.
tech: [Rails, Hotwire, Tailwind]
url: /clients/open-apply/
- name: Mobile Coach
body: Hired us to support and extend the products around their enterprise chatbot platform, and to scale their R&D and engineering teams.
tech: [Rails, AWS, PostgreSQL]
url: /clients/mobile-coach/

testimonial:
eyebrow: From a client
# VERBATIM tail of the canon description in data/testimonials.yaml (Bruno
# Wozniak). The design blueprint had smoothed it to "They were detailed and
# precise, helping us find problems..." - a real person's words are not copy
# to tighten. Asserted by test/unit/next_rail_test.rb against the yaml.
quote: Their team was also detailed and precise, helping us to find problems before they appear. We knew exactly what was happening and where we were going the whole time.
attribution: Bruno Wozniak · Director of Engineering, PubNative
sourceName: verified Clutch review
sourceUrl: https://clutch.co/profile/jetthoughts
proof:
- "[**4.8**/5.0 on Clutch](https://clutch.co/profile/jetthoughts)"
- "**5-year** average client relationship"

closing:
headline: Still deciding?
body: The consultation is free. The assessment is yours either way.
cta:
name: Book a free consultation
url: /free-consultation/

footer:
columns:
- heading: Services
links:
- name: Fractional CTO
url: /services/fractional-cto/
- name: Fractional Product Management
url: /services/fractional-product-management/
- name: App/Web Development
url: /services/app-web-development/
- name: Talent Recruiting & Training
url: /services/talent-recruiting-training/
- heading: Proof
links:
- name: Clients
url: /clients/
- name: Use Cases
url: /use-cases/
- name: Friday report
url: /friday-report/
- heading: Learn
links:
- name: Blog
url: /blog/
- name: Course
url: /course/tech-for-non-technical-founders-2026/
- name: About us
url: /about-us/
---
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ zero FL-Builder export files remain in any slice.
| next-pilot | `layouts/next/single.html` (repo root, NOT in theme) | pages/next-pilot.css | new 2026-08-21 | v2 clean-slate rail (ADR-0006): css-variables + navigation.css + footer.css only — no style.css/586/base-4/legacy-theme-skin. Serves `/next/*` staging pages |
| next-rescue-room | `layouts/next/landing.html` (repo root, NOT in theme) | pages/next-rescue-room.css | new 2026-08-21 | Design-register pilot A (10.01). The register skin is the bundle's ONLY file — not even css-variables — because the pilot renders its own nav and footer and must be judged on its own surface. Serves `/next/pilots/rescue-room/*`. A new register adds a row here, a skin file, and one line to the `$skins` dict |
| next-editorial | `layouts/next/landing.html` (repo root, NOT in theme) | pages/next-editorial.css | new 2026-08-21 | Design-register pilot B, "Artifact Editorial" (10.01). Same rule as pilot A — the skin is the bundle's only file. Serves `/next/pilots/editorial/*`. Its three webfonts ship as ONE `static/css/fonts-editorial.css`, keyed by register rather than by family, so the shared `font:` frontmatter key stays one stylesheet + one preload |
| next-precision | `layouts/next/landing.html` (repo root, NOT in theme) | pages/next-precision.css | new 2026-08-21 | Design-register pilot C, "Engineered Precision" (10.01). Same rule as pilots A and B — the skin is the bundle's only file. Serves `/next/pilots/precision/*`. `static/css/fonts-precision.css` ships Inter and REUSES pilot B's `/fonts/jetbrains-mono-latin.woff2` rather than duplicating the binary: a register-keyed font stylesheet may point at another register's file |

¹ careers was a byte-identical verbatim move (3086-layout2 had zero dead
nodes); the small growth vs 07-12 is upstream content drift (course v2 merge
Expand Down
1 change: 1 addition & 0 deletions layouts/next/landing.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
{{- $skins := dict
"rescue-room" (resources.Get "css/pages/next-rescue-room.css")
"editorial" (resources.Get "css/pages/next-editorial.css")
"precision" (resources.Get "css/pages/next-precision.css")
-}}
{{- $resources := slice (index $skins $register) -}}
{{ partial "assets/css-processor.html" (dict "resources" $resources "bundleName" (printf "next-%s" $register)) }}
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions test/system/desktop_site_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,17 @@ def test_next_editorial
assert_stable_screenshot "next/editorial"
end

# Design-register pilot C, "Engineered Precision" - same assertions again,
# for the same reason. Three skins, one anatomy, one set of words.
def test_next_precision
visit "/next/pilots/precision/fractional-cto/"

assert_text "A technical partner in days, not months of hiring"
assert_text "#{Time.now.year - 2008}+"

assert_stable_screenshot "next/precision"
end

def test_free_consultation
visit "/"

Expand Down
10 changes: 10 additions & 0 deletions test/system/mobile_site_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,16 @@ def test_next_editorial
assert_stable_screenshot "next/editorial"
end

# Pilot C on a phone. Same words again - three skins now.
def test_next_precision
visit "/next/pilots/precision/fractional-cto/"

assert_text "A technical partner in days, not months of hiring"
assert_text "What you're comparing it against"

assert_stable_screenshot "next/precision"
end

def test_free_consultation
visit "/"
# Add more specific scoping for Talk to an Expert button
Expand Down
Loading
Loading