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
30 changes: 30 additions & 0 deletions .okf/log.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,36 @@ make it green: restructure same-day entries under one heading, and add
`timestamp` to the 23 concepts missing it (anchored to each file's last commit
time, which is verifiable - never invented).

## 2026-08-21 - PR-2 pilot: two CSS traps and a claims fix, from adversarial review

The styled D1 pilot shipped through author -> verifier -> fixes. Three durable
learnings from the verifier's HOLD:

**`.parent a { }` outranks single-class components.** `.next-article a` (0,1,1)
beat both `.np-link-cta` and `.np-button` (0,1,0) - the page's ONE filled CTA
shipped black-on-ruby at 3.33:1, an AA failure, verified in pixels (385px of ink
glyphs where ruby was intended). The fix is one token: scope descendant link
rules as `:where(a)` so they carry (0,1,0) and components win on order. Applies
to every future rail page.

**A rendered guard can be non-discriminating NOW and still be right.** The
tenure assertion (np-stat-value == now.Year - foundingYear) cannot distinguish
derived from frozen until 2027, because this year they are equal - documented in
the test rather than pretended away.

**The rail sat outside both copy ratchets.** marketing_copy_test globbed
`themes/beaver/layouts/**` (not root `layouts/`) and its RENDERED_GLOBS had no
`next/**` - the one surface with template-authored marketing copy was the one
neither pass read. Both globs extended.

Also: the composition swap (FAQs in, clients/testimonials out) silently dropped
every trust signal on the page - restored as a minimal canon-exact proof line
(4.8/5 on Clutch, profile linked, no review count). And FAQ 5 carried an
unsourced "15+ years of industry experience" CONTRADICTING the derived 18+ stat
on the same screen - removed at the frontmatter source, which also fixes the
LIVE page's JSON-LD. Measured payoff of the rail, per the repo's own evidence
form: next-pilot 3.1 KB gzip vs single-service 21.6 KB - minus 85.6%.

## 2026-08-21 - Phase 2.3 shipped: course module eyebrow, dual derivation

The course lesson eyebrow ships with a detail worth keeping: **the module number
Expand Down
2 changes: 1 addition & 1 deletion content/services/fractional-cto/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ faqs:
- question: "How does the engagement model work?"
answer: "We offer flexible engagement models including part-time (10-20 hours/week), project-based contracts, interim CTO roles during transitions, and strategic consulting relationships. Most clients start with a part-time arrangement that can scale up or down based on your needs and growth stage."
- question: "What experience do your Fractional CTOs have?"
answer: "Our Fractional CTOs average 8+ years of development experience with 15+ years of industry experience. They've led technical teams, managed complex software projects, and helped companies scale from startup to enterprise level. All have hands-on experience with modern technology stacks and proven track records of successful product delivery."
answer: "Our Fractional CTOs average 8+ years of development experience. They've led technical teams, managed complex software projects, and helped companies scale from startup to enterprise level. All have hands-on experience with modern technology stacks and proven track records of successful product delivery."

overview:
headline: The power of a CTO at a fraction of the cost
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ course system, which is exactly what this competition steps back from.
| Direction 1 "Artifact Editorial" (stitch) | DONE — project `4487418121858436329` (disclosure: generated under a ruby-locked brief, before fully-open) |
| Direction 2 "Institutional Authority" (stitch) | DONE 2026-08-21 — same project, screen `7cbde8e2e694438d82138be4d6f7f3f9`. Dark midnight-navy/charcoal, IBM Plex Sans, blue accent `#3B82F6`, forensic-artifact narrative (audit report, accountability dashboard, recovery timeline). **Canon flags for judging:** invents a "90-day stabilization guarantee" (no such claim in canon — copy must not ship as-is); dark chrome contradicts the peer-set evidence ADR-0003 cited (all services peers light) — the panel weighs, not auto-rejects, since the brief was fully open. |
| Claude Design run (Paul) | Project **created and seeded via DesignSync** from this session: "JetThoughts — From-Scratch Competition (2608)", id `a5f25203-6dd9-45c6-a978-5842152d1389` — contains BRIEF.md, both directions' DESIGN.md + full-page renders as preview cards. Paul opens claude.ai/design and iterates there. |
| Judging board (fable critic + ICP panel) | BLOCKED on the above |
| Judging board | **RUN 2026-08-21 — D1 wins 4–1** (tally below). Paul's Claude Design pass can still override; until then D1 is the working winner and PR-2 styles against it (reversible: CSS on a noindexed staging page). |

---

Expand Down Expand Up @@ -77,3 +77,18 @@ action, not six.
- Paul sees ONE side-by-side board per direction: homepage + single-service
screens, 3-line verdict per lens, one "what this says about us" sentence.
- **Paul picks.** Rejection feedback, if both fail, seeds direction 3.


---

## The vote — 2026-08-21 (four personas on sonnet, fable critic in main loop)

| Voter | Vote | Decisive reason | Objection to own pick |
|---|---|---|---|
| Alex, burned founder | **D2** | "Vague empathy is what the last shop gave me" — D2's specific failure-naming (Opaque Box, Misaligned Clock, Debt Spiral) reads as competence | dark enterprise-navy is the aesthetic of the shops that burn founders; slick dashboards are cheap to fake |
| CFO skeptic | **D1** | D2's fabricated "90-day guarantee" is a due-diligence disqualifier — one invented promise poisons every other number on the page. "Vague survives a diligence call; fabrication survives it with a lie or a retraction." | D1's informality is itself a red flag at a five-figure monthly spend |
| Mobile commuter | **D1** | D2's failure is structural (illegible dashboard hero, fixed-1280 grid rework); D1's is cosmetic (headline reflow) | D1's flat-lay photography reads as agency gloss |
| Brand strategist | **D1** | D1 is a *reading system* that carries blog/course/case-studies; D2 is a landing-page costume that fights body text everywhere else | evidentiary calm might read slow to a founder bleeding runway |
| **Fable critic** (render inspection) | **D1** | D2 has visible execution defects: hero + Phase-01 + final-CTA text renders washed-out pale on WHITE (near-invisible), and the page alternates white/black bands — the exact background-switch disease 2.4 exists to cure. D1's defects (staged wood styling ×2, two CTA idioms) are cosmetic. | D1's tablet "weekly report" mock is its weakest artifact — replace with a real report render |

**Synthesis worth grafting regardless of winner:** D2's *problem-naming specificity* (Opaque Box / Misaligned Clock / Debt Spiral) is the single thing Alex trusted most — port that COPY register into D1's visual system, minus the fabricated guarantee. And D1's "VIEW A REAL AUDIT" link-as-primary-action is the best trust move on either page — keep it.
60 changes: 57 additions & 3 deletions layouts/next/single.html
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,64 @@
{{- with site.GetPage . -}}{{- $src = . -}}{{- end -}}
{{- end -}}
<article class="next-article">
<h1>{{ $src.Params.headline | default $src.Title }}</h1>
{{- with $src.Params.excerpt }}
<p class="next-lede">{{ . }}</p>
<header class="np-hero">
<h1>{{ $src.Params.headline | default $src.Title }}</h1>
{{- with $src.Params.excerpt }}
<p class="np-lede">{{ . }}</p>
{{- end }}
<a class="np-link-cta" href="{{ relURL "free-consultation/" }}">Talk to an expert <span aria-hidden="true">&rarr;</span></a>
</header>

{{- with $src.Params.overview }}
<section class="np-section">
<p class="np-label">Service overview</p>
<h2>{{ .headline }}</h2>
{{- range .list }}
<div class="np-block">
<h3>{{ .name }}</h3>
{{ .value | markdownify }}
</div>
{{- end }}
{{- with .outcome }}
<ul class="np-stats">
{{- range . }}
{{/* tenure derives from foundingYear (claims canon) - frontmatter values rot */}}
{{- $value := .value }}
{{- if eq .name "Years of Industry Experience" }}
{{- $value = sub now.Year (int site.Params.foundingYear) }}
{{- end }}
<li>
<span class="np-stat-value">{{ $value }}+</span>
<span class="np-stat-label">{{ .name }}</span>
</li>
{{- end }}
</ul>
{{/* Minimal proof line (review F3): the composition swap dropped every
trust signal; this restores the one that is canon-exact - 4.8/5 on
Clutch with the profile linked, NO review count (claims-canon). */}}
<p class="np-proof">Rated <strong>4.8/5 on Clutch</strong> &mdash; <a href="https://clutch.co/profile/jetthoughts" rel="noopener">read the verified reviews</a>.</p>
{{- end }}
</section>
{{- end }}

{{- with $src.Params.faqs }}
<section class="np-section">
<h2 class="np-label">Common questions</h2>
<dl class="np-faq">
{{- range . }}
<dt>{{ .question }}</dt>
<dd>{{ .answer | markdownify }}</dd>
{{- end }}
</dl>
</section>
{{- end }}

{{ $src.Content }}

<section class="np-close">
<h2>Let&rsquo;s get started now</h2>
<p>Get in touch with one of our experts to get a technical strategy &amp; planning session for your project at no cost.</p>
<a class="np-button" href="{{ relURL "contact-us/" }}">Contact Us</a>
</section>
</article>
{{ end }}
Binary file modified test/fixtures/screenshots/linux/desktop/next/pilot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified test/fixtures/screenshots/linux/mobile/next/pilot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified test/fixtures/screenshots/macos/desktop/next/pilot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified test/fixtures/screenshots/macos/mobile/next/pilot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion test/unit/marketing_copy_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class MarketingCopyTest < Minitest::Test
"content/pages/**/*.md",
"content/services/**/*.md",
"content/use-cases/**/*.md",
"layouts/next/**/*.html", # the v2 rail is template-authored marketing copy on root layouts
"themes/beaver/layouts/home.html",
"themes/beaver/layouts/page/*.html",
# Blog CHROME (list hero, section furniture) is a marketing surface even
Expand Down Expand Up @@ -119,7 +120,7 @@ def test_every_declared_surface_matches_at_least_one_file
# original authors and are governed by the separate dev.to ICP gate, not this
# ratchet. The excluded set is DERIVED from `source: dev_to` frontmatter, so
# it tracks the imports instead of rotting as a hand-typed list.
RENDERED_GLOBS = %w[blog/**/*.html course/**/*.html services/**/*.html].freeze
RENDERED_GLOBS = %w[blog/**/*.html course/**/*.html services/**/*.html next/**/*.html].freeze

# Paginated list views (/blog/page/7/, /blog/tags/startup/page/4/) only
# re-print excerpts from posts this pass already counts, so every hit on them
Expand Down
13 changes: 13 additions & 0 deletions test/unit/next_rail_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,19 @@ def test_next_pages_are_absent_from_the_sitemap

# The stub mirrors a real page; the copy lives there, so that URL is the
# canonical one - and exactly one canonical may ship.
# HONEST LIMIT: in 2026 the derived value equals the frozen frontmatter 18,
# so this assertion cannot distinguish them until 2027-01-01 - from then on
# it bites forever. Kept rendered-level per repo doctrine (no template greps).
def test_tenure_stat_is_derived_not_frozen
doc = parse_html_file(PILOT)
tenure = doc.css(".np-stat-value").map(&:text).find { |t| t.include?("+") }
expected = "#{Time.now.year - 2008}+"
assert_includes doc.css(".np-stat-value").map(&:text), expected,
"tenure stat must derive from foundingYear (#{expected}), not the frozen frontmatter 18 - " \
"the label-keyed branch in layouts/next/single.html silently falls back if the label is renamed"
refute_nil tenure
end

def test_next_pages_canonicalise_to_their_source_page
canonicals = parse_html_file(PILOT).css("link[rel='canonical']")

Expand Down
Loading
Loading