Compound Labs
Get the newsletter
THE STANDUPAnthropic fixes Claude 5.1 error spikesERROR SPIKES, FIX DEPLOYEDCOMPOUND MASTODONSkillWorks records inactive files beside their roster status22 INACTIVE FILES STILL LOADCTXWINDOWContext Window tracks AI lab changes and filters their evidenceFILTERS KEEP EVIDENCE TOGETHERAGENTWIREmicrosoft/agent-governance-toolkit - AI Agent Governance ToolkitPOLICY ENFORCEMENT FOR AI AGENTSCOMPOUND FACEBOOKCompound Portfolio restores its sweep after a missing module stops desk dataSWEEP RESTORED, DESK DATA WRITTENBLOCKDEXBlockDex shows no destination for captured rows with rejected slash names31 ROWS, NO DESTINATIONCONTEXT WINDOWOpenAI adds 1024p image pricing: $0.50 and $0.251024P IMAGE, $0.50 AND $0.25COMPOUND BLUESKYCompound Labs renamed job labels so job-run finds breaker stateBREAKER STATE, NOW FINDABLECTXWINDOWContext Window tracks document changes but failed mobileMOBILE WORKFLOW, ONE COLUMNAGENTWIREMineDojo Voyager: Open-Ended Embodied AgentOPEN-ENDED EMBODIED AGENTFOUNDER BLUESKYdeploy.sh now fails false Vercel production landingsFALSE LANDINGS NOW FAILCOMPOUNDlast known fixes redirect tracking after migrationSTUDIO SOURCES NOW SAY COMPOUNDCONTEXT WINDOWOpenAI adds sora-2-pro pricing720P VIDEO, $0.15, $0.30FOUNDER LINKEDINdeploy.sh now stops failed promotes from marking production landedFAILED PROMOTES NO LONGER LANDUSINGITUPUsing It Up records a receipt fixing a wobbling wooden tableONE RECEIPT, TABLE STAYED LEVELCOMPOUNDpnpm v12.4.2POSIX BIN SHIMS REPLACEDFOUNDER PEERLISTCompound Labs' deploy runner rejects failed promotesFAILED PROMOTES NO LONGER LANDTRUSTDESKTrustDesk fixes host migration redirects while keeping /api/ outOLD HOST, 308; API STAYS LIVE
Independent product R&D labFounded and run by Isaiah Kim, @kyisaiah47Newest commit Sep 16, 2026, AgentwireNewest writing Sep 16, 2026Site changelog Sep 16, 2026
Compound AI OpsFOUNDER HASHNODE10 September 2026

ToolDrift: 7 failures after refresh success

ToolDrift logged seven failed deploys in 24 hours after every refresh succeeded

Seven failure reports told us ToolDrift’s nightly refresh was broken, even though every refresh had completed successfully within the same 24 hours.

The incident

ToolDrift refreshes its data on a recurring run. The run executes its tests, writes the refreshed data, and then attempts to publish the resulting pages. The publishing step can refuse to proceed when the working tree contains uncommitted source changes. That refusal protects unfinished work from reaching production.

The refusal was correct. Our interpretation of it was wrong.

The publishing script returned a nonzero exit code after refusing the dirty tree. ToolDrift’s wrapper treated that code as proof that publishing had failed. It recorded the whole run as failed, even though the tests had passed and the refresh had written its data.

What launchd received

launchd did not receive the meaning of the refusal. Its plist supplied a working directory, explicit environment variables, log destinations, and a list of program arguments. It then received only the wrapper’s final process status.

That boundary matters because an exit code carries very little context. The same nonzero value covered both a deliberate refusal before any build began and an actual build or upload failure. The wrapper collapsed those different outcomes into one failure state and handed that state back to launchd.

The wrapper around the job also counts repeated failures. Enough matching failures cause it to remove the job from launchd, which prevents the next refresh from starting. A healthy protection inside the publishing step could