Skip to content

mobile fixes and my voice#5

Merged
khaliqgant merged 2 commits into
mainfrom
fix/mobile-layout
May 12, 2026
Merged

mobile fixes and my voice#5
khaliqgant merged 2 commits into
mainfrom
fix/mobile-layout

Conversation

@khaliqgant
Copy link
Copy Markdown
Member

No description provided.

Copy link
Copy Markdown

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 2 potential issues.

View 6 additional findings in Devin Review.

Open in Devin Review

Comment thread content/posts/why-proactive-is-hard.mdx Outdated

All three of these problems get worse every time you add another integration. Webhook formats are different between Zendesk and GitHub and Linear. State schemas are different. The confidence threshold for closing a support ticket has nothing to do with the threshold for escalating a PagerDuty incident.

I think this is why the most successful proactive agents out there are super narrow in scope. [ChatGPT Pulse](/posts/chatgpt-pulse) does one thing: it processes your browsing history overnight. The proactive agents coming out of Google and Anthropic tend to be similarly focused, one domain, one provider. We've been tracking who's building what in [a landscape scorecard](/posts/proactive-agent-landscape), and the pattern keeps showing up. Scheduled execution ships first because it's the easiest part, then teams spend months on change detection and delivery.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Broken internal link to landscape page uses wrong route prefix

The new post content/posts/why-proactive-is-hard.mdx:79 links to /posts/proactive-agent-landscape, but the landscape article lives under the market section at /market/proactive-agent-landscape (served by app/market/[slug]/page.tsx from content/market/proactive-agent-landscape.mdx). There is no corresponding file in content/posts/ for this slug, so getPost('proactive-agent-landscape') at lib/posts.ts:48-64 will return null, triggering notFound() and rendering a 404 page. This also violates the CLAUDE.md rule: "When referencing our own essays, link to the actual post path."

Prompt for agents
In content/posts/why-proactive-is-hard.mdx line 79, the markdown link [a landscape scorecard](/posts/proactive-agent-landscape) uses the wrong route prefix. The proactive-agent-landscape content is a market page, not a post. The link path should be /market/proactive-agent-landscape instead of /posts/proactive-agent-landscape. Replace the link text accordingly.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread .agentworkforce/workforce/personas/operator.json
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 12, 2026

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6186bbdd-96e3-4ab5-ba26-3adf8f0ad051

📥 Commits

Reviewing files that changed from the base of the PR and between cf3f22b and 6e74f45.

📒 Files selected for processing (1)
  • content/posts/why-proactive-is-hard.mdx

📝 Walkthrough

Walkthrough

This PR adds Open Graph image generation infrastructure, refines responsive typography and layouts across all major pages, redesigns mobile navigation as a slide-over panel, introduces new visual figure components for articles, publishes a new article on proactive agent complexity, and updates editorial content with refined phrasing across multiple existing posts.

Changes

Content Presentation & Navigation Overhaul

Layer / File(s) Summary
Open Graph image generation library
lib/og.tsx
New library exports OG_SIZE, OG_CONTENT_TYPE, color themes, and createOgImage() function that renders styled OG images with title, summary, and accent color.
OG image routes for home and dynamic pages
app/opengraph-image.tsx, app/posts/[slug]/opengraph-image.tsx, app/posts/[slug]/twitter-image.tsx, app/market/[slug]/opengraph-image.tsx, app/market/[slug]/twitter-image.tsx, app/twitter-image.tsx
Route handlers export OG and Twitter images using the library, with dynamic content fetching and fallback messaging when posts/articles are missing.
SEO schema enhancement with image metadata
lib/seo.ts
articleSchema() now includes dateModified and image fields pointing to the generated OG image URL.
Global CSS responsive typography and layout
app/globals.css
Updated dropcap, prose-essay, blockquotes, and tables with breakpoint-specific styles optimizing readability on small screens and enabling horizontal scroll for tables on mobile.
Page layout refinements across site
app/page.tsx, app/about/page.tsx, app/agent/page.tsx, app/guide/page.tsx, app/market/page.tsx, app/market/[slug]/page.tsx, app/posts/page.tsx, app/posts/[slug]/page.tsx
Updated responsive spacing, typography scaling, and padding to align with new design scale and breakpoint strategy.
Component styling updates
components/post-hero.tsx, components/post-nav.tsx, components/site-footer.tsx
Refined typography, spacing, and responsive layout in hero section, navigation links, and footer.
Mobile-responsive navigation with slide-over panel
components/site-nav.tsx
Converted to client component with state-driven mobile menu, Escape key dismissal, body scroll locking, route-change auto-close, and hamburger toggle visible on small screens only.
New MDX visual figure components
components/mdx/figures.tsx
Added DemoVsProdFigure, MemoryDriftFigure, and JudgmentGateFigure SVG components visualizing demo vs production architecture, memory drift across runs, and judgment gate logic.
Register new figures in MDX components
components/mdx/mdx-components.tsx
Imported and registered the three new figure components for use in MDX content.
Card illustration for new article
components/card-illustrations.tsx
Added WhyHardArt SVG component and registered in SLUGS mapping for the why-proactive-is-hard article.
New article: what makes proactive agents hard
content/posts/why-proactive-is-hard.mdx
Published article explaining proactive agent complexity: wake-up timing, cross-run memory/state, judgment on action, and provider scaling, with embedded visual components.
Editorial refinements across existing articles
content/posts/*, content/market/*
Updated frontmatter summaries and body text across 11 posts and 1 market page, refining phrasing, emphasis, and voice consistency.
Writing voice guide for Khaliq
.agentworkforce/workforce/skills/khaliq-voice.md
Comprehensive documentation specifying tone (first-person, grounded optimism), sentence patterns, word choice, opening/closing preferences, personality markers, hard prohibitions, and pre-publish voice checklist.
MCP permissions configuration update
.agentworkforce/workforce/personas/operator.json
Added mode: bypassPermissions to MCP permissions configuration.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 New frames for every post and page,
🌅 OG images now the latest stage,
📱 Mobile menu slides in with grace,
✨ Figures dance in content's space,
📝 Voice refined from first to last—
A presentation sprint, complete and fast!

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive No description was provided by the author, making it impossible to evaluate whether it relates to the changeset. Add a pull request description explaining the motivation, scope, and key changes related to mobile fixes and the voice guide.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately captures two main change categories: mobile layout adjustments across multiple pages/components and the addition of a new voice guide file for Khaliq Gant.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/mobile-layout

Warning

Review ran into problems

🔥 Problems

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.


Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
content/posts/why-proactive-is-hard.mdx (1)

31-92: ⚠️ Potential issue | 🔴 Critical

Fix broken internal link: /posts/proactive-agent-landscape does not exist.

The link in "We've been tracking who's building what in a landscape scorecard" references a post that is not present in the content/posts directory. This creates a broken link and damages internal linking SEO value. Either create the referenced post or replace the link with an existing slug.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@content/posts/why-proactive-is-hard.mdx` around lines 31 - 92, The internal
link "[a landscape scorecard](/posts/proactive-agent-landscape)" is broken
because the slug /posts/proactive-agent-landscape doesn't exist; either create a
post with that slug or update the MDX to reference an existing slug—locate the
link text "We've been tracking who's building what in [a landscape
scorecard](/posts/proactive-agent-landscape)" and replace the URL with the
correct post slug (or add the missing post content with that exact slug) so the
internal link resolves.
🧹 Nitpick comments (2)
content/posts/building-weekly-digest.mdx (1)

9-11: ⚡ Quick win

Add source links for named platforms to improve citation-friendly clarity.

This section names key entities (Cloudflare Pages Functions, GitHub issues) but doesn’t link all of them. Adding links here improves factual traceability and machine comprehension.

✍️ Suggested edit
-The weekly-digest agent is a Cloudflare Pages Function wired to cron (`0 9 * * 6`, Saturday mornings). It fans out across four sources looking for mentions of "proactive agents," deduplicates what it finds against previous results, clusters the survivors by topic using an LLM, and upserts a single GitHub issue labeled `weekly-digest`. A run takes about twelve seconds.
+The weekly-digest agent is a [Cloudflare Pages Function](https://developers.cloudflare.com/pages/functions/) wired to cron (`0 9 * * 6`, Saturday mornings). It fans out across four sources looking for mentions of "proactive agents," deduplicates what it finds against previous results, clusters the survivors by topic using an LLM, and upserts a single [GitHub issue](https://docs.github.com/en/issues) labeled `weekly-digest`. A run takes about twelve seconds.

As per coding guidelines, "Apply GEO fundamentals to every deliverable: ... citation-friendly claims, entity clarity ..."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@content/posts/building-weekly-digest.mdx` around lines 9 - 11, The paragraph
mentions platforms without links—update the "weekly-digest agent" description to
add citation-friendly hyperlinks for the named entities (e.g., link "Cloudflare
Pages Function" to Cloudflare Pages Functions docs and "GitHub issue" or the
`weekly-digest` label to GitHub Issues documentation or the repo label page) so
readers can follow sources; keep existing inline post links as-is and ensure the
added links are concise, authoritative, and placed directly on the phrases
"Cloudflare Pages Function" and "GitHub issue" (and optionally the cron
expression) for clarity.
content/posts/push-breaks-too.mdx (1)

9-13: ⚡ Quick win

Make the opening answer-first to improve GEO/SEO scanability.

The new intro is readable, but it delays the core takeaway. Lead with a one-sentence thesis (“push fails in specific ways; here are mitigations”), then keep the personal context after it.

Suggested edit
-I've spent a ton of this series talking up push-based, event-driven architectures. Polling is wasteful. Cron loops are fragile. Webhooks deliver change the moment it happens. All of that is true.
-
-But I'd be lying if I said push doesn't break too. So here's the other side.
-
-Push architectures break. Sometimes in small annoying ways, sometimes spectacularly. Some of these I've seen firsthand while building the webhook infrastructure described in [the webhook tax](/posts/the-webhook-tax). Others I know from my time at [Nango](https://nango.dev) and from talking to teams who run webhook-heavy systems in production.
+Push architectures fail in predictable ways in production: missed events, replay storms, ordering gaps, and silent schema drift. This post explains where they break and what mitigations actually work.
+
+I've spent much of this series advocating push-based, event-driven systems—and that guidance still stands for many agent workloads. But in practice, push also introduces sharp operational edges.
+
+Some of these failure modes come from building the webhook infrastructure described in [the webhook tax](/posts/the-webhook-tax), and others from my time at [Nango](https://nango.dev) and conversations with teams running webhook-heavy systems.

As per coding guidelines, "Apply GEO fundamentals to every deliverable: answer-first structure, high factual density, citation-friendly claims, entity clarity..."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@content/posts/push-breaks-too.mdx` around lines 9 - 13, The intro delays the
main takeaway—rewrite the very first line to an answer-first thesis such as
“Push fails in specific ways; here are practical mitigations,” then move the
existing opening paragraph that begins "I've spent a ton of this series talking
up push-based, event-driven architectures..." directly after that thesis so the
post leads with the core claim and keeps the personal/contextual content
immediately following.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.agentworkforce/workforce/personas/operator.json:
- Line 67: The persona configuration currently sets the JSON property "mode" to
"bypassPermissions" for the operator persona; remove this global bypass or
replace it with an environment-gated value (e.g., enable only when not in
production) and restore least-privilege checks so normal permission guards
remain active for the operator configuration.

In @.agentworkforce/workforce/skills/khaliq-voice.md:
- Line 127: Replace the malformed prohibition sentence containing the exact
phrase "a series that only X isn't really Y" with a clearer alternative; locate
that string in .agentworkforce/workforce/skills/khaliq-voice.md and change it to
a concise prohibition such as "a series that presents only X and therefore isn't
really Y" or "a series that includes only X but is not truly Y" so the rule
reads grammatically correct and is easy to apply during writing/editing.

In `@components/site-nav.tsx`:
- Around line 129-141: The mobile drawer never closes when a user taps the
already-active nav item because closing only depends on pathname changes; inside
the LINKS.map render where the Link is returned (the block using pathname,
active, and rendering l.label), add an onClick={() => setOpen(false)} prop to
the Link so any tap always closes the drawer (keep the existing active logic and
className intact); ensure setOpen is in scope (imported/prop or useState) and
that this handler does not prevent the normal navigation behavior.

In `@content/market/proactive-agent-landscape.mdx`:
- Line 9: The sentence beginning "Six months ago, nobody was really shipping
proactive agents..." is a sweeping market claim; either add one or more citation
links to credible sources (e.g., blog posts, press releases, major announcements
from OpenAI, Google, Anthropic, Meta, Perplexity, or reputable industry
analyses) supporting the claim, or tone it down to a citation-friendly qualifier
such as "several major AI labs" or "many teams" and include a supporting source;
update the line in content/market/proactive-agent-landscape.mdx (the paragraph
that lists OpenAI, Google, Anthropic, Meta, Perplexity, etc.) to include the
chosen citation(s) or the narrowed phrasing.

In `@content/posts/building-weekly-digest.mdx`:
- Line 122: Replace the absolute phrase "it basically costs nothing" in the
sentence starting "At this price point, the 'is this worth running?' question
never comes up." with a measured alternative such as "it is effectively zero at
current usage" (or similar) to match the prior quantified phrasing ("fractions
of a cent", "less than a penny") and maintain factual consistency and
citation-friendliness.

In `@content/posts/chatgpt-pulse.mdx`:
- Line 81: The sentence "The models are good enough to handle every judgment
call on this list" is an unsupported strong claim—either add a citation or
soften it: replace or augment that sentence by citing relevant benchmarks,
papers, or benchmark results (e.g., model names and evaluation metrics) that
demonstrate capability, or rephrase to a qualified statement such as "models are
approaching the capability to handle many judgment calls" and/or mention
specific limitations; locate and update that exact sentence in
content/posts/chatgpt-pulse.mdx.

In `@content/posts/three-primitives.mdx`:
- Line 78: The statement on Line 78 ("None of this is exotic security
engineering...") is presented as a broad industry fact; either add a supporting
citation (e.g., a blog post, paper, or reputable article about agent frameworks
and API key misuse) or rephrase it as an anecdotal/observed pattern (e.g., "In
our experience..." or "Often, agent frameworks...") so the claim is
citation-friendly; update the sentence in content/posts/three-primitives.mdx
accordingly and include the citation reference or the scoped wording.

In `@lib/og.tsx`:
- Around line 25-31: Truncate long titles like you do summaries: introduce a
truncatedTitle (e.g., const truncatedTitle = title.length > 80 ? title.slice(0,
77) + "…" : title) and use truncatedTitle wherever title is rendered in the OG
component (replace direct uses of title with truncatedTitle); apply the same
change to the other OG rendering block referenced (the second occurrence around
the other title rendering) so both instances use the new truncatedTitle instead
of the raw title.

---

Outside diff comments:
In `@content/posts/why-proactive-is-hard.mdx`:
- Around line 31-92: The internal link "[a landscape
scorecard](/posts/proactive-agent-landscape)" is broken because the slug
/posts/proactive-agent-landscape doesn't exist; either create a post with that
slug or update the MDX to reference an existing slug—locate the link text "We've
been tracking who's building what in [a landscape
scorecard](/posts/proactive-agent-landscape)" and replace the URL with the
correct post slug (or add the missing post content with that exact slug) so the
internal link resolves.

---

Nitpick comments:
In `@content/posts/building-weekly-digest.mdx`:
- Around line 9-11: The paragraph mentions platforms without links—update the
"weekly-digest agent" description to add citation-friendly hyperlinks for the
named entities (e.g., link "Cloudflare Pages Function" to Cloudflare Pages
Functions docs and "GitHub issue" or the `weekly-digest` label to GitHub Issues
documentation or the repo label page) so readers can follow sources; keep
existing inline post links as-is and ensure the added links are concise,
authoritative, and placed directly on the phrases "Cloudflare Pages Function"
and "GitHub issue" (and optionally the cron expression) for clarity.

In `@content/posts/push-breaks-too.mdx`:
- Around line 9-13: The intro delays the main takeaway—rewrite the very first
line to an answer-first thesis such as “Push fails in specific ways; here are
practical mitigations,” then move the existing opening paragraph that begins
"I've spent a ton of this series talking up push-based, event-driven
architectures..." directly after that thesis so the post leads with the core
claim and keeps the personal/contextual content immediately following.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f38ed77f-a9f4-4625-a4f1-185a11635529

📥 Commits

Reviewing files that changed from the base of the PR and between 6fcb90a and cf3f22b.

📒 Files selected for processing (38)
  • .agentworkforce/workforce/personas/operator.json
  • .agentworkforce/workforce/skills/khaliq-voice.md
  • app/about/page.tsx
  • app/agent/page.tsx
  • app/globals.css
  • app/guide/page.tsx
  • app/market/[slug]/opengraph-image.tsx
  • app/market/[slug]/page.tsx
  • app/market/[slug]/twitter-image.tsx
  • app/market/page.tsx
  • app/opengraph-image.tsx
  • app/page.tsx
  • app/posts/[slug]/opengraph-image.tsx
  • app/posts/[slug]/page.tsx
  • app/posts/[slug]/twitter-image.tsx
  • app/posts/page.tsx
  • app/twitter-image.tsx
  • components/card-illustrations.tsx
  • components/mdx/figures.tsx
  • components/mdx/mdx-components.tsx
  • components/post-hero.tsx
  • components/post-nav.tsx
  • components/site-footer.tsx
  • components/site-nav.tsx
  • content/market/proactive-agent-landscape.mdx
  • content/posts/building-weekly-digest.mdx
  • content/posts/chatgpt-pulse.mdx
  • content/posts/magical-agents.mdx
  • content/posts/push-breaks-too.mdx
  • content/posts/reactive-vs-proactive.mdx
  • content/posts/the-genesis.mdx
  • content/posts/the-prompt-cant-save-you.mdx
  • content/posts/the-webhook-tax.mdx
  • content/posts/the-wish-list.mdx
  • content/posts/three-primitives.mdx
  • content/posts/why-proactive-is-hard.mdx
  • lib/og.tsx
  • lib/seo.ts

}
},
"permissions": {
"mode": "bypassPermissions",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Avoid globally bypassing permission checks for this persona

Line 67 sets mode to bypassPermissions, which effectively disables normal guardrails and creates a high-risk authorization path for MCP actions. Please remove this override (or gate it to non-production only) and keep least-privilege enforcement active.

Suggested fix
   "permissions": {
-    "mode": "bypassPermissions",
     "allow": [
       "mcp__notion"
     ]
   },
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"mode": "bypassPermissions",
"permissions": {
"allow": [
"mcp__notion"
]
},
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agentworkforce/workforce/personas/operator.json at line 67, The persona
configuration currently sets the JSON property "mode" to "bypassPermissions" for
the operator persona; remove this global bypass or replace it with an
environment-gated value (e.g., enable only when not in production) and restore
least-privilege checks so normal permission guards remain active for the
operator configuration.

- End with grand closing lines that could be taglines
- Write balanced parallel comparisons: "X gives you A but costs B. Y gives you C but costs D." Real people don't structure observations this symmetrically.
- Write sentences that could be pulled out as LinkedIn quotes. If it sounds quotable, it's too polished. Rough it up.
- Use "a series that only X isn't really Y" or similar meta-commentary that sounds like an essayist performing self-awareness
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix malformed prohibition sentence for clarity.

The phrase "a series that only X isn't really Y" reads broken and is hard to apply consistently during writing/editing.

Suggested wording fix
-- Use "a series that only X isn't really Y" or similar meta-commentary that sounds like an essayist performing self-awareness
+- Use meta-commentary patterns like "a series that only criticizes X isn't really Y" that sound like an essayist performing self-awareness
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Use "a series that only X isn't really Y" or similar meta-commentary that sounds like an essayist performing self-awareness
- Use meta-commentary patterns like "a series that only criticizes X isn't really Y" that sound like an essayist performing self-awareness
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agentworkforce/workforce/skills/khaliq-voice.md at line 127, Replace the
malformed prohibition sentence containing the exact phrase "a series that only X
isn't really Y" with a clearer alternative; locate that string in
.agentworkforce/workforce/skills/khaliq-voice.md and change it to a concise
prohibition such as "a series that presents only X and therefore isn't really Y"
or "a series that includes only X but is not truly Y" so the rule reads
grammatically correct and is easy to apply during writing/editing.

Comment thread components/site-nav.tsx
Comment on lines +129 to +141
{LINKS.map((l) => {
const active = pathname === l.href || pathname.startsWith(`${l.href}/`);
return (
<Link
key={l.href}
href={l.href}
className={`flex items-center justify-between border-b border-rule/60 py-4 font-display text-2xl tracking-tight transition-colors ${
active ? "text-terracotta" : "text-ink hover:text-terracotta"
}`}
>
{l.label}
<span aria-hidden className="text-ink-faint">→</span>
</Link>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Close the drawer on mobile link click, even for same-route taps.

On Line 130, closing currently depends on pathname changing. If the user taps the already-active route, the drawer stays open. Add an onClick={() => setOpen(false)} on mobile links.

Suggested patch
                 <Link
                   key={l.href}
                   href={l.href}
+                  onClick={() => setOpen(false)}
                   className={`flex items-center justify-between border-b border-rule/60 py-4 font-display text-2xl tracking-tight transition-colors ${
                     active ? "text-terracotta" : "text-ink hover:text-terracotta"
                   }`}
                 >
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{LINKS.map((l) => {
const active = pathname === l.href || pathname.startsWith(`${l.href}/`);
return (
<Link
key={l.href}
href={l.href}
className={`flex items-center justify-between border-b border-rule/60 py-4 font-display text-2xl tracking-tight transition-colors ${
active ? "text-terracotta" : "text-ink hover:text-terracotta"
}`}
>
{l.label}
<span aria-hidden className="text-ink-faint"></span>
</Link>
{LINKS.map((l) => {
const active = pathname === l.href || pathname.startsWith(`${l.href}/`);
return (
<Link
key={l.href}
href={l.href}
onClick={() => setOpen(false)}
className={`flex items-center justify-between border-b border-rule/60 py-4 font-display text-2xl tracking-tight transition-colors ${
active ? "text-terracotta" : "text-ink hover:text-terracotta"
}`}
>
{l.label}
<span aria-hidden className="text-ink-faint"></span>
</Link>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/site-nav.tsx` around lines 129 - 141, The mobile drawer never
closes when a user taps the already-active nav item because closing only depends
on pathname changes; inside the LINKS.map render where the Link is returned (the
block using pathname, active, and rendering l.label), add an onClick={() =>
setOpen(false)} prop to the Link so any tap always closes the drawer (keep the
existing active logic and className intact); ensure setOpen is in scope
(imported/prop or useState) and that this handler does not prevent the normal
navigation behavior.

---

Six months ago, proactive AI was a research concept. Today, every major AI lab either has a proactive agent product in market or has one in internal testing. The convergence is striking: OpenAI, Google, Anthropic, Meta, Perplexity, and several startups are all building agents that act without being asked.
Six months ago, nobody was really shipping proactive agents. Now every major AI lab either has one in market or has one in internal testing. The convergence is something else: OpenAI, Google, Anthropic, Meta, Perplexity, and several startups all building agents that act without being asked.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add a citation or qualifier for the market-wide claim.

Line 9 makes a sweeping industry claim; please add a source link (or narrow the wording) so the statement is citation-friendly and easier for machines/readers to trust.

As per coding guidelines, "Apply GEO fundamentals to every deliverable: ... citation-friendly claims ..."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@content/market/proactive-agent-landscape.mdx` at line 9, The sentence
beginning "Six months ago, nobody was really shipping proactive agents..." is a
sweeping market claim; either add one or more citation links to credible sources
(e.g., blog posts, press releases, major announcements from OpenAI, Google,
Anthropic, Meta, Perplexity, or reputable industry analyses) supporting the
claim, or tone it down to a citation-friendly qualifier such as "several major
AI labs" or "many teams" and include a supporting source; update the line in
content/market/proactive-agent-landscape.mdx (the paragraph that lists OpenAI,
Google, Anthropic, Meta, Perplexity, etc.) to include the chosen citation(s) or
the narrowed phrasing.

Total monthly cost: effectively zero. The Brave free tier gives us 250x more queries than we use. The OpenRouter call costs less than a penny. The GitHub API has no meaningful rate limit at this volume. The Cloudflare function runs for under a minute per month total.

At this price point, the "is this worth running?" question never comes up. The agent costs less per month than the electricity to think about whether to keep it.
At this price point, the "is this worth running?" question never comes up. It basically costs nothing.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Avoid absolute cost phrasing to keep factual consistency.

“it basically costs nothing” is a bit too absolute, especially after giving quantified costs (“fractions of a cent”, “less than a penny”). Prefer “effectively zero at current usage.”

✍️ Suggested edit
-At this price point, the "is this worth running?" question never comes up. It basically costs nothing.
+At this price point, the "is this worth running?" question never comes up. At current volume, the monthly cost is effectively zero.

As per coding guidelines, "Apply GEO fundamentals to every deliverable: ... high factual density, citation-friendly claims ..."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
At this price point, the "is this worth running?" question never comes up. It basically costs nothing.
At this price point, the "is this worth running?" question never comes up. At current volume, the monthly cost is effectively zero.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@content/posts/building-weekly-digest.mdx` at line 122, Replace the absolute
phrase "it basically costs nothing" in the sentence starting "At this price
point, the 'is this worth running?' question never comes up." with a measured
alternative such as "it is effectively zero at current usage" (or similar) to
match the prior quantified phrasing ("fractions of a cent", "less than a penny")
and maintain factual consistency and citation-friendliness.

An inbox delivers results wherever they're useful. A morning card when a digest is the right format. A Slack DM when something is urgent. A draft email when the right action is a reply. A filed ticket when the right action is tracking. The delivery channel matches the action, not the product's UI constraints.

That version of Pulse would actually look like the proactive assistant OpenAI described in the announcement. The models are good enough to handle every judgment call on this list. They have been for a while. What's missing is the infrastructure underneath.
That version of Pulse would actually look like the proactive assistant OpenAI described in the announcement. The models are good enough to handle every judgment call on this list, and honestly they have been for a while. What's missing is the infrastructure underneath, and that's the harder part to build.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Qualify or cite the “models are good enough” assertion.

Line 81 is a strong technical claim; add supporting evidence (benchmark/reference) or soften the phrasing to keep the argument citation-friendly.

As per coding guidelines, "Apply GEO fundamentals to every deliverable: ... citation-friendly claims ..."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@content/posts/chatgpt-pulse.mdx` at line 81, The sentence "The models are
good enough to handle every judgment call on this list" is an unsupported strong
claim—either add a citation or soften it: replace or augment that sentence by
citing relevant benchmarks, papers, or benchmark results (e.g., model names and
evaluation metrics) that demonstrate capability, or rephrase to a qualified
statement such as "models are approaching the capability to handle many judgment
calls" and/or mention specific limitations; locate and update that exact
sentence in content/posts/chatgpt-pulse.mdx.

The fix is narrow scoping at three levels. First, per-agent: the digest agent gets read access to GitHub issues, not write access to your production database. Second, per-provider: a token for Notion doesn't also unlock Slack. Third, per-workspace: an agent operating in the "support" workspace can't reach into "finance." Token rotation matters too. Short-lived tokens with refresh grants mean a compromised agent loses access on the next rotation, not indefinitely. And every action the agent takes needs to be logged and attributable, because "the agent did it" is not a sufficient incident postmortem.

None of this is exotic security engineering. It's the same principle behind IAM policies and service accounts. But most agent frameworks ship with a single API key that has access to everything, because that's easier to demo. Production is not a demo.
None of this is exotic security engineering. It's the same principle behind IAM policies and service accounts. But most agent frameworks ship with a single API key that has access to everything, because that's easier to demo. And then you wonder why things go sideways at 3am.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Back the framework-wide security claim with a source (or scope it as anecdotal).

Line 78 currently reads as a broad industry fact; add a citation or rephrase as an observed pattern from your own implementations.

As per coding guidelines, "Apply GEO fundamentals to every deliverable: ... citation-friendly claims ..."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@content/posts/three-primitives.mdx` at line 78, The statement on Line 78
("None of this is exotic security engineering...") is presented as a broad
industry fact; either add a supporting citation (e.g., a blog post, paper, or
reputable article about agent frameworks and API key misuse) or rephrase it as
an anecdotal/observed pattern (e.g., "In our experience..." or "Often, agent
frameworks...") so the claim is citation-friendly; update the sentence in
content/posts/three-primitives.mdx accordingly and include the citation
reference or the scoped wording.

Comment thread lib/og.tsx
Comment on lines +25 to +31
title: string,
summary: string,
accent: string = "peach",
) {
const accentColor = ACCENT[accent] || ACCENT.peach;
const truncatedSummary =
summary.length > 160 ? summary.slice(0, 157) + "…" : summary;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add title truncation to avoid OG image overflow.

Line 25 currently accepts unbounded titles while only summary is truncated on Lines 30–31. Long post titles can clip in the fixed-size OG layout.

Proposed patch
 export function createOgImage(
   title: string,
   summary: string,
   accent: string = "peach",
 ) {
   const accentColor = ACCENT[accent] || ACCENT.peach;
+  const truncatedTitle =
+    title.length > 90 ? title.slice(0, 87).trimEnd() + "…" : title;
   const truncatedSummary =
     summary.length > 160 ? summary.slice(0, 157) + "…" : summary;
@@
-              {title}
+              {truncatedTitle}
             </div>

Also applies to: 94-103

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/og.tsx` around lines 25 - 31, Truncate long titles like you do summaries:
introduce a truncatedTitle (e.g., const truncatedTitle = title.length > 80 ?
title.slice(0, 77) + "…" : title) and use truncatedTitle wherever title is
rendered in the OG component (replace direct uses of title with truncatedTitle);
apply the same change to the other OG rendering block referenced (the second
occurrence around the other title rendering) so both instances use the new
truncatedTitle instead of the raw title.

@khaliqgant khaliqgant merged commit f0d6e04 into main May 12, 2026
1 check was pending
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