From bc2ebf7ab7451a4c773e6f984681af698273250c Mon Sep 17 00:00:00 2001 From: Sai Kiran Date: Mon, 8 Jun 2026 00:32:44 +0530 Subject: [PATCH] chore(drafts): keep only the W23 sample public, stop publishing runs to a public branch Removed drafts/2026-W16..W22 from main, leaving 2026-W23 as the single demo sample. The cron no longer force-pushes drafts to the public weekly-drafts branch; each run now keeps its drafts as a private CI artifact (30-day retention) with stats in Supabase. Dropped the now-unused contents:write permission to read. Updated the README draft link. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/cron.yml | 23 ++++++++-------- README.md | 2 +- drafts/2026-W16/fri.md | 20 -------------- drafts/2026-W16/mon.md | 22 --------------- drafts/2026-W16/wed.md | 24 ----------------- drafts/2026-W17/fri.SKIPPED.md | 31 --------------------- drafts/2026-W17/fri.md | 23 ---------------- drafts/2026-W17/mon.SKIPPED.md | 38 -------------------------- drafts/2026-W17/mon.md | 25 ----------------- drafts/2026-W17/wed.SKIPPED.md | 32 ---------------------- drafts/2026-W17/wed.md | 29 -------------------- drafts/2026-W18/fri.md | 23 ---------------- drafts/2026-W18/mon.md | 19 ------------- drafts/2026-W18/wed.md | 32 ---------------------- drafts/2026-W19/fri.SKIPPED.md | 37 ------------------------- drafts/2026-W19/fri.md | 23 ---------------- drafts/2026-W19/mon.SKIPPED.md | 37 ------------------------- drafts/2026-W19/wed.SKIPPED.md | 37 ------------------------- drafts/2026-W19/wed.md | 24 ----------------- drafts/2026-W20/fri.SKIPPED.md | 25 ----------------- drafts/2026-W20/mon.SKIPPED.md | 25 ----------------- drafts/2026-W20/wed.SKIPPED.md | 25 ----------------- drafts/2026-W21/fri.SKIPPED.md | 49 ---------------------------------- drafts/2026-W21/mon.SKIPPED.md | 49 ---------------------------------- drafts/2026-W21/wed.SKIPPED.md | 49 ---------------------------------- drafts/2026-W22/fri.SKIPPED.md | 49 ---------------------------------- drafts/2026-W22/mon.SKIPPED.md | 49 ---------------------------------- drafts/2026-W22/wed.SKIPPED.md | 49 ---------------------------------- 28 files changed, 13 insertions(+), 857 deletions(-) delete mode 100644 drafts/2026-W16/fri.md delete mode 100644 drafts/2026-W16/mon.md delete mode 100644 drafts/2026-W16/wed.md delete mode 100644 drafts/2026-W17/fri.SKIPPED.md delete mode 100644 drafts/2026-W17/fri.md delete mode 100644 drafts/2026-W17/mon.SKIPPED.md delete mode 100644 drafts/2026-W17/mon.md delete mode 100644 drafts/2026-W17/wed.SKIPPED.md delete mode 100644 drafts/2026-W17/wed.md delete mode 100644 drafts/2026-W18/fri.md delete mode 100644 drafts/2026-W18/mon.md delete mode 100644 drafts/2026-W18/wed.md delete mode 100644 drafts/2026-W19/fri.SKIPPED.md delete mode 100644 drafts/2026-W19/fri.md delete mode 100644 drafts/2026-W19/mon.SKIPPED.md delete mode 100644 drafts/2026-W19/wed.SKIPPED.md delete mode 100644 drafts/2026-W19/wed.md delete mode 100644 drafts/2026-W20/fri.SKIPPED.md delete mode 100644 drafts/2026-W20/mon.SKIPPED.md delete mode 100644 drafts/2026-W20/wed.SKIPPED.md delete mode 100644 drafts/2026-W21/fri.SKIPPED.md delete mode 100644 drafts/2026-W21/mon.SKIPPED.md delete mode 100644 drafts/2026-W21/wed.SKIPPED.md delete mode 100644 drafts/2026-W22/fri.SKIPPED.md delete mode 100644 drafts/2026-W22/mon.SKIPPED.md delete mode 100644 drafts/2026-W22/wed.SKIPPED.md diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml index 10fe959..054f3fe 100644 --- a/.github/workflows/cron.yml +++ b/.github/workflows/cron.yml @@ -7,7 +7,7 @@ on: workflow_dispatch: {} permissions: - contents: write + contents: read issues: write jobs: @@ -32,17 +32,18 @@ jobs: run: pnpm pipeline --profile examples/sai-voice # Cost is capped in the engine (budgets.cost_usd_per_run, mid-run abort) and # run stats land in Supabase, so there is no data/runs summary to assert here. - # main is branch-protected (required CI check), so generated drafts are - # archived to the unprotected weekly-drafts branch, not committed to main. - - name: archive drafts to weekly-drafts + # Drafts are NOT published to any public branch. They are kept as a private + # CI artifact (visible to repo collaborators only); run stats land in Supabase. + - name: upload drafts (private artifact) if: always() - run: | - git config user.name "linkedin-engine-bot" - git config user.email "bot@users.noreply.github.com" - git add drafts/ posted/ || true - git diff --cached --quiet && echo "no draft changes" && exit 0 - git commit -m "chore: weekly pipeline run [skip ci]" - git push -f origin HEAD:refs/heads/weekly-drafts + uses: actions/upload-artifact@v4 + with: + name: weekly-drafts + path: | + drafts/ + posted/ + retention-days: 30 + if-no-files-found: ignore - name: upload logs if: always() uses: actions/upload-artifact@v4 diff --git a/README.md b/README.md index 33c75ba..a47f9f8 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ pnpm pipeline --profile examples/my-voice ## Demo - Demo profile: [`examples/sai-voice`](./examples/sai-voice) -- A recent run's drafts: [`drafts/`](./drafts) (the cron archives fresh drafts to the [`weekly-drafts`](https://github.com/Imasaikiran/linkedin-engine/tree/weekly-drafts/drafts) branch, keeping `main` protected) +- A sample week of drafts: [`drafts/2026-W23`](./drafts/2026-W23) (each scheduled run keeps its drafts as a private CI artifact, not a public branch) - Public Langfuse trace: [a real run, span per node](https://cloud.langfuse.com/trace/1e5a5622cf85438f2b45e7f50bf983de) ## Design docs diff --git a/drafts/2026-W16/fri.md b/drafts/2026-W16/fri.md deleted file mode 100644 index 20a9246..0000000 --- a/drafts/2026-W16/fri.md +++ /dev/null @@ -1,20 +0,0 @@ -# Friday — Hot take - -Naming a model after Rosalind Franklin does not make it a life sciences breakthrough - -The assumption is that a frontier model wrapped in domain branding equals specialization. Biotech leaders are celebrating GPT-Rosalind as if the name and the positioning settle the question. - -It does not. OpenAI built GPT-Rosalind to accelerate drug discovery, genomics analysis, protein reasoning, and scientific research workflows. Those are use cases, not architectural choices. A general reasoning model pointed at biology is still a general reasoning model. - -Real specialization means training data curation, domain-specific evaluation sets, and failure mode accountability that a broad lab cannot offer at launch. Branding is not a substitute for any of that. - -What would actually convince you that a model is genuinely specialized for life sciences rather than marketed toward it? - ---- - -**Sources:** -- [Introducing GPT-Rosalind for life sciences research](https://openai.com/index/introducing-gpt-rosalind) - -**Why this angle:** The post challenges the biotech community's reflexive excitement over GPT-Rosalind by drawing a hard line between domain-branded positioning and genuine architectural specialization, a distinction that will invite real disagreement from both OpenAI advocates and life sciences practitioners. - -**Metadata:** pillar=hottake | retries=0 | cost=$0.01 | gate_pass_rate=100% diff --git a/drafts/2026-W16/mon.md b/drafts/2026-W16/mon.md deleted file mode 100644 index f1e1076..0000000 --- a/drafts/2026-W16/mon.md +++ /dev/null @@ -1,22 +0,0 @@ -# Monday — Hot take - -Software engineers are not becoming more productive, they are becoming reviewers - -The common assumption is that tools like Codex make engineers faster at writing code. Teams are hiring for coding speed, measuring output in lines, and treating AI as an accelerant. - -That framing is wrong. When a single tool handles browsing, image generation, memory, plugins, and computer use inside one workflow, the bottleneck is no longer writing. It is judgment. - -The engineer who thrives next is not the fastest coder. It is the person who can evaluate what an agent produced, catch subtle failures, and decide when to trust the output. That is a reviewer's job, not a builder's. - -Most teams are still hiring and training for the old identity. That gap will cost them. - -Is "software reviewer" a promotion or a demotion? - ---- - -**Sources:** -- [Codex for (almost) everything](https://openai.com/index/codex-for-almost-everything) - -**Why this angle:** Codex's broad capability set, combining computer use, browsing, memory, and plugins, makes the engineer-as-reviewer identity shift concrete and debatable rather than abstract. - -**Metadata:** pillar=hottake | retries=1 | cost=$0.01 | gate_pass_rate=100% diff --git a/drafts/2026-W16/wed.md b/drafts/2026-W16/wed.md deleted file mode 100644 index 842014e..0000000 --- a/drafts/2026-W16/wed.md +++ /dev/null @@ -1,24 +0,0 @@ -# Wednesday — Framework - -Most AI agents don't fail loudly. They fail quietly, and you ship them anyway - -I call it the 3-Layer Agent Diagnostic. Run it before any agent goes to production. - -1. Reasoning gaps. The agent reaches a wrong conclusion not because it lacks data, but because its chain of thought breaks mid-task. Trace the reasoning steps, not just the final output. - -2. Tool misuse. The agent calls the right tool at the wrong moment, or passes malformed inputs it never validates. Log every tool call with its inputs and the downstream result. - -3. Context collapse. Long conversations or multi-step tasks cause the agent to lose track of earlier constraints. Test explicitly at the edges of your context window, not just at average session length. - -Diagnosing the layer tells you exactly where to intervene, not just that something went wrong. - -When you debug your agents, which of these three layers trips you up most often? - ---- - -**Sources:** -- [Inside VAKRA: Reasoning, Tool Use, and Failure Modes of Agents](https://huggingface.co/blog/ibm-research/vakra-benchmark-analysis) - -**Why this angle:** The 3-layer structure maps reasoning gaps, tool misuse, and context collapse into a concrete audit checklist that practitioners can apply immediately to their own agent pipelines before shipping. - -**Metadata:** pillar=framework | retries=2 | cost=$0.03 | gate_pass_rate=100% diff --git a/drafts/2026-W17/fri.SKIPPED.md b/drafts/2026-W17/fri.SKIPPED.md deleted file mode 100644 index 91878d9..0000000 --- a/drafts/2026-W17/fri.SKIPPED.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -week: 2026-W17 -day: fri -pillar: critique -retries: 1 -status: skipped -reason_class: gate_fail ---- - -# fri SKIPPED (gate_fail) - -Voice gate failed AFTER critic approval (system bug): -- first line word count 24 (max 12) -- first line ends with period - -Draft text: -Anthropic's Opus 4.7 launch: pricing confusion generated more support noise than any capability announcement. That ratio is a product failure, not a comms failure. - -Most people read the release as a capability story. Scores went up, Claude Code got a spotlight, the labs kept trading blows. - -What got buried: the rollout landed with reproducibility bugs, uneven output quality across use cases, and Claude Code pricing confusion that drowned out every feature announcement. When I was fielding evaluation questions from enterprise buyers in the two weeks post-launch, the pricing surface and rollback SLA questions outnumbered capability questions by a wide margin. that is the signal, not the benchmark score. - -Here is the 3-signal checklist I now use before recommending any frontier model rollout to enterprise buyers: (1) reproducibility rate on your own evals. not Anthropic's, yours; (2) pricing surface clarity. can a non-technical stakeholder explain the cost model in one sentence; (3) rollback SLA. what is the vendor's committed response time if output quality degrades in production. Opus 4.7 failed two of three on launch day. - -To be fair to Anthropic, they are building at a pace that makes clean rollouts genuinely hard. The competitive pressure from OpenAI, both companies positioning for IPO, all of it compresses the margin for deliberate release management. I get it. - -But here is what I think the industry keeps missing: trust and transparency are now the real conversion metrics for PM teams evaluating frontier models. A 94th-percentile MMLU score means nothing if your on-call engineer spent the weekend chasing inconsistent completions. The scorecard has changed. - -The labs that figure out product ops as a first-class discipline, not an afterthought to research, will own the enterprise segment in 2026. - -My take: this is structural, not execution. Labs that grew from research culture treat release management as overhead. That won't change until an enterprise customer churns publicly over it. and when that happens, the lab that already has a product ops motion will take the account. diff --git a/drafts/2026-W17/fri.md b/drafts/2026-W17/fri.md deleted file mode 100644 index eee5e2d..0000000 --- a/drafts/2026-W17/fri.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -week: 2026-W17 -day: fri -pillar: critique -cost_usd: 0.019482 -retries: 0 -word_count: 261 -char_count: 1680 ---- - -Anthropic's Claude Mythos launch got the safety logic backwards - -Most people read Project Glasswing as responsible stewardship. Restrict a powerful cybersecurity model to 40 organizations, keep it out of bad hands, protect the internet. That framing is everywhere right now. - -What it misses: attackers do not apply to waitlists. They share tools in private channels, iterate fast, and do not wait for a press release. Defenders, on the other hand, are exactly the kind of institutions that go through formal access programs. So a 40-org cap on Claude Mythos does not symmetrically slow both sides. It slows the side that follows rules. - -OpenAI read this differently. GPT-5.4-Cyber went to thousands of defenders. Broad distribution to the people actively patching networks, triaging alerts, and writing detection rules. I watched security teams I know go from months-long vulnerability reviews to findings in seconds after getting access. That asymmetry matters more than the headline restriction numbers. - -To be fair to Anthropic, I think the Glasswing model reflects a genuine belief that concentrated, auditable deployment produces better feedback and fewer catastrophic misuses early on. With Anthropic capturing 37 percent of enterprise AI spending right now, they have real use to set norms, and they are betting that quality of deployment beats quantity. - -But I think they are solving for the wrong tail risk. The catastrophic scenario is not a vetted defender misusing Mythos. It is defenders being outpaced because access was rationed. - -Do you think restricted rollouts protect more than they cost, or is broad defender access the only move that actually shifts the odds? diff --git a/drafts/2026-W17/mon.SKIPPED.md b/drafts/2026-W17/mon.SKIPPED.md deleted file mode 100644 index 8cc4019..0000000 --- a/drafts/2026-W17/mon.SKIPPED.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -week: 2026-W17 -day: mon -pillar: shipped -retries: 1 -status: skipped -reason_class: gate_fail ---- - -# mon SKIPPED (gate_fail) - -Voice gate failed AFTER critic approval (system bug): -- first line word count 14 (max 12) -- word count 357 outside 180-340 -- char count 2157 outside 1100-2150 -- paragraph has 5 lines (>4) -- bullet/numbered list in non-framework post - -Draft text: -Most PMs misread Claude Design. it's not a Figma killer, it's a category creator - -Anthropic shipped Claude Design last week, and the market noticed before most PMs finished their morning coffee. - -The product lets users generate designs, prototypes, slides, and marketing materials from a text prompt. No design background required. That framing matters, because it is not aimed at Figma's core power users. It is aimed at the people who were never Figma's customers in the first place. - -That is the part I kept turning over. Anthropic did not attack an incumbent head-on. They found the adjacent job-to-be-done that incumbents had quietly ignored: the non-designer who still needs a polished output by Friday. The competitive pressure on Figma and Adobe shares was a side effect, not the stated goal. - -Here is how to spot that same gap in your own category. the Non-Customer Wedge, 3 signals: -1. The incumbent's docs assume expertise the buyer does not have -2. The workaround is a human (contractor, designer, agency), not a competing tool -3. The output standard is 'good enough to ship' not 'pixel-perfect' -All three were true for Claude Design. All three were true when we shipped our own async-first reporting tool: our users were ops leads copy-pasting into slides every Friday, not analysts in BI software. - -The tradeoff is real, though. Shipping a generative design tool before the quality ceiling is fully proven means early users will hit rough edges. Anthropic is betting that speed of iteration covers the gap. the same bet they made with Claude Code before it became a serious enterprise tool. We made the same call: ship to the workaround user first, raise the quality ceiling in public. It cost us two churned pilots and bought us twelve referenceable customers. - -What this told me is that Anthropic's enterprise pivot is not theoretical anymore. Two flagship productivity apps, both targeting workflows that did not exist in software form two years ago. - -If I had to bet on the third app: developer documentation. The signal is the same. experts ignore it, non-experts drown in it, and the current workaround is a Slack message to an engineer. diff --git a/drafts/2026-W17/mon.md b/drafts/2026-W17/mon.md deleted file mode 100644 index 21aa766..0000000 --- a/drafts/2026-W17/mon.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -week: 2026-W17 -day: mon -pillar: shipped -cost_usd: 0.013704 -retries: 0 -word_count: 235 -char_count: 1377 ---- - -We hardcoded Claude into our stack and paid for it 3 times - -Last year, our team built a document-processing feature directly around Claude Sonnet. Not an abstraction layer. The model name was literally in our config files, our prompt templates, our error messages. - -It felt fast. It was fast. We shipped in two weeks and the feature worked beautifully. - -Then Claude Sonnet 4.6 dropped. Then GPT-5.4. Then Gemini 3.1 and Grok 4.20, all within weeks of each other. Suddenly our competitors were testing newer models while we were stuck in a refactor that ate an entire sprint. - -The tradeoff we missed was not about the models themselves. It was about the assumption baked into our architecture: that the model we chose at launch would stay the best choice. That assumption has a shelf life measured in months, maybe weeks now. - -What we should have built was a routing layer with a named interface, something like ModelClient, that swapped providers without touching business logic. We knew this pattern existed. We skipped it because the deadline felt more real than the future technical debt. - -The lesson I carried forward: every time you write a model name directly into product code, you are making a bet that the frontier stays still. Right now, that bet loses almost every quarter. - -Is your team building for the model you have, or the one you will need six months from now? diff --git a/drafts/2026-W17/wed.SKIPPED.md b/drafts/2026-W17/wed.SKIPPED.md deleted file mode 100644 index 329199e..0000000 --- a/drafts/2026-W17/wed.SKIPPED.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -week: 2026-W17 -day: wed -pillar: framework -retries: 1 -status: skipped -reason_class: gate_fail ---- - -# wed SKIPPED (gate_fail) - -Voice gate failed AFTER critic approval (system bug): -- first line word count 16 (max 12) -- first line ends with period - -Draft text: -Stop prompting first. I cut eval cycles from 4 rounds to 1.5. here's the 3-layer method. - -Most PMs jump straight to the prompt. I did too, until output quality tanked on three consecutive sprints. We were building a summarization feature for a B2B inbox product; ROUGE-L scores regressed two sprints running and I could not reproduce the outputs that had scored well. The fix was not a better prompt. It was a methodology sitting underneath every prompt I wrote. - -I call it the PMF-3 Stack (Prompt-last Methodology Framework). Here is why it works now: AI tools like Claude Code and Gemini reward structured thinking before generation. Prompt-first approaches produce inconsistent, hard-to-evaluate outputs that slow teams down. - -1. Define your Innovation Mode first -Before opening any AI tool, write one sentence naming the problem type: exploratory, generative, or evaluative. In Claude Code, this changes your prompt structure in a concrete way. an evaluative task (e.g., scoring five candidate summaries against a rubric) requires you to front-load the rubric and output format before any generation instruction, whereas a generative task lets Claude lead with open drafting. Collapsing these two modes into one prompt is where revision cycles multiply. - -2. Build a Methodology Scorecard -Score your approach on three axes before prompting: clarity of success criteria, specificity of constraints, and validation method. A scored card forces you to think in evals, not vibes. Save this artifact and reuse it across every sprint. - -3. Prompt last, with context loaded -Only after steps 1 and 2 do you open Claude Code or your tool of choice. Your prompt becomes a delivery vehicle for a decision already made, not a question you are still figuring out. Note the failure condition: if the task is low-stakes, one-off, or time-boxed to under 30 minutes, prompt-first is correct. the scorecard overhead costs more than it saves. This framework earns its keep on multi-sprint, eval-heavy work. - -Save this post, fill out your own Methodology Scorecard this week, and tell me what changed. diff --git a/drafts/2026-W17/wed.md b/drafts/2026-W17/wed.md deleted file mode 100644 index 2de148a..0000000 --- a/drafts/2026-W17/wed.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -week: 2026-W17 -day: wed -pillar: framework -cost_usd: 0.016599 -retries: 0 -word_count: 206 -char_count: 1353 ---- - -Stop prompt-chasing. Start context engineering. 4-layer system - -Frontier AI PMs are being evaluated on methodology, not model familiarity. The skill gap separating high-performers from generalists is structural thinking before the first token fires. - -1. Problem Statement Layer -Write a crisp, bounded problem statement before opening any AI tool. If you cannot state the problem in two sentences without jargon, the model cannot help you either. - -2. Context Inventory Layer -Audit what the model needs: user data shape, constraints, success criteria, and known failure modes. I ran this audit on 3 active specs last quarter and cut revision cycles by roughly 40%. - -3. Synthetic Evaluation Layer -Build lightweight synthetic evals before shipping any AI-assisted output. Anthropic Academy frames this as the dividing line between reliable workflow design and prompt lottery. - -4. Trace Log Layer -Capture trace logs on every meaningful run. Logs become your institutional memory, your debugging surface, and your evidence base when stakeholders question model behavior. - -The framework is the artifact. Save it, adapt it to your product area, and run it before your next sprint planning session. If your team is still optimizing prompts without a context inventory in place, you are solving the wrong problem. - -Which layer is weakest in your current workflow? diff --git a/drafts/2026-W18/fri.md b/drafts/2026-W18/fri.md deleted file mode 100644 index 85d9622..0000000 --- a/drafts/2026-W18/fri.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -week: 2026-W18 -day: fri -pillar: critique -cost_usd: 0.014979 -retries: 0 -word_count: 252 -char_count: 1575 ---- - -Anthropic lost the Pentagon contract. I think that was intentional - -Most observers read the DoD's decision to award seven AI vendors while excluding Anthropic as a stumble. A company that couldn't clear the bar for military procurement. - -What that reading misses: Anthropic's Constitutional AI framework was never built to bend on harm categories. The Pentagon's requirements reportedly asked vendors to disable or override certain safety guardrails for sensitive operational contexts. Anthropic said no. That is not a fumble. That is a product boundary enforced in public. - -The charitable but sharp reframe is this. Anthropic just told every regulated enterprise buyer, every healthcare system, every financial institution watching that procurement fight exactly what kind of vendor it intends to be. One that will not negotiate its constraint layer away for a large check. That signal is worth more than one contract to a company whose entire commercial thesis rests on trustworthy AI. - -OpenAI and Google took the deal. Good for them. They have different bets on the table and different customer bases to serve. But Anthropic now owns a positioning that neither of them can credibly claim, and they own it because of a loss. - -I worked through the procurement details when this broke and counted at least 3 public safety commitments Anthropic has made that would conflict directly with standard DoD override requirements. The exclusion was not a gap in capability. It was a gap in willingness. - -Am I reading too much into a contract decision? Tell me where this falls apart. diff --git a/drafts/2026-W18/mon.md b/drafts/2026-W18/mon.md deleted file mode 100644 index 13f13ad..0000000 --- a/drafts/2026-W18/mon.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -week: 2026-W18 -day: mon -pillar: shipped -cost_usd: 0.014901 -retries: 0 -word_count: 207 -char_count: 1242 ---- - -4M weekly users didn't come from a better autocomplete - -OpenAI Codex crossed that number after one product decision that most teams would have delayed: shipping persistent goals. - -The team behind Codex chose to let the agent hold a task in memory across a full coding session, not just a single prompt. That meant building a permission profile so Codex could run terminal commands, read file trees, and write diffs without asking for confirmation every step. The tradeoff was real. More autonomy meant more surface area for the agent to do something unexpected. They shipped it anyway, pairing the persistent-goal architecture with a sandboxed environment so the blast radius stayed small. - -The lesson I kept turning over: activation in agentic tools is not about the first output. It is about whether the user trusts the agent enough to hand it a second task. Persistent goals changed that calculus. A developer who watched Codex finish a multi-file refactor without interruption came back. One who had to babysit every step did not. - -The sharp question for any PM building in this space: what is the smallest unit of autonomy your users will trust on day one, and does your permission model actually protect them if the agent gets it wrong? diff --git a/drafts/2026-W18/wed.md b/drafts/2026-W18/wed.md deleted file mode 100644 index 7dd27e4..0000000 --- a/drafts/2026-W18/wed.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -week: 2026-W18 -day: wed -pillar: framework -cost_usd: 0.01287 -retries: 0 -word_count: 234 -char_count: 1476 ---- - -5 layers every enterprise multi-model stack needs before 2027 - -Three major model updates shipped within 50 days. GPT-5.5, Gemini 3.1 Ultra, and Claude all landed in the same window. If your evaluation process is still a vendor comparison spreadsheet, you are already behind. - -I built this scaffold after watching AI PMs scramble to justify model choices to CFOs who wanted one number: cost per correct output. Here it is. - -1. Routing logic -Decide which model handles which task class before the first token is generated. Static routing beats reactive switching 9 times out of 10 on latency. - -2. Hallucination guardrails -Score every output against a grounded reference set. Track drift weekly, not quarterly. A single uncaught fabrication in a client-facing workflow costs more than the model subscription. - -3. Governance and audit trail -Log model version, prompt hash, and output for every production call. Regulators and legal teams will ask for this. Having it ready changes the conversation. - -4. Cost caps with automatic fallback -Set a per-request ceiling and a cheaper fallback model. I watched one team cut monthly inference spend by 34% without touching accuracy, just by adding this single rule. - -5. Portability contracts -Abstract your prompt layer so swapping the underlying model takes hours, not sprints. Lock-in is a budget problem disguised as a technical one. - -Save this before your next model evaluation cycle. Which layer does your stack handle worst right now? diff --git a/drafts/2026-W19/fri.SKIPPED.md b/drafts/2026-W19/fri.SKIPPED.md deleted file mode 100644 index 8115a41..0000000 --- a/drafts/2026-W19/fri.SKIPPED.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -week: 2026-W19 -day: fri -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# fri SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 0, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 4, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -] diff --git a/drafts/2026-W19/fri.md b/drafts/2026-W19/fri.md deleted file mode 100644 index ffb48f8..0000000 --- a/drafts/2026-W19/fri.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -week: 2026-W19 -day: fri -pillar: critique -cost_usd: 0.017409 -retries: 0 -word_count: 240 -char_count: 1485 ---- - -Anthropic and OpenAI's forward-deployed engineer bets may be a trap - -The common read is that embedding engineers directly into mid-market companies is how frontier labs finally crack enterprise adoption at scale. - -What that read misses: Anthropic's $1.5B joint venture with Blackstone, Goldman Sachs, and Hellman & Friedman, and OpenAI's parallel $4B venture with TPG, Bain, and Brookfield, both depend on a labor model that does not compound. You are not building a product flywheel. You are staffing a consulting practice with a Claude logo on it. - -Forward-deployed engineers generate revenue and generate insight. But the insight stays trapped in bespoke workflows inside portfolio companies. It rarely feeds back into the model or the platform in ways that widen the moat. What you get is a high-touch, high-cost engagement that looks like SaaS ARR on a pitch deck but behaves like professional services on a P&L. - -I watched a mid-market rollout take 14 months to reach steady state because every edge case required an engineer on a call. That is not a distribution strategy. That is an account management problem with better branding. - -The charitable version of this bet: both labs are buying ground truth data on how real companies actually work, and that corpus will eventually train something worth the price. That would make the services layer a research investment, not a revenue model. - -I am genuinely uncertain which version is true. Are you building a moat or renting one? diff --git a/drafts/2026-W19/mon.SKIPPED.md b/drafts/2026-W19/mon.SKIPPED.md deleted file mode 100644 index e098206..0000000 --- a/drafts/2026-W19/mon.SKIPPED.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -week: 2026-W19 -day: mon -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# mon SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 0, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 4, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -] diff --git a/drafts/2026-W19/wed.SKIPPED.md b/drafts/2026-W19/wed.SKIPPED.md deleted file mode 100644 index 294bd7e..0000000 --- a/drafts/2026-W19/wed.SKIPPED.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -week: 2026-W19 -day: wed -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# wed SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 0, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 4, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -] diff --git a/drafts/2026-W19/wed.md b/drafts/2026-W19/wed.md deleted file mode 100644 index 0a91696..0000000 --- a/drafts/2026-W19/wed.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -week: 2026-W19 -day: wed -pillar: framework -cost_usd: 0.013275 -retries: 0 -word_count: 187 -char_count: 1176 ---- - -3 reasons synthetic evals beat human review for agentic AI - -Human review pipelines break down fast when agents branch across 10+ tools and memory states. I built a synthetic eval framework last quarter that cut hallucination rates by 80% across a production agent suite, and the pattern is repeatable. - -1. Deterministic acceptance criteria -Human reviewers disagree on edge cases. Synthetic evals encode exact pass/fail conditions once, then run them thousands of times without drift. - -2. Coverage at agent-branching scale -A single agentic workflow can fork into hundreds of execution paths. Human review samples maybe 5% of those. Synthetic evals cover all of them, every run. - -3. Feedback loops that close in minutes, not days -When I integrated synthetic evals into a CI pipeline for an OpenAI Frontier-style deployment, regressions surfaced in under 4 minutes. Human review cycles were taking 3 days for the same signal. - -I call this the Synthetic Acceptance Criteria (SAC) framework. Save this post and drop it into your next eval planning doc. If you run agents at Anthropic, OpenAI, or DeepMind, I'd genuinely like to hear how your team handles acceptance criteria today. diff --git a/drafts/2026-W20/fri.SKIPPED.md b/drafts/2026-W20/fri.SKIPPED.md deleted file mode 100644 index 37498fc..0000000 --- a/drafts/2026-W20/fri.SKIPPED.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -week: 2026-W20 -day: fri -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# fri SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 9, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -] diff --git a/drafts/2026-W20/mon.SKIPPED.md b/drafts/2026-W20/mon.SKIPPED.md deleted file mode 100644 index 6c9dac0..0000000 --- a/drafts/2026-W20/mon.SKIPPED.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -week: 2026-W20 -day: mon -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# mon SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 9, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -] diff --git a/drafts/2026-W20/wed.SKIPPED.md b/drafts/2026-W20/wed.SKIPPED.md deleted file mode 100644 index 2a82dc4..0000000 --- a/drafts/2026-W20/wed.SKIPPED.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -week: 2026-W20 -day: wed -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# wed SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 9, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -] diff --git a/drafts/2026-W21/fri.SKIPPED.md b/drafts/2026-W21/fri.SKIPPED.md deleted file mode 100644 index f115456..0000000 --- a/drafts/2026-W21/fri.SKIPPED.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -week: 2026-W21 -day: fri -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# fri SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 2, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 4, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 1, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -] diff --git a/drafts/2026-W21/mon.SKIPPED.md b/drafts/2026-W21/mon.SKIPPED.md deleted file mode 100644 index f32c177..0000000 --- a/drafts/2026-W21/mon.SKIPPED.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -week: 2026-W21 -day: mon -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# mon SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 2, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 4, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 1, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -] diff --git a/drafts/2026-W21/wed.SKIPPED.md b/drafts/2026-W21/wed.SKIPPED.md deleted file mode 100644 index 2a5faea..0000000 --- a/drafts/2026-W21/wed.SKIPPED.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -week: 2026-W21 -day: wed -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# wed SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 2, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 4, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 1, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -] diff --git a/drafts/2026-W22/fri.SKIPPED.md b/drafts/2026-W22/fri.SKIPPED.md deleted file mode 100644 index ba1617b..0000000 --- a/drafts/2026-W22/fri.SKIPPED.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -week: 2026-W22 -day: fri -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# fri SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 6, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 3, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 9, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -] diff --git a/drafts/2026-W22/mon.SKIPPED.md b/drafts/2026-W22/mon.SKIPPED.md deleted file mode 100644 index 5f4612c..0000000 --- a/drafts/2026-W22/mon.SKIPPED.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -week: 2026-W22 -day: mon -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# mon SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 6, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 3, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 9, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -] diff --git a/drafts/2026-W22/wed.SKIPPED.md b/drafts/2026-W22/wed.SKIPPED.md deleted file mode 100644 index d8b12ab..0000000 --- a/drafts/2026-W22/wed.SKIPPED.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -week: 2026-W22 -day: wed -pillar: "" -retries: 0 -status: skipped -reason_class: aborted ---- - -# wed SKIPPED (aborted) - -Run aborted: [ - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "trending_topics", - 6, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 3, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - }, - { - "origin": "string", - "code": "too_small", - "minimum": 1, - "inclusive": true, - "path": [ - "recent_launches", - 9, - "summary" - ], - "message": "Too small: expected string to have >=1 characters" - } -]