diff --git a/AGENTS.md b/AGENTS.md index 2150346..7e114b2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,6 +16,11 @@ House style: ASCII punctuation only, no em dashes; operator-first, skeptical, no hype. Cite the primary source on the claim-bearing words. Every claim carries a receipt or it does not ship. +For reader-facing prose, use the repo-local [humanizer skill](./skills/humanizer/SKILL.md): +the public copy should sound like a sharp person explaining the idea clearly, +with traceability and research-process details pushed into quieter source +layers. + Validate before you push: npm --prefix site run build # regenerates pages + internal link check diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ebd958a..0fa7935 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -61,6 +61,17 @@ window-anchoring; the maintainers decide whether it rises to a signal. See the A coverage gap must carry the same receipt and in-window date as a correction, plus which artifact should have caught it (which window's digest, which profile). +For public X/social discovery that may become a coverage gap later, use the +[X Social Harvest Workflow](./docs/x-social-harvest-workflow.md). Social harvests +are candidate inputs only; product/version claims still need source-contract +cross-checks before promotion. + +For deeper public-conversation work, including static tweet-like receipt cards +and ecosystem-drama cataloging, use the +[Deep Social Research Loop](./docs/deep-social-research-loop.md). The loop keeps +cards repo-local and treats social posts as context until source contracts +support promotion. + ### 3. New-source proposals A proposal to add a watchlist source contract (a new provider) or an diff --git a/docs/deep-social-research-loop.md b/docs/deep-social-research-loop.md new file mode 100644 index 0000000..0cfdd8f --- /dev/null +++ b/docs/deep-social-research-loop.md @@ -0,0 +1,114 @@ +# Deep Social Research Loop + +This workflow turns public X/social material into a richer research layer for +Bitter Frontier without relaxing the evidence floor for product claims. + +The loop has three roles: + +- Scout: mines public social posts for interesting facts, public exchanges, + adoption signals, user pain, maintainer intent, benchmark discourse, and + ecosystem drama. +- Critic: challenges the scout packet for overclaiming, missing counter-posts, + weak source attribution, and unclear operator relevance. +- Editor: stores only reproducible artifacts in the repo, writes cautious + summaries, and decides what remains social context versus what deserves a + later source-contract verification pass. + +The role names are generic. Do not record private session identifiers, model +transcripts, raw API payloads, local paths, private prompts, reviewer names, or +credentials in public artifacts. + +## Output Shape + +A social research run may include: + +```text +runs// + manifest.yml + editorial.yml + harvest/*.md + social-cards/*.yml + research-journal.md + verify/*.md + qa.md +``` + +`harvest/*.md` keeps structured candidate claims. `social-cards/*.yml` stores +static post artifacts the site can embed inside editorial. `editorial.yml` is +the public reading experience: argument first, evidence woven into the essay, +with traceability pushed into source links or a collapsed source trail. +`research-journal.md` records editorial decisions, open loops, and what the next +scout pass should investigate. + +## Publication Rule + +The public page should read like a finished editorial, not a research binder. +Use X/social material to sharpen the story, show the public conversation, and +surface questions a release-note-only workflow would miss. Do not lead with raw +receipts, card grids, QA notes, claim tables, or artifact inventories. + +Traceability remains mandatory, but it belongs in the background: source links +on the embedded post figure, collapsed evidence notes, repo artifacts, and the +Git history. A reader should be able to audit the piece without having the audit +machinery interrupt the piece. + +## Static Social Cards + +Social cards simulate the useful parts of an embedded post while keeping runtime +independent from X. They are source material for editorial embeds, not the +primary public artifact: + +```yaml +schema_version: bitter.frontier_social_cards.v0 +run_id: 2026-06-24-x-social-harvest-2026-06-24-frontier-v0 +cards: + - id: + title: + kind: capability_announcement | maintainer_intent | user_pain | adoption_signal | benchmark_discourse | ecosystem_drama | public_exchange | governance_or_affiliation | meme_or_positioning + status: candidate | social_context | single_source_unconfirmed | needs_primary_crosscheck | verified_secondary | refuted | superseded + date: YYYY-MM-DD + date_precision: day | month_only | year_only | unknown + date_note: + source_ids: [] + authors: [] + source_urls: [] + excerpt: + summary: + why_it_matters: + verification_needed: + confidence: + caveats: + tags: [] +``` + +Use short excerpts only. Prefer a neutral summary plus a source link over long +quoted text. + +## Evidence Boundaries + +- A social card can make the journal more grounded and readable. +- A social card is not, by itself, a finding, signal, digest claim, or profile + claim. +- Product/version/capability claims still need source-contract verification + before promotion. +- A secondary receipt upgrades only the exact bounded claim it proves. Do not + let a real release tag or PR validate a different claim from the same project. +- Drama, public exchanges, rankings, benchmark chatter, and user pain may be + cataloged as ecosystem context when clearly labeled. +- If a claim depends on a thread or reply chain, keep enough public source URLs + to let a reader reconstruct the exchange. +- Reputational or conduct claims about named people or organizations stay + journal-only unless supported by direct primary receipts. +- User-pain and drama clusters should include counterweight searches: fixes, + maintainer replies, disconfirming posts, issue threads, or release notes. + +## Loop Cadence + +1. Scout one slice: a project, theme, or date window. +2. Critic pass: reject weak items, ask for missing context, and identify + follow-up searches. +3. Editor pass: write or revise social cards, journal notes, and caveats. +4. Repeat until the remaining open questions are specific verification tasks, + not broad social discovery gaps. +5. Run `git diff --check`, `node site/scripts/check-integrity.mjs`, and the site + build before publishing. diff --git a/docs/x-social-harvest-workflow.md b/docs/x-social-harvest-workflow.md new file mode 100644 index 0000000..39e3586 --- /dev/null +++ b/docs/x-social-harvest-workflow.md @@ -0,0 +1,155 @@ +# X Social Harvest Workflow + +This workflow captures public X/social signals as discovery input for Bitter +Frontier. It does not create findings, signals, digests, or profile updates by +itself. Promotion happens only in a later source-contract pass. + +## When to use it + +Use this workflow when X/social posts may reveal maintainer intent, public +adoption, ecosystem tension, or feature announcements that are not yet obvious +from releases and changelogs. + +Do not use it to publish claims directly. A social post can seed a candidate; it +does not satisfy the evidence floor for product/version claims unless the source +contract explicitly accepts that evidence kind. + +## Run shape + +Create a run directory: + +```text +runs/YYYY-MM-DD-x-social-harvest-YYYY-MM-DD-frontier-v0/ + manifest.yml + editorial.yml + harvest/.md + social-cards/.yml + research-journal.md + verify/x-post-dates.md + qa.md +``` + +Keep the run public and reproducible. Do not mention local paths, session IDs, +private prompts, private API payloads, reviewer names, or internal coordination. + +`editorial.yml` is the public reading surface for a social harvest. It should +read like a finished essay: thesis first, human stakes second, evidence embedded +tastefully where it clarifies the argument. The rest of the run is supporting +infrastructure. Do not make readers begin with receipt grids, harvest tables, +QA notes, or artifact inventories. + +## Harvest fields + +Each claim record should include these fields: + +```text +claim_id: +source: +claim: +primary_url: +author: +observed_at: YYYY-MM-DD +event_date: YYYY-MM-DD +date_precision: day | month_only | year_only | unknown +date_note: +evidence_kind: maintainer_authored_post | official_account_post | community_discussion | community_account_post +channel: x.com +status: candidate | needs_primary_crosscheck | single-source-unconfirmed | refuted | superseded +secondary_receipts: +crosscheck_status: verified_primary | verified_secondary | needs_primary_crosscheck | single_source_unconfirmed | social_only | refuted | superseded +release_channel: tagged-release | main-unreleased | preview-or-beta | social_only | not_applicable | mixed +operator_consequence: +notes: +``` + +`secondary_receipts` is optional. When present, use public URLs such as GitHub +release tags, commits, pull requests, changelog entries, or official docs. + +## Evidence rules + +- Persist exact public post URLs, not paraphrased search results. +- Resolve post dates to full ISO `YYYY-MM-DD` when possible. +- If only month or year is available, record `date_precision` and explain the + limitation in `date_note`. +- Use cautious `operator_consequence` language. Social evidence can suggest what + to investigate; it should not tell operators to upgrade, migrate, or trust a + feature. +- Mark product/version claims `needs_primary_crosscheck` until checked against + the relevant source contract. +- Mark drama, adoption, benchmark, and ranking claims + `single-source-unconfirmed` unless independently supported. + +For richer public context, use the +[Deep Social Research Loop](./deep-social-research-loop.md). It defines the +static social-card format used to render tweet-like figures inside the editorial +from repo data without loading X at runtime. + +## Cross-check pass + +For each product/version/capability claim, check the public source contract +surface before promotion: + +- GitHub releases or tags +- commit or pull request receipts +- official docs or changelog +- reproducible local probe, when appropriate + +Record the result as `crosscheck_status`. If the claim is only social evidence, +leave it as `needs_primary_crosscheck` or `single_source_unconfirmed`. + +When upgrading a claim to `verified_secondary`, record the receipt-to-claim map. +The secondary receipt must prove the same bounded claim, not merely a nearby +claim in the same project. Narrow the claim text when the receipt verifies only +part of the social post. + +Examples: + +- A release tag that includes an Antigravity transition banner and migration + commands can verify transition/migration support, but not a broader social + claim about a hard cutoff or quota pain. +- A release PR that adds an ACP settings UI can partially support an ACP post, + but it should not verify every SDK, cloud, or product-surface claim unless the + receipt names those surfaces. +- A release that contains adjacent orchestration or adapter work should not + verify an aspirational maintainer post unless it names the same shipped + feature. + +For drama, affiliation, takedown, funding, hiring, or motive claims naming +people or organizations, keep the item as journal context until direct +participant posts, public organization records, or other primary receipts +support the exact claim. Date precision alone is not enough. + +When a social cluster is user pain or drama, look for counterweight before +publishing the run: maintainer replies, release fixes, docs, issue threads, or +changelog entries that show remediation or disconfirmation. + +## QA checklist + +Before opening or updating a PR: + +- Every claim has a public `primary_url`. +- Every claim has `observed_at`, `event_date`, `date_precision`, and `date_note`. +- Every product/version claim has `crosscheck_status`. +- Every `verified_secondary` claim has a public receipt-to-claim explanation. +- Reputational or conduct claims remain journal-only unless exact primary + evidence supports them. +- User-pain clusters include counterweight search notes where public releases, + issues, or maintainer replies exist. +- No claim is promoted into `content/digests`, `content/profiles`, or + `signals/frontier-signals.yml`. +- `verify/x-post-dates.md` explains how dates were resolved. +- `qa.md` lists what was checked, what remains unchecked, and the discovery-only + boundary. +- `git diff --check` passes. +- `node site/scripts/check-integrity.mjs` passes. + +## PR language + +Describe the PR as a discovery harvest, not a verified digest. A good summary is: + +```text +Public X/social discovery harvest for candidate Frontier claims. The run records +public post URLs, exact or qualified dates, evidence kind, status, and +cross-check state. No claims are promoted to findings, signals, digests, or +profiles. +``` diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/editorial.yml b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/editorial.yml new file mode 100644 index 0000000..5634fb8 --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/editorial.yml @@ -0,0 +1,175 @@ +schema_version: bitter.frontier_run_editorial.v0 +title: The Agent Fight Is About Trust Now +dek: A noisy week on X made one thing clearer. The fight is no longer just about better code edits. It's about whether these tools are becoming infrastructure that teams can actually trust. +eyebrow: Social dispatch +byline: Bitter Frontier +published_at: 2026-06-24 +blocks: + - type: paragraph + text: > + Here's what jumped out this week: the loudest posts were not really about + coding. They were about trust. Who gets to remember your project? Who + controls the place where the agent runs? Who can spend tokens on your + behalf? Who do you blame when the agent goes sideways? + + - type: paragraph + text: > + That's a different conversation from "which agent writes the best patch?" + A few months ago, it still made sense to talk about these tools like + autocomplete with ambition. Now they look more like small operating + systems for work. Once you see that, the launch posts, release notes, and + drama all start to rhyme. + + - type: pullquote + text: The question is no longer just "can it write code?" It is "would you let it keep working after you close the laptop?" + attribution: The shift + + - type: heading + text: Memory Is Becoming the Product + + - type: paragraph + text: > + Hermes is the easiest place to see it. The /learn pitch is that the agent + can turn code, docs, and prior sessions into reusable skills. If that + works well, it is not just a shortcut. It means yesterday's work can + make tomorrow's agent better. The agent is no longer only reading context. + It is trying to remember how the team works. + + - type: social_embed + card_id: hermes-learn-official-post + caption: "Hermes is selling memory as a front-door feature: past work becomes something the agent can reuse, not just context it consumes." + + - type: paragraph + text: > + That's exciting, but it also opens the obvious questions. What exactly is + being saved? Can the skill travel to another machine or another team? Does + it avoid secrets? What happens when it learns the wrong lesson? The launch + post is interesting because it points straight at those questions. + + - type: heading + text: Distribution Is Becoming the Product + + - type: paragraph + text: > + Gemini CLI and OpenHands show the second fight: where the agent lives. + Gemini's Antigravity transition can sound like branding, but the concrete + part is more practical. There are migration commands, docs, and transition + banners around v0.47.0. That matters because the channel decides how users + install the tool, how they move, what defaults they inherit, and who gets + to change the terms later. + + - type: social_embed + card_id: gemini-antigravity-transition-post + caption: The interesting story is not a slogan change; it is the migration path around a new distribution channel. + + - type: paragraph + text: > + OpenHands is coming at the same problem from the other side. Its ACP pitch + is basically: your agent should not be trapped in one client. The code and + release notes back up part of that story, especially UI, presets, and + routing work. They don't yet prove every product area named in the post. + That is fine. The important thing is that portability is becoming part of + what these products are selling, not an afterthought. + + - type: social_embed + card_id: openhands-acp-official-post + caption: The interop pitch matters because portability is a promise users can actually test. + + - type: heading + text: The Boring Controls Are Becoming the Story + + - type: paragraph + text: > + The third pattern is less flashy and probably more important. Codex + chatter around token budgets and Claude Code chatter around sandbox + credentials, resume repair, and remote MCP timeouts all point at the same + thing: once an agent runs for more than a few minutes, controls become the + product. Budgets, resumability, credential boundaries, and timeout behavior + aren't plumbing. They decide whether you can let the agent work without + babysitting it. + + - type: social_embed + card_id: codex-token-budget-release-post + caption: Token budgets are not a cosmetic feature. They give the agent a meter and a stopping point. + + - type: social_embed + card_id: claude-code-community-2187-post + caption: A community changelog is useful when it sends readers back to the official notes. + + - type: paragraph + text: > + This is where coding agents start to look more like security tooling than + developer toys. The question is not only "can it do the task?" The question + is "can we see what it did, stop it, and recover from it?" The least + flashy posts from the week may be the most important because they mark the + move from demos to operations. + + - type: heading + text: Drama Shows Where Trust Is Weak + + - type: paragraph + text: > + The OpenClaw and Hermes drama is tempting because drama is easy to follow. + But the useful part is not who got the best line off. The useful part is + what people chose to fight about: funding, non-profit posture, agendas, + and who deserves trust. That tells you project leadership is not a side + issue for agent tools. It is part of the product. + + - type: social_embed + card_id: openclaw-hermes-public-exchange + caption: The drama is useful because it shows where people are nervous about trust. It does not prove motives. + + - type: paragraph + text: > + The code keeps that from turning into a cheap dunk. OpenClaw's + recent release work shows active fixes around routing, channel/session + state, and trusted-policy hook composition. That doesn't erase user pain + or reputational tension, but it does stop the lazy version of the story: + "project is broken, rivals are right." The better read is messier: + reliability problems and active repair are happening at the same time. + + - type: heading + text: Ambition Matters Before It Ships + + - type: paragraph + text: > + Paperclip's Maximizer-mode post is different. It is not something you can + point to as shipped in the public releases from this window. But it + is still worth paying attention to because it says the quiet part out + loud. The market doesn't want to stop at "an agent helps me code." It + wants to get to "an agent can organize other agents toward an outcome." + + - type: social_embed + card_id: paperclip-maximizer-maintainer-post + caption: "The point is direction, not shipment: Paperclip is sketching a future of delegated agents managing other agents." + + - type: paragraph + text: > + That's the thread tying the week together. Hermes wants memory to + compound. Gemini and OpenHands are fighting over channels and portability. + Codex and Claude Code are making the boring controls more explicit. + OpenClaw and Hermes show that leadership and reputation travel through the + same channels as releases. Paperclip points toward agents delegating to + other agents. These are not separate anecdotes. They are the outline of a + stack. + + - type: heading + text: How to Read the Noise + + - type: paragraph + text: > + So the simple advice is: read the noise, but don't be ruled by it. Don't + migrate because a project account announced a future. Don't dismiss a + framework because a rival found a sore spot. Don't accept an interop + promise until you can see exactly what works. But do notice what the + conversation reveals before the release note does: where maintainers want + to move authority, where users feel trapped, where rivals attack trust, + and where boring controls start to matter more than benchmark theatrics. + + - type: paragraph + text: > + The agent frontier is becoming less about isolated intelligence and more + about permission. Who remembers? Who routes? Who pays? Who can stop the + work? Who can prove what happened? X will not answer those questions for + you. It is just a good place to notice which questions the market can no + longer avoid. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/agent-zero.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/agent-zero.md new file mode 100644 index 0000000..a66efc4 --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/agent-zero.md @@ -0,0 +1,19 @@ +# Harvest — agent-zero (X Social Signals) + +## Claim 1 +claim_id: agent-zero-governance-vote-2026-06 +source: agent-zero +claim: Agent Zero held a governance vote on vote transparency; 64% voted for public wallet addresses and weights. +primary_url: https://x.com/Agent0ai/status/2067583909815087601 +author: @Agent0ai +observed_at: 2026-06-24 +event_date: 2026-06-18 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2067583909815087601): 2026-06-18. Reproducible from primary_url. +evidence_kind: official_account_post +channel: x.com +status: candidate +crosscheck_status: social_only +release_channel: not_applicable +operator_consequence: Candidate governance-discovery item; verify against the project's governance surface before promotion. +notes: Governance signal. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/claude-code.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/claude-code.md new file mode 100644 index 0000000..190b65a --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/claude-code.md @@ -0,0 +1,19 @@ +# Harvest — claude-code (X Social Signals) + +## Claim 1 +claim_id: claude-code-takedown-2026 +source: claude-code +claim: Anthropic issued takedown requests for ~97 repositories containing copies or forks of Claude Code code. +primary_url: https://x.com/GergelyOrosz/status/2039450834853916811 +author: @GergelyOrosz +observed_at: 2026-06-24 +event_date: 2026-04-01 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2039450834853916811): 2026-04-01. Reproducible from primary_url. +evidence_kind: community_discussion +channel: x.com +status: single-source-unconfirmed +crosscheck_status: single_source_unconfirmed +release_channel: not_applicable +operator_consequence: Candidate ecosystem/trust item; needs independent public confirmation before promotion. +notes: Ecosystem / trust claim. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/codex.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/codex.md new file mode 100644 index 0000000..49468e2 --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/codex.md @@ -0,0 +1,39 @@ +# Harvest — codex (X Social Signals) + +## Claim 1 +claim_id: codex-disk-bug-2026-06 +source: codex +claim: Codex CLI v0.142.0 fixed aggressive background writing to ~/.codex/logs_2.sqlite that could fill SSDs. +primary_url: https://x.com/songguoxiansen/status/2069246911841022200 +author: @songguoxiansen +observed_at: 2026-06-24 +event_date: 2026-06-23 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2069246911841022200): 2026-06-23. Reproducible from primary_url. +evidence_kind: community_discussion +channel: x.com +status: candidate +crosscheck_status: needs_primary_crosscheck +release_channel: social_only +operator_consequence: Candidate reliability incident; verify against OpenAI/Codex release notes or issue/commit receipts before action language. +notes: Reliability incident. + +## Claim 2 +claim_id: codex-token-budgets-2026-06 +source: codex +claim: v0.142.0 added configurable per-thread token budgets with automatic turn abortion. +primary_url: https://x.com/CodexReleases/status/2069185685131804760 +author: @CodexReleases +observed_at: 2026-06-24 +event_date: 2026-06-22 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2069185685131804760): 2026-06-22. Reproducible from primary_url. +evidence_kind: community_account_post +channel: x.com +status: candidate +secondary_receipts: + - https://github.com/openai/codex/releases/tag/rust-v0.142.0 +crosscheck_status: verified_secondary +release_channel: tagged-release +operator_consequence: Candidate capability item with public release-tag support; verify release-note wording before promotion. +notes: Capability claim. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/flue.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/flue.md new file mode 100644 index 0000000..1c0ffdf --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/flue.md @@ -0,0 +1,21 @@ +# Harvest — flue (X Social Signals) + +## Claim 1 +claim_id: flue-1.0-beta-2026-06 +source: flue +claim: Flue 1.0 Beta introduced explicit Workflow, Agent, and Channel primitives. +primary_url: https://x.com/FredKSchott/status/2066962296119959581 +author: @FredKSchott +observed_at: 2026-06-24 +event_date: 2026-06-16 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2066962296119959581): 2026-06-16. Reproducible from primary_url. +evidence_kind: maintainer_authored_post +channel: x.com +status: candidate +secondary_receipts: + - https://flueframework.com/blog/flue-1-0-beta/ +crosscheck_status: needs_primary_crosscheck +release_channel: social-plus-blog +operator_consequence: Candidate framework-evolution item; verify against changelog/package tags before promotion. +notes: Framework evolution claim. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/gemini-cli.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/gemini-cli.md new file mode 100644 index 0000000..48684de --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/gemini-cli.md @@ -0,0 +1,23 @@ +# Harvest — gemini-cli (X Social Signals) + +## Claim 1 +claim_id: gemini-antigravity-migration-2026-06-18 +source: gemini-cli +claim: Public X discussion on 2026-06-18 claimed a Gemini CLI to Antigravity transition affected individual users; later source receipts confirm transition-banner and migration-support work, not the full social cutoff claim. +primary_url: https://x.com/i/status/2067702889837953512 +author: multiple users +observed_at: 2026-06-24 +event_date: 2026-06-18 +date_precision: day +date_note: Exact event date was captured in the initial harvest and retained; reproducible from primary_url. +evidence_kind: community_discussion +channel: x.com +status: candidate +secondary_receipts: + - https://github.com/google-gemini/gemini-cli/releases/tag/v0.47.0 + - https://github.com/google-gemini/gemini-cli/pull/27676 + - https://github.com/google-gemini/gemini-cli/pull/27765 +crosscheck_status: single_source_unconfirmed +release_channel: mixed +operator_consequence: Candidate ecosystem/trust item; requires official or release-channel evidence before any Frontier claim. +notes: Release v0.47.0 and PRs #27676/#27765 verify transition and migration affordances only; they do not verify closed-source impact, a hard cutoff, or quota complaints. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/hermes-agent.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/hermes-agent.md new file mode 100644 index 0000000..2ef0914 --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/hermes-agent.md @@ -0,0 +1,55 @@ +# Harvest — hermes-agent (X Social Signals) + +## Claim 1 +claim_id: hermes-learn-2026-06 +source: hermes-agent +claim: Hermes Agent added /learn command that distills directories of code, docs, and sessions into reusable, verifiable skills. +primary_url: https://x.com/NousResearch/status/2069526242236182697 +author: @NousResearch +observed_at: 2026-06-24 +event_date: 2026-06-23 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2069526242236182697): 2026-06-23. Reproducible from primary_url. +evidence_kind: official_account_post +channel: x.com +status: candidate +crosscheck_status: needs_primary_crosscheck +release_channel: social_only +operator_consequence: Candidate self-improvement feature item; verify against Hermes docs, release notes, or commits before promotion. +notes: Major self-improvement signal. Requires confirmation in release notes or docs. + +## Claim 2 +claim_id: hermes-openrouter-rank-2026-06 +source: hermes-agent +claim: Hermes Agent reached #1 globally on OpenRouter by daily token volume. +primary_url: https://x.com/sudoingX/status/2053028341431820608 +author: @sudoingX +observed_at: 2026-06-24 +event_date: 2026-05-09 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2053028341431820608): 2026-05-09. Reproducible from primary_url. +evidence_kind: community_discussion +channel: x.com +status: single-source-unconfirmed +crosscheck_status: single_source_unconfirmed +release_channel: not_applicable +operator_consequence: Candidate adoption/usage item only; needs an OpenRouter public-stat receipt before use. +notes: Single-source claim. Should be cross-checked with OpenRouter public stats if available. + +## Claim 3 +claim_id: hermes-openclaw-drama-2026-06 +source: hermes-agent +claim: Public exchange occurred between @Teknium and OpenClaw founder Peter Steinberger regarding non-profit status and agendas. +primary_url: https://x.com/clawdb0t/status/2069299802903654611 +author: @clawdb0t +observed_at: 2026-06-24 +event_date: 2026-06-23 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2069299802903654611): 2026-06-23. Reproducible from primary_url. +evidence_kind: community_discussion +channel: x.com +status: single-source-unconfirmed +crosscheck_status: single_source_unconfirmed +release_channel: not_applicable +operator_consequence: Candidate ecosystem-color item; do not promote without direct primary posts or independent confirmation. +notes: Drama claim. Kept as discovery only. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/openclaw.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/openclaw.md new file mode 100644 index 0000000..3d1ec95 --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/openclaw.md @@ -0,0 +1,37 @@ +# Harvest — openclaw (X Social Signals) + +## Claim 1 +claim_id: openclaw-founder-openai-2026 +source: openclaw +claim: Peter Steinberger (@steipete) was hired by OpenAI in early 2026 to work on personal agents. +primary_url: https://x.com/steipete/status/2068961217524490739 +author: @steipete +observed_at: 2026-06-24 +event_date: 2026-06-22 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2068961217524490739): 2026-06-22. Reproducible from primary_url. +evidence_kind: maintainer_authored_post +channel: x.com +status: candidate +crosscheck_status: needs_primary_crosscheck +release_channel: not_applicable +operator_consequence: Candidate governance/affiliation item; verify against public project/org records before promotion. +notes: Governance and affiliation change. + +## Claim 2 +claim_id: openclaw-hermes-drama-2026-06 +source: openclaw +claim: Public tension between OpenClaw and Hermes Agent maintainers in June 2026 regarding non-profit status and funding. +primary_url: https://x.com/clawdb0t/status/2069299802903654611 +author: @clawdb0t +observed_at: 2026-06-24 +event_date: 2026-06-23 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2069299802903654611): 2026-06-23. Reproducible from primary_url. +evidence_kind: community_discussion +channel: x.com +status: single-source-unconfirmed +crosscheck_status: single_source_unconfirmed +release_channel: not_applicable +operator_consequence: Candidate ecosystem-color item; do not promote without direct primary posts or independent confirmation. +notes: Drama claim — kept as discovery. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/openhands.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/openhands.md new file mode 100644 index 0000000..02d74de --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/openhands.md @@ -0,0 +1,40 @@ +# Harvest — openhands (X Social Signals) + +## Claim 1 +claim_id: openhands-acp-2026-06-18 +source: openhands +claim: OpenHands added full Agent Client Protocol (ACP) support across Agent Canvas, SDK, and Cloud offering on 2026-06-18. +primary_url: https://x.com/OpenHandsDev/status/2067643119957410096 +author: @OpenHandsDev +observed_at: 2026-06-24 +event_date: 2026-06-18 +date_precision: day +date_note: Exact event date was captured in the initial harvest and retained; reproducible from primary_url. +evidence_kind: official_account_post +channel: x.com +status: candidate +secondary_receipts: + - https://github.com/OpenHands/OpenHands/releases/tag/1.8.0 + - https://github.com/OpenHands/OpenHands/pull/14401 +crosscheck_status: needs_primary_crosscheck +release_channel: mixed +operator_consequence: Candidate protocol/interoperability item; verify against OpenHands release notes, docs, or commits before promotion. +notes: Release 1.8.0 and PR #14401 verify ACP UI/presets and routing support. They are partial receipts and do not verify the full Agent Canvas, SDK, and Cloud claim. + +## Claim 2 +claim_id: openhands-gneubig-benchmarks-2026-06 +source: openhands +claim: Graham Neubig (@gneubig) published benchmark results on the OpenHands Index covering SWE-Bench and other suites. +primary_url: https://x.com/gneubig/status/2067698787082973390 +author: @gneubig +observed_at: 2026-06-24 +event_date: 2026-06-18 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2067698787082973390): 2026-06-18. Reproducible from primary_url. +evidence_kind: maintainer_authored_post +channel: x.com +status: candidate +crosscheck_status: needs_primary_crosscheck +release_channel: not_applicable +operator_consequence: Candidate benchmark item; requires benchmark-method receipt before use. +notes: Maintainer-authored technical content. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/paperclip.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/paperclip.md new file mode 100644 index 0000000..24e19be --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/paperclip.md @@ -0,0 +1,19 @@ +# Harvest — paperclip (X Social Signals) + +## Claim 1 +claim_id: paperclip-maximizer-mode-2026 +source: paperclip +claim: Paperclip is developing "Maximizer mode" where a CEO agent can autonomously hire and run agents toward an outcome. +primary_url: https://x.com/dotta/status/2067801977447137332 +author: @dotta +observed_at: 2026-06-24 +event_date: 2026-06-19 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2067801977447137332): 2026-06-19. Reproducible from primary_url. +evidence_kind: maintainer_authored_post +channel: x.com +status: candidate +crosscheck_status: needs_primary_crosscheck +release_channel: social_only +operator_consequence: Candidate workflow/positioning item; verify against product docs, release notes, or commits before promotion. +notes: Philosophy and workflow signal. Paperclip v2026.618.0 verifies adjacent OpenClaw Gateway and Hermes adapter interoperability work, but the in-window release does not mention Maximizer mode. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/pi-coding-agent.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/pi-coding-agent.md new file mode 100644 index 0000000..eee54cb --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/pi-coding-agent.md @@ -0,0 +1,37 @@ +# Harvest — pi-coding-agent (X Social Signals) + +## Claim 1 +claim_id: pi-v0.80.0-2026-06-23 +source: pi-coding-agent +claim: Pi v0.80.0 released with breaking API changes moving global API to compat layer. +primary_url: https://x.com/PiChangelog/status/2069475435738480878 +author: @PiChangelog +observed_at: 2026-06-24 +event_date: 2026-06-23 +date_precision: day +date_note: Exact event date was captured in the initial harvest and retained; reproducible from primary_url. +evidence_kind: community_account_post +channel: x.com +status: candidate +crosscheck_status: needs_primary_crosscheck +release_channel: social_only +operator_consequence: Candidate version item; verify against Pi release notes/tags before migration language. +notes: Version-specific claim. + +## Claim 2 +claim_id: pi-extension-system-2026 +source: pi-coding-agent +claim: Pi has a powerful native in-process extension API with deep lifecycle hooks. +primary_url: https://x.com/eSaadster/status/2069592942206243149 +author: @eSaadster +observed_at: 2026-06-24 +event_date: 2026-06-24 +date_precision: day +date_note: Exact post publication date resolved via public X post lookup (ID 2069592942206243149): 2026-06-24. Reproducible from primary_url. +evidence_kind: community_discussion +channel: x.com +status: candidate +crosscheck_status: needs_primary_crosscheck +release_channel: social_only +operator_consequence: Candidate extension-system item; verify against docs or release notes before promotion. +notes: Technical capability signal. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/manifest.yml b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/manifest.yml new file mode 100644 index 0000000..0982d95 --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/manifest.yml @@ -0,0 +1,35 @@ +schema_version: bitter.frontier_run.v0 +run_id: 2026-06-24-x-social-harvest-2026-06-24-frontier-v0 +mode: social_harvest +window: + start: 2026-06-01 + end: 2026-06-24 +purpose: Structured discovery harvest of X signals across all watchlist projects. All claims are candidate status only. +sources: + - hermes-agent + - openhands + - openclaw + - pi-coding-agent + - paperclip + - agent-zero + - flue + - codex + - claude-code + - gemini-cli +tools_used: + - public X search and post URL inspection + - public GitHub/releases/docs lookup where noted + - scout/critic/editor social-research loop +input: + - public X searches for watched project names, official accounts, maintainer accounts, and recurring feature keywords +outputs: + - runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/editorial.yml + - runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/harvest/ + - runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/social-cards/ + - runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/research-journal.md + - runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/verify/x-post-dates.md + - runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/verify/drama-code-followup.md + - runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/qa.md +status: discovery +note: > + This run harvests X posts as discovery input. Product and governance claims must be cross-checked against primary source contracts (GitHub releases, commits, official docs) before promotion to findings. No claims in this run should be treated as verified without additional receipt. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/qa.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/qa.md new file mode 100644 index 0000000..1e9df69 --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/qa.md @@ -0,0 +1,45 @@ +# QA Report — 2026-06-24 X Social Harvest + +## Scope +This run performed discovery-only harvesting of X posts for all 10 watchlist projects. No claims were promoted to findings. + +## Checks Performed + +### Date / Channel Verification +- All event dates are full ISO YYYY-MM-DD dates. Dates were resolved from public X post IDs/URLs where possible; `verify/x-post-dates.md` records the per-claim resolution notes. +- Reproducibility: every claim includes `primary_url`, `observed_at`, `event_date`, `date_precision`, and `date_note`. +- `channel` records the evidence surface (`x.com`). `release_channel` records whether the claim is social-only, not applicable, or supported by a release-tag receipt. +- No private data referenced. + +### Evidence Kind +- Primary evidence_kind used: `maintainer_authored_post`, `official_account_post`, `community_discussion`. +- Social claims flagged as `single-source-unconfirmed` unless multiple independent posts found. +- Each claim includes `crosscheck_status`. Most product/version claims remain `needs_primary_crosscheck`. The Codex v0.142.0 token-budget claim carries a public release-tag secondary receipt and `crosscheck_status=verified_secondary`. +- Static social cards are generated only from exact-dated scout/harvest items. They do not use live embeds, engagement metrics, or unverified paraphrases as quotes. +- A drama/code follow-up pass added a receipt-to-claim map in `verify/drama-code-followup.md`. A `verified_secondary` status now requires that the public secondary receipt prove the same bounded claim, not merely a nearby project claim. + +### Refuted / Downgraded +- Several early hype claims around OpenClaw and Gemini CLI noted as having cooled significantly. +- No product version claims accepted without cross-reference to GitHub releases where possible. +- `operator_consequence` is cautious discovery language only. It does not direct upgrades or product decisions from social evidence alone. +- The scout/critic/editor loop rejected inferred-date and tracker-metric material from the social-card face. Those items remain journal/open-loop material until exact post dates and primary metric receipts are available. +- Gemini Antigravity was narrowed to transition-banner and migration-support receipts; hard-cutoff, closed-source-impact, and quota/backlash claims remain unverified social context. +- OpenHands ACP remained `needs_primary_crosscheck` despite release and PR receipts because those receipts verify only part of the broad social surface claim. +- Paperclip Maximizer mode remained maintainer intent; in-window Paperclip release receipts verify adjacent OpenClaw/Hermes interoperability work, not Maximizer itself. +- OpenClaw reliability complaints are paired with release-note counterweight in the verification record so the public research does not turn user-pain posts into an unbalanced verdict. + +### Limitations +- Public secondary cross-checks were added only where discovered in this pass. Full verification of product/version claims requires a separate source-contract pass against GitHub releases, commits, docs, or changelogs. +- Specific X post content beyond primary_url not persisted; reproduction requires visiting public URLs. +- All artifacts public and reproducible from X search + GitHub public surfaces using generic tools; no tool-specific or private session artifacts referenced. + +## Files Added/Changed in This Pass +- harvest/*.md: exact event_date + date_precision=day for all previously imprecise X posts. +- social-cards/x-cards.yml: static tweet-like receipt cards rendered from repo data only. +- research-journal.md: public R&D journal for scout, critic, editor decisions and open loops. +- verify/x-post-dates.md: per-cluster verification notes (what checked, why, public sources only). +- verify/drama-code-followup.md: drama/code follow-up receipt map and counterweight notes. +- qa.md: updated to reflect full date resolution and crosscheck additions. + +## Recommendation +This run should be treated strictly as discovery input. A follow-up run should be scheduled to convert high-potential claims into receipted findings with GitHub primary sources. Future Frontier runs can now pick candidates from this harvest with confidence in X evidence existence, exact timestamps, and public primary source cross-check status. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/research-journal.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/research-journal.md new file mode 100644 index 0000000..ceb5a03 --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/research-journal.md @@ -0,0 +1,136 @@ +# R&D Journal — Deep X/Social Research Loop + +Run: `2026-06-24-x-social-harvest-2026-06-24-frontier-v0` + +This journal records the editorial loop used to turn public X/social material +into Frontier research context. It is not a digest and does not promote any +claim into findings, signals, or profiles. + +## 2026-06-24 — Loop Setup + +Objective: make the journal more grounded in the public conversation around +agentic coding frameworks while keeping runtime independent from X and keeping +the evidence floor intact. + +Implemented site affordance: + +- Static social receipt cards stored in `social-cards/*.yml`. +- Cards render from repo data only. +- Each card links to the source post but does not load embeds, scripts, or media + from X at runtime. +- Cards distinguish the receiptable social fact from the claim inside the post. + +## Scout Pass 1 + +The first scout pass returned several interesting clusters: + +- Hermes versus OpenClaw momentum, reliability, and maintenance-tax discourse. +- A harness-comparison thread arguing that tooling/context can matter more than + the underlying model. +- Paperclip as a possible orchestration layer for mixed agent fleets. +- Shared skill packs as cross-harness operating discipline. +- A Bitter self-positioning post. + +Editorial response: + +- Do not use inferred dates in cards. +- Do not quote paraphrases as if they are verbatim tweet text. +- Do not put tracker-account metrics on card faces unless the numbers are + checked against primary sources. +- Do not include Bitter self-positioning as Frontier analysis. The method keeps + the publisher's own product out of the analysis; at most this could be a + disclosure note, not a research card. +- Do not convert a single post into multiple apparent signals. +- Keep drama and public exchanges as ecosystem context unless direct reply-chain + receipts are reconstructed. + +## Critic Pass + +The critic pass rejected all loose scout items as card-ready because they lacked +exact dates, conflated paraphrase with quotation, or overstated metric and +adoption claims. The useful gate that came out of the critique: + +> The card receipts that a public post exists on a date. The claim inside the +> post remains unverified until the relevant source contract supports it. + +That gate now governs the card set. + +## Editor Pass + +The first committed card set uses only exact-dated items already present in the +structured harvest or a later exact-date scout pass: + +- Hermes `/learn` official post. +- OpenClaw/Hermes public-tension context. +- OpenHands ACP official post. +- Codex token-budget post with a public release-tag secondary receipt. +- Claude Code community changelog post for v2.1.187. +- Gemini CLI Antigravity transition notice. +- Agent Zero governance-vote post. +- Paperclip Maximizer-mode maintainer-intent post. + +Every card is framed as social context, maintainer intent, or a candidate claim +that still needs source-contract verification. No card says a capability is true +merely because it was posted on X. + +## Open Research Loops + +- A third strict scout pass looked for additional exact-date cards and + disconfirming/counter-evidence. It found no additional items that cleared the + exact-date and direct-source gate. The unresolved items below remain research + tasks, not card material. +- Reconstruct the OpenClaw/Hermes exchange from direct participant posts before + drawing any governance or motive conclusion. +- Cross-check OpenHands ACP support against docs, release notes, and commits. +- Cross-check Paperclip Maximizer mode against product docs or code before + treating it as shipped. +- Verify Codex token-budget behavior from release notes and, ideally, a local or + documented behavior probe. +- If using growth metrics, source them from GitHub or another primary/public + metrics surface at a stated timestamp, not from tracker tweets. +- Search for disconfirming posts: OpenClaw maintainer replies, failed Hermes + migrations, or user pain on the favored side of any comparison. + +## Drama / Code Follow-Up Pass + +The follow-up scout focused on drama leads and then checked public code, +release, PR, and changelog receipts for each lead. + +Editorial results: + +- OpenClaw/Hermes governance and funding tension remains journal-only. Hermes + found direct participant URLs, but the pass did not return complete + `created_at` timestamps or enough reply-chain structure to promote the item + beyond social context. +- Gemini Antigravity is now source-backed for the narrow transition/migration + claim: Gemini CLI v0.47.0 includes merged PRs for Antigravity transition + banner behavior and migration commands/docs. This does not verify social + claims about a hard cutoff, closed-source impact, or quota pain. +- Claude Code v2.1.187 is source-backed for the release-note subset listed in + the community tracker post. The official changelog supports sandbox + credentials, resume repair, and remote MCP timeout handling. This receipt is + not reusable for unrelated Claude Code controversy claims. +- OpenHands ACP is partially source-backed. Release 1.8.0 and PR #14401 verify + ACP UI/preset/routing work, but not every Agent Canvas, SDK, and cloud surface + named in the social post. +- Paperclip Maximizer mode remains maintainer intent only. The in-window + release verifies adjacent interop and reliability work around OpenClaw Gateway + and Hermes custom providers, but does not mention Maximizer mode. +- OpenClaw reliability complaints should be read with counterweight: v2026.6.10 + and linked PRs show active fixes in model routing, channel/session state, and + trusted-policy hook composition. The release verifies real bug classes and + active remediation, not a simple "broken" narrative. + +The durable record for this pass is `verify/drama-code-followup.md`. It maps +each receipt to the exact claim it supports so a later editor cannot let a real +source receipt validate a different social claim in the same project. + +## Editorial Standard + +Make the public conversation visible without becoming gossip: + +- title the card as a catalog label, not a verdict; +- keep excerpts short and only verbatim when verified; +- show status and caveats on the card face; +- use drama to identify governance questions, not to assign motives; +- require a later source-contract pass for any product/version/capability claim. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/social-cards/x-cards.yml b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/social-cards/x-cards.yml new file mode 100644 index 0000000..088f8f1 --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/social-cards/x-cards.yml @@ -0,0 +1,160 @@ +schema_version: bitter.frontier_social_cards.v0 +run_id: 2026-06-24-x-social-harvest-2026-06-24-frontier-v0 +cards: + - id: hermes-learn-official-post + title: Official Hermes account posts a /learn feature claim + kind: capability_announcement + status: needs_primary_crosscheck + date: 2026-06-23 + date_precision: day + date_note: Exact post date carried forward from the structured harvest for source post 2069526242236182697. + source_ids: [hermes-agent] + authors: ["@NousResearch"] + source_urls: + - https://x.com/NousResearch/status/2069526242236182697 + display_text: "Hermes is pitching /learn as a way for the agent to turn past code, docs, and sessions into reusable skills." + summary: "The official NousResearch account described Hermes Agent's /learn command as a way to turn directories of code, docs, and sessions into reusable skills." + why_it_matters: "The post points at the same frontier pressure this journal keeps seeing: agent systems are trying to turn past work into reusable operating memory." + verification_needed: "Check Hermes docs, release notes, or source commits before treating /learn as a shipped, specified capability." + confidence: social primary, product claim unverified + caveats: "This card receipts that the public post exists; it does not verify the implementation details." + tags: [skills, memory, self-improvement] + + - id: openclaw-hermes-public-exchange + title: Public OpenClaw/Hermes tension enters the research queue + kind: ecosystem_drama + status: single_source_unconfirmed + date: 2026-06-23 + date_precision: day + date_note: Exact post date carried forward from the structured harvest for source post 2069299802903654611. + source_ids: [openclaw, hermes-agent] + authors: ["@clawdb0t"] + source_urls: + - https://x.com/clawdb0t/status/2069299802903654611 + display_text: "OpenClaw and Hermes-adjacent accounts are not just trading feature notes. They are arguing about trust, funding, and what kind of project people should rely on." + summary: "A community account surfaced a public exchange involving OpenClaw and Hermes-adjacent figures around non-profit status, funding, and agendas." + why_it_matters: "Framework drama can reveal governance pressure, project positioning, and trust questions that do not show up in release notes." + verification_needed: "Reconstruct the direct reply chain from primary participant posts before treating this as more than ecosystem context." + confidence: single-source social context + caveats: "Kept as drama/context only; no product, governance, or motive claim is accepted from this card." + tags: [drama, governance, positioning] + + - id: openhands-acp-official-post + title: OpenHands official account claims broad ACP support + kind: capability_announcement + status: needs_primary_crosscheck + date: 2026-06-18 + date_precision: day + date_note: Exact event/post date carried forward from the structured harvest for source post 2067643119957410096. + source_ids: [openhands] + authors: ["@OpenHandsDev"] + source_urls: + - https://x.com/OpenHandsDev/status/2067643119957410096 + - https://github.com/OpenHands/OpenHands/releases/tag/1.8.0 + - https://github.com/OpenHands/OpenHands/pull/14401 + display_text: "OpenHands is talking up ACP support across its product surface, which is another way of saying: your agent should not be trapped in one client." + summary: "The OpenHands account posted that Agent Client Protocol support spans Agent Canvas, SDK, and the cloud offering." + why_it_matters: "ACP support is a composability claim: if shipped, it changes how operators can move agents across surfaces." + verification_needed: "Check OpenHands docs and follow-up commits for the full Agent Canvas, SDK, and cloud surface claim before promotion." + confidence: official social post, partial release and PR support + caveats: "Release 1.8.0 and PR #14401 support ACP UI/presets and routing work; they do not by themselves verify every surface named in the social post." + tags: [acp, interoperability, cloud] + + - id: codex-token-budget-release-post + title: Codex token-budget post has a release-tag cross-check + kind: capability_announcement + status: verified_secondary + date: 2026-06-22 + date_precision: day + date_note: Exact post date carried forward from the structured harvest for source post 2069185685131804760. + source_ids: [codex] + authors: ["@CodexReleases"] + source_urls: + - https://x.com/CodexReleases/status/2069185685131804760 + - https://github.com/openai/codex/releases/tag/rust-v0.142.0 + display_text: "Codex release chatter around token budgets points to a simple need: an agent should have a meter, and it should stop when the meter is spent." + summary: "A Codex release-tracker post said v0.142.0 added configurable per-thread token budgets with automatic turn abortion; the run found a public release tag as secondary support." + why_it_matters: "Budgets are operational control-plane state: they turn runaway agent work into a bounded, inspectable failure mode." + verification_needed: "Check release-note wording and behavior before promoting this into a finding or signal." + confidence: secondary release receipt present + caveats: "The X account is not treated as primary; the release tag is the stronger receipt." + tags: [budgets, control-plane, release] + + - id: claude-code-community-2187-post + title: Community changelog account posts Claude Code 2.1.187 notes + kind: capability_announcement + status: verified_secondary + date: 2026-06-23 + date_precision: day + date_note: Exact post date reported by the second scout pass for source post 2069531604951687542. + source_ids: [claude-code] + authors: ["@ClaudeCodeLog"] + source_urls: + - https://x.com/ClaudeCodeLog/status/2069531604951687542 + - https://code.claude.com/docs/en/changelog#2-1-187 + display_text: "Claude Code 2.1.187 chatter pointed back to practical fixes: sandbox credentials, resume behavior, and remote MCP timeout handling." + summary: "A community changelog account posted Claude Code v2.1.187 notes; the official Claude Code changelog confirms the core release items including sandbox credentials, resume repair, and remote MCP timeout handling." + why_it_matters: "Even unofficial release chatter can point the verifier toward security and reliability changes worth checking in primary Anthropic channels." + verification_needed: "Before promotion, quote and scope the exact official changelog item being used; do not apply this receipt to unrelated Claude Code controversy claims." + confidence: community tracker plus official changelog receipt + caveats: "The source post remains a community tracker; the official changelog entry was published on 2026-06-24 and supports the release-item subset only." + tags: [security, release-tracker, reliability] + + - id: gemini-antigravity-transition-post + title: Gemini CLI account posts Antigravity transition notice + kind: maintainer_intent + status: verified_secondary + date: 2026-06-18 + date_precision: day + date_note: Exact post date reported by the second scout pass and aligned with the structured Gemini transition harvest. + source_ids: [gemini-cli] + authors: ["@geminicli"] + source_urls: + - https://x.com/geminicli/status/2067702889837953512 + - https://github.com/google-gemini/gemini-cli/releases/tag/v0.47.0 + - https://github.com/google-gemini/gemini-cli/pull/27676 + - https://github.com/google-gemini/gemini-cli/pull/27765 + display_text: "Gemini CLI's Antigravity transition is a channel story: where the tool lives, how users migrate, and who controls the next default." + summary: "A Gemini CLI account post described an Antigravity transition path; Gemini CLI v0.47.0 includes source receipts for persistent transition-banner behavior and Antigravity migration commands/docs." + why_it_matters: "Distribution-channel shifts are operator-relevant even before they become code receipts: they change who can run what, where, and under which terms." + verification_needed: "Do not infer a hard cutoff, source-availability change, or quota/backlash claim without separate primary receipts." + confidence: stable release and merged PR receipts for transition/migration affordances + caveats: "The receipts verify transition and migration support in Gemini CLI, not the broader social claims about closed-source impact or user cutoffs." + tags: [distribution, antigravity, channel-shift, migration] + + - id: agent-zero-governance-vote + title: Agent Zero account posts governance-vote result + kind: governance_or_affiliation + status: social_context + date: 2026-06-18 + date_precision: day + date_note: Exact post date carried forward from the structured harvest for source post 2067583909815087601. + source_ids: [agent-zero] + authors: ["@Agent0ai"] + source_urls: + - https://x.com/Agent0ai/status/2067583909815087601 + summary: "The Agent Zero account posted a governance-vote result about vote transparency, including public wallet addresses and weights." + why_it_matters: "Governance mechanics affect how much operators should trust community-owned roadmap or token claims." + verification_needed: "Check the project's governance surface or on-chain/public vote record before accepting the outcome." + confidence: official social context + caveats: "This card does not verify the vote mechanics or tally." + tags: [governance, transparency, voting] + + - id: paperclip-maximizer-maintainer-post + title: Paperclip maintainer describes “Maximizer mode” + kind: maintainer_intent + status: needs_primary_crosscheck + date: 2026-06-19 + date_precision: day + date_note: Exact post date carried forward from the structured harvest for source post 2067801977447137332. + source_ids: [paperclip] + authors: ["@dotta"] + source_urls: + - https://x.com/dotta/status/2067801977447137332 + display_text: "Paperclip's Maximizer idea is the big-swing version of the market: not one agent helping you code, but agents managing other agents toward an outcome." + summary: "A Paperclip maintainer described a Maximizer-mode direction where a CEO-like agent can hire and run agents toward an outcome." + why_it_matters: "The post captures where orchestration products are trying to move: from single coding helpers toward delegated agent operations." + verification_needed: "Find a Paperclip docs, release-note, or commit receipt that names Maximizer mode before treating it as shipped behavior." + confidence: maintainer intent, product state unverified + caveats: "The 2026-06-18 Paperclip release verifies adjacent OpenClaw Gateway and Hermes adapter work, but it does not mention Maximizer mode." + tags: [orchestration, delegation, positioning] diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/verify/drama-code-followup.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/verify/drama-code-followup.md new file mode 100644 index 0000000..f2b73fe --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/verify/drama-code-followup.md @@ -0,0 +1,203 @@ +# Drama / Code Follow-Up Verification + +Observed: 2026-06-24 + +This file records the follow-up pass requested after the social harvest. It +checks drama leads against public source receipts and records exactly what each +receipt can and cannot support. + +## Verdict Legend + +- `CONFIRMED_NARROW`: public code, release, PR, or official changelog receipt + supports the bounded claim stated here. +- `PARTIAL`: public source receipts support part of the social claim but not the + whole public framing. +- `UNVERIFIED_SOCIAL`: public social post or thread exists, but the claim needs + direct participant chain reconstruction or other primary receipts. +- `COUNTERWEIGHT`: public source receipt complicates or balances a social-pain + narrative. +- `ABSENT_IN_WINDOW`: the checked in-window source receipt did not contain the + named feature or claim. + +## Receipt Map + +### Gemini CLI / Antigravity + +Verdict: `CONFIRMED_NARROW` + +Social lead: Gemini CLI / Antigravity transition notice and user backlash. + +Public source receipts: + +- https://github.com/google-gemini/gemini-cli/releases/tag/v0.47.0 +- https://github.com/google-gemini/gemini-cli/pull/27676 +- https://github.com/google-gemini/gemini-cli/pull/27765 + +What the receipts support: + +- Gemini CLI v0.47.0 was published on 2026-06-18. +- The release includes PR #27676 for Antigravity transition-banner visibility. +- The release includes PR #27765 for Antigravity installation/migration help, + platform-specific commands, and an `antigravity-support` built-in skill. + +What remains unverified: + +- A hard cutoff on 2026-06-18. +- Closed-source impact claims. +- Quota/backlash claims from user posts. + +Card action: upgrade only the narrow transition/migration-support card to +`verified_secondary`. + +### Claude Code 2.1.187 + +Verdict: `CONFIRMED_NARROW` + +Social lead: community changelog post about Claude Code v2.1.187. + +Public source receipt: + +- https://code.claude.com/docs/en/changelog#2-1-187 + +What the receipt supports: + +- The official Claude Code changelog has a 2.1.187 entry published on + 2026-06-24. +- The entry includes sandbox credential hardening, a `--resume` repair, remote + MCP idle-timeout handling, and other release notes. + +What remains unverified: + +- The community tracker account is not an official release channel. +- This receipt does not apply to unrelated Claude Code social controversy or + takedown claims elsewhere in the harvest. + +Card action: upgrade the 2.1.187 card to `verified_secondary`; leave unrelated +Claude Code claims unchanged. + +### OpenHands ACP + +Verdict: `PARTIAL` + +Social lead: official OpenHands post claiming broad ACP support. + +Public source receipts: + +- https://github.com/OpenHands/OpenHands/releases/tag/1.8.0 +- https://github.com/OpenHands/OpenHands/pull/14401 + +What the receipts support: + +- OpenHands 1.8.0 was published on 2026-06-10 and includes "Minimal generic ACP + agent UI." +- PR #14401 was merged and describes an `ENABLE_ACP` feature flag, Settings + Agent UI, ACP presets for Claude Code/Codex/Gemini CLI/custom, unified + conversation routing, `tags['acp_server']`, and deferred cross-kind config + preservation. + +What remains unverified: + +- The full Agent Canvas, SDK, and cloud support wording from the social post. +- The exact shipped state of every surface on 2026-06-18. + +Card action: add secondary receipts but keep status `needs_primary_crosscheck`. + +### Paperclip Maximizer / Interop + +Verdict: `ABSENT_IN_WINDOW` for Maximizer, `CONFIRMED_NARROW` for adjacent +interop work. + +Social lead: maintainer-described Maximizer mode. + +Public source receipts checked: + +- https://github.com/paperclipai/paperclip/releases/tag/v2026.618.0 +- https://github.com/paperclipai/paperclip/pull/2322 +- https://github.com/paperclipai/paperclip/pull/8231 + +What the receipts support: + +- Paperclip v2026.618.0 was published on 2026-06-18. +- The release includes stabilized OpenClaw Gateway integration via PR #2322. +- PR #2322 exposes OpenClaw Gateway config fields, injects `x-openclaw-token`, + adds an `OPENCLAW_TOKEN` fallback, adds transient retry handling, restores + documented timeout defaults, and adds regression tests. +- The release includes Hermes custom-provider support via PR #8231. +- PR #8231 passes Hermes `custom:*` providers through as `--provider` args + while preserving auth injection and avoiding duplicate provider args. + +What remains unverified: + +- A shipped or documented Paperclip "Maximizer mode." + +Card action: keep Maximizer as maintainer intent with +`needs_primary_crosscheck`. + +### OpenClaw Reliability Complaints + +Verdict: `COUNTERWEIGHT` + +Social lead: user reports about update breakage and maintenance tax. + +Public source receipts: + +- https://github.com/openclaw/openclaw/releases/tag/v2026.6.10 +- https://github.com/openclaw/openclaw/pull/94545 +- https://github.com/openclaw/openclaw/pull/95328 +- https://github.com/openclaw/openclaw/pull/94461 + +What the receipts support: + +- OpenClaw v2026.6.10 was published on 2026-06-24 and lists reliability fixes + in model routing, session/channel state, trusted policies, and provider + plugin onboarding. +- PR #94545 fixes trusted-policy lookup across composed hook registries. +- PR #95328 fixes stale per-channel origin fields after channel switches. +- PR #94461 fixes a Z.ai model base-URL fallback that could produce confusing + 401 failures. + +What remains unverified: + +- Broad "OpenClaw is broken" or comparative stability claims from user posts. +- Any quantitative reliability conclusion. + +Card action: do not promote a complaint card from this pass. Use the release +receipts as counterweight when discussing OpenClaw social pain. + +### OpenClaw / Hermes Governance Tension + +Verdict: `UNVERIFIED_SOCIAL` + +Social leads: + +- https://x.com/steipete/status/2068961217524490739 +- https://x.com/Teknium/status/2069020939132813642 +- https://x.com/clawdb0t/status/2069299802903654611 + +What the social passes found: + +- The existing harvest has day precision for the @steipete and @clawdb0t + posts. +- Hermes could identify direct participant handles and neutral summaries, but + did not return complete `created_at` timestamps or enough reply-chain + structure to treat the exchange as reconstructed. + +What remains unverified: + +- Non-profit legal structure details. +- Funding motive claims. +- Any inference about OpenAI ties, hiring, or project agendas beyond the + primary public posts already captured. + +Card action: keep as `single_source_unconfirmed` social context. Do not promote +to a stronger card or finding without direct primary reconstruction. + +## Protocol Notes + +- Do not treat a release receipt as a blanket validation for every social claim + in the same project. +- Prefer narrowing a card to the claim the source receipt actually proves. +- When social user pain is interesting, check for public maintainer responses, + releases, issue fixes, and changelogs before representing the cluster. +- Reputational, hiring, funding, takedown, and motive claims remain journal-only + unless public primary receipts support the exact claim. diff --git a/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/verify/x-post-dates.md b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/verify/x-post-dates.md new file mode 100644 index 0000000..7ab2cf5 --- /dev/null +++ b/runs/2026-06-24-x-social-harvest-2026-06-24-frontier-v0/verify/x-post-dates.md @@ -0,0 +1,60 @@ +# X Post Date Verification Notes + +## Method +- Used public X post IDs/URLs with date range 2026-01-01 to 2026-12-31 to resolve posted_at for every primary_url in harvest/*.md. +- All claims now have day-precision event_date. +- No private data; all resolutions cite public X post IDs/URLs. +- For claims where secondary sources (e.g. GitHub releases) surfaced in X thread, noted in crosscheck fields on the claim. + +## Per-Cluster Results + +### claude-code +- primary_url ID 2039450834853916811 resolved to 2026-04-01 (was year_only). +- Note: April 1 2026 post about Anthropic DMCA / GitHub takedown incident. Community discussion only; no product version claim. + +### agent-zero +- ID 2067583909815087601 resolved to 2026-06-18 (was month_only). +- Official @Agent0ai post on governance vote. + +### codex +- ID 2069246911841022200 (@songguoxiansen) resolved to 2026-06-23: disk bug report. +- ID 2069185685131804760 (@CodexReleases) resolved to 2026-06-22: v0.142.0 release notes. + - Secondary receipt surfaced: https://github.com/openai/codex/releases/tag/rust-v0.142.0 + - crosscheck_status: verified_secondary, channel: tagged-release (added to claim). + +### flue +- ID 2066962296119959581 resolved to 2026-06-16: Flue 1.0 Beta announcement by maintainer @FredKSchott. + - Linked blog: https://flueframework.com/blog/flue-1-0-beta/ (public secondary). + +### hermes-agent +- ID 2069526242236182697 (@NousResearch) resolved to 2026-06-23: /learn feature. +- ID 2053028341431820608 (@sudoingX) resolved to 2026-05-09: OpenRouter ranking claim (community). +- ID 2069299802903654611 (@clawdb0t) resolved to 2026-06-23: drama thread (community_discussion). + +### openclaw +- ID 2068961217524490739 (@steipete) resolved to 2026-06-22: founder post on non-profit vs VC (maintainer_authored). +- Shared ID with hermes drama resolved as above. + +### openhands +- ID 2067698787082973390 resolved to 2026-06-18 (already had day but confirmed via X). + +### paperclip +- ID 2067801977447137332 resolved to 2026-06-19: Plan-of-Plans tip by @dotta (maintainer). + +### pi-coding-agent +- ID 2069592942206243149 resolved to 2026-06-24: pi-token-goat extension (community). + +### gemini-cli +- Already had 2026-06-18; no change needed. + +## Downgrades / Cautions Applied +- All social-only claims retain status: single-source-unconfirmed or community_discussion. +- No operator_consequence language directs upgrades or product decisions from social evidence alone; all consequences are discovery notes. +- Version claims (e.g. codex v0.142.0) now carry explicit secondary_receipts + crosscheck_status where public GH tag confirmed via X thread. +- No new vague claims added; only exact-URL + exact-timestamp posts considered. + +## Files Not Modified (per discovery boundary) +- content/digests, content/profiles, signals/, source-contracts/ left untouched. +- Only harvest/*.md, qa.md (expanded), and new verify/ touched. + +Reproducible: rerun public X search or X API lookup with the listed IDs/URLs. diff --git a/site/src/components/RunEditorial.astro b/site/src/components/RunEditorial.astro new file mode 100644 index 0000000..fdfd289 --- /dev/null +++ b/site/src/components/RunEditorial.astro @@ -0,0 +1,45 @@ +--- +import type { RunEditorial, SocialReceiptCard } from "../lib/frontier"; +import SocialPostEmbed from "./SocialPostEmbed.astro"; + +const { editorial, cards } = Astro.props as { + editorial: RunEditorial; + cards: SocialReceiptCard[]; +}; + +const cardsById = new Map(cards.map((card) => [card.id, card])); +--- + +
+
+

{editorial.eyebrow ?? "Bitter Frontier dispatch"}

+

{editorial.title}

+ {editorial.dek &&

{editorial.dek}

} + {(editorial.byline || editorial.publishedAt) && ( +

+ {editorial.byline && {editorial.byline}} + {editorial.byline && editorial.publishedAt && } + {editorial.publishedAt && } +

+ )} +
+ +
+ {editorial.blocks.map((block) => { + if (block.type === "heading") return

{block.text}

; + if (block.type === "pullquote") { + return ( +
+

{block.text}

+ {block.attribution && {block.attribution}} +
+ ); + } + if (block.type === "social_embed") { + const card = cardsById.get(block.cardId); + return card ? : null; + } + return

{block.text}

; + })} +
+
diff --git a/site/src/components/SocialPostEmbed.astro b/site/src/components/SocialPostEmbed.astro new file mode 100644 index 0000000..2b4c6ce --- /dev/null +++ b/site/src/components/SocialPostEmbed.astro @@ -0,0 +1,52 @@ +--- +import { sourceLabel, type SocialReceiptCard } from "../lib/frontier"; + +const { card, caption } = Astro.props as { card: SocialReceiptCard; caption?: string }; + +const kindLabel = card.kind.replace(/_/g, " "); +const primaryUrl = card.sourceUrls[0]; +const supportingUrls = card.sourceUrls.slice(1); +const sourceNames = card.sourceIds.map((sourceId) => sourceLabel(sourceId)).join(" / "); +const authors = card.authors.join(" / "); +const evidenceLabel = card.status === "verified_secondary" + ? "cross-checked" + : card.status === "needs_primary_crosscheck" + ? "needs source check" + : card.status.replace(/_/g, " "); +--- + + diff --git a/site/src/components/SocialReceiptCards.astro b/site/src/components/SocialReceiptCards.astro new file mode 100644 index 0000000..8fcf869 --- /dev/null +++ b/site/src/components/SocialReceiptCards.astro @@ -0,0 +1,81 @@ +--- +import { sourceLabel, type SocialReceiptCard } from "../lib/frontier"; + +const { cards = [] } = Astro.props as { cards: SocialReceiptCard[] }; + +const kindLabel = (kind: string) => kind.replace(/_/g, " "); +--- + +{ + cards.length > 0 && ( +
+ + +
+ ) +} diff --git a/site/src/lib/frontier.ts b/site/src/lib/frontier.ts index e9605c1..073c448 100644 --- a/site/src/lib/frontier.ts +++ b/site/src/lib/frontier.ts @@ -576,6 +576,42 @@ export type RunArtifact = { internalUrl?: string; }; +export type SocialReceiptCard = { + id: string; + title: string; + kind: string; + status: string; + date: string; + datePrecision?: string; + dateNote?: string; + sourceIds: string[]; + authors: string[]; + sourceUrls: string[]; + displayText?: string; + excerpt?: string; + summary: string; + whyItMatters?: string; + verificationNeeded?: string; + confidence?: string; + caveats?: string; + tags: string[]; +}; + +export type RunEditorialBlock = + | { type: "paragraph"; text: string } + | { type: "heading"; text: string } + | { type: "pullquote"; text: string; attribution?: string } + | { type: "social_embed"; cardId: string; caption?: string }; + +export type RunEditorial = { + title: string; + dek?: string; + eyebrow?: string; + byline?: string; + publishedAt?: string; + blocks: RunEditorialBlock[]; +}; + export function runArtifacts(runId: string): RunArtifact[] { const runDir = repoPath("runs", runId); if (!fs.existsSync(runDir)) return []; @@ -588,6 +624,14 @@ export function runArtifacts(runId: string): RunArtifact[] { repoPath: rel(manifestPath), }); } + const editorialPath = path.join(runDir, "editorial.yml"); + if (fs.existsSync(editorialPath)) { + artifacts.push({ + kind: "editorial", + label: "Public editorial", + repoPath: rel(editorialPath), + }); + } const findingsDir = path.join(runDir, "findings"); if (fs.existsSync(findingsDir)) { for (const file of fs.readdirSync(findingsDir).filter((f) => f.endsWith(".md")).sort()) { @@ -618,6 +662,34 @@ export function runArtifacts(runId: string): RunArtifact[] { }); } } + const socialCardsDir = path.join(runDir, "social-cards"); + if (fs.existsSync(socialCardsDir)) { + for (const file of fs.readdirSync(socialCardsDir).filter((f) => f.endsWith(".yml") || f.endsWith(".yaml")).sort()) { + artifacts.push({ + kind: "social cards", + label: `Static social cards — ${file.replace(/\.(ya?ml)$/, "")}`, + repoPath: rel(path.join(socialCardsDir, file)), + }); + } + } + const verifyDir = path.join(runDir, "verify"); + if (fs.existsSync(verifyDir)) { + for (const file of fs.readdirSync(verifyDir).filter((f) => f.endsWith(".md")).sort()) { + artifacts.push({ + kind: "verification", + label: `Verification notes — ${file.replace(/\.md$/, "")}`, + repoPath: rel(path.join(verifyDir, file)), + }); + } + } + const journalPath = path.join(runDir, "research-journal.md"); + if (fs.existsSync(journalPath)) { + artifacts.push({ + kind: "journal", + label: "R&D journal", + repoPath: rel(journalPath), + }); + } const qaPath = path.join(runDir, "qa.md"); if (fs.existsSync(qaPath)) { artifacts.push({ @@ -637,6 +709,86 @@ export function runArtifacts(runId: string): RunArtifact[] { return artifacts; } +export function runEditorial(runId: string): RunEditorial | undefined { + const editorialPath = repoPath("runs", runId, "editorial.yml"); + if (!fs.existsSync(editorialPath)) return undefined; + const yaml = readYaml(editorialPath); + const blocks = Array.isArray(yaml?.blocks) + ? yaml.blocks.map((block: any) => { + const type = String(block?.type ?? ""); + if (type === "social_embed") { + return { + type, + cardId: String(block.card_id ?? block.cardId ?? ""), + caption: block.caption ? String(block.caption) : undefined, + }; + } + if (type === "pullquote") { + return { + type, + text: String(block.text ?? ""), + attribution: block.attribution ? String(block.attribution) : undefined, + }; + } + return { + type: type === "heading" ? "heading" : "paragraph", + text: String(block?.text ?? ""), + }; + }).filter((block: RunEditorialBlock) => { + if (block.type === "social_embed") return block.cardId.length > 0; + return block.text.length > 0; + }) + : []; + if (!yaml?.title || blocks.length === 0) return undefined; + return { + title: String(yaml.title), + dek: yaml.dek ? String(yaml.dek) : undefined, + eyebrow: yaml.eyebrow ? String(yaml.eyebrow) : undefined, + byline: yaml.byline ? String(yaml.byline) : undefined, + publishedAt: yaml.published_at ? formatDate(yaml.published_at) : undefined, + blocks, + }; +} + +function normalizeStringArray(value: unknown): string[] { + if (Array.isArray(value)) return value.map((item) => String(item)).filter(Boolean); + if (typeof value === "string" && value.length > 0) return [value]; + return []; +} + +export function listRunSocialCards(runId: string): SocialReceiptCard[] { + const dir = repoPath("runs", runId, "social-cards"); + if (!fs.existsSync(dir)) return []; + return fs + .readdirSync(dir) + .filter((file) => file.endsWith(".yml") || file.endsWith(".yaml")) + .sort() + .flatMap((file) => { + const yaml = readYaml(path.join(dir, file)); + return (yaml?.cards ?? []).map((card: any) => ({ + id: String(card.id ?? ""), + title: String(card.title ?? card.id ?? "Untitled social receipt"), + kind: String(card.kind ?? "social_receipt"), + status: String(card.status ?? "candidate"), + date: formatDate(card.date ?? card.event_date ?? card.observed_at), + datePrecision: card.date_precision ? String(card.date_precision) : undefined, + dateNote: card.date_note ? String(card.date_note) : undefined, + sourceIds: normalizeStringArray(card.source_ids ?? card.sources ?? card.source), + authors: normalizeStringArray(card.authors ?? card.author), + sourceUrls: normalizeStringArray(card.source_urls ?? card.source_url ?? card.primary_url), + displayText: card.display_text ? String(card.display_text) : undefined, + excerpt: card.excerpt ? String(card.excerpt) : undefined, + summary: String(card.summary ?? ""), + whyItMatters: card.why_it_matters ? String(card.why_it_matters) : undefined, + verificationNeeded: card.verification_needed ? String(card.verification_needed) : undefined, + confidence: card.confidence ? String(card.confidence) : undefined, + caveats: card.caveats ? String(card.caveats) : undefined, + tags: normalizeStringArray(card.tags), + })).filter((card: SocialReceiptCard) => card.id && card.sourceUrls.length > 0); + }) + .sort((a, b) => b.date.localeCompare(a.date) || a.title.localeCompare(b.title)); +} + export function runManifest(runId: string): any | undefined { const manifestPath = repoPath("runs", runId, "manifest.yml"); if (!fs.existsSync(manifestPath)) return undefined; diff --git a/site/src/pages/runs/[runId].astro b/site/src/pages/runs/[runId].astro index 23c99bb..23cfbe8 100644 --- a/site/src/pages/runs/[runId].astro +++ b/site/src/pages/runs/[runId].astro @@ -1,11 +1,14 @@ --- import Base from "../../layouts/Base.astro"; +import RunEditorial from "../../components/RunEditorial.astro"; +import SocialReceiptCards from "../../components/SocialReceiptCards.astro"; import SourceTrail from "../../components/SourceTrail.astro"; import { - formatDate, getSignal, + listRunSocialCards, listRuns, runArtifacts, + runEditorial, runManifest, signalIdsInRun, sourceLabel, @@ -26,9 +29,83 @@ const acceptedSignalIds = signalIdsInRun(run.id); const acceptedSignals = acceptedSignalIds.map((id) => getSignal(id)).filter(Boolean); const sourceContractPaths: string[] = manifest?.source_contracts ?? []; const manifestSources: string[] = manifest?.sources ?? []; +const socialCards = listRunSocialCards(run.id); +const editorial = runEditorial(run.id); --- + {editorial ? ( + <> + + +
+
+ Source trail and public artifacts +
+

+ The essay above is the public artifact. The files below keep the evidence reproducible without making the reading experience depend on X embeds or internal research notes. +

+ + {manifestSources.length > 0 && ( +
+

Projects covered

+ +
+ )} + + {sourceContractPaths.length > 0 && ( +
+

Source contracts

+
    + {sourceContractPaths.map((p) => ( +
  • {p}
  • + ))} +
+
+ )} + + {acceptedSignals.length > 0 && ( +
+

Accepted signals from this run

+
    + {acceptedSignals.map((signal: any) => ( +
  1. + {signal.title} +
  2. + ))} +
+
+ )} + + {artifacts.length > 0 && ( +
+

Public artifact files

+ +
+ )} +
+
+
+ + ) : (

Research Version

{run.title}

@@ -110,6 +187,8 @@ const manifestSources: string[] = manifest?.sources ?? []; )} + + {artifacts.length > 0 && (

Artifact contents

@@ -142,4 +221,5 @@ const manifestSources: string[] = manifest?.sources ?? []; )}
+ )} diff --git a/site/src/styles/global.css b/site/src/styles/global.css index 9dc1f54..5b169b0 100644 --- a/site/src/styles/global.css +++ b/site/src/styles/global.css @@ -680,6 +680,272 @@ code { line-height: 1.65; } +.editorial-article { + max-width: 46rem; + margin-inline: auto; + padding: 3.1rem clamp(1.25rem, 4vw, 2rem) 2rem; +} + +.editorial-header { + padding-bottom: 2rem; + border-bottom: 1px solid var(--color-line); +} + +.editorial-eyebrow { + margin: 0; + color: var(--color-bitter); +} + +.editorial-title { + margin: 0.85rem 0 0; + font-family: var(--font-serif); + font-size: 2.35rem; + font-weight: 700; + letter-spacing: 0; + line-height: 1.08; + text-wrap: balance; +} + +@media (min-width: 760px) { + .editorial-title { + font-size: 3.25rem; + } +} + +.editorial-dek { + margin: 1.2rem 0 0; + max-width: 42rem; + color: var(--color-muted); + font-size: 1.12rem; + line-height: 1.65; +} + +.editorial-meta { + margin: 1.45rem 0 0; + color: var(--color-muted); + font-family: var(--font-mono); + font-size: 0.78rem; + letter-spacing: 0.02em; + line-height: 1.7; +} + +.editorial-body { + max-width: 42.5rem; + padding-top: 0.75rem; + font-family: var(--font-serif); + font-size: 1.08rem; + line-height: 1.78; +} + +@media (min-width: 760px) { + .editorial-body { + font-size: 1.16rem; + } +} + +.editorial-body > p { + margin: 1.28rem 0; +} + +.editorial-body > p:first-child { + font-size: 1.18rem; + line-height: 1.68; +} + +@media (min-width: 760px) { + .editorial-body > p:first-child { + font-size: 1.28rem; + } +} + +.editorial-body h2 { + margin: 3.2rem 0 1rem; + font-family: var(--font-serif); + font-size: 1.55rem; + font-weight: 700; + letter-spacing: 0; + line-height: 1.16; + text-wrap: balance; +} + +@media (min-width: 760px) { + .editorial-body h2 { + font-size: 1.9rem; + } +} + +.editorial-pullquote { + margin: 2.4rem 0; + padding: 1.1rem 0 1.1rem 1.25rem; + border-left: 2px solid var(--color-bitter); +} + +.editorial-pullquote p { + margin: 0; + font-size: 1.25rem; + font-weight: 650; + line-height: 1.42; + text-wrap: balance; +} + +.editorial-pullquote cite { + display: block; + margin-top: 0.7rem; + color: var(--color-muted); + font-family: var(--font-mono); + font-size: 0.72rem; + font-style: normal; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +.editorial-social-embed { + margin: 2rem 0 2.15rem; +} + +.editorial-social-shell { + border-block: 1px solid var(--color-line); + padding: 1rem 0; +} + +.editorial-social-topline, +.editorial-social-label, +.editorial-social-evidence summary { + font-family: var(--font-mono); + font-size: 0.72rem; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.editorial-social-topline { + display: flex; + flex-wrap: wrap; + gap: 0.4rem 1rem; + justify-content: space-between; + color: var(--color-muted); +} + +.editorial-social-body { + margin-top: 0.9rem; + padding: 0.95rem 1rem; + border: 1px solid var(--color-line); + border-radius: 6px; + background: color-mix(in srgb, var(--color-ground) 88%, white); +} + +:root.dark .editorial-social-body { + background: color-mix(in srgb, var(--color-ground) 92%, white); +} + +.editorial-social-embed-ecosystem_drama .editorial-social-body, +.editorial-social-embed-public_exchange .editorial-social-body { + border-left: 2px solid var(--color-bitter); +} + +.editorial-social-label { + margin: 0; + color: var(--color-bitter); +} + +.editorial-social-text { + margin: 0.5rem 0 0; + color: var(--color-ink); + font-size: 1rem; + line-height: 1.58; +} + +.editorial-social-shell figcaption { + display: flex; + flex-wrap: wrap; + gap: 0.45rem 0.8rem; + justify-content: space-between; + margin-top: 0.75rem; + color: var(--color-muted); + font-size: 0.86rem; + line-height: 1.5; +} + +.editorial-social-shell figcaption a, +.editorial-social-evidence a { + color: var(--color-bitter); + text-decoration: none; + border-bottom: 1px solid color-mix(in srgb, var(--color-bitter) 45%, transparent); +} + +.editorial-social-shell figcaption a:hover, +.editorial-social-evidence a:hover { + border-bottom-color: var(--color-bitter); +} + +.editorial-social-evidence { + margin-top: 0.65rem; + color: var(--color-muted); + font-size: 0.78rem; + line-height: 1.55; +} + +.editorial-social-evidence summary { + cursor: pointer; + color: var(--color-muted); +} + +.editorial-social-evidence div { + margin-top: 0.55rem; + padding-left: 0.8rem; + border-left: 1px solid var(--color-line); +} + +.editorial-social-evidence p { + margin: 0.35rem 0; +} + +.editorial-source-drawer { + color: var(--color-muted); +} + +.editorial-source-drawer details { + border-top: 1px solid var(--color-line); + padding-top: 1rem; +} + +.editorial-source-drawer summary { + cursor: pointer; + font-family: var(--font-mono); + font-size: 0.76rem; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.editorial-source-drawer-body { + display: grid; + gap: 1.35rem; + margin-top: 1rem; + font-size: 0.9rem; + line-height: 1.6; +} + +.editorial-source-drawer-body h2 { + margin: 0 0 0.55rem; + color: var(--color-ink); + font-family: var(--font-mono); + font-size: 0.76rem; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.editorial-source-links { + display: flex; + flex-wrap: wrap; + gap: 0.35rem 0.75rem; + font-family: var(--font-mono); + font-size: 0.82rem; +} + +.editorial-evidence-list { + margin: 0; + padding-left: 1.1rem; +} + .homepage-thesis { margin: 1.1rem 0 0; font-family: var(--font-serif); @@ -994,6 +1260,183 @@ code { margin-top: 0.25rem; } +.social-receipts-head { + display: grid; + gap: 0.85rem; +} + +@media (min-width: 760px) { + .social-receipts-head { + grid-template-columns: minmax(0, 1fr) minmax(14rem, 18rem); + align-items: end; + } +} + +.social-receipts-title { + margin: 0.45rem 0 0; + font-family: var(--font-serif); + font-size: clamp(1.18rem, 1.4vw, 1.36rem); + font-weight: 600; + letter-spacing: 0; + line-height: 1.25; + text-wrap: balance; +} + +.social-receipts-note { + margin: 0; + color: var(--color-muted); + font-size: 0.9rem; + line-height: 1.5; +} + +.social-receipt-grid { + display: grid; + gap: 1rem; + margin: 1.35rem 0 0; + padding: 0; + list-style: none; +} + +.social-receipt-card { + display: grid; + gap: 0.75rem; + padding: 1rem 1rem 0.95rem; + border: 1px solid var(--color-line); + background: + linear-gradient(180deg, color-mix(in srgb, var(--color-ground) 92%, white), var(--color-ground)); +} + +:root.dark .social-receipt-card { + background: + linear-gradient(180deg, color-mix(in srgb, var(--color-ground) 94%, white), var(--color-ground)); +} + +.social-receipt-card.social-receipt-ecosystem_drama, +.social-receipt-card.social-receipt-public_exchange { + border-left: 2px solid var(--color-bitter); +} + +.social-receipt-meta, +.social-receipt-byline, +.social-receipt-status, +.social-receipt-links, +.social-receipt-tags { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.38rem 0.7rem; + font-family: var(--font-mono); + font-size: 0.7rem; + letter-spacing: 0.05em; + text-transform: uppercase; + color: var(--color-muted); +} + +.social-receipt-meta { + justify-content: space-between; + gap: 0.5rem; +} + +.social-receipt-title { + margin: 0; + font-family: var(--font-serif); + font-size: clamp(1.04rem, 1.1vw, 1.18rem); + font-weight: 600; + letter-spacing: 0; + line-height: 1.28; + text-wrap: balance; +} + +.social-receipt-excerpt { + margin: 0.05rem 0 0; + padding: 0.2rem 0 0.2rem 0.85rem; + border-left: 2px solid color-mix(in srgb, var(--color-bitter) 55%, var(--color-line)); + color: var(--color-ink); +} + +.social-receipt-excerpt p { + margin: 0; + font-size: 0.98rem; + line-height: 1.55; +} + +.social-receipt-summary, +.social-receipt-why, +.social-receipt-verification, +.social-receipt-date-note, +.social-receipt-caveat { + margin: 0; + font-size: 0.92rem; + line-height: 1.55; + color: var(--color-muted); +} + +.social-receipt-why, +.social-receipt-verification, +.social-receipt-date-note { + display: grid; + gap: 0.18rem; +} + +.social-receipt-why span, +.social-receipt-verification span, +.social-receipt-date-note span { + font-family: var(--font-mono); + font-size: 0.68rem; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--color-bitter); +} + +.social-receipt-footer { + display: grid; + gap: 0.65rem; + padding-top: 0.7rem; + border-top: 1px solid var(--color-line); +} + +@media (min-width: 640px) { + .social-receipt-footer { + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + } +} + +.social-receipt-links { + justify-content: flex-start; +} + +@media (min-width: 640px) { + .social-receipt-links { + justify-content: flex-end; + } +} + +.social-receipt-links a { + color: var(--color-bitter); + text-decoration: none; + border-bottom: 1px solid color-mix(in srgb, var(--color-bitter) 45%, transparent); + padding-bottom: 0.1rem; +} + +.social-receipt-links a:hover { + border-bottom-color: var(--color-bitter); +} + +.social-receipt-tags { + gap: 0.32rem; +} + +.social-receipt-tags span { + padding: 0.08rem 0.45rem; + border: 1px solid var(--color-line); + color: var(--color-muted); +} + +.social-receipt-caveat { + font-size: 0.86rem; +} + .source-footer { font-family: var(--font-mono); font-size: 0.75rem; diff --git a/skills/humanizer/SKILL.md b/skills/humanizer/SKILL.md new file mode 100644 index 0000000..27a3826 --- /dev/null +++ b/skills/humanizer/SKILL.md @@ -0,0 +1,61 @@ +--- +name: humanizer +description: Revise AI-sounding drafts into clear, human editorial prose. Use when Codex is writing or editing blog posts, essays, digests, newsletters, landing copy, social-callout copy, or reader-facing explanations and the user asks for more natural, conversational, Stratechery/Krebs-like, less mechanical, less internal, less corporate, or less AI-generated language. +--- + +# Humanizer + +Use this skill to make reader-facing prose sound like a sharp person explaining +the idea to another person. Preserve rigor, but move process details and +traceability into footnotes, links, collapsed notes, or repo artifacts. + +## Workflow + +1. Identify the real reader-facing job of the copy: explain, persuade, orient, + critique, or narrate. +2. Remove internal process language from the main flow. Push audit mechanics, + validation caveats, and source-status terms into background affordances. +3. Rewrite around concrete questions, stakes, and examples. Prefer "what this + means" over "how this was verified" unless the reader needs that in the + moment. +4. Read each paragraph aloud mentally. If it sounds like a policy memo, a PR + note, or a model explaining its method, rewrite it. +5. Keep the strongest sentence and delete the scaffolding around it. + +## Voice Targets + +- Clear enough to say to a friend without embarrassment. +- Specific enough that it still carries an argument. +- Skeptical without sounding defensive. +- Conversational without becoming sloppy. +- Direct, not branded, breathless, or self-congratulatory. + +## Replace These Patterns + +- "This claim should not be promoted" -> "That is a lead, not the whole story." +- "Verification is needed before..." -> "The interesting question is..." +- "Social evidence indicates..." -> "The post points at..." +- "Operators should..." -> "If you are running this, the practical read is..." +- "This validates the bounded claim" -> "The code backs up the smaller version." +- "The editorial workflow..." -> remove it from the public copy. + +## Keep These Boundaries + +- Do not invent warmth by adding jokes, hype, or fake intimacy. +- Do not hide uncertainty. Translate it into plain language. +- Do not let a paragraph begin with a disclaimer unless the disclaimer is the + point. +- Do not use em dashes in repos that prefer ASCII punctuation. +- Do not collapse important source distinctions. Move them into a quieter layer + when they interrupt the reading experience. + +## Quick Checks + +Ask these before finishing: + +- Would a smart reader understand the point without knowing our research + process? +- Is the first sentence carrying an idea, or just clearing its throat? +- Did we say "evidence", "verification", "claim", "finding", "status", or + "workflow" in the public prose when a normal word would do? +- Could this sentence be said out loud naturally? diff --git a/skills/humanizer/agents/openai.yaml b/skills/humanizer/agents/openai.yaml new file mode 100644 index 0000000..45062a1 --- /dev/null +++ b/skills/humanizer/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Humanizer" + short_description: "Make editorial prose sound clear and human" + default_prompt: "Use $humanizer to revise this draft into clear, human editorial prose."