<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: CraigJPerry</title><link>https://news.ycombinator.com/user?id=CraigJPerry</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 11 Apr 2026 11:37:16 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=CraigJPerry" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by CraigJPerry in "Nowhere is safe"]]></title><description><![CDATA[
<p>>> the world stops buying US bonds and suddenly they are bankrupt and can not pay its debts<p>How does this work exactly? It doesn't. It's a misunderstanding of public debt.<p>When you say stops buying US bonds, you're talking about the secondary market for US government bonds right - because in practice, contrary to the econ textbooks and common understanding, only a small number of institutions are allowed to purchase them in the primary market, not only that but these purchasers are compelled by law to continue buying them, to continue bidding for them at a fair price, and if they don't have the reserves to buy them then these purchasers will be given the reserves to continue to buy them. The entire premise of the argument falls apart as soon as you step away from the econ model and look at the legislation governing what actually happens by law.</p>
]]></description><pubDate>Sat, 11 Apr 2026 05:27:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=47727694</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47727694</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47727694</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Hold on to Your Hardware"]]></title><description><![CDATA[
<p>yeah 3 years sounds reasonable to me, less than one asset depreciation cycle in business. Pain for you and me, but just a bump in the road for the accounts dept.</p>
]]></description><pubDate>Fri, 27 Mar 2026 11:16:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=47541292</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47541292</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47541292</guid></item><item><title><![CDATA[New comment by CraigJPerry in "$500 GPU outperforms Claude Sonnet on coding benchmarks"]]></title><description><![CDATA[
<p>Do you not end up breaking half the value of referential integrity doing it that way (e.g. you had to update all the queries but now you have a sharp edge in that all future queries need to remember to be soft delete aware. Not a blocker for sure, just a sharp edge).<p>You know your system better than me for sure, a random commenter on a website :-D your comment just shocked me out of my daze enough for my brain to say "but I always move the record to another table rather than soft delete" and i felt compelled to give unsolicited and likely wrong opinion.</p>
]]></description><pubDate>Fri, 27 Mar 2026 11:14:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=47541272</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47541272</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47541272</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Hold on to Your Hardware"]]></title><description><![CDATA[
<p>Articles entire thesis looks like it can be completely de-railed if  one activity happened: ai infrastructure firms cease to be able to secure more capital.<p>Is that likely? History says it's inevitable, but timeframe is an open question.</p>
]]></description><pubDate>Fri, 27 Mar 2026 10:49:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=47541091</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47541091</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47541091</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Running Tesla Model 3's computer on my desk using parts from crashed cars"]]></title><description><![CDATA[
<p>I don't think there's a requirement that they give access for free but they are alone i think in doing so.<p>Here in the UK (where i also have free tesla repair manual access) i have to pay a daily rate (there are annual subscriptions available) for other marques and i would say it's not cheap.<p>For example, ford charges me £20/hour or £75/day for access to manuals, wiring diagrams, online connected diagnostics (which sounds more impressive than it is, the UI will show vehicle status like fuel tank level or error codes reported by the various ECUs, without physically connecting to the vehicle, i.e. it's done over the vehicle telemetry link), and the ability to connect via a data link connector device for diagnostics and some reflashing activities. Security activities like key coding require a further (chargeable) registration).<p>The same setup is available by at least VAG, BMW and Fiat Chrysler (the latter has an annoying extra device registration step the others don't). All chargeable.</p>
]]></description><pubDate>Fri, 27 Mar 2026 10:40:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=47541024</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47541024</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47541024</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Running Tesla Model 3's computer on my desk using parts from crashed cars"]]></title><description><![CDATA[
<p>>> Tesla is the same pattern applied to consumer vehicles<p>No i'd push back on this because the entire workshop manual is available for free without even registration required. You can literally google and land in the relevant sections and it is of a far higher quality than ford, VAG or bmw as three examples i'm pretty familiar with. I haven't seen the John Deere stuff.<p>Tesla does have "special tools" for some repair procedures, a practice as old as the auto industry but they don't rely on them to the same extent as BMW for example. Anecdotally, the special tools i'm aware of are genuinely useful - for example, the tool for disconnecting seatbelt anchors saves time vs the traditional bolt - where special tools on other marques are often clearly to workaround a failure of packaging or engineering resulting in tight access for a regular tool.<p>Their online API access is a little bit annoying, or at least unfriendly to casual home user, specifically the workflow to register an OIDC client, but not insurmountable.</p>
]]></description><pubDate>Thu, 26 Mar 2026 08:29:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=47527935</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47527935</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47527935</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Ghostling"]]></title><description><![CDATA[
<p>I used ghostty for the shell in my agent-manager tool (think something like <a href="https://air.dev/" rel="nofollow">https://air.dev/</a> but in SwiftUI. One architectural detail i'm still going back and forth on is: who should own the PTY?<p>If embedded Ghostty owns it, now i have to have some kind of workaround to instrument what's happening inside the terminal - signals, stdout/stderr events, return code etc.<p>If my parent agent-manager app owns it, now i don't have the nice clean small interface to ghostty (i'm a fan of John Ousterhout style narrow but deep interfaces, pulling complexity down rather than pushing up to parent).<p>Not sure if any other ghostty embedders might have advice. It's on my todo list to task a an agent to "gh repo clone" a few ghostty using shells and report on their arch.</p>
]]></description><pubDate>Sat, 21 Mar 2026 13:20:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=47466773</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47466773</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47466773</guid></item><item><title><![CDATA[New comment by CraigJPerry in "A sufficiently detailed spec is code"]]></title><description><![CDATA[
<p>>> Misconception 1: specification documents are simpler than the corresponding code<p>I used to be on that side of the argument - clearly code is more precise so it MUST be simpler than wrangling with the uncertainty of prose. But precision isn't the only factor in play.<p>The argument here is that essential complexity lives on and you can only convert between expressions of it - that is certainly true but it's is overlooking both accidental complexity and germane complexity.<p>Specs in prose give you an opportunity to simplify by right-sizing germane complexity in a way that code can't.<p>You might say "well i could create a library or a framework and teach everyone how to use it" and so when we're implementing the code to address the essential complexity, we benefit from the germane complexity of the library. True, but now consider the infinite abstraction possible in prose. Which has more power to simplify by replacing essential complexity with germane complexity?<p>Build me a minecraft clone - there's almost zero precision here, if it weren't for the fact that word minecraft is incredibly load bearing in this sentence, then you'd have no chance of building the right thing. One sentence. Contrast with the code you'd have to write and read to express the same.</p>
]]></description><pubDate>Thu, 19 Mar 2026 08:16:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=47436353</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47436353</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47436353</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Show HN: Axe – A 12MB binary that replaces your AI framework"]]></title><description><![CDATA[
<p>Ahh apologies<p>#!/usr/bin/env bash
# agent-lib.sh — shared plumbing for all claude -p agents<p>AGENTS_DIR="${AGENTS_DIR:-$HOME/Code/github.com/craigjperry2/tiny-agents}"
SKILLS_DIR="$AGENTS_DIR/skills"
CLAUDE_OPTS="${CLAUDE_OPTS:-}"<p># Build a system prompt by concatenating skill files
# Usage: load_skills core/unix-output.md domain/git.md output/plain-text.md
load_skills() {
    local combined=""
    for skill in "$@"; do
        local path="$SKILLS_DIR/$skill"
        if [[ -f "$path" ]]; then
            combined+=$'\n\n'"$(cat "$path")"
        else
            echo "[agent-lib] WARNING: skill not found: $skill" >&2
        fi
    done
    echo "$combined"
}<p># Core invocation: reads stdin, prepends system prompt, calls claude -p
# Usage: run_agent <system_prompt> [extra claude opts...]
run_agent() {
    local system_prompt="$1"
    shift
    local stdin_content
    stdin_content=$(cat)  # buffer stdin<p><pre><code>    if [[ -z "$stdin_content" ]]; then
        echo "[agent] ERROR: no input on stdin" >&2
        exit 1
    fi

    # Combine system prompt with stdin as user message
    printf '%s' "$stdin_content" \
        | claude -p \
            --system-prompt "$system_prompt" \
            --output-format text \
            $CLAUDE_OPTS \
            "$@"</code></pre>
}<p># Run agent then pipe through a guard
# Usage: run_agent_guarded <guard_name> <system_prompt>
run_agent_guarded() {
    local guard="$1"
    shift
    local system_prompt="$1"
    shift<p><pre><code>    local output
    output=$(run_agent "$system_prompt" "$@")
    local agent_exit=$?

    if [[ $agent_exit -ne 0 ]]; then
        echo "$output"
        exit $agent_exit
    fi

    # Pass through guard
    echo "$output" | "$AGENTS_DIR/guards/$guard"
    exit $?</code></pre>
}<p># For structured output: run agent then validate with jq
run_json_agent() {
    local system_prompt="$1"
    shift
    run_agent "$system_prompt" --output-format text "$@" | guard-json-valid
}</p>
]]></description><pubDate>Tue, 17 Mar 2026 07:40:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=47409695</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47409695</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47409695</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Show HN: Axe – A 12MB binary that replaces your AI framework"]]></title><description><![CDATA[
<p>My skills/domain/git.md looks like this:<p><pre><code>    Context: You are working with Git repositories.
    - Commit messages follow Conventional Commits: type(scope): description
    - Types: feat, fix, docs, refactor, test, chore, ci, perf
    - Subject line max 72 chars, imperative mood, no trailing period
    - Reference issue numbers when relevant
</code></pre>
So it produces messages like:<p><pre><code>    $ git diff HEAD~1 | bin/ai-commit-msg
    fix(guards): pass input to claude and tighten verdict handling</code></pre></p>
]]></description><pubDate>Fri, 13 Mar 2026 11:04:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=47362807</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47362807</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47362807</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Show HN: Axe – A 12MB binary that replaces your AI framework"]]></title><description><![CDATA[
<p>Something like this: <a href="https://github.com/craigjperry2/tiny-agents/blob/main/lib/agent-lib.sh" rel="nofollow">https://github.com/craigjperry2/tiny-agents/blob/main/lib/ag...</a></p>
]]></description><pubDate>Fri, 13 Mar 2026 11:01:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=47362786</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47362786</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47362786</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Show HN: Axe – A 12MB binary that replaces your AI framework"]]></title><description><![CDATA[
<p>I've had good success with something along these lines but perhaps a bit more raw:<p><pre><code>    - claude takes a -p option
    - i have a bunch of tiny scripts, each script is an agent but it only does one tiny task
    - scripts can be composed in a unix pipeline
</code></pre>
For example:<p><pre><code>    $ git diff --staged | ai-commit-msg | git commit -F -
</code></pre>
Where ai-commit-msg is a tiny agent:<p><pre><code>    #!/usr/bin/env bash
    # ai-commit-msg: stdin=git diff, stdout=conventional commit message
    # Usage: git diff --staged | ai-commit-msg
    set -euo pipefail
    source "${AGENTS_DIR:-$HOME/.agents}/lib/agent-lib.sh"
    
    SYSTEM=$(load_skills \
        core/unix-output.md \
        core/be-concise.md \
        domain/git.md \
        output/plain-text.md)
    
    SYSTEM+=$'\n\nTask: Given a git diff on stdin, output a single conventional commit message. One line only.'
    
    run_agent "$SYSTEM"
</code></pre>
And you can see to keep the agents themselves tiny, they rely on a little lib to load the various skills and optionally apply some guard / post-exec validator. Those validators are usually simple grep or whatever to make sure there were no writes outside a given dir but sometimes they can be to enforce output correctness (always jq in my examples so far...). In theory the guard could be another claude -p call if i needed a semantic instruction.</p>
]]></description><pubDate>Thu, 12 Mar 2026 23:05:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=47358479</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47358479</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47358479</guid></item><item><title><![CDATA[New comment by CraigJPerry in "FreeCAD"]]></title><description><![CDATA[
<p>I'm pretty happy with build123d these days <a href="https://github.com/gumyr/build123d" rel="nofollow">https://github.com/gumyr/build123d</a></p>
]]></description><pubDate>Fri, 20 Feb 2026 06:51:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=47084597</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=47084597</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47084597</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Claude Opus 4.6"]]></title><description><![CDATA[
<p>There's an extended thinking mode for GPT 5.2 i forget the name of it right at this minute. It's super slow - a 3 minute opus 4.5 prompt is circa 12 minutes to complete in 5.2 on that super extended thinking mode but it is not a close race in terms of results - GPT 5.2 wins by a handy margin in that mode. It's just too slow to be useable interactively though.</p>
]]></description><pubDate>Thu, 05 Feb 2026 20:57:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=46905187</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=46905187</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46905187</guid></item><item><title><![CDATA[New comment by CraigJPerry in "I miss thinking hard"]]></title><description><![CDATA[
<p>>> Coding is like<p>That description is NOT coding, coding is a subset of that.<p>Coding comes once you know what you need to build, coding is the process of you expressing that in a programming language and as you do so you apply all your knowledge, experience and crucially your taste, to arrive at an implementation which does what's required (functionally and non-functionally) AND is open to the possibility of change in future.<p>Someone else here wrote a great comment about this the other day and it was along the lines of if you take that week of work described in the GP's comment, and on the friday afternoon you delete all the code checked in. Coding is the part to recreate the check in,  which would take a lot less than a week!<p>All the other time was spent turning you into the developer who could understand why to write that code in the first place.<p>These tools do not allow you to skip the process of creation. They allow you to skip aspects of coding - if you choose to, they can also elide your tastes but that's not a requirement of using them, they do respond well to examples of code and other directions to guide them in your tastes. The functional and non-functional parts they're pretty good at without much steering now but i always steer for my tastes because, e.g. opus 4.5 defaults to a more verbose style than i care for.</p>
]]></description><pubDate>Wed, 04 Feb 2026 10:47:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=46884197</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=46884197</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46884197</guid></item><item><title><![CDATA[New comment by CraigJPerry in "htmx: Server Sent Event (SSE) Extension"]]></title><description><![CDATA[
<p>This levels concept resonates with me: <a href="https://www.lorenstew.art/blog/progressive-complexity-manifesto" rel="nofollow">https://www.lorenstew.art/blog/progressive-complexity-manife...</a><p>There are cases where you need more than htmx / datastar, but i like the explicit calling out of when these boundaries occur (e.g. you've exceeded what "islands" can give you), and i like the gravitational pull to lower levels.</p>
]]></description><pubDate>Sat, 31 Jan 2026 12:15:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=46835955</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=46835955</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46835955</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Automatic Programming"]]></title><description><![CDATA[
<p>>> are you ready to be first in line to accept accountability<p>I'm accountable for the code i push to production. I have all the power and agency in this scenario, so i am the right person to be accountable for what's in my PR / CL.</p>
]]></description><pubDate>Sat, 31 Jan 2026 11:03:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=46835498</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=46835498</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46835498</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Surely the crash of the US economy has to be soon"]]></title><description><![CDATA[
<p>I, a foreign entity, have sold something to an american and now have 10 dollars and zero treasuries.<p>I purchase a treasury. I have zero product, zero dollars and one treasury.<p>At some point in future i have zero product, maybe 12 dollars and zero treasuries. Presumably i now either repeat the cycle or use my winnings to spend on us output.<p>GP’s version checks out, your assertion about dollars staying abroad doesnt track? What am i misunderstanding - How did these dollars get abroad, how did they repatriate to buy treasuries, how did a treasury become a reserve, how did the dollars still exist abroad after being exchanged for treasuries?</p>
]]></description><pubDate>Sat, 31 Jan 2026 09:02:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=46834802</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=46834802</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46834802</guid></item><item><title><![CDATA[New comment by CraigJPerry in "Adoption of EVs tied to real-world reductions in air pollution: study"]]></title><description><![CDATA[
<p>>> EV have far more tire wear because they are heavier<p>Is this true?<p>If an EV were 30% heavier than an ICE, would it produce 30% more tyre wear emissions? Or would it produce more or less than 30%? Is the primary factor in tyre wear weight and is the relationship linear?<p>The types of tyres appear to be quite different, the EVs seem to have smaller contact patches (narrower wheels) and they're made of different "less grippy" compounds that drag less. Does this change the equation at all?</p>
]]></description><pubDate>Sun, 25 Jan 2026 18:55:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=46756955</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=46756955</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46756955</guid></item><item><title><![CDATA[New comment by CraigJPerry in "In Europe, wind and solar overtake fossil fuels"]]></title><description><![CDATA[
<p>in cold weather an ice is not close to 30%, that's an achievable warm weather figure when everything's working efficiently. Many ice journeys are so short in cold weather that efficiency never peaks above 10%</p>
]]></description><pubDate>Fri, 23 Jan 2026 07:30:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=46729560</link><dc:creator>CraigJPerry</dc:creator><comments>https://news.ycombinator.com/item?id=46729560</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46729560</guid></item></channel></rss>