Implement Sift product with enhanced diff UI and demo presets#2
Merged
Conversation
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>
✅ Deploy Preview for elaborate-malasada-e00aa3 ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.