Skip to content

Implement Sift product with enhanced diff UI and demo presets#2

Merged
coderoast-dev merged 22 commits into
mainfrom
features
May 26, 2026
Merged

Implement Sift product with enhanced diff UI and demo presets#2
coderoast-dev merged 22 commits into
mainfrom
features

Conversation

@coderoast-dev

Copy link
Copy Markdown
Collaborator

No description provided.

coderoast-dev and others added 22 commits May 25, 2026 10:33
Paste two logs -> a ranked, noise-suppressed change report. New /diff page +
runInsightDiff() API client + diff types. Renders the "X changes, Y significant"
headline, per-input provenance, and severity-badged ranked changes; surfaces the
daily-quota PolicyDenialError with a friendly "try the CLI locally" message.
Builds clean (tsc + vite).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reposition the hero + navbar around the insight_diff wedge while keeping the
"log noise -> comprehension" thesis. Hero headline becomes "what changed between
two logs - and what's just noise", primary CTA -> /diff, secondary -> InSight
Lab. Navbar promotes "Diff logs" to the primary CTA and keeps InSight Playground
as a regular link (Eidos one click away). en/fr hero copy updated; nav.diff key
added. tsc + vite build clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add InsightDiffShowcase (home), placed FIRST below the hero — CI-persona copy
("your CI went red, which lines matter?") + a sample ranked-report mock in the
visitor's language (CI runs / pytest / endpoints), no observability jargon.
CTA -> /diff. en/fr diffShowcase copy added; fr hero trust line de-jargonised
to match the diff framing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The /diff page renders ranked changes on a slate→amber→orange→crimson severity
ladder (NOT git red/green) with a neutral change-type icon (decoupled from
add/remove). Hovering a change highlights the exact source lines in the
baseline/changed pane (left border + tint in the severity hue) and auto-scrolls
to the first. Input→result phases; types carry the line refs. tsc + vite clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Lay baseline | changed side-by-side (ranked list 1/3 left, panes 2/3 right) so
  both panes are visible at once instead of stacked in the right column.
- Center the highlighted line in the pane (scrollIntoView block:'center')
  instead of leaving it at the viewport edge.
- Click a change to PIN its highlight — it stays after the mouse leaves; hover
  still previews (active = hovered ?? pinned). Pinned row shows a pin marker.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Flip the result layout: Baseline | Changed panes sit side-by-side on top,
the ranked "Significant changes" list scrolls below them (max-h-[28rem]).
Both panes are visible at once instead of the changed pane appearing far
to the right.

Allow multiple pins (pinned: Set<number>) so several changes can light up
lines in both panes simultaneously; "clear N pinned" resets.

Make the scroll target independent of pin/hover state. Focus is now its
own nonce-bumped signal: hovering OR clicking a row calls focusOn(i),
which re-aims both panes at that change's first line and bumps a nonce so
the LogPane scroll effect re-fires even when the target line is unchanged
(fixes: a pinned row stayed "focused" and re-hovering it no longer
re-scrolled). Highest-severity-wins highlight map per pane (buildHighlights).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The "hover to preview…" helper and "Want this in CI?" footer were
text-gray-600 on bg-gray-950 — nearly invisible. Bump the helper to
gray-500 and the footer CTA to gray-400 with a brand-colored arrow so the
conversion nudge actually reads.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…se 1)

Introduce src/config/products.ts as the single source of truth for the
product slate — adding a product is now one entry, and the umbrella
hero/nav never change as the slate grows. Portfolio.tsx renders from the
registry instead of a hardcoded array.

Portfolio now reflects the VISION slate: insight_diff (live, the wedge) +
LogCraft (live) + InSight (beta) as real cards, plus MetaLog forwarding and
Canary validation as "Coming soon" teasers so the slate visibly grows.
Cards link to a product page when one exists, else the tool surface.

Drop the "playground" portfolio card — the Lab is a tool reached through a
product, not a peer product. Retune the portfolio title/subtitle to
umbrella framing (was InSight/LogCraft-specific). en + fr in sync.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The toast palette classes live on the container; the message is a child
span (added when the dismiss button landed). The test was asserting the
palette on the span's own className, so all three palette cases failed.
Assert on the container via closest('div'). Unrelated to the IA work —
caught while running the suite during the navbar refactor.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Navbar is now umbrella-only: a registry-driven "Products ▾" dropdown
(products with live/beta/soon maturity dots) + Pricing + the wedge CTA.
Drop the product-specific section anchors (#product/#how/#features) and the
standalone LogCraft/Lab links — products are reached through the menu, and
those sections move to product pages in phase 3. Remove the now-dead
nav.how/nav.features i18n keys (en+fr).

Hero copy is now CodeRoast-general (turn log noise into comprehension;
precision-first; runs on your infra) instead of an insight_diff pitch. The
primary CTA stays the wedge ("Diff two logs" → /diff) per the chosen
PLG-lead direction; the secondary CTA points at the portfolio (#portfolio).

Rewrite Navbar.test for the new contract: asserts the Products menu /
Pricing / CTA, that the old anchors are gone, and that opening the menu
reveals the registry slate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Finish the evolutive-portfolio refactor: focused product pages + a home
that is now a pure umbrella lobby.

Phase 3 — product pages:
- Parameterize ProductNavbar (brand / homeTo / links / cta props) — it was
  hardcoded to LogCraft. Centralize per-product chrome in
  config/productChrome.tsx (logcraft / insight / insightDiff), shared by a
  product page and its sub-pages.
- New /insight (InSight front door → /lab/insight) and /insight-diff (the
  CI/CD wedge front door → /diff) pages, each with its own ProductNavbar.
- LogCraft + /use-cases now consume the shared chrome (no behavior change).
- Registry gains page routes; portfolio cards + the nav Products menu now
  point at the product pages (insight_diff → /insight-diff, InSight →
  /insight, LogCraft → /logcraft).

Phase 4 — drain the home to a lobby (Hero + Portfolio + Roadmap +
MakerNote). The product deep-dive sections move off the home onto their
pages: InsightDiffShowcase → /insight-diff, ProductShowcase → /insight,
ProblemSection + HowItWorks + FeatureGrid → /logcraft. Retire UseCasesHome
(a duplicate of the LogCraft page's own Use Cases) + its en/fr i18n.

build + lint + 114 tests green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…g/Sign-in, working back-links

From clicking through the live IA:
- Extract the Products ▾ dropdown into a shared ProductsMenu (+ mobile list)
  so it's on every product page's ProductNavbar, not only the home Navbar.
- Grey out Pricing (no price list yet) and add a greyed "Sign in" placeholder
  (accounts are coming) in both navbars — fills the lonely top bar and stops
  Pricing from landing on the access/capability matrix.
- /diff was a dead-end: wrap it in the insight_diff ProductNavbar (+ Footer)
  so there's a way back / cross-product switch.
- /tiers back button now returns to the previous page (history) instead of
  unconditionally to the playground.
- Lab back link: "Back to product" (/#product) → "Back to CodeRoast" (/);
  rename the i18n key backToLogCraft → backToHome to match.
- New nav i18n: signIn, back (en+fr).

build + lint + 114 tests green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
First-time visitors no longer need to bring their own logs: a "Load a
sample" chip row above the inputs fills both panes with a realistic
baseline/changed pair, then they hit Compare. Four kinds (src/data/
diffPresets.ts), each shaped so significant changes surface against
suppressed noise:
- CI/CD run — green pipeline vs the run that went red
- Unit tests — clean pytest vs new failures
- Load / regression — passing load test vs a latency regression
- Service incident — calm window vs an error cascade

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Brand decision: house of brands under CodeRoast (not "InSight Sift" sub-
branding). The CI-diff wedge is now Sift. The name points at the payoff
(sift signal from noise), not the mechanism — your tool is better than diff.

Product-layer rename (user-facing + structural):
- registry slug insightDiff → sift; route /insight-diff → /sift
- productChrome.insightDiffChrome → siftChrome; wordmark "insight_diff" → "Sift"
- i18n portfolio.insightDiff → portfolio.sift; name/eyebrow/copy → "Sift"
- product page InsightDiffProduct.tsx → Sift.tsx (SiftPage); App route
- showcase CLI example: `insight-diff …` → `sift …`; anchor id → #sift
- Navbar test updated to expect "Sift"

Kept (the underlying engine capability, not the brand): the insight/diff
feature naming — the /diff tool, runInsightDiff API client, types/diff, and
the InsightDiffShowcase component — all reference the InSight diff endpoint
(insight-eidos/diff), which is unchanged. Sift is the product; insight/diff
is what it runs on.

build + lint + 114 tests green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Focus no longer scrolls the page. scrollIntoView was scrolling every
  scrollable ancestor (incl. the window), so hovering a change moved the
  page scrollbar and made multi-pin selection unusable. Centre the line by
  nudging the pane container's own scrollTop instead — the page stays put.
- After a diff, auto-pin every change rated notable-or-worse (severity ≥
  medium), so all the suspicious lines light up across both panes the
  moment the report lands. Weak/low changes stay unpinned.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Last stray product reference on the tool surface. Title/subtitle stay (they
describe the action and correctly credit the InSight engine).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The backend returns changes in significance order, which doesn't track the
severity tier — so a NOTABLE could sit below WEAKs. Render a severity-sorted
view (critical → … → weak) via a stable sort, so significance order still
holds within a tier. Original source indices ride along, so pin/hover/focus
and the highlight map are unaffected.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The samples were too short (~12 lines) to show the core value — with that
little input there's no noise to suppress. Replace the hand-written pairs
with a deterministic seeded generator: baseline and changed share the SAME
templates (only params — ids, timings, hosts, percentiles — vary by seed),
so a plain text diff sees hundreds of changed lines while Sift suppresses
them and surfaces only the injected STRUCTURAL changes. That contrast IS
the pitch.

Signal is always structural (new templates/failures), never numeric — a
latency regression shows up as new WARN/FAIL lines, not bigger numbers
(which Sift correctly suppresses as params). Output is stable (seeded PRNG,
no Math.random) since Sift is deterministic. Lengths: CI 92, pytest 134,
load 113, incident 119.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…mo presets

- types: DiffRankedChange.polarity ('regression' | 'recovery' | 'neutral').
- InsightDiff: a Tone = severity | 'recovery' drives both the row badge and the
  pane line highlight — recoveries render GREEN ("RECOVERED"), regressions keep
  the severity heat. Semantic better/worse, still NOT git add/remove. Display
  order: regressions → recoveries → neutral, then severity, then significance.
- presets: lead with two "not a grep" demos — "Hotfix verify" (DB errors
  recovered + a new timeout regressed, in one diff) and "Silent regression"
  (a success line vanished + a retry surged, with NO error keyword at all).

build + lint + 114 tests green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The backend now ranks regressions → recoveries → presence → rate → shape,
then significance. The client-side re-sort (POLARITY_GROUP/groupOf) undid
that ordering; remove it and render in backend order. The source index
still rides along for pin/hover/focus keying.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
A swap control in both the input row (flips the two textareas) and the
results header (flips and re-compares immediately). A regression one way
reads as a recovery the other, so swapping is the fastest polarity sanity
check — for testing and for users. Compare logic extracted into a
runCompare(base, chg) core so the swap can re-run with explicit values
rather than racing React state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace CI/CD, unit-tests, load, and service-incident (all just "an ERROR line
appeared" — grep does that) with presets that show what a filter structurally
cannot:
  - Same errors, real change: identical errors are a decoy; the vanished success
    is the regression. Sift mutes what didn't change and shows what did.
  - Cache silently died: zero errors, but cache→origin frequency flipped.
  - Canary vs stable: same traffic, two builds; a behavior swap, no errors.
  - Hot key / throttling: a new throttling template dominates; no errors.
  - Escalating warning: a WARN goes rare→pervasive — the pre-incident creep.
Hotfix verify + Silent regression stay. The dropped generators are removed
(no dead code).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@netlify

netlify Bot commented May 26, 2026

Copy link
Copy Markdown

Deploy Preview for elaborate-malasada-e00aa3 ready!

Name Link
🔨 Latest commit c2b99e3
🔍 Latest deploy log https://app.netlify.com/projects/elaborate-malasada-e00aa3/deploys/6a15d595fc1c4800080d0fac
😎 Deploy Preview https://deploy-preview-2--elaborate-malasada-e00aa3.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderoast-dev coderoast-dev merged commit e85bbc8 into main May 26, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant