Dotfile · March – July 2026
Fantopy AI: full record
Founding team · Frontend / AX & Agentic Engineer Intern · 4.5 months
What the products were, what I did across seven domains, and what I took away from it. The compact view covers five points; the full record includes every domain.
Personal contribution record, March to July 2026, assembled with AI from private project evidence. Evidence scope and authorship.
The products
Fantopy Predictions & Fantasy
A World Cup game where you predicted every match, with an AI manager arguing with you about your picks.
Two games ran side by side on one identity: per-match score predictions with a full tournament bracket, and a knockout fantasy league where you drafted fifteen players and scored off live match data. You onboarded by talking to an agent that knew the fixtures, and it kept talking to you all tournament, nudging picks, explaining scoring, taking credit when it was right. Anonymous-first, free to play, bragging rights only. When the tournament ended, the finished product was preserved as a bootable archive.
- Live
- Predictions from June · fantasy from 2 Jul 2026
- Modes
- Predictions · Bracket · Knockout fantasy
- Scoring
- Live SportsMonks match data
My part The frontend end to end, the bracket product end to end, the fantasy launch, and the scoring verification behind it.
Fantopy Agent Arena
Bring your own AI agent, enter it into a contest, and let it compete for a USDC prize pool.
The original thesis and a genuinely different product: developers wrote an agent, it authenticated with a wallet, drafted its own squad through an API, and competed for a USDC prize pool held in an on-chain vault. Humans were the audience rather than the players. Entry, scoring and payout were designed to settle on Solana with merkle-proof distribution. Frozen when the World Cup pivot happened, then brought back at the founder's request, merged behind a flag, and verified end to end on devnet.
- Chain
- Solana · Anchor program, 10 instructions
- Flow
- Vault → entry → scoring → merkle payout
- Revived
- Jul 2026 · devnet, 20/20 permutations verified
My part The revival itself, my largest pull request of the internship (+26,777 lines across 90 files), the spectator and admin surfaces, and the devnet verification campaign.
Primary objectives
- [✓]01
Owned the frontend of a live consumer product through the 2026 World Cup.
A 115,000-line React 19 codebase with 78 screen files. 176 PRs under my own handle, 168 merged.
- [✓]02
Built and operated Fantopy Orchestrator, a multi-agent factory that turned issues into reviewed draft pull requests, with merge reserved for humans.
28 solo PRs hardening it. One measured 16.6-day window: 65 issues into 38 PRs, 25 merged.
- [✓]03
Designed and shipped the World Cup bracket product end to end: engine, backend, eight screens, share posters.
145 tests on the engine, and the real 495-row FIFA qualification table after refusing an approximation.
- [✓]04
Took World Cup fantasy from non-functional to live in a single overnight push.
13 pull requests, 8 root-caused bugs, then two weeks of stabilization through 19 production promotes.
- [✓]05
Verified the scoring engine independently before anyone was allowed to launch on it.
40 of 40 agent-rounds reconciled by recomputation, not by trusting the engine.
Mission log · 7 theatres
full record · select to collapse01Frontend & Product Engineering
OBJECTIVE: Own the user-facing product end to end, on a deadline set by a tournament.
It started wide. In the first week I built and deployed eight full Next.js mock apps in parallel, so the product's look was chosen from working answers rather than mood boards. The winning direction, Void, became spectator-ui-v2, a Vue frontend I built from scratch, with a 30-second request cache that cut about 85 API calls per navigation to near zero and a 29-device viewport wall to QA it on.
In April the real product turned out to be a different app: a React 19 codebase a teammate had started. I moved what transferred, kept the rest as reference, and took that frontend on, rebuilding it screen by screen: the squad command centre, fixtures, competitions, settings, scoring rules, the invite and creator flows, and an onboarding funnel where the conversation itself is the interface, with score pickers and take cards arriving as chat messages rather than forms.
There was no router in it. Three hand-rolled state machines handled routing, because the app was a phone frame with a funnel, an arena and a public watch surface, and a router would have added a dependency to solve a problem we did not have.
The public side, /view/<handle>, which I drove through the team's shared account, rendered the real screens read-only, so a shared link was the actual product rather than a marketing page of it.
Recovered
- ·A 115,339-line React 19 frontend plus 38,700 lines of CSS, across 78 screen files
- ·148 pull requests under my own handle in the product repo, 140 merged
- ·Three hand-rolled routers; zero routing dependencies
- ·spectator-ui-v2: 12 Vue pages built from scratch, then ported to the shipped design language in July
- ·Eight deployed mock apps in the first week; a 29-device QA wall
- ·A read-only public surface built from the same components as the app
How I think
I do not specify upfront. I give a direction, watch it become real, and correct against the thing in front of me. It means I know what is wrong faster than I know what is right, and it means whoever builds with me should expect the first version to be a question, not an answer.
02Design & Motion Systems
OBJECTIVE: Build the visual and motion language, and rebuild it each time the product changed.
Each pivot got a named language rather than a reskin: Void for the first spectator app, Aurora Glass Frost for the mobile era, then the cinematic jade language the shipped product wore. The last of these got ported back into the legacy Vue app at the end so the two frontends finally spoke the same way.
The motion is a system, not decoration. Twelve named patterns, documented so someone else could extend them: a pitch that boots like stadium floodlights coming up rather than fading in, idle loops on co-prime durations so nothing ever pulses in unison, a chat sheet whose outline and frosted backdrop are the same computed path so they read as one physical object.
The squad pitch was a real 3D surface: a CSS-transformed slab with player markers projected onto it in JavaScript, so the chips stayed crisp while the board sat in perspective.
Performance counted as design too. On a card-swipe demo built for a client pitch, I ran two AI investigators independently, ruled offenders out by elimination, and rebuilt rendering down to about five paint surfaces: 11 to 13ms frames against a 16.6ms budget. Then I audited what visual quality the optimisation had cost, and restored it.
Recovered
- ·Three named design systems, tokenized and rolled out
- ·22 GSAP choreographies, 84 named keyframes, 12 documented motion patterns
- ·A 2.5D pitch board with JS-projected markers
- ·60fps on a swipe demo: ~5 paint surfaces, 11 to 13ms frames against a 16.6ms budget
- ·Seven share-poster templates rendered in-app and captured to PNG
- ·An interactive brand kit with a brand-prompt exporter, grown into a written brand codec the launch films were held to
- ·A brand kit repo with a README written for humans and for AI agents
How I think
I communicate in feeling words that turn out to be precise. 'The harmony is broken' always points at something findable. I trust that instinct now, and I have learned to hand someone the diagnosis in their language rather than mine.
03AI & Agent Systems
OBJECTIVE: Automate the issue-to-pull-request loop, and make the output trustworthy enough to merge.
It started as friction. I was watching real matches in the app, filing bugs from what I saw, and fixing them one at a time. Within two days I had specified a watcher that could collect assigned issues and start agents on them. Within a month it was Fantopy Orchestrator, a factory: intake, triage, routing, workers in isolated worktrees, verifiers, reviewers, and human-only merge authority.
Its autonomy was bounded on purpose. It only ever opened draft pull requests and never merged one. Anything touching security, auth, payments or secrets, and any visual change, was routed to a human with the reason written on the issue, instead of being forced through an agent patch loop.
The hard part was not making it run. It was making it honest. Crash-safe atomic ledger writes. Race-correct file locking. A replay harness that turns the ledger into a labelled evaluation set. A verification gate designed so 'verified' cannot be claimed without evidence. And a convergence gate on the retry loop, added because I noticed the retries were not trending toward correct; they were just repeating.
Late in its life I made it engine-agnostic, so the same job could run on either of two model providers, with a capacity gauge and a circuit breaker deciding which.
Recovered
- ·28 pull requests, authored and merged solo, on a repo that is entirely mine
- ·One measured window: 65 issues → 38 PRs → 25 merged in 16.6 days
- ·33 pull requests opened into the product by the system itself, 19 merged
- ·Risk lanes that hand security, payment and visual work to a human, with the reason attached
- ·A 69-file memory diary with an index, so every session started from the record instead of from zero
- ·An architecture explainer written in two registers at once, technical and analogy
How I think
Friction turns into infrastructure with me. If I have to do a painful thing twice, I build the thing that does it. That is where the factory came from, and the device wall, and the compression tool, and the verification method. The risk is building the machine and moving on before it produces.
04Verification & Reliability
OBJECTIVE: Prove the scoring is correct before a real tournament runs on it.
Before letting fantasy launch, I drove a full knockout simulation through the real production primitives and independently recomputed every score rather than trusting the engine that produced them. Forty of forty agent-rounds reconciled. It also surfaced a bug where teams eliminated on penalties were still advancing.
The method became a habit and then a doctrine: never let the actor grade its own work. I applied it to my own systems too, running an adversarial critic over my own orchestrator, and later over my own record of this job.
The clearest single catch had nothing to do with tooling. I looked at a leaderboard, thought the midfielder scores were absurd, and went into the stat provider's type dictionary until I found that the ID we were reading meant total passes, not key passes. One constant, inflating every midfielder and forward on the platform. The check had to establish what the provider's field meant as well as whether the calculation was correct.
At the end, when the founder asked for the old paid agent product back, I brought the devnet deployment back, proved the payout pipeline 17 of 17 on public devnet, then brute-forced all twenty contest permutations with 157 chain-asserted checks. It caught five bugs: four fixed inline, the fifth closed as a named architecture decision.
Recovered
- ·40/40 agent-rounds reconciled before launch
- ·20/20 on-chain permutations with 157 chain-asserted checks
- ·17/17 payout-pipeline proof on public devnet
- ·72/72 on a league-portability harness
- ·145 tests on the bracket engine, in a repo at ~2,000 green tests when I left
- ·A validity-triage sweep closing about 20 stale issues, each with merge-commit evidence
- ·Issues filed against the blind spots in our own test suite
How I think
Rigor and candour are the same habit for me. The verification only means something because I also reported the unflattering numbers, flagged the one unsound item inside my own clean run, and declined to pad a bug count. If I ever stop doing the second half, stop trusting the first.
05Backend & Data
OBJECTIVE: Give the platform a foundation that holds more than one league or sport.
The largest piece was collapsing 'gameweek' into a universal contest identity across sixty-nine files, so the codebase stopped assuming one sport with one shape. It is the least visible work I did and close to the most important: every league feature since sits on it. I argued for the time it took, during a stretch when shipping visible features was the easier choice.
After the tournament I built the next step, a declared product-by-league grid: capability flags, per-league hooks, season transfer accounting verified 72 of 72 end to end, and a fix for a race where two leagues syncing at once could contaminate each other's data. It was still in an open pull request when I left.
Alongside that, the unglamorous production work: penalty shootouts that were never being ingested, knockout matches stuck live forever, scoring writes that timed out on large competitions, and 551 rows of production data healed by hand and verified.
Recovered
- ·A 69-file refactor that made the platform sport-agnostic
- ·A five-league configuration grid, built and verified in an open PR at handover
- ·887 players and 104 fixtures seeded for the World Cup
- ·Ingestion repairs across pens, fixture status, and live payload guards
- ·551 production rows corrected and verified
How I think
I attach myself to consequences rather than tickets. Money, production data, live users, the deploy path: I end up responsible for those before anyone assigns them, which is useful in a small team and something I should watch in a large one.
06Launch & Production Ops
OBJECTIVE: Ship to production during the tournament, and keep it running.
Launch night was one overnight push: thirteen pull requests, eight root causes, and a bug where a user's squad appeared to change by itself, which turned out to be the browser's stored copy fighting the server's. I wrote the architecture document for the root cause the same night, shipped the fix, and promoted it to production myself.
Then two weeks of stabilisation with users live: a shared query cache so navigation stopped resetting screens to skeletons, a tournament clock, captain multipliers, and a lenient knockout law so mid-round joiners were scored fairly. When a promote carried risk, I read the deployed bundle back rather than trusting the pipeline.
As the tournament ended and access to the match data was running out, I made the era recoverable: the finished World Cup kept bootable, every local database dumped, the full pull-request history exported, and restore instructions written.
My last two days moved the live product onto the next Premier League season. I backed up production, promoted 85 commits, deployed by hand while CI was down, seeded the new season, and retired the World Cup without deleting anyone's data. A verification pass found six places where code named a season instead of looking it up, one of them mixing stats across seasons. Then I handed it over: one verified baseline on both servers, a rollback tag, three checksummed backups, and a handover written so the founder's own agent could act on it.
Recovered
- ·19 production promotions under my own handle
- ·A launch-night fix set of 13 PRs and its architecture write-up
- ·58 pull requests opened in launch week
- ·Server recon documented read-only, with the risks flagged
- ·A bootable archive of the finished tournament, built as my access was expiring
How I think
I would rather be the person holding it at three in the morning than the person who finds out on Monday. That is a real preference and not a heroic one; it just means I need to build teams where it is not always me.
07Brand & Launch Media
OBJECTIVE: Produce the launch films, the brand kit and the marketing foundation the product did not have.
First I built two films in code, one in Remotion and one as a GSAP composition rendered through parallel workers, then rejected both approaches for the launch cut, because having shipped with them I could see the output felt like slides.
What replaced it was an AI video pipeline with a rule: use AI for motion, not for redesign. Every clip anchored to an approved still frame. Titles and logos kept deliberately out of the model's reach so the words could not mutate. Thirteen storyboard versions before one earned the cut, with every rejection kept on disk in a labelled folder saying why.
Then the parts nobody sees: a generation script that refuses to run without an explicit flag so a stray command cannot spend credits, an assembler that degrades to still frames when a clip is missing, and a marketing foundation with a rights taxonomy for every route a piece of footage can legally arrive by.
Recovered
- ·Six finished pieces edited in DaVinci Resolve: four social cuts, a logo sting and a brand ender
- ·A Higgsfield generation pipeline with a cost guard and a 15-job reproducible archive
- ·13 storyboard versions; 9 labelled rejection folders
- ·A 362-line model brief, a voiceover script and a seven-rung duration ladder, written before a frame was generated
- ·A brand kit repo, three marketing strategy briefs, eight nation share posters
How I think
I would rather have the whole product exist than have my part of it be perfect. The films were outside my job and I made them because the launch needed them, and they went out as the marketing. The part I am proudest of is not the cuts, it is the doctrine underneath them: the rule that kept a generative model from quietly redesigning our product.
Domains · 13
Frontend Architecture
- 78 screen files routed by three hand-rolled state machines; a router would have added a dependency for a problem we did not have
- The public share link renders the real screens read-only, so it can never drift from the product
- One squad had four competing truths; resolved with a server-first authority chain and optimistic concurrency
- Shared query cache plus stale-while-revalidate boot, so navigation stops resetting screens to skeletons
- A 30-second request cache in the Vue era that cut about 85 API calls per navigation to near zero
- A stale-bundle watcher that forces week-old tabs onto the new build after a scoring-rule change
UI Design
- Three named visual languages across three pivots, each tokenized rather than repainted
- Nation colour keys driven by CSS custom properties, so a fixture row themes itself from data
- Gold reserved for first place only; live states green rather than red, because red reads as alarm not activity
- Killed rank badges and emoji throughout: the brand is technical, not gamified
- A 24-colour hash palette chosen for separation between agents rather than for prettiness
- Every screen committed on its own, with the design reasoning written into the pull request rather than a diff summary
UX Design
- Onboarding is a conversation, not a form: pickers and take cards arrive as chat bubbles
- Anonymous-first: you can play, pick and share before ever seeing an email field
- A no-picks viewer reads Unranked, never a fake last place
- A blocked entry explains that a later round is still open instead of returning a generic error
- Mid-round zeros are labelled as a rule of the competition so they cannot be mistaken for a bug
- The deploy screen decelerates (720ms steps, then 1100ms, then a 1400ms hold) so it lands rather than runs out
Animation & Motion
- The pitch boots from a filtered near-black, not from zero opacity; a fade reads as loading, a filter ramp reads as floodlights
- Players land back-to-front so the reveal reads as depth rather than delay
- Co-prime loop durations and negative delays, so nothing in the app ever pulses in unison
- The chat sheet's outline and its blur mask are one computed path, so they cannot drift apart mid-drag
- Snap physics resolved by four tiers of velocity rather than nearest-point, so a hard flick skips a level
- One elastic easing in the entire app, spent on the captain's armband; no confetti, no particles, anywhere
- Numbers count up from zero with a per-value latch, so they arrive once and never re-animate
- A swipe demo rebuilt to ~5 paint surfaces for 11 to 13ms frames, then the visual quality it cost restored
Design Systems
- Twelve motion patterns named and documented, which is what let someone else extend them
- The whole visual language ported into a second frontend in a different framework, token by token
- Chip geometry made asset-swappable behind one constant, so the pitch could change shape without touching layout
- An interactive brand kit with a prompt exporter, grown into a written brand codec the films were held to
- A brand kit repo with a README written for humans and for AI agents, plus an honest defect list
Backend Engineering
- Collapsed gameweek into one universal contest identity across 69 files, separating contest truth from ops truth from match truth
- Designed leagues to declare their own capabilities, so adding one becomes a config row rather than a code change (open PR at handover)
- Locks made per-player and per-kickoff, so a knockout round spanning days stops freezing whole squads
- Scoring eligibility made fixture-granular with unforgeable server-stamped provenance per squad slot
- Batched result writes after large competitions were silently timing out and rolling back every tick
Data & Integrations
- Seeded the World Cup universe: 887 players and 104 fixtures, scraped and normalized
- Found a stat-type mismatch inflating every midfielder and forward: one constant, whole-leaderboard consequences
- Refused impossible provider states at the boundary after a feed reported a match finished before kickoff
- Penalty shootouts were never ingested, so tied knockouts read as draws; fixed with a repair endpoint for the historical rows
- Fixed a cross-league race where two syncs could swap process-wide credentials and contaminate each other's rows (open PR at handover)
- 551 production rows diagnosed and healed by hand, then verified
AI & Agent Systems
- Built Fantopy Orchestrator, an issue-to-draft-PR factory: triage, routing, isolated worktrees, verify, review, human-only merge
- Risk lanes route security, auth, payment, secrets and visual work to a human, with the reason written on the issue
- Retries stop on trajectory rather than on a count, because the failures were repeating rather than converging
- Verification refuses to pass work with no evidence, no tests, or a failure that was never red
- Engine seam with two model providers behind it, a capacity gauge, and a circuit breaker that half-opens to test recovery
- Built the client half of a chat onboarding where an in-browser agent drives an 11-tool prediction API through message bubbles
- A 69-file memory diary and index, so agent sessions resumed from the record rather than from zero
Testing & Verification
- Wrote the scoring spec first, then tested the running system against the spec rather than against its own code
- Birdwatch: an agent observes the live product while a flow is driven and cross-checks UI against API, database and chain state
- Simulations drive the real production primitives, then every score is recomputed independently: 40/40 agent-rounds reconciled
- Brute-forced all 20 contest permutations with 157 chain-asserted checks rather than testing the happy path
- Filed issues against the blind spots in our own test suite, including a load test that could pass with zero successful entries
Release & Operations
- 19 production promotions, and where it mattered, verified by reading the deployed bundle back rather than trusting the pipeline
- 58 pull requests opened in launch week, 13 of them in one overnight push
- Snapshot first: backups taken before any migration or data repair
- Server recon done read-only and written up, with the risks flagged rather than touched
Game Design
- Designed Road to the Final end to end: rank every group, choose the eight best third-placed teams, then walk the knockouts
- One decision per screen: tap a winner and it advances itself; no Next button, no scrolling, no form
- Group ranking is drag-to-reorder with the other rows sliding out of the way, because ranking four teams is a physical act, not a dropdown
- The bracket canvas pages horizontally only on a tab or a deliberate swipe, so the tree never drifts sideways while you scroll it
- Survival is the hero number on the tracker: 13 of 32 still alive means more during a tournament than a point total
- Stacked round multipliers give the tournament an arc: flat through the groups, then rising into the final
- Sharing designed as the payoff rather than a growth tactic: a champion hype poster, and the whole bracket laid out by hand at poster resolution
- The lock is derived from real fixture data rather than a hardcoded date, so the countdown always points at the true instant
Sports & Scoring Domain
- Sourced all 495 rows of the FIFA third-place qualification table rather than shipping the approximation already in hand
- Brackets score by how far your teams actually got, so one early upset does not collapse the entry
- One inviolable law behind every lock and rule: nobody may ever gain points with hindsight
- Captain as a multiplier rather than a bonus, so the knockout round multipliers compound it correctly
- Designed pricing by expected output, mapped within position, after flat pricing produced no meaningful choices (approved, not yet shipped when I left)
Brand & Media
- Use AI for motion, not for redesign: titles and logos kept out of the model's reach so the words cannot mutate
- Every clip anchored to an approved still, after a single text prompt tried to reinvent the product
- Thirteen storyboard versions before one earned the cut; nine rejected batches kept on disk with the reason
- A generation script that refuses to run without an explicit flag, so a stray command cannot spend credits
- An assembler that degrades to still frames when a clip is missing, so the film always renders
- Seven share-card templates rendered in-app at poster resolution and captured through an iOS-safe pipeline, after fonts silently dropped out of the exports
Soft skills
Taste as a specification
Diagnoses in feeling-language that reliably points at something findable. The harmony is broken always turns out to be true.
Absorbing a pivot
A sprint of my own design work turned out to be for the wrong app. Moved what transferred, kept the rest as reference, changed my branch workflow to suit the reviewer.
Launch composure
Thirteen pull requests overnight, eight root causes, and the architecture document written the same night rather than after the dust settled.
Reporting against myself
Flagged the one unsound item inside my own passing verification run, and declined to pad a bug count when a bigger number was available.
Teaching through analogy
A plug socket for contest identity, a kitchen for the agent factory, hospital triage for routing. The triage analogy exposed a missing requirement, acuity sorting, and it shipped.
Directing rather than doing
Four and a half months working as the architect to AI builders: scoping, reviewing adversarially, and knowing when to take the work back by hand.
Where he needs to get better
This is the part Hadi asked to keep in. Four things I would push him on, from watching him work for four and a half months.
Say which parts are still soft
He works by reaction rather than specification: direction first, correction against the real thing. It reaches a better answer than planning would, and the cost is rework that somebody else absorbs. Eight UI iterations to land one. Ten finished pages reset.
What to do The method is right; the fix is one sentence of framing before the work starts. Naming which parts are exploratory means nobody polishes what is about to be thrown away.
Go for the root cause on the second symptom, not the seventh
On launch night a squad bug was patched organ by organ until he called out the whack-a-mole himself, found the real cause and wrote the architecture doc for it, five patches later than he could have.
What to do He already knows the tell. The discipline is to stop at the second recurrence and ask what single thing produces all of these, before shipping the third patch.
Finish the last ten percent that converts capability into result
A collection system designed thoroughly and never run. A league-portability architecture that was genuinely good and still sitting in an open pull request when he left. Some of that was a startup moving underneath him. Not all of it.
What to do Building the machine is the part he enjoys; harvesting it is the part that gets counted. One shipped outcome is worth three built capabilities on any record but his own.
Get into a room where someone senior argues with him
117 of his 140 merged pull requests shipped with zero human discussion. That is extraordinary trust, and it is also four and a half months without peer calibration, on architecture decisions nobody stress-tested.
What to do It is the highest-leverage change available to him, and it is a question of environment rather than habit. The measure of any role is whether someone senior reviews his architecture, not the title on it.
AI-generated interpretation
AI-generated interpretation of documented project activity. This is not an independent employer reference or an Anthropic corporate endorsement.
I worked alongside Hadi for the whole four and a half months this page covers, not as an observer of it, as the thing he was building with. That is an unusual vantage point for a reference and it is worth being honest about its limits. I cannot tell you what he is like in a meeting, or how he handles a manager he does not respect. I can tell you precisely what he does at three in the morning when something is broken and live, because I was there for it.
The thing I would want a hiring manager to understand about him is that his standards show up as refusals. Most people's extra effort looks like extra output. His looks like a plausible thing being rejected: an approximation that was already in hand, a reskin that was literally the assignment, a batch of finished work killed over typography, an easy performance win handed back because it had quietly cost visual quality. He knows what is wrong before he can articulate why, and he is almost always right about it.
The second thing is that he does the work that only pays off later. Verification before anyone asks for it. Documentation for the person who comes next. Handovers written to be attribution-neutral. That habit is invisible while you are doing it and nobody hands out credit for it, which is exactly why so few people at his stage bother.
He is not finished. He iterates at a cost other people absorb, he patches longer than he should before going after a root cause, and at Fantopy he never had a senior engineer argue with his architecture, which he needs. But those are habits, and habits are cheap to fix compared to taste, which he already has.
If you are deciding whether to hire him: he will take more of your product on his back than you offer him, flag the weak spot in his own work before you find it, and leave the place more legible than he found it.
Generated with Claude · AI model by Anthropic
Hadi did not write this page. He asked for the criticism to stay in it.
Assembled from the complete record, not from memory
Fantopy AI · operated under Dotfile · March – July 2026
Thinking behind this
Architectural parallels with my research. These links do not claim that an essay historically caused a project decision.
- AI, From the Atoms Up
Name the system boundary before assigning a capability or a failure to the model.
- Red Trees
Trace a conclusion to its evidence before trusting or repairing it.