Friday, October 23, 2026
-
Claude formally verifies 239 fuzz targets in 123 open source libraries
Anthropic and Theorem had Claude write Rocq proofs that 239 OSS-Fuzz entry points in 123 libraries cannot crash on inputs under 64 MB, checked against the compiled RISC-V binaries rather than the source. Claude fixed hundreds of bugs it hit along the way before proving the no crash property. A subset of proofs, the RISC-V and Linux process semantics, and an enrollment repo with a Claude skill for adding projects are public on GitHub.
Heat · Hacker News front page, about 342 points and 201 commentsWhat people foundThe scale is the story: about 180 million lines of Rocq, with a typical proof near 600,000 lines for a median binary of about 18,000 instructions. Anthropic itself stresses that formally verified does not mean bug free, since the proofs trust the RISC-V and Linux model, the Rocq checker and the hardware, and cover only static musl builds.Learn it15 min · 5 steps
Key ideas
- Formal verification
- A machine checked mathematical proof that a program satisfies a stated property for every possible input, not just the ones a test tried.
- Fuzz target
- A small entry function that feeds arbitrary bytes into a library so a fuzzer can hunt for crashes, here reused as the specification to prove.
- Trusted base
- The parts a proof assumes are correct, such as the CPU and OS model and the proof checker, which is where any remaining risk lives.
Steps
- Read the Anthropic research post first, focusing on the sections on what was proved and on limitations.
- Open the oss-verify-proofs README and skim the repository structure table to see how statements, proofs and binaries are laid out.
- Open one entry in index/PROOFS.md, for example coturn FuzzStunClient, and read its Statements.v to see what exactly is claimed.
- Read the README limitations list on sanitizers, x86 builds and non terminating runs.
- Self check: name two kinds of bug that a proof here would still not rule out.
Try it30 min · 6 steps
You need: Linux or macOS laptop with Docker, zstd, Python 3 and git; ideally 16 GB RAM or more, limit cores to keep memory down. No API key needed.Steps
- Clone the proofs repo with
git clone https://github.com/theorem-labs/oss-verify-proofsand enter the folder. - Fetch one project's binaries with
./oft fetch coturn, which checks each binary against its SHA-256. - Install the checker's Python dependencies into a side folder with
python3 -m pip install --require-hashes --target "$HOME/oft-pydeps" -r tools/oft/requirements.txt. - Run the pinned checker image from the README with
docker run --rm --network none, mounting the repo and the deps folder, and add--cpuset-cpusto cap cores, then run./oft check coturn/FuzzStunClient --parts statements,proofsinside it. - Watch the final step where the checker reads the Print Assumptions output and rejects any axiom not on the allowed list.
- Note wall time and peak memory, and compare against the README figure of up to 20 GiB on 16 cores.
Small angles to try
- Pick a library you depend on from index/PROOFS.md, such as zstd or cjson, and check its proofs instead.
- Read the oss-verify enrollment steps and dry run
tools/validate.pyon a template project you own. - Browse the counterexamples folder to see inputs that break a statement.
-
Claude API version 2026-10-21 removes sampling params, Python SDK 2.0
Anthropic released API version 2026-10-21 alongside new major SDKs, with Python
anthropicat 2.0.0. Requests that send temperature, top_p or top_k now get a 400, the TypeScript and Ruby tool runners drop client side compaction in favor of server side compaction, and SDKs send the key as an Authorization Bearer header instead of X-Api-Key. Claude Code v2.1.307 adds a/claude-api api-versioncommand to move existing code to the new version.Heat · Shipped with a dedicated migration command in Claude Code v2.1.307 on Oct 21 and a full migration guide in the Claude docsWhat people foundPer the migration guide, lowering temperature for consistency simply stops having any effect on models that accepted it, such as Claude Sonnet 4.6, with nothing to replace it; requests that truly need it should stay on 2023-06-01. Gateways and proxies that read or set X-Api-Key need updating, although the API itself still accepts either header.Learn it15 min · 5 steps
Key ideas
- API version header
- The anthropic-version request header pins which behavior the API uses, so old code keeps working until it opts into the new date.
- Sampling parameters
- Settings like temperature, top_p and top_k that change how random the next token choice is; the new version rejects them outright.
- Server side compaction
- The API summarizes older context once input tokens pass a trigger, replacing the SDK option that did this on the client.
Steps
- Read the 2026-10-21 migration guide in the Claude docs first, top to bottom.
- List which of the breaking changes touch your code: sampling params, document blocks in assistant turns, citations on user text, Admin API field renames.
- Read the compaction before and after snippet to see how
compactionControlmaps tocontext_management. - Skim the Claude Code v2.1.307 release notes for the new migration command.
- Self check: why would a proxy break after an SDK upgrade even though the API accepts both auth headers?
Try it30 min · 5 steps
You need: Python 3, an Anthropic API key in ANTHROPIC_API_KEY, and theanthropicpackage at 2.0.0; Claude Code is optional for the migration command.Steps
- In a fresh virtual environment, install
anthropic==2.0.0with pip. - Send a short Messages request with a current model id from the docs and no sampling params, and confirm it succeeds.
- Add temperature 0 to the same request and confirm it now fails with a 400.
- Point the client at a tiny local logging proxy you run yourself and confirm the key arrives as an Authorization Bearer header, not X-Api-Key.
- On a copy of an old project, run
/claude-api api-versioninside Claude Code and review the diff it proposes.
Small angles to try
- Call the API directly with curl twice, once with anthropic-version 2023-06-01 and once with 2026-10-21, sending temperature both times.
- Port a TypeScript tool runner from
compactionControltocontext_managementwith the 50,000 token minimum trigger. - Grep your codebase for top_p, top_k and X-Api-Key before upgrading.
-
Twelve AI models give nearly the same 'controversial' take on humans
ModelCompare asked 12 text models from different labs for their most controversial take about humans, three times each with no system prompt and no retries. 29 of 35 answers that were not refusals said people value belonging over truth, and 7 of the 12 models gave that take on every run. Image models asked for a satirical caricature mostly drew phone addicted consumers damaging the planet, a theme no text answer raised.
Heat · Hacker News front page, about 404 points and 412 commentsWhat people foundOnly Claude Opus 5.5, Claude Fable 5.1, GLM 5.3 and Mistral Large 4 ever strayed from the shared answer, and the whole run of 60 calls cost $1.54. The authors read it as models returning the most familiar criticism of people, which matters if you expect a model switch to add variety to generated content.Learn it15 min · 5 steps
Key ideas
- Output convergence
- Different models trained on overlapping web data and similar tuning tend to land on the same answer to open questions.
- Mode collapse
- A model repeatedly picks one high probability answer instead of covering the range of plausible ones.
- Sampling runs
- Asking the same prompt several times shows whether an answer is a stable preference or a random draw.
Steps
- Read the ModelCompare blog post first, including the exact prompt and the list of models.
- Note how answers were grouped by hand and how refusals were counted.
- Compare the text results with the image results and note where they diverge.
- Skim the Hacker News thread for critiques of the method, such as sample size and prompt wording.
- Self check: what would you change in the setup to tell model convergence apart from prompt wording effects?
Try it30 min · 5 steps
You need: Python 3 and API keys for two or three model providers you already use, or a single multi model gateway account; a few cents of usage.Steps
- Copy the exact prompt from the blog post into a small script.
- Call each model three times with no system prompt and save every answer to a JSON file.
- Write a one sentence label for each answer and group identical themes by hand.
- Count how many answers share the most common theme and how many models gave it every time.
- Compare your counts with the post's 29 of 35 figure.
Small angles to try
- Swap in a question from your own product domain to see if your candidate models converge there too.
- Add a system prompt asking for an unusual view and measure whether diversity improves.
- Run the same prompt against one model at several temperatures where supported.
Sources:ModelCompare blog post -
Cache engineering: agents drop KV cache entries instead of summarizing
Tsinghua researchers argue that trimming or summarizing an agent's history invalidates its KV cache and forces an expensive re prefill. Their method lets agents drop cache entries from future attention and reposition the keys that remain, served by an engine called AKV that keeps a stateless interface compatible with existing serving APIs. A rolling drop of old tool responses scored 1.7 points higher on average and cost 27.7% less than threshold triggered summarization, with up to 1.2x output throughput and 1.5x better P95 latency.
Heat · Hugging Face daily papers, 111 upvotes, #4 of the Oct 22 listingWhat people foundThe authors point out that identical token sequences can now map to different cache states depending on the order of operations, so plain prefix matching is no longer enough for cache reuse. In AKV the harness keeps the full message list and sends drop and reposition instructions as extra request fields; the README warns not to delete dropped messages from the request yourself.Learn it15 min · 5 steps
Key ideas
- KV cache
- Stored attention keys and values for tokens already processed, so the model does not recompute them each turn.
- Prefill
- The step that processes the whole prompt before generation; editing early context forces it to rerun on everything after the edit.
- Repositioning
- Shifting the position encodings of retained keys so the context stays contiguous after some entries are dropped.
Steps
- Read the Hugging Face paper page abstract first.
- Open the AKV README and read how drop_message and reposition are added to a Chat Completions request.
- Read the three ways a policy can be set: trigger, selector and reposition components, or a model calling a drop tool.
- Compare this with how your own agent harness compacts context today.
- Self check: why does summarizing history cost more prefill than dropping cache entries?
Try it30 min · 5 steps
You need: A laptop with Python 3.12, uv and Rust for reading and installing; running the server needs GPUs, the README example uses GPT-OSS-120B across two. No API key needed.Steps
- Clone the repo with
git clone https://github.com/thu-nics/AKV.gitand create an environment withuv venv --python 3.12. - Install it in editable mode with
uv pip install -e .so the policy classes can be imported. - Read
examples/demo.pyto see how a multi turn agent sends its history and cache instructions. - Build a toy message list with a few fake tool responses and run it through a
CachePolicyto print the resulting drop_message and reposition fields, without any server. - If you have access to a GPU box you own, launch the server per the README with a supported Qwen3 or GPT-OSS model and run the demo.
Small angles to try
- Change the trigger from turn based to token based and compare which messages get dropped.
- Log how many prompt cache hits your current agent loses each time it summarizes history.
- Try the model driven mode where the model calls a drop tool itself.
-
Personal AI agents go abroad: Meta's Muse launches in Japan
After the Oct 21 Radar items on its US downloads, the news is that Meta launched its personal agent Muse in Japan on Oct 23, its first market outside North America. ITmedia reports Mercari, Money Forward ME and Ticket Pia as planned Japanese integrations, joining existing links such as Gmail, Google Calendar, Instagram, Stripe, Shopify, Trip.com, Agoda and Klook. Muse runs long tasks in a dedicated cloud VM per user and asks for approval before actions like sending email or buying.
Heat · Muse is #3 on the US App Store top free chart, but was not seen in Japan's top 50 free chart as of Oct 22 UTC, before the launchWhat people foundPer ITmedia, Meta says Muse never sees passwords or payment details directly and a separate agent called Sentinel checks external actions and asks the user for approval. For Japanese services the practical upshot is that agents acting for users become real API clients, so scoped permissions, approval steps and action logs need designing now.Learn it15 min · 5 steps
Key ideas
- Personal agent
- An assistant that carries out multi step tasks across a user's connected apps rather than only answering questions.
- Human approval gate
- A checkpoint where the agent pauses and asks the user before an irreversible action such as a payment or an outgoing email.
- Guard agent
- A second model, Sentinel in Muse's case, that reviews the first agent's external actions before they run.
Steps
- Read the ITmedia NEWS article first, using a translator if needed.
- List the current and planned integrations and note which ones handle money or personal data.
- Read the Business Insider Japan piece for background on the September US launch and an early privacy slip.
- Sketch what Mercari or Money Forward would need to expose for an agent to act safely.
- Self check: which Muse safety measures protect the user if the main agent is tricked by content in an email?
Try it30 min · 5 steps
You need: A phone or browser and a throwaway Google account with a test calendar; Muse availability depends on region. No API key needed.Steps
- Sign up for Muse with a test account and connect only a test Google Calendar.
- Ask it to schedule a meeting and draft an email invite, and note exactly when it asks for approval.
- Decline the approval and check that nothing was sent or created.
- Open the action history and compare planned versus completed actions.
- Revoke the calendar connection and confirm the agent can no longer read it.
Small angles to try
- Put a hidden instruction in a test calendar event description and see whether the agent follows it.
- Write a one page design for an approval API your own service could offer to agents.
- Compare Muse's permission screens with those of another agent you already use.
-
Anthropic hands Agent Skills to the Linux Foundation's AAIF
On Oct 22 Anthropic donated the Agent Skills standard, along with its name, logo, GitHub org and the agentskills.io domain, to the Agentic AI Foundation, the Linux Foundation body that already hosts MCP. Engineers from Anthropic, Google, OpenAI and other companies will maintain it as individuals, with David Soria Parra and Mahesh Murag as lead maintainers. Anyone can use or contribute to the standard without joining the foundation.
Heat · Modest discussion so far, about 5 HN points; Anthropic reports 70+ integrating agent platforms such as ChatGPT, Cursor, GitHub Copilot and VS Code, 1 million published skills and nearly 280 million installsWhat people foundAnthropic's proposed roadmap adds versioned releases, a formal proposal process and security guidance for skill authors and installers, so a SKILL.md folder written today becomes a vendor neutral, governed format rather than one company's feature.Learn it15 min · 4 steps
Key ideas
- Agent Skill
- A folder with a SKILL.md file of YAML metadata plus Markdown instructions, optionally bundling scripts, references and assets.
- Progressive disclosure
- Agents load only each skill's name and description at startup and read the full instructions only when a task matches.
- Agentic AI Foundation
- A Linux Foundation project cofounded by Anthropic, Block and OpenAI that gives MCP and now Agent Skills a neutral home.
Steps
- Read the Anthropic announcement first to see what moved to the foundation and who maintains it.
- Read the specification page on agentskills.io, focusing on the frontmatter table and the name field rules.
- Note the size guidance: about 100 tokens of metadata, a body under 5000 tokens and a SKILL.md under 500 lines.
- Self check: why must the description say both what a skill does and when to use it?
Try it30 min · 6 steps
You need: Any laptop with Python and git; a skills compatible agent you already use is optional. No API key needed for validation.Steps
- Create a folder named
release-notesand inside it a SKILL.md whose frontmatter setsname: release-notesand a description saying what it does and when to use it. - Write a short Markdown body with step by step instructions, one input and output example and one edge case.
- Install the skills-ref reference library from the agentskills GitHub repo by following its README.
- Run
skills-ref validate ./release-notesand fix any reported errors. - Break it on purpose: rename the name field to
Release--Notesand confirm validation fails for uppercase and consecutive hyphens. - If you use a compatible agent, copy the folder into its skills directory and ask for release notes to see whether it activates.
Small angles to try
- Add the optional license, compatibility and metadata fields and revalidate.
- Move long details into references/REFERENCE.md and compare how much context the agent loads.
- Load the same skill in two different agents and compare behavior.
-
OpenAI's official CLI for its API draws HN attention
OpenAI's openai-cli repo is an official Go command line tool for the OpenAI REST API, covering standard endpoints with OPENAI_API_KEY and admin endpoints such as organization usage with a separate OPENAI_ADMIN_KEY. It installs through Homebrew or
go install, and the repo has no tagged releases yet.Heat · HN this week, about 235 points and 110 comments; 653 GitHub starsWhat people foundThe useful bits for scripting:--formatswitches between json, jsonl, yaml, pretty, raw and an explore view,--transformfilters output with GJSON syntax, and@fileattaches a file even inside a JSON or YAML body. The README warns that--debuglogs full request and response bodies, so keep those logs private. Licensed Apache 2.0.Learn it15 min · 4 steps
Key ideas
- Resource command pattern
- Commands mirror the REST API, so
openai responses createmaps to creating a Responses API call. - Admin key
- A separate organization level key used only for admin endpoints such as usage reports, kept apart from normal API keys.
- GJSON
- A compact path syntax for picking fields out of JSON, used here by the transform flags.
Steps
- Read the openai-cli README on GitHub first, especially installation, environment variables and output formats.
- Compare one command with the matching endpoint in OpenAI's API reference to see the mapping.
- Read the @file section to learn how files, plain text and base64 are passed.
- Self check: which environment variable does an admin usage command need, and why is it separate from OPENAI_API_KEY?
Try it30 min · 6 steps
You need: macOS or Linux with Homebrew, or Go 1.25 or later; an OpenAI API key with a little credit; an admin key only for the admin angle.Steps
- Install with
brew install openai/tools/openai, or withgo install 'github.com/openai/openai-cli/cmd/openai@latest'and add the Go bin directory to PATH. - Export OPENAI_API_KEY with your own key.
- Run the README example
openai responses create --input "Say this is a test" --model gpt-5.5. - Repeat it with
--format yaml, then with--format jsonplus a--transformGJSON path that extracts only the output text. - Pass a local text file of your own with the
@filesyntax and check the request is built as expected. - Rerun once with
--debugto inspect the HTTP exchange, then delete that output since it holds request bodies.
Small angles to try
- Replace an existing curl plus jq script with the CLI and compare length.
- With an admin key, pull a day of completions usage via the
openai admin:organization:usage completionscommand from the README. - Use
--format-errorto get machine readable errors in a shell script.
Sources:openai-cli on GitHub -
Grid choice drives AI carbon: same request, about 8x CO2 in Texas
Swedish provider Berget AI now shows emissions for each request in its console, following the Green Software Foundation's SCI for AI spec and counting hardware manufacturing. Its example Kimi K3 request with 5,000 input and 387 output tokens uses about 4 Wh in both places, yet comes to 0.38 g CO2e in Sweden and 3.2 g in Texas. A source review corrected an embargoed draft that had claimed a tenfold gap.
Heat · HN about 111 points and rising on Oct 23What people foundElectricity per request is roughly equal, so the gap of about 8x comes from grid intensity: in Sweden about 89% of the footprint is GPU manufacturing, while in Texas about 90% is electricity. For engineers, the inference region can matter more than model tweaks for carbon.Learn it15 min · 4 steps
Key ideas
- Grid carbon intensity
- Grams of CO2e per kWh of electricity, about 8 for Sweden versus about 333 for Texas in Berget's sources.
- Embodied emissions
- Emissions from manufacturing hardware, here about 1,000 kg CO2 per data centre GPU spread over its requests.
- SCI for AI
- A Green Software Foundation spec for computing a software carbon intensity score for AI workloads.
Steps
- Read the Berget AI press release first, including the correction note at the end.
- Recompute the ratio from the table: 3.2 divided by 0.38 is about 8.4, close to the 8.5x the release states from unrounded data.
- Open the berget-ai co2-calculator repo README and find the inputs it takes, such as hardware, grid region and token counts.
- Self check: why does Sweden's footprint become dominated by hardware manufacturing rather than electricity?
Try it30 min · 5 steps
You need: Node.js and npm on a laptop. No API key needed.Steps
- Make an empty Node project and install the calculator package named in the berget-ai co2-calculator README; the README says
npm install @berget/co2-emissions-calculatorwhile the release names @bergetai/co2-calculator, so check which one npm actually has. - Copy the README's
calculateInferenceexample into a script and run it once as is. - Change only the deploymentGrid between the available grid regions and print grams of CO2e per request for each.
- Change the input and output token counts toward the release example of 5,000 in and 387 out and note how the totals scale.
- Put the results in a small table and compare the region ratio with the release's figure.
Small angles to try
- Toggle includeTraining and see how much training amortization adds.
- Vary concurrency to see how batching shifts the hardware share.
- Estimate a month of your own app's traffic in two regions.
-
KRAFTON Raon-1 mini preview: 30B-A4B open weight MoE, Apache 2.0
KRAFTON published Raon-1 mini preview, a hybrid MoE with 28.8B total and 4.3B active parameters, a 262,144 token context, a thinking mode and tool calling for agents like Hermes Agent, Pi and OpenCode. It comes with a DFlash2 draft model for speculative decoding plus NVFP4, GGUF and MLX variants, and KRAFTON highlights strong Korean performance. Access is gated but approved automatically.
Heat · Hugging Face model page with 68 likes when checked on Oct 23What people foundKRAFTON's own table is mixed: 84.3 on GPQA Diamond beats the listed MoE peers but trails dense Qwen3.8-27B at 89.7, and 76.5 on MMLU Pro is below every comparison model. KRAFTON reports the DFlash2 draft gives up to 2.18x output throughput on one B300.Learn it15 min · 4 steps
Key ideas
- Active parameters
- In a MoE only a few experts run per token, so 4.3B of 28.8B weights do the work each step.
- Hybrid attention
- The model mixes 18 linear attention layers with 7 full attention layers to keep long context cheaper.
- Draft model
- A small model that proposes tokens the big model verifies in one pass, speeding decoding without changing output.
Steps
- Read the Hugging Face model card first, especially the architecture notes and benchmark table.
- Compare the MoE rows with the dense rows and note which tasks favor which.
- Look at the quickstart to see how the DFlash2 draft is wired in with speculative decoding flags.
- Self check: why can a 30B MoE run nearly as fast as a 4B dense model yet still need memory for all 30B weights?
Try it30 min · 6 steps
You need: A Hugging Face account to accept the gated access; for local runs a Mac with enough unified memory for the MLX variant or a machine for the GGUF Q4_K_M build with llama.cpp. No API key needed beyond an HF token.Steps
- Request access on the model page; approval is automatic.
- Pick the variant that fits your machine:
KRAFTON/Raon-1-mini-preview-gguffor llama.cpp with the Q4_K_M quant, orKRAFTON/Raon-1-mini-preview-mlxon Apple silicon. - Load it with the tool's standard run command as shown in the model card's local apps section and ask a short reasoning question with thinking on.
- Ask the same question in Korean and in English and compare answer quality.
- Give it a simple tool calling task through an agent harness you already use, such as OpenCode, and check the tool call format.
- Write down tokens per second and whether answers look right.
Small angles to try
- On a GPU server, try the vLLM quickstart with the dflash2 draft and compare speed with and without it.
- Run the same prompts on Qwen3.6-35B-A3B for a side by side.
- Feed a long document to probe the long context claim.
Sources:Hugging Face model card -
EAGLE-4 speculative decoding: about 3.5x on one AMD MI355X
EAGLE-4 pairs a small drafter with eagle-harness, which measures costs on your own hardware to decide how far to speculate while keeping output identical to the target model. On Oct 20 AMD published day zero MI355X support, reporting 3.5x over plain decoding for Qwen3.8-27B at one request on a single GPU with SGLang, and results for its ATOM engine too. The GitHub repo lists support for SGLang, vLLM and TokenSpeed.
Heat · 880 GitHub stars; AMD technical article on launch dayWhat people foundPer the GitHub repo, gains shrink with load: on 4x B300 SGLang goes from 3.42x at 1 request to 1.39x at 64 concurrent, and vLLM from 2.83x to 1.14x. The repo also states the license is source available, not OSI open source, with a $20M revenue threshold for commercial use, so check it before shipping.Learn it15 min · 4 steps
Key ideas
- Speculative decoding
- A cheap drafter guesses several tokens and the target model verifies them in one pass, keeping only correct ones.
- Cost measurement
- eagle-harness profiles your GPU and tensor parallel size once, about 10 to 20 minutes on MI355X per AMD, to tune speculation depth.
- Concurrency tradeoff
- At high batch sizes the GPU is already busy, so spare compute for drafting shrinks and speedups fall.
Steps
- Read the AMD technical article first for the MI355X numbers and the benchmark setup.
- Then read the EAGLE-4 GitHub README speedup table for B300 across SGLang, vLLM and TokenSpeed.
- Read the license section of the repo and note the commercial terms.
- Self check: why is the speedup at 64 concurrent requests far below the one at a single request?
Try it30 min · 5 steps
You need: No large GPU required for the laptop path: a browser and git. A real run needs a big data centre GPU, Python 3.12 and about 62 GB for the drafter. No API key needed.Steps
- Clone the EAGLE-4 repo and open the README speedup table and license file.
- Put the AMD single GPU numbers next to the repo's B300 numbers in a small table, labeling each source.
- Read the Docker serve command in the README and identify each speculative flag: num steps 12, topk 4 and 16 draft tokens.
- Sketch your own workload's typical concurrency and estimate which column of the table applies.
- Decide whether your use falls under the license's commercial terms.
Small angles to try
- If you have a suitable GPU, run the README Docker command and send the sample curl request.
- Compare EAGLE-4 against the built in MTP speedup numbers in the AMD article.
- Read the EAGLE-4 paper PDF in the repo for how the drafter is trained.
-
OpenAI opens its Decisions API to all, adding voice and image input
OpenAI's Decisions API, shown at its Sept 29 dev day, became available to all API customers on Oct 22, now with voice and visual inputs. It is a dedicated endpoint where
gpt-6-lunaanswers bounded questions of three types, predicate, choice and score, and returns probabilities and confidence instead of free text; TechCrunch reports it is ChatGPT Luna reconfigured for speed, not a separately trained decision model. Unlike last week's open weight pplx-decider and the wave of Jev alternatives, this is OpenAI's own hosted entry, with up to 400 questions per request and native hooks into GPT-Live voice sessions.Heat · TechCrunch coverage on Oct 22; no HN or Hugging Face numbers foundWhat people foundPricing is $0.10 per million input tokens with no charge for output tokens, and TechCrunch reports latency dropping from 1 to 3 seconds to roughly 100 to 180 ms; Speak CTO Andrew Hsu cites 1.4 s to 0.13 s between actions. On quality it trails, ranking 8th on the AIM System One Index and 14th on the Artificial Analysis Decision Index, and TypeSafe CEO Diogo Almeida advises testing decision models on your own workload rather than trusting benchmarks.Learn it15 min · 5 steps
Key ideas
- Decision model
- A model that picks one answer from a fixed set and reports how likely each option is, instead of writing open text.
- Predicate, choice and score questions
- Predicate returns a probability that a condition holds, choice picks one of your listed values, and score rates input against ordered rubric levels.
- Calibration
- How well the reported probabilities match how often the model is actually right, which decides whether a confidence threshold is trustworthy.
Steps
- Read the OpenAI Decisions API developer guide at developers.openai.com first, focusing on the request fields and the three question types.
- Read the OpenAI announcement page for pricing, regions and the GPT-Live voice trigger example.
- Skim the TechCrunch article for how it ranks against TypeSafe's Jev and other decision models.
- Compare with pplx-decider from the Oct 19 radar: hosted versus open weight, and what each returns.
- Self check: for a support ticket router, which question type would you use, and what would you do when confidence is low?
Try it30 min · 5 steps
You need: OpenAI API key with Decisions access, curl or any HTTP client, a few cents of usageSteps
- Collect 30 of your own short texts with known labels, for example support messages or commit messages tagged bug, feature or chore.
- Send one
POST https://api.openai.com/v1/decisionsrequest with"model": "gpt-6-luna", the text asinput, and onechoicequestion listing your labels as choices. - Loop over all 30 texts, logging the chosen label, its
confidenceand the wall clock latency of each call. - Run the same 30 texts through the Responses API on
gpt-6-lunawith a plain classification prompt and log latency and tokens for comparison. - Compute accuracy for both, then sort the Decisions results by confidence and pick a threshold below which you would fall back to a full LLM call.
Small angles to try
- Use a
predicatequestion as a guardrail, such as whether a message contains a request for personal data. - Use a
scorequestion with 3 to 5 rubric levels to grade answer quality. - Put several questions in one request against the same input and see how latency changes.
-
Graphify 0.9.94 turns repos into graphs for agents, now with T-SQL edges
Graphify parses a codebase with local tree-sitter ASTs into a queryable knowledge graph, labels each edge as extracted or inferred, uses no vector store, and runs as a
/graphifyskill in Claude Code, Cursor, Codex and Gemini CLI, with an optional MCP server. Release 0.9.94 on Oct 22 bundles 19 community pull requests: fetched URLs are now rejected on every redirect if they lack a hostname, have a bad port or embed credentials, T-SQL procedures emitreads_fromandwrites_toedges, and the Codex hook now quotes paths with spaces.Heat · About 133k stars on the GitHub repo page on Oct 23; a third party daily digest also listed it as trending on Oct 22What people foundThe AST cache schema has been bumped in every release from 0.9.86 to 0.9.94, so the first build after each upgrade re-extracts the whole repo; pin the version in CI to avoid surprise rebuilds. The README also notes every query is logged to~/.cache/graphify-queries.log, whichGRAPHIFY_QUERY_LOG_DISABLE=1turns off.Learn it15 min · 4 steps
Key ideas
- Tree-sitter AST parsing
- A fast local parser turns source files into syntax trees, so functions, classes and calls can be found without any model.
- Extracted versus inferred edges
- Extracted edges come straight from the code structure, while inferred edges are guesses from a semantic pass and deserve less trust.
- MCP server
- A small process that exposes tools such as graph queries to an AI assistant over the Model Context Protocol.
Steps
- Read the Graphify README on GitHub first, especially the install section and the Common commands block.
- Read the 0.9.94 release notes on the releases page to see what kinds of edges and languages it handles.
- Open a sample
graph.jsonandGRAPH_REPORT.mdafter a build to see how nodes and edges are named. - Self check: why would a coding agent prefer a call graph over embedding search when asked what breaks if a function changes?
Try it30 min · 5 steps
You need: Python with uv or pipx, one of your own repos, an AI coding assistant for the slash commands; No API key needed for code only buildsSteps
- Install the CLI with
uv tool install graphifyy, noting the double y in the package name, then rungraphify installto register the skill with your assistant. - In your assistant, inside one of your own repos, run
/graphify . --no-vizto build the graph and report only. - Open
graphify-out/GRAPH_REPORT.mdand check whether the main modules and their links match your mental model of the code. - Ask a structural question with
/graphify path "ClassA" "ClassB"using two real names from your repo, and/graphify explainon one central class. - Edit one file and run
/graphify . --updateto confirm only changed files are re-extracted.
Small angles to try
- Run it on a repo with SQL stored procedures and look for the new read and write edges.
- Install the MCP extra with
uv tool install "graphifyy[mcp]"and compare agent answers with and without the graph. - Upgrade from an older version and time the forced full re-extraction.
-
Railway breach leaks env vars in a campaign aimed at AI inference keys
Railway disclosed on Oct 21 that an unauthorized party may have accessed encrypted customer environment variables and, for some customers, obtained decrypted values, which can include API keys and registry credentials. Railway called it part of a series of attacks on platform companies "with the aim of compromising AI inference providers", paused all deployments, notified upstream providers so they could revoke keys, and told every customer to rotate all variables.
Heat · HN front page, about 592 points and 334 comments; GitGuardian published response guidance the next dayWhat people foundGitGuardian advises treating every Railway variable as exposed, sealed ones included, and rotating at the upstream provider such as AWS, GCP, GitHub or the AI API first, then updating Railway and redeploying. The wider lesson: LLM provider keys sitting in PaaS environment variables are now a named target, so know where yours live and how fast you can rotate them.Learn it15 min · 4 steps
Key ideas
- Platform environment variables
- Secrets a hosting platform stores and injects into your app at runtime, so a platform breach can expose them even if your code is clean.
- Upstream first rotation
- Issue a new key at the provider and revoke the old one there, because changing the value only on the platform leaves the leaked key valid.
- Sealed variables
- Railway values that cannot be read back through its UI, API or CLI, though the disclosure does not say whether they were safe.
Steps
- Read Railway's security disclosure for Oct 21 first, including the later updates.
- Read GitGuardian's response guide for its order of operations from investigation to cleanup.
- List which AI provider keys your own apps use and where each is stored.
- Self check: if an AI API key leaks from your hosting platform, which two actions come first, and why must the first happen at the provider?
Try it30 min · 6 steps
You need: Your own repos and deploy config only, ggshield with a free GitGuardian account token, access to your own AI provider dashboardsSteps
- Write an inventory of every AI provider key your own projects use, noting where each is stored: local .env files, CI secrets or a hosting platform.
- Install the scanner with
pipx install ggshieldand authenticate withggshield auth login. - In each of your own repos, scan the working tree with
ggshield secret scan path -r .and the git history withggshield secret scan repo .. - Confirm .env files are listed in .gitignore and that no committed config holds a live key; move any you find into your secret store.
- Rotate one of your own AI keys end to end: create a new key at the provider, update your config, redeploy, revoke the old key, and note how long it took.
- Set a spend limit or usage alert on each provider account so a stolen key shows up quickly.
Small angles to try
- If you deploy on Railway, follow GitGuardian's guide to export your own variables with
railway variable list --service <service> --environment <environment> --kv > .env.railway, scan the file, then delete it. - Split one shared AI key into per project, per environment keys so a leak has a smaller blast radius.
- Turn the rotation you just did into a short written runbook.
-
David Harvey finds an AI model's faster multiplication claim plausible
David Harvey, who with Joris van der Hoeven gave the 2021
O(n log n)integer multiplication algorithm, posted a note on a new manuscript claimingO(n (log n)^(1-ε))bit operations, withε = 2^-182in the first writeup. The note says the work came from a model whose manuscripts an American technology company posted in bulk on GitHub, and it builds directly on the Harvey and van der Hoeven algorithm. Harvey says he has not read the paper in full and used Claude Fable 5.1 to explain the argument to him.Heat · HN front page, about 306 points and 290 commentsWhat people foundHarvey calls the bound plausible but says he has not checked most of the details and knows of no Lean formalisation yet, which he says would greatly raise his confidence. The gain is purely asymptotic with a tiny exponent, yet he describes it as a large conceptual step, and notes that if correct it would disprove a network coding conjecture of Li and Li.Learn it15 min · 4 steps
Key ideas
- Bit complexity
- Counting elementary bit operations on a multitape Turing machine or Boolean circuit, so results do not depend on machine word size.
- FFT based multiplication
- Large integers are split into chunks, transformed with a discrete Fourier transform, multiplied pointwise and transformed back.
- Formal verification in Lean
- Writing a proof in the Lean proof assistant so a computer checks every step, instead of trusting human or model review.
Steps
- Read the first two pages of Harvey's note first for the claim, its origin and his caveats.
- Look up a plain introduction to the Schönhage and Strassen FFT method to see where the
n log nshape comes from. - Return to the note's sections on tensor powers and amplified savings, reading for the idea rather than every detail.
- Self check: why does a saving of
(log n)^εwithε = 2^-182matter to theorists but not to any program you will run?
Try it30 min · 5 steps
You need: Laptop with Python 3, no extra packages; No API key neededSteps
- In Python, time multiplication of two random integers built with
random.getrandbitsat bit lengths from 10 thousand to 10 million, doubling each step. - Divide each time by
n * math.log2(n)and plot or print the ratio to see how far the built in algorithm is fromn log nscaling. - Compute
math.log2(n) ** (2**-182)forn = 2**64and observe that the claimed saving factor is indistinguishable from 1 in floating point. - Pick one paragraph of Harvey's note, ask any chat model to explain it, then check the explanation against the note's own wording and list where they disagree.
- Write down what evidence would convince you the result is correct: a Lean proof, independent expert review, or both.
Small angles to try
- Repeat the timing with an arbitrary precision library you already have installed and compare the curves.
- Ask two different models to summarize the note and compare their stated caveats.
- Search for a Lean formalisation effort over the coming weeks and note whether one appears.
Sources:Harvey's note, PDF -
GPT-6 models arrive in Google Cloud Model Garden as a private preview
OpenAI and Google Cloud announced on Oct 21 that GPT-6 Astra, GPT-6.1 Sol and GPT-6 Luna are coming to Google Cloud's Model Garden, starting as a private preview for selected enterprise customers. Purchases go through Google Cloud Marketplace, appear on one Google Cloud invoice and can draw down existing commitments. OpenAI says broader availability is planned in the coming weeks and that Microsoft remains its primary cloud partner.
Heat · HN front page, about 287 points and 119 commentsWhat people foundAccording to the Google Cloud blog, prompts, context and outputs stay inside the customer's data perimeter and are not used for training, while Zero Data Retention and Confidential Compute are listed as coming soon. Google also says local Codex CLI and Desktop workflows can point at Google Cloud for inference, but it publishes no setup steps yet, so most teams should treat this as a procurement change, not something to build on today.Learn it15 min · 4 steps
Key ideas
- Model Garden
- Google Cloud's catalog for deploying and calling first party and partner models inside your own project.
- Committed spend drawdown
- Usage counts against money a company already promised to spend on the cloud, which often decides which vendor a team can use.
- Zero Data Retention
- A mode where the provider keeps no copy of prompts or outputs after serving the request.
Steps
- Read the Google Cloud blog post first for model names, preview status and the security list.
- Read OpenAI's announcement for timing and the Microsoft partnership note.
- List which controls your team needs before using a model through a cloud: VPC Service Controls, audit logs, retention terms.
- Self check: what changes for a team on GCP compared with calling OpenAI directly, and what stays the same?
Try it30 min · 5 steps
You need: OpenAI API key for the direct API, optionally your own Google Cloud project; Model Garden access itself is private previewSteps
- Pick 10 prompts from your own real workload and save them with the answers you would accept.
- Run them through the OpenAI Responses API on
gpt-6-lunaandgpt-6.1-sol, logging latency, tokens and cost per prompt. - Save this as a small reusable eval script so the same prompts can be rerun on Model Garden once access opens.
- In your own Google Cloud project, browse Model Garden and Marketplace to see whether the OpenAI listing is visible to your account.
- Check with whoever owns your cloud contract whether a Google Cloud commitment exists that this usage could draw down, and submit the interest form if it is worth it.
Small angles to try
- Add
gpt-6-astrato the eval for your hardest prompts and compare cost per correct answer. - Write down which Google Cloud controls you would require before switching, such as VPC Service Controls and audit logging.
- Run the same prompts on a model you can already reach in Model Garden to get a baseline.
-
Base Labs ships mammoth-1 and elephant-1, models that return odds, not text
Base Labs, the research lab at Baseten, released two decision models: mammoth-1 at 27B parameters and elephant-1 at 9B, post trained from Qwen3.5. Instead of generating text, they read a state such as a support ticket plus typed questions and return a probability for each option, for choice, score or yes and no questions. Weights are on Hugging Face, and both models are free to try on Baseten Model APIs for one week with zero data retention on by default.
Heat · Low so far: HN 11 points on the Baseten blog post; the Hugging Face API showed 8 likes for mammoth-1 and 3 for elephant-1, with 21 downloads each, on 2026-10-23.What people foundBase Labs reports mammoth-1 at #1 of 208 models on the Jev Decision Index 0.4 with 71.24, and elephant-1 tied for #8 as the top 9B model. Training used about 6.21M examples, and an added "I don't know" option gets the full target whenever the model's top probability falls below a threshold a little under 0.5, so low confidence can route a case to a human.Learn it15 min · 5 steps
Key ideas
- Decision model
- A model that scores a fixed list of answers in one forward pass and returns their probabilities, instead of writing a reply token by token.
- Shared prefix caching
- The system prompt and state are processed once and cached, so each extra question only costs a pass over its own short suffix.
- Calibration
- A model is calibrated when an answer it gives 80% really is right about 80% of the time, which makes thresholds for escalation meaningful.
Steps
- Read the Baseten launch post first for the idea and the benchmark claims.
- Read the Base Labs technical report section on how option probabilities come from a softmax over the option letter logits.
- Read section 2.5 of the report on the "I don't know" training rule and its threshold.
- Compare this with asking a chat model to answer "billing or support" in text and parsing the reply.
- Self check: why does one shared prefix make ten questions about the same ticket cheap, and what threshold would send a ticket to a human?
Try it30 min · 6 steps
You need: A Baseten account and API key for the free week, curl or Python on a laptop; no GPU needed.Steps
- Create a Baseten API key and export it as
BASETEN_API_KEY. - Open the elephant-1 page in the Baseten Model Library and copy its curl example, which POSTs to
https://inference.baseten.co/v1/systemonewith modeldecision-models/baseten-elephant-9b-latest. - Write 20 short support messages of your own and label each as billing or support by hand.
- Send each message as the state with one choice question named route whose criteria describe billing and support.
- Record the probability of the chosen option, then compute accuracy and see whether the wrong answers had lower probabilities.
- Pick a cutoff such as 0.6 and count how many tickets would go to a human.
Small angles to try
- Swap in mammoth-1 from the Model Library and compare accuracy and latency on the same 20 messages.
- Add a score question for urgency with three ordered levels and check whether the probabilities look sensible.
- Run the same set through a chat model with a text prompt and compare cost per decision.
-
Opposable runs a 2B GUI agent model on the phone itself
Opposable published how its Android app runs GUI-Owl 1.5 2B, a 4 bit Qwen3-VL fine tune from Alibaba's Mobile-Agent team, on device with llama.cpp. The model looks at a screenshot and taps or types in other apps. At startup the app tries the NPU, then the GPU, then the CPU for the vision encoder, and hands tasks the small model can't handle to Claude, ChatGPT or Codex when one is connected.
Heat · Show HN, 17 points and 4 comments.What people foundOn a Galaxy S25 NPU the fp16 vision encoder takes 236 ms, versus 3.9 s on an M2 CPU. Cropping the status bar, navigation bar and keyboard, then dropping flat background tokens, together cut 25 to 40% of prefill tokens, and splitting tasks into checked subgoals raised held out success from 4 of 8 to 6 of 8.Learn it15 min · 5 steps
Key ideas
- GUI agent
- A model that takes a screenshot and a goal and outputs the next action, such as a tap at given coordinates or text to type.
- Image token pruning
- Removing image patches that carry no content, like empty background, so the language model has fewer tokens to prefill.
- Accelerator fallback
- Trying the fastest hardware first and falling back to slower hardware when a self test shows wrong outputs or no speed gain.
Steps
- Read the Opposable blog post from start to the NPU section, noting each latency number.
- Skim the llama.cpp multimodal doc to see how a vision encoder and a language model are loaded as two files.
- Sketch the step loop: screenshot, crop, encode, prune, prefill, decode an action, check the screen.
- Note why the w8a16 encoder was rejected even though it was faster.
- Self check: which of encoder, prefill and decode dominates step time on a CPU, and which trick targets each?
Try it30 min · 6 steps
You need: A laptop with about 8 GB free RAM, llama.cpp installed from its README quick start, and a few screenshots of your own phone; No API key needed.Steps
- Install llama.cpp following the quick start in its GitHub README.
- Take 5 screenshots of your own phone home screen and settings pages and copy them to the laptop.
- Start a small vision model with
llama-mtmd-cli -hf ggml-org/Qwen2-VL-2B-Instruct-GGUF, adding-c 8192if the context is too small. - For each screenshot, ask where to tap to open a named setting and note the answer and the time per step.
- Crop the status bar and navigation bar off each image with any image editor and repeat the same questions.
- Compare the time and the answers before and after cropping.
Small angles to try
- Try
ggml-org/Qwen2.5-VL-3B-Instruct-GGUFand compare speed against the 2B model. - Downscale screenshots to half width and see where answers start to break.
- Ask for one subgoal at a time instead of the whole task and compare accuracy.
-
AI phone agents reach small restaurants: LINE AI Reservation launches
LY Corp launched LINE AI予約, or LINE AI Reservation, for restaurants on 2026-10-22. An AI answers the store phone 24/7 in natural speech, books, changes and cancels against the Toreta reservation ledger, suggests other times when full, and sends booking details by SMS. It can also block sales calls, answer questions like opening hours and directions, and draft those FAQ answers from the store's website for staff to edit.
Heat · On the Impress Watch front page on 2026-10-22; no ranking or social numbers seen.What people foundPricing starts at ¥10,000 a month before tax, with no setup fee and the first month free, which puts a voice agent tied to a live booking system within reach of a single small shop. Staff see recordings, transcripts and AI summaries of each call, and LINE notifications for bookings, cancellations and reminders are planned, matched by phone number.Learn it15 min · 5 steps
Key ideas
- Slot filling
- The agent keeps asking until it has every field a booking needs, such as date, time, party size and name.
- Tool calling against a ledger
- The model does not decide availability itself; it calls the reservation system and phrases the result for the caller.
- Human in the loop FAQ
- The AI drafts answers from the store's site, and staff approve or edit them before callers hear them.
Steps
- Read the Impress Watch article, using a translator if needed, and list every action the agent can take.
- Map each action to an API call it would need on a booking system: check, create, change, cancel.
- Note which parts must be exact, like times and party size, and which can be free text, like the greeting.
- Think about failure cases: a caller who changes their mind, an unclear date, a full night.
- Self check: why should availability always come from the ledger and never from the model's own guess?
Try it30 min · 6 steps
You need: Python 3 on a laptop, a made up restaurant calendar in a JSON file, optionally a local LLM; No API key needed. Never call real restaurants or real phone lines.Steps
- Create a JSON file with a fake restaurant's tables and time slots for the next three days.
- Write a small Python text chat loop that asks for date, time, party size and name until all are filled.
- Add functions to check, book, change and cancel that read and write only that JSON file.
- When the slot is full, return the two nearest free times and offer them.
- Add three FAQ answers, hours, address and parking, and route questions that match them.
- Run ten test conversations of your own, including a cancel and a change, and check the JSON file after each.
Small angles to try
- Put a local LLM in front to turn free speech like "tomorrow at seven for four" into the slot fields.
- Add speech input and output on your own machine with any offline speech library to make it a voice prototype.
- Log every turn and write a one line summary per call, like the staff dashboard.
Sources:Impress Watch, Japanese -
Assistants get your personal data on the road: Gemini on Android Auto
Google began rolling out Personal Intelligence for Gemini on Android Auto on 2026-10-20, with cars that have Google built-in to follow in the coming months. Once opted in, Gemini can answer using Gmail, Calendar, Photos, Maps, YouTube and Search, for example "take me to my doctor's appointment" or directions to a car wash from a photo you took. In cars with Google built-in, personal answers work only while your phone is connected.
Heat · Google Gemini was #5 on the Japan App Store top free chart, verified by a reviewer.What people foundIt stays off until you opt in, is limited to personal accounts of users 18 and older, and is not offered in the EEA, Switzerland, the UK or Nigeria. Google's help page notes that to remove something Gemini knows you must both delete the related chats and disconnect the app; doing only one is not enough.Learn it15 min · 5 steps
Key ideas
- Connected apps
- Per app grants that let the assistant search a given service, such as Gmail or Photos, on your behalf.
- Retrieval over personal data
- The assistant looks up your own emails, events or photos at question time and answers from them, instead of from its training data.
- Opt in scope
- Nothing is connected by default; each source is added explicitly and can be removed later.
Steps
- Read the Google blog post for what works in the car and the limits.
- Read the Gemini help page on Personal Intelligence for the settings path and the required activity settings.
- List which of your own Google apps hold data you would or would not want read aloud in a car.
- Think about how a wrong calendar match could send a driver to the wrong place.
- Self check: which two actions are needed to make Gemini forget something it learned from a connected app?
Try it30 min · 6 steps
You need: Your own personal Google account and the Gemini app or gemini.google.com, in an eligible region; No API key needed. Use only your own account and do not test while driving.Steps
- Open Gemini on your phone, tap your profile picture, then Personal Intelligence, then Connected Apps.
- Write down which apps are on and whether Keep Activity is on.
- With only Calendar connected, ask about your next appointment and note what it found.
- Turn Calendar off, ask again, and confirm the answer no longer uses your data.
- Use Tools in a chat to turn Personal Intelligence off for that chat and compare an answer with it on.
- Decide which apps to keep connected and set them.
Small angles to try
- On the web, check Settings & help, then Personal Intelligence, then Connected Apps, and compare with the phone.
- Ask a question that needs a photo, then disconnect Photos and see how the answer changes.
- Review Gemini Apps Activity to see what was saved from your test chats.
-
Canva Craft: Canva's first in house image model, with an API
Canva released Craft, its first image generation model. According to TechCrunch, a first stage plans placement, scale, hierarchy and text, a second stage renders the image at up to 2K, and the model was trained on Canva's human designed templates rather than photographs. It is in the Dream Lab tab for all Canva users and in a preview Connect API, and TechCrunch says cheaper fast variants are coming soon.
Heat · HN: 12 points on the Canva developer post and 4 points on The Verge's story.What people foundIn the Connect API, pin"model": "craft_v1_2k"onPOST /v1/image-generations, then pollGET /v1/image-generations/{jobId}with backoff until status is success. Canva says to expect about 50 to 60 seconds per job, the download URL lasts 24 hours, and the call needs a user token with theasset:writescope.Learn it15 min · 5 steps
Key ideas
- Plan then render
- One stage decides where text and elements go, and a second stage draws the pixels, which helps with text heavy layouts.
- Async job API
- You create a job, get an id, and poll for the result instead of waiting on one long request.
- Idempotency key
- A unique id sent with the create call so a retry does not start a second, paid job.
Steps
- Read the Canva developer community post first for the request shape and the limits.
- Read the TechCrunch article for how the two stages and the template training work.
- Open the Canva Connect REST reference, Generations section, for the create and get job pages.
- Note the two error codes,
model_not_availableandunsafe_input, and how to handle each. - Self check: why does a model trained on templates handle a menu or poster better than one trained on photos?
Try it30 min · 5 steps
You need: A Canva account, a Connect API integration from the Canva developer portal with a user access token that hasasset:write, and curl or Python.Steps
- Try Craft in Canva's Dream Lab tab with a prompt for a text heavy poster to see the output first.
- Create an integration in the Canva developer portal and get a user access token with the
asset:writescope. - Send
POST /v1/image-generationswith a prompt,"model": "craft_v1_2k", an aspect ratio and a fresh UUID asidempotency_key. - Poll
GET /v1/image-generations/{jobId}every few seconds with growing waits until status is success, and time it. - Download the image within 24 hours and check whether all the text is spelled correctly.
Small angles to try
- Set
asset_upload.typetouploadso the image is saved to your Canva uploads instead. - Generate the same poster with Craft and with the default model and compare text accuracy.
- Send the same idempotency key twice and confirm only one job is created.