Posts

new standard for agents configuration and skills

Use multiple AI agents? Cursor, Claude code, Codex and more? Writing skills files too I'll bet. Probably rules files as well. Guess what. Now your skills are in multiple different folders such as .claude/skills or .cursor/skills etc. Same for commands, rules etc. There's a new emerging standard for consolidating and sharing configuration and capabilities. It's a new folder .agents which would include skils subfolder and more. Yeah great. But sadly currently Claude Code doesn't load skills from .agents. It only reads from .claude folder. So in Claude /mynew-skill won't resolve as a slash command, from .agents and the Skill tool can't invoke it. Claude said if you want mynew-skill usable as /mynew-skill, the options are: 1. Symlink it: ln -s ../../.agents/skills/mynew-skill .claude/skills/mynew-skill — one source of truth, both tools see it. 2. Move it to .claude/skills/ and symlink the other direction for Codex. 3. Leave it and just tell me "follow .agents/s...

Guillermo says "read the code" and he's right

I love this post from Guillermo about reading the code . Thank you for saying this. I feel more tech leaders think this but may be afraid for one reason or another to say it out loud.  Contents: "If you’re not reading the code, whether explicitly or through agentic inquiry, one or more of these is true: ○ You’re a beginner ○ Software is throwaway ○ You’re prototyping ○ You have no users / revenue ○ You’re taking on debt & risk ○ Your problems are basic And btw. All of this is fine. But the reality is that models are still not at the “full autonomy” stage yet. They make rookie mistakes, they go down bad architectural paths. I just had the best model in the world add a nonsensical 700ms delay to “settle” something and it told me “you’re right, I was cargo-culting” 🤨 I am on the camp that this need will diminish more and more. Most code is indeed going to be assembly-like. But we also have the global internet and software infrastructure riding on these models and narrative...

Opus 5 is a regression

I've been using Opus 5 in Cladue code for about a month since I returned from summer holidays. Before that was using an older Opus model. Opus 5 kinda sucks and I'm "not gonna take it anymore", problems: its slow  it goes down rabbit holes a lot more often and adds code which is not required code quality is not good enough it uses up the context window quickly past safe point ~60% it feels like its optimized to generate as much tokens as possible (good for Anthropic, not good for me) for some reason it adds significant useless code comments, when I asked does it know code comments best practices? Opus 5 confirmed it did but also admitted it did not follow.  I talked with other engs and they all agree, same experiences. Most went back to 4.8 or switched to using Codex and Sol. Google "Opus is bad" yourself and you'll see others having similar issues e.g. reddit post I have made improvements to CLAUDE.md to instruct AI to: follow code comment best practice...

using AGENTS.md as single source including for Claude

I use multiple vendors when generating software: Claude Code, Cursor, OpenAI Codex. I want to define Agent rules in one place for all.  But Claude looks for CLAUDE.md, not AGENTS.md. OpenAI and Cursor read AGENTS.md (not CLAUDE.md).  Additionally, Cursor uses its own cursor rules files where we have defined specific rules. AGENTS.md is for certain information only. Cursor rules and Skills have their own purposes. My solution is use AGENTS.md as the single source of truth, not CLAUDE.md. I put a reference to the agents file in CLAUDE.md like so: "@AGENTS.md" In CLAUDE.md. @AGENTS.md is also expanded before Claude code sees anything. From the memory docs: "Imported files are expanded and loaded into context at launch alongside the CLAUDE.md that references them". No tool call, no pointer, no decision on Claude's part. An easy way to see this is after first starting Claude run "/context" and scroll down to Memory files section. It shows CLAUDE.md loaded a...

using Promise.all and Promise.allSettled like a boss (in a semantically correct way)

Sometimes we see this pattern with Promise.all const [api1, api2, api3, api4] = await Promise.all([   getForApiOne(id),   getForApiTwo(id),   getForApiThree(id).catch(() => undefined),   getForApiFour(id).catch(() => undefined), ]); This code works. But its circumventing the meaning of Promise.all().  Promise.all() stops if any promise fails (because Promise.all() assumes there is a strict dependency between promises). But this code catches 2 failed exception and returns undefined, effectively "working around" Promise.all(). Noting: it does retain the "fail fast" behavior of Promise.all() What would be more explicit is to use a mix of Promise.all() for critical and Promise.allSettled() for non critical calls because it's more explicit for what you're trying to achieve.  Use Promise.allSettled() when you want to allow all promises to run to completion, even if some fail, which is what is the intent in original code. note: Promise.allSettled() does ret...

don't become an intellectual tourist

Image
I learned a lot from this Ted talk  "How to stop AI from killing your critical thinking"  With so much AI available at our fingertips it's become clear to me that critical thinking skills are more important than ever. We cannot make the mistake of developing the habit of just accepting what AI tells us and delegating our critical thinking to AI.  So this talk resonated with me. The speaker is polished and in command. He hits us with some home truths: "where the knowledge worker no longer engages with the materials of their craft" "we've become intellectual tourists" we visit, but don't inhabit ideas "we've become middle managers for our own thoughts" Working with AI requires significant metacognitive reasoning (thinking about your own thinking process), about your task goals, decomposing work, applicability of gen-ai nd your ability to evaluate output. Working directly with the material makes you better at these skills and becomes...

chrome overrides is great for testing flows

Image
Chrome overrides is very useful for editing header responses from api calls. When working you can select a request in Network tab. Right click on it and choose "Override headers". Then edit headers (or content) in the right side. Reload the page and it should work. If you have not setup the local folder then when you choose "Override headers" for a request nothing happens. So confirm you have setup a local override folder: in Sources -> Overrides In setup y ou should have chosen a local folder to save overrides in.