Traps and fixes

One line per trap met in GT work, grouped by area: the symptom a reader sees, the fix in a few words and the section that explains the cause.

Updated

Each row below is a failure met in General Translation (GT) work on Prototemplate, generaltranslation.com and the films between July and October 2026. A row gives the symptom a reader sees first, then the fix in a few words, and links the section that explains the cause, the proof and the date. When something breaks, find its symptom here; before a round of work in an area, read that area's rows. Numbers indexes the values the fixes depend on in the same way.

The cause and the measurement live on the linked page, so a row changes when its section does. Paths are relative to the root of the Prototemplate repository.

Dev servers

SymptomFixExplained in
A second next dev for the same checkout refuses to startOne server per checkout; another worktree runs its own server on its own portDev servers and builds: failure modes of next dev
Every route answers 404 after a restartTwo servers shared one .next: stop both by PID, rm -rf .next, start oneDev servers and builds: failure modes of next dev
Every route answers 500 with "Unexpected non-whitespace character after JSON"Stop the server by PID, delete .next/dev, start it againDev servers and builds: failure modes of next dev
The server answers nothing after a large fast-forwardThe same restartDev servers and builds: failure modes of next dev
The disk fills while a shared server runsDelete .next/dev at the restartDev servers and builds: failure modes of next dev
A changed image still shows its old versionrm -rf .next and restartDev servers and builds: failure modes of next dev
A cold image request hangs for 900s and times out a page checkRetry once the machine's load dropsDev servers and builds: failure modes of next dev
next start serves the old build after a rebuild reported successDelete .next in the scratch tree before diagnosingDev servers and builds: failure modes of next dev
Every docs page answers 404 after a merge, with nothing in the logpnpm install --frozen-lockfile and a restartDev servers and builds: failure modes of next dev
Module not found for a workspace package whose sources changedBuild the package, which resolves from a stale dist/Dev servers and builds: failure modes of next dev
A pending navigation lasts longer than in productionJudge navigation timing on a production buildDev servers and builds: failure modes of next dev
A route answers 200 and its body is the error overlayCall a server ready only when a real page's body has no build errorDev servers and builds: failure modes of next dev
A hydration mismatch appears at random under next devJudge it on a production build before chasing itLocalized routing: links, routers and strings in gt-next
pnpm add fails on a dependency the change never touchedAdd the one dependency by hand under the minimum release ageDev servers and builds: a minimum release age for dependencies
"Can't resolve 'gt-next/link'" after a relinkRestart the dev server that ran during itDev servers and builds: a minimum release age for dependencies

Gates and tooling

SymptomFixExplained in
A failing build reached main through pnpm build 2>&1 | tail -2 && git pushCapture output to a file and chain on the real exit status with &&Agents on one machine: exit-status gates
next build passes with type errorsIt never type-checks here; run pnpm exec tsc --noEmit as its own gateGates: the type check
tsc reports errors in .next/dev/types that no change touchedRun the type check in the scratch worktree that runs the buildGates: the type check
pnpm lint:lines:shell fails on pages that are correctRun browser gates one at a time, then rerun the failing one aloneGates: browser gates run one at a time
The line audit exits 2 on its first routeLoad the route by hand; restart the server only when your session owns itGates: before trusting a red browser gate
A lint exits clean under --reportRead the findings; --report drops exits 1 and 2Gates: exit codes
A new violation passes its ratchetLower the baseline in the cleanup commit and read the JSON diffGates: ratchets
A missing page or a list of URLs audits cleanA status of 400 or more and a URL with whitespace exit 2; pass lists as arraysLines and seams: the line auditor's thresholds
Every browser gate breaks at once after a generator changeKeep the single quotes and field names the route list's regexes readScripts: first slugs read by regex
A lint at rest misses the search dialog and the scroll thumbOpen the dialog and hover the list before collectingProving a visual change: states that mount on demand
pnpm doctor runs something other than the setup checkWrite pnpm run doctor; the bare form is pnpm's own commandGet started: run the site
A skill install replaces a project's own skill with no reportThe installer refuses foreign entries; check a new slug against every skills folderSkills: slug collisions

Builds and deploys

SymptomFixExplained in
Docs HTML grows from 245KB to 731KBRevert experimental.inlineCss, which embeds the entry CSS twiceDocs site traps: inline CSS, built and reverted
The build worker is killed partway through prerenderingPin next 16.2.12Docs site traps: prerender memory on Next.js 16.3
Every deploy fails with TS6306 on a referenced packageReference only the packages the app importsDev servers and builds: filtered installs and project references
CI fails on content a submodule never checked outGuard the read itself and degrade the featureDev servers and builds: CI without the content submodule
A live count renders on localhost and is empty in productionA static minimum label and a cached same-origin route for the valueCanvas and WebGL engines: static pages with live values
A merged change does not show on the siteRead the dpl_ stamp on the production host against the newest Ready buildProving a visual change: whether it is live
Builds fail at random in the Google font loaderSelf-host the facesProving a visual change: whether it is live
A push that compiles cleanly fails its hosted buildKeep request-scoped server calls inside the server function's handlerReviewing with Kevin: ship states

SEO and agent files

SymptomFixExplained in
Every page names the home page as its canonicalWrite each route's whole head with seoRoute(); the root layout sets no canonicalThe SEO system: the lint
A route's partial openGraph drops the parent's fieldsseoRoute() writes every field every timeThe SEO system: what one call writes
A Markdown twin answers 200 locally and 500 in productionPrerender every twin with dynamicParams = falseDocs site traps: Markdown twins in production
A .md URL never reaches the middlewarePut the twin rules in next.config.ts rewrites or the routeThe SEO system: why the twins are prerendered
Agent-readability checkers find no links in a closed menuA machine-only sr-only anchor in the server-rendered bodyThe SEO system: why the twins are prerendered
A disallowed URL is still indexedPut the policy in noindex and leave robots.txt openThe SEO system: the policy

Docs adapters

SymptomFixExplained in
A click on a docs folder paints the layout with no article for about 280msLink to leaf pages; redirect folders in next.config.tsDocs site traps: links that point at leaf pages
The sidebar's rail and current-row tint pop in at hydrationShow only the row tint before data-sb-readyDocs site traps: marks that exist at first paint
The sidebar's rail runs past the remaining rows while a folder foldsRead whether a folder is open from its collapsibleDocs site traps: the sidebar after fumadocs 16.16
The pill and thumb stay on a row that is folding awayTreat an active link inside a closed collapsible as not currentDocs site traps: the sidebar after fumadocs 16.16
The sidebar list jumps when a folder reopensReplace the viewport's scroll() and write scrollTopDocs site traps: the sidebar after fumadocs 16.16
The sidebar list scrolls when a folder opens near its endoverflow-anchor: none on the viewportDocs site traps: the sidebar after fumadocs 16.16
The sticky sidebar lifts at the end of the pagemargin-bottom: -1px on its grid columnDocs site traps: the sidebar after fumadocs 16.16
Two builds of one page ship different code colourstokenizeTimeLimit: 0 wherever Shiki runsDocs site traps: code highlighting across builds
An MDX component renders with its props undefined and no build errorComponents that take string attributes and child elementsDocs site traps: MDX that drops props
Every docs element computes font-feature-settings: normalType the docs root as a class in the token base rulesDocs site traps: features that compute normal
A token set in the docs sheet's @theme reaches other routesScope docs rules to docs-only ids or :root:has(#nd-notebook-layout)Docs site traps: features that compute normal
The docs title renders at 28px, off the display ladderPut the title, lead and prose on the ladder in docs.cssDocs site traps: what fumadocs leaves for the lints
Docs headings render at 600 and 700One weight cap at 500 in docs.cssUse these docs as a template: the adapters
fumadocs' dark mode ignores html[data-theme]theme={{ enabled: false }} and a dark variant on :root[data-theme='dark']Use these docs as a template: the adapters
Tailwind's theme layer resets the font tokens for the whole documentPoint --font-sans and --font-mono at the site's type tokens in @themeUse these docs as a template: the adapters
A prose override restyles the table of contentsScope it to #nd-page .proseDocs site traps: markup that hides from a lint
The search dialog and the phone drawer keep shadows and blurName the portaled dialog, its overlay and the drawer in the flat ruleInterface details: shadows and blur from a component library
A script looks for /docs/(internals)/gatesDrop every (name) segment when a path becomes a routeUse these docs as a template: adding a page
A plate appears in the Markdown twin as a bare tagA sentence beside every plate says what it showsUse these docs as a template: adding a page

CSS and Tailwind

SymptomFixExplained in
font-semibold, tracking-* and mt-6 do nothing on headingsMetrics in the section's own stylesheet, gaps on the parentDocs site traps: unlayered rules and layered utilities
One ID in a list of root classes overrides component rules site-wideJoin an :is() list as a classDocs site traps: specificity of an is() list
text-sm beats .prose on a table-of-contents rowScope prose rules under #nd-page, which breaks the tie with the utilities layerDocs site traps: the typography plugin in the utilities layer
A corner lint reports 33,554,400pxrounded-full is calc(infinity * 1px); a square box takes 50%Docs site traps: the full round corner
A token read only by inline styles is missing from the built CSSDeclare it in @theme staticDocs site traps: Tailwind 4 build traps
The CSS build breaks after an edit to a commentFix the bracketed utility in the comment, then rm -rf .nextDocs site traps: Tailwind 4 build traps
Classes added to a workspace package never compiletouch the app's globals.cssDocs site traps: Tailwind 4 build traps
text-[var(--x)] becomes a colourtext-[length:var(--x)]Docs site traps: Tailwind 4 build traps
A rule removed with border-image: none still paintsborder-image-source: noneLines and seams: rules that run the full width
A hover-scale reset in CSS does nothingReset the scale in the markup, because Lightning CSS folds scale into transformLines and seams: rules that run the full width
Margin utilities do nothing on a ported pagePut margins in the port's compatibility sheetThe design lab and the directions: the port recipe

WebGL and canvas

SymptomFixExplained in
A field draws black after a dozen client-side navigations, with no errorOne engine and one context per engine module for the sessionCanvas and WebGL engines: the context budget
Fields go black while a probe counts contextsWrap getContext before the page's scripts runCanvas and WebGL engines: the context budget
A mark leaks one WebGL context per mountDelete its buffers and shaders, then loseContext(), on unmountThe component library: the numbers behind it
Two fields of different sizes keep the main thread busyGrow the shared canvas to the largest field and blit from its bottom-left cornerCanvas and WebGL engines: a shared canvas that only grows
The glyph rain lags on phones, worst on WebKitSnapshot the readback atlas into an ImageBitmap for the blitsCanvas and WebGL engines: readback canvases and the blit path
A canvas goes soft after browser zoomWatch the resolution media query and re-arm it on every changeCanvas and WebGL engines: browser zoom
A wide window on weak hardware gets the heaviest quality tierPick the tier from measured frame timeCanvas and WebGL engines: quality from measured frame time
Only a shader's fallback renders after an editNo newline before #version 300 es; check that the shader drawsCanvas and WebGL engines: shader source weight
A wall of frozen previews still lagsStills on every card, the live page only under the pointerCanvas and WebGL engines: galleries of live previews
A frozen preview keeps animatingMove the loop to requestAnimationFrame, the only thing the gate holdsCanvas and WebGL engines: galleries of live previews
A duplicate canvas stays in the DOM in developmentRemove every node an effect creates, and check for exactly one canvasCanvas and WebGL engines: strict mode and effects
Every listener is dead in developmentDefer the mount effect's cleanup by one task, as useMountEffect doesPages and the viewer shell: effects under strict mode
Dragging a seam over a large figure runs at 5 fpsKeep the subtree under a moving inherited variable small, such as one canvasCanvas and WebGL engines: inherited properties on a moving subtree
A canvas shows its stretched 300 by 150 store for a framePaint one frame before any requestAnimationFrameDither and the studio field: engine copies and canvas traps
A cloned canvas is blankRedraw clones from the theme tokens, sized from clientWidthDither and the studio field: engine copies and canvas traps

Dither

SymptomFixExplained in
A dithered transition flashes on its first frameAnchor the tile: phase.y = n % 8 for a canvas n cells lowerDither in practice: transitions on one grid
Quick steps flash back to a picture that has goneStart each new mix from the frame on screenDither in practice: transitions on one grid
A step through a new level becomes a cutDecode all 65 mask levels before the first stepDither in practice: transitions on one grid
A picture's edge fades in grey cellsA hard cut at the plate's edge, then a dissolve by toneDither in practice: transitions on one grid
A field arrives as a fadeRaise its tone from 0Dither in practice: transitions on one grid
A dithered pattern on a moving sprite flickersPut dither on fields and stills; a moving sprite carries solid inkDither and the studio field: dither on a moving sprite
Dither dots alias into noise at 1xDraw at 2x the stage height with image-rendering: pixelatedDither in practice: cells are screen pixels
A dithered photograph loses its inscriptionsNo blur; the cutter solves the black and white pointsDither in practice: the picture standard
The picture cutter refuses a source fileIts bytes changed upstream; the recorded sha256 pins the originalDither in practice: the picture standard
The hero's field has no effect in the light themeA filter, because a screen blend is inert in an isolated hostDither in practice: material strength
A placed picture reads as an empty window with a sliverAnchor it to a share of the field's rampDither in practice: placing a picture on a field

Lines and seams

SymptomFixExplained in
A seam reads at the two-stroke greyCheck the neighbouring pixels: a glow raises them and a double leaves them at the groundLines and seams: reading a seam by its grey
A bordered element's edge composites darker than every other hairlinebackground-clip: padding-boxLines and seams: self-stacks and stacked grounds
A new rail doubles every hairline by 2px a sideSeat it on the existing pages' edgesLines and seams: rails drawn as borders
Rules keep their author colour in forced coloursThe hairline tokens become CanvasTextLines and seams: rules that run the full width
A grid of links draws stacked linesOnly the first link of each row draws the ruleLines and seams: rules that run the full width
Cards paint over the rule below them after a revealSet will-change only for the tween and clear what the tween setLines and seams: stacking contexts over seams
Sticky figures stop stickingoverflow-x: clip on the root, which clips without making a scroll containerLines and seams: registration crosses and horizontal clipping

SVG lines

SymptomFixExplained in
A dash meant as a fraction of a path draws as a short fleckDrop pathLength under non-scaling-stroke and dash in user unitsSVG lines in motion: pathLength under a non-scaling stroke
One travelling pulse shows up as severalMove a short <line> segment by translateSVG lines in motion: a travelling dash that tiles
An arc parked on a closed shape leaves part of it unpaintedStart the path where the arc startsSVG lines in motion: dashes on a closed path
A draw-on runs backwardsRead the first point of d, then flip the parked signSVG lines in motion: the sign of the parked offset
A fleck stays at the end of a line that should be empty'100 200' parked at 101 or -101SVG lines in motion: a fleck at the end of the path
A dash freezes for about four frames, then jumpsautoRound: false, and pathLength 1000 on a looping dashSVG lines in motion: rounding, cached paths and empty paths
A rerun of an effect traces an empty pathStore the authored d once and restore it before measuringSVG lines in motion: rounding, cached paths and empty paths
Curves warp and text distorts in a stretched stripStraight taps with one elbow, labels in HTMLSVG lines in motion: drawing under a stretched viewBox
The GT monogram renders 214 units too highReference the symbol from an svg with no viewBoxSVG lines in motion: symbols and masks
A mask lands away from its shapeWrite the mask in the masked shape's coordinatesSVG lines in motion: symbols and masks
A second copy of a figure draws the first one's maskA unique id prefix per figureSVG lines in motion: symbols and masks
A mark seated on an iso face lies flatter than the faceplane() in place of scale(1 0.5) rotate(45)Isometric drawings: numbers and traps

GSAP

SymptomFixExplained in
window.gsap is undefined in the pageRead state from the page, such as a computed CSS-variable dialSVG lines in motion: GSAP from outside the page
Overriding requestAnimationFrame does not freeze an animationPoll the dial and capture about 100ms earlySVG lines in motion: GSAP from outside the page
A harness that seeks a timeline gets stale framestl.seek(t, false) so onUpdate runsSVG lines in motion: GSAP from outside the page
A shimmer's sweep lands about 180 units off its markPre-rotated windows moved by a pure translateSVG lines in motion: GSAP from outside the page
A CSS transition never runs on the first frameA keyframe animationSVG lines in motion: transitions at first paint
Glyphs jump across the screen after the fonts loadMeasure again and never resampleSVG lines in motion: moving type

Lottie on canvas

SymptomFixExplained in
A translated animation draws nothing after one text layerAn empty glyph entry for every drawable character, \r and \u0003Lottie on canvas: a missing glyph stops the frame
Content under a track matte stays clipped after the canvas growsResize every matte buffer after each resize and redrawLottie on canvas: track-matte buffers are sized once
drawImage throws from a canvas parked at 0 by 0Park a hidden player at resize(1, 1)Lottie on canvas: track-matte buffers are sized once
A playing animation redraws 120 times a secondsetSubframe(false), and per-frame work only when the frame changesLottie on canvas: subframes redraw at display rate
A hidden layer builds its canvas at the wrong sizeA visibility: hidden class in place of the hidden attributeLottie on canvas: hidden layers that keep their box
Two players meant to match stay a frame apartOne leader; followers stay paused and take its raw frameLottie on canvas: two players on one clock drift
The animation jumps at every looploop: false, a copy of the last frame, then a dither back to the startLottie on canvas: the loop is a cut
Reduced motion shows an empty frameA poster frame from the longest stretch with text on screenLottie on canvas: a poster frame for reduced motion
A lower canvas resolution barely speeds up textCut the text drawn; the cost is replaying glyph paths in scriptLottie on canvas: canvas text costs JavaScript

Type

SymptomFixExplained in
A page renders desktop Inter 3 when its font file failsBind the face to an identifier no installed font carriesType: the binding
A client-side navigation swaps one page's face for another'sA unique identifier for every localFont callType: the binding
A subset renders a shade off the full fileKeep glyph names when subsettingType: subsets and glyph names
A tracked heading loses its -> arrow and its centred colonsName calt in the feature listType: contextual alternates under letter-spacing
The brand deck's headings lose their contextual alternatesThe same calt, which waits for the deck's ownerThe brand deck: the sheet and the grammar
Optical sizing stops for a whole subtreeNever write font-variation-settings or font-optical-sizing: noneType: optical size
A measure of 62ch holds 84 characters a lineSet measures in emType: measure
Hebrew and Arabic render in ArialA script stack with no Inter variable in frontType: scripts and the Arial fallback
Numerals in a weight 500 block render at 700A base rule sets b, strong to 500Type: weight and stack traps
A second Inter appears only while the page loadsStacks read var(--font-inter) and name no bare InterType: weight and stack traps
A label draws a different a from the row beside itLabels read the text tokenType: weight and stack traps
A heading sits 1.85px above its label from 1348px wideA trim inside the media query where the rounding step occursType: seating display type
A heading painted on a canvas comes out 12px shortA FontFace built with featureSettingsType: canvas text
WebKit canvas text changes its optical sizeCopies of the font pinned to one opsz and text-rendering: autoType: canvas text
A face meant for one page is preloaded on every pagepreload: false and a family name only that route's CSS namesType: preloads that leak across routes
The theme button's glyph renders in a system faceRead the face with CSS.getPlatformFontsForNode, since the lint's range misses itType: glyphs outside the subsets

Interface

SymptomFixExplained in
Two buttons with one CSS gap show different gaps beside their iconsMatch the measured visible gapsInterface details: gaps beside a glyph
A row of buttons moves when one label reads CopiedSize the face from the idle label through a grid sizerInterface details: gaps beside a glyph
A copy button fails in an agent app's browser paneTest it in Chrome; the pane blocks clipboard writesInterface details: the copy control
The foot of a page jumps when a control mounts at hydrationReserve the control's height in the server markupInterface details: layout shifts
Controls move when the language changesAnchor the language left and the theme toggle rightInterface details: layout shifts
A sign-in widget draws a white card on a dark pagePass the resolved theme and key the widget on itInterface details: third-party widgets and the site's theme
Captions fail contrast in the light theme#6e737c or ink-2 in place of titaniumInterface details: contrast
A double click moves a carousel two slidesDrop commands within 350ms of the last oneInterface details: carousels and galleries
An element that moves on hover flickers under the pointerA still hit area with the moving drawing inside itInterface details: a still hit area for a moving target

Verification

SymptomFixExplained in
Shader and dither canvases come back blank in an embedded browser paneTake pixels with Playwright in Chrome for TestingProving a visual change: the in-app browser pane
A capture comes out in the wrong themeSeed the theme before load and assert it tookProving a visual change: the in-app browser pane
An edit trims padding where the gap came from a marginQuote the box model before editingProving a visual change: the spot before the edit
A scroll story locks in a different place scrolling upRun the whole stress matrixProving a visual change: the stress matrix
A fix shown with a scripted selection proves nothing about a dragPerform the real gesture and read the result backProving a visual change: real gestures
A harness request leaves its originBuild every URL as new URL(ORIGIN + path)Proving a visual change: real gestures
A layout breaks in Safari aloneCheck one invariant in Chromium and WebKitProving a visual change: WebKit
A route list read from a running dev server is truncatedTake the routes from the source or the sitemapProving a visual change: parity across an upgrade
Timings read slow and a dev-server Lighthouse run scores 0.65Record the load average, and run a production build in a clean profilePerformance without visual loss: measure honestly
A lab score does not answer a complaint about a slow first paintRead field dataPerformance without visual loss: field data against lab data
A structural audit passes every item while the visual bar failsReport each kind of check on its own lineAgent workflows: kinds of check

Films

SymptomFixExplained in
Two renders of one film differCompare every pair by framemd5; large animated type renders on the software pathFilms: compare every render pair
One render loses its dither field and reports successGuard every cached image read with img.complete && img.naturalWidth > 0Films: images and the first timeline update
The render log reads "Fetched 11 font face(s)"Set type through the kit's var(--font)Films: fonts in a composition
A thin blue stroke turns slate grey in the encoded fileStart it on an even pixelFilms: thin coloured strokes in H.264
1px routes vanish at phone size2.5px routes over a keyline, checked at 640 by 360Films: thin lines over a dithered ground
A louder mix comes out quieterPut peak control in the ffmpeg mastersFilms: the mix and its traps
A gain ramp clicksaeval for any gain curveFilms: the mix and its traps
The music bed pumps between linesHold the duck across gaps under about 1.2sFilms: the mix and its traps
A voice model ignores its speed settingInline pace tagsFilms: speech synthesis
A still pulled with -ss comes out near blackSelect the frame by indexFilms: frames, probes and disks
A render that looks fine in its log is an error pageFlag frames whose grey standard deviation is under about 20Films: frames, probes and disks
page.evaluate(() => tl.seek(t)) hangsReturn a number from evaluateFilms: frames, probes and disks

Routing

SymptomFixExplained in
A locale prefix outside the roster answers 500A locale guard ahead of every rewriteLocalized routing: middleware order
Every old URL redirects to a 404Deploy a redirect only after the moved pages existLocalized routing: middleware order
Links to /sitemap.xml and other root files answer 404A plain <a> for root filesLocalized routing: links, routers and strings in gt-next
A programmatic navigation loses the localePush a path that already carries the localeLocalized routing: links, routers and strings in gt-next
Strings render in English in every localeconst gt = await getGT(); on its own lineLocalized routing: links, routers and strings in gt-next
The language menu breaks on default-locale pagesMap usePathname() back to the public pathLocalized routing: links, routers and strings in gt-next
A CLI setup command waits forever under an agent--no-interactive and a flag for every answerLocalized routing: a start prompt that must run unchanged

The shared machine

SymptomFixExplained in
A pkill -f stops other sessions' servers, browsers and rendersStop a process by the PID recorded when it startedAgents on one machine: stopping a process
A kill by port closes a browserkill $(lsof -ti tcp:<port> -sTCP:LISTEN)Agents on one machine: stopping a process
Every later command reports "command not found"Never name a zsh variable pathAgents on one machine: shell traps in zsh
"$B:apps/landing" rewrites the stringBrace the name: "${B}:apps/landing"Agents on one machine: shell traps in zsh
A loop over an unquoted variable runs onceAn array, an explicit list or ${=urls}Agents on one machine: shell traps in zsh
A Python heredoc becomes a pushed commit messageWrite each message to a file first, then git commit -FAgents on one machine: shell traps in zsh
echo ==== stops a && chainQuote itAgents on one machine: shell traps in zsh
A grep over two folders greps nothingA glob with no match aborts the line; use find or quote the patternAgents on one machine: shell traps in zsh
A browser starts while the memory check said to waitChain on the check's own exit status with && and no pipeAgents on one machine: exit-status gates
One git grep grows from 42.6 to 166GB-F with a pattern file, -I and a thread countAgents on one machine: memory and disk
A reboot empties the sessions' scratch foldersKeep specs and helpers that must outlive the day in a repositoryAgents on one machine: memory and disk
Lane agents hang for hours on shell calls that never startNo rm in a lane, edits in separate calls, network calls under an alarmAgents on one machine: long commands
A commit publishes another session's staged deletionsCommit with a pathspecAgents on one machine: one checkout and several sessions
A copy into the tree erases commits another session pushedFetch and read HEAD..origin/main before any copy or pushAgents on one machine: one checkout and several sessions

Pull requests and workflows

SymptomFixExplained in
A pull request's checks are stale, cancelled or missingResolve the merge conflicts firstPull requests and CI: CI signals that mislead
The latest push shows a red e2e it did not causeList the runs and find the first red onePull requests and CI: CI signals that mislead
The build dies in "Running TypeScript"Raise --max-old-space-sizePull requests and CI: CI signals that mislead
A bot's summary describes a diff that no longer existsCompare its reviewed commit with the head before actingPull requests and CI: review bots
A force push erases a collaborator's commitsFetch, then lease against the sha you expectPull requests and CI: git on shared trees
A fast-forward overwrites ignored files without a warningCopy the ignored originals aside firstPull requests and CI: git on shared trees
Commits meant for a pull request never reach itCheck the branch before each commit and compare the head with HEADPull requests and CI: git on shared trees
A lane builds nothing and verifies something unrelatedOpen every lane prompt with the user's own words for that laneAgent workflows: lane prompts
A resumed workflow pays for its finished agents againResume by run id with byte-identical argumentsAgent workflows: resuming a run

Sources

  • The pages each row links to, read on 2026-10-21: the Craft and Engineering tabs of /docs, the Components and Internals pages with trap sections, and the handbook's documents on one machine, workflows, pull requests and review.
  • The curated skills those pages cite: gt-motion (references/traps.md), gt-performance (references/webgl-lifecycles.md), gt-website (references/docs.md, references/deploys.md), gt-local-dev, gt-verify, gt-films, gt-dither, gt-brand (references/type.md), gt-orchestration and gt-ship.

On this page