<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>James M — Project Releases</title>
    <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/</link>
    <atom:link href="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/feed.xml" rel="self" type="application/rss+xml" />
    <description>Release notes across 19 projects in James M&apos;s portfolio, shipped continuously by an autonomous burndown fleet.</description>
    <language>en</language>
    <generator>build-feed.mjs</generator>
    <lastBuildDate>Sat, 15 Aug 2026 14:05:52 GMT</lastBuildDate>
    <item>
      <title>LRGQ v0.3.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/lrge</link>
      <guid isPermaLink="false">lrge@v0.3.0</guid>
      <pubDate>Sun, 19 Jul 2026 14:48:08 GMT</pubDate>
      <category>C++</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/lrge.svg" />
      <description>- chore: bump version to 0.3.0
- chore(release): correct the build system&apos;s self-description + v0.3.0 notes
- [GD-2] Bug hunt: a nested link crashed the app — and my first fix silently did nothing
- fix(text): substitute glyphs the face cannot draw, instead of drawing a box
- fix(gfx): the raylib Manual said &quot;File ? Save&quot; — and SFML said &quot;File [] Save&quot;
- chore(validation): editor-validation pass — 2 delivered, 0 reopened, 0 skipped
- fix(gfx): a &gt;16-point polygon drew nothing on raylib — and one lead that was wrong
- [GD-2] Bug hunt: no new defect — a dissolved candidate and a confirmed lead
- chore(ci): build the raylib backend and its probe — the guard nothing was building
- fix(input): holding Escape to leave Play no longer closes the application
- [GD-2] Bug hunt: the raylib editor maximised over the Windows taskbar
- chore(validation): editor-validation pass — 2 delivered, 0 reopened, 0 skipped</description>
    </item>
    <item>
      <title>Pipeworks v0.10.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/pipeworks</link>
      <guid isPermaLink="false">pipeworks@v0.10.0</guid>
      <pubDate>Sat, 18 Jul 2026 21:48:07 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/pipeworks.svg" />
      <description>- chore(release): cut v0.10.0 &quot;AAA UI &amp; Juice&quot;; open Release 11 &quot;Mastery&quot;
- feat(sim): per-pipeline execution history — and reconcile a backlog that had drifted (#118) (#118)
- chore(render): pin the renderer to WebGL, and retire the atlas half of the graphics-foundation item (#116)
- feat(mastery): percentile bars — the scorecard says where a run SITS, not just its number (#117)
- feat(render): BitmapText on-board labels — crisp under zoom (#113) (#113)
- feat(render): per-lane dirty-tracking — the board stops redrawing what hasn&apos;t changed (#114)
- fix(mastery): a personal best has to be earned — two of three axes were free 100s (#115)
- hunt(rating): the personal best is warm-up-dominated — and only profile-fair by accident (#112)
- hunt(render): the board was contradicting the HUD (#111) (#111)
- feat(audio): sound one-shots — the interaction layer gets a voice (#110)
- chore(release): roadmap to v1.0.0 + an automated, event-driven release cadence (#109)
- feat(render): glow/bloom layer — the board emits light (#108) (#108)</description>
    </item>
    <item>
      <title>Pipeworks v0.9.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/pipeworks</link>
      <guid isPermaLink="false">pipeworks@v0.9.0</guid>
      <pubDate>Sat, 18 Jul 2026 19:09:48 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/pipeworks.svg" />
      <description>- chore(release): cut v0.8.0 &quot;Dependencies&quot; + v0.9.0 &quot;Onboarding &amp; Teach&quot;; open v0.10.0 (#105)
- hunt(ui): probe the R10 UI surface — no defect found (#104) (#104)
- feat(ui): context menu on stage nodes — quick actions at the cursor (#103) (#103)
- feat(ui): type scale — 15 ad-hoc font sizes collapse onto named steps (#102) (#102)
- feat(ui): density toggle — density is a setting, not a fixed choice (#101) (#101)
- hunt(onboarding): the tutorial was taxing the player who took it (#100) (#100)
- feat(onboarding): invert the opening — hand-deploy, then get handed the machine (#99) (#99)
- feat(ui): progressive UI disclosure — the HUD earns its complexity (#98) (#98)
- feat(ui): glass surfaces — the design language&apos;s signature move (#97) (#97)
- feat(ui): a held service explains itself — name the blocking dependency (#96) (#96)
- feat(render): impact juice — failure cue + event-driven screen shake (#95) (#95)
- feat(render): board juice — a success pop + a homegrown easing helper (#94) (#94)</description>
    </item>
    <item>
      <title>sketchbook v0.6.1</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/processing-sandbox</link>
      <guid isPermaLink="false">processing-sandbox@v0.6.1</guid>
      <pubDate>Sat, 18 Jul 2026 17:06:46 GMT</pubDate>
      <category>JavaScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/processing-sandbox.svg" />
      <description>- docs(roadmap): GFX-067 (reduced-motion) now complete across all 7 reel sketches
- gfx(G4·GFX-067): extend reduced-motion to the rest of the reel (Tree Heights + 2 generative)
- docs(roadmap): GFX-067 (reduced-motion) opened — done on the 4 spring reel sketches
- gfx(G4·GFX-067): prefers-reduced-motion support on the 4 spring reel sketches
- docs(roadmap): GFX-061 spring physics now on 4 sketches (+ Dijkstra node-settle pop)
- gfx(G4·GFX-061): node-settle spring-pop on Dijkstra 3D
- docs(roadmap): GFX-061 spring physics now on 3 sketches (+ Hanoi landing squash); GFX-063 overshoot has a 3rd case
- gfx(G4·GFX-061/063/068): landing squash-spring on Hanoi disk placement
- fix(collection): auto-run 3 more interaction-gated sketches — 0 passive-viewer blanks left
- gfx(GFX-001): antialiasing sweep — MSAA on all 96 remaining WEBGL sketches
- fix(collection): auto-run the 7 interaction-gated sketches (passive-viewer fix)
- fix(collection): clear the last 4 hard-broken sketches — collection now 0 errors (111 sketches)</description>
    </item>
    <item>
      <title>sketchbook v0.6.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/processing-sandbox</link>
      <guid isPermaLink="false">processing-sandbox@v0.6.0</guid>
      <pubDate>Sat, 18 Jul 2026 06:25:23 GMT</pubDate>
      <category>JavaScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/processing-sandbox.svg" />
      <description>- docs(roadmap): GFX-061 spring physics now on 2 sketches (N-Queens + Consistent Hashing); GFX-063 overshoot started — pending v0.6.0
- gfx(G4·GFX-061/063): spring-pop on Consistent Hashing node join/leave
- docs(roadmap): G4 opened — spring physics (GFX-061) done on N-Queens; pending reel deploy
- gfx(G4·GFX-061): spring-physics motion on N-Queens — the G4 opener</description>
    </item>
    <item>
      <title>sketchbook v0.5.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/processing-sandbox</link>
      <guid isPermaLink="false">processing-sandbox@v0.5.0</guid>
      <pubDate>Sat, 18 Jul 2026 05:35:44 GMT</pubDate>
      <category>JavaScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/processing-sandbox.svg" />
      <description>- docs(roadmap): GFX-050 IBL now on 3 sketches (Hanoi + N-Queens + Dijkstra) — pending v0.5.0 deploy
- gfx(G3): image-based lighting + auto-run on Dijkstra 3D — third G3 sketch
- docs(roadmap): GFX-050 IBL now on 2 sketches (Hanoi + N-Queens) — both pending the v0.5.0 reel deploy
- gfx(G3): image-based lighting on N-Queens — second G3 sketch
- docs(roadmap): G3 opened — IBL done on Hanoi (GFX-050/051); feasibility correction: IBL/materials are 1.7-safe, not needs-2.x (only shader hooks need 2.0)
- gfx(G3): image-based lighting on Hanoi Rings — the G3 (lighting &amp; materials) opener</description>
    </item>
    <item>
      <title>sketchbook v0.4.2</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/processing-sandbox</link>
      <guid isPermaLink="false">processing-sandbox@v0.4.2</guid>
      <pubDate>Sat, 18 Jul 2026 04:25:45 GMT</pubDate>
      <category>JavaScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/processing-sandbox.svg" />
      <description>- docs(roadmap): GFX-036 chromatic aberration done (Shader Sphere composite) — built 8042061, pending reel deploy
- gfx(G2·GFX-036): chromatic aberration on the Shader Sphere composite
- docs(roadmap): GFX-033 DoF done (tilt-shift on Tree Heights; screen-Y depth proxy for the fixed camera) — built 538eddd, pending reel deploy
- gfx(G2·GFX-033): tilt-shift depth-of-field on Tree Heights</description>
    </item>
    <item>
      <title>sketchbook v0.4.1</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/processing-sandbox</link>
      <guid isPermaLink="false">processing-sandbox@v0.4.1</guid>
      <pubDate>Sat, 18 Jul 2026 03:36:31 GMT</pubDate>
      <category>JavaScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/processing-sandbox.svg" />
      <description>- perf(hashing): pixelDensity(1) on Consistent Hashing — the &quot;slows my computer&quot; fix
- docs(roadmap): GFX-035 — broad grade-via-filter() deferred (subtle on dark bgs + adds a pass); keep it in-composite (sphere) or via the Bench post() chain
- gfx(G2): reusable cinematic grade (vignette + film grain + cool grade) on the bloom composite</description>
    </item>
    <item>
      <title>Pipeworks v0.8.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/pipeworks</link>
      <guid isPermaLink="false">pipeworks@v0.8.0</guid>
      <pubDate>Sat, 18 Jul 2026 02:57:42 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/pipeworks.svg" />
      <description>- feat(deps): dependency cycle guard — reject a loop that would deadlock (v0.8.0 slice 2a) (#83)</description>
    </item>
    <item>
      <title>sketchbook v0.4.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/processing-sandbox</link>
      <guid isPermaLink="false">processing-sandbox@v0.4.0</guid>
      <pubDate>Sat, 18 Jul 2026 02:21:49 GMT</pubDate>
      <category>JavaScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/processing-sandbox.svg" />
      <description>- docs(roadmap): GFX-032 bloom done @ 60fps (2-pass; FBO-bind-count was the cost)
- perf(G2): bloom to 60fps — collapse the pipeline from 8 framebuffer passes to 2
- perf(G2): HALF_FLOAT bloom buffers + fewer blur iterations
- gfx(G2): real framebuffer BLOOM on the Shader Sphere (post-processing proof)</description>
    </item>
    <item>
      <title>Pipeworks v0.7.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/pipeworks</link>
      <guid isPermaLink="false">pipeworks@v0.7.0</guid>
      <pubDate>Sat, 18 Jul 2026 01:29:01 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/pipeworks.svg" />
      <description>- chore(release): cut v0.6.0 &quot;Optimization&quot; + v0.7.0 &quot;Legibility &amp; Playability&quot; (#80) (#80)
- feat(techtree): two play-changing research nodes — a real progression fork (#79) (#79)
- hunt(pressure): lock the demand-pressure antagonist at fixed, scarce capacity (#78)
- feat(game): execution history — an audit log of run outcomes (#77) (#77)
- feat(game): Concourse wallboard — a zoomed-out overview of every service&apos;s health (#76) (#76)
- feat(a11y): colour-blind-safe status — a shape/glyph channel on every status cue (#75) (#75)
- feat(game): demand pressure — a mounting antagonist so standing still loses (#74) (#74)
- docs(manual): a comprehensive Player&apos;s Manual (#73) (#73)
- feat(game): HUD alert strip — the one thing to fix now (+ fix the stale version footer) (#72) (#72)
- feat(game): onboarding — a first-run welcome/coach + a help &amp; glossary overlay (#71) (#71)
- feat(game): juice + audio — a deploy that ships finally sounds and pops (#70) (#70)
- feat(game): directives — a milestone ladder that gives the session a north star (#69) (#69)</description>
    </item>
    <item>
      <title>sketchbook v0.3.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/processing-sandbox</link>
      <guid isPermaLink="false">processing-sandbox@v0.3.0</guid>
      <pubDate>Sat, 18 Jul 2026 01:05:39 GMT</pubDate>
      <category>JavaScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/processing-sandbox.svg" />
      <description>- gfx(G0a): bump p5 1.6.0 → 1.11.13 across all sketches — v0.3.0 (the upgrade unlock)
- tools: add the smoke-test harness (GFX-020) + p5 1.6.0 baseline
- docs(roadmap): G0 upgrade-readiness audit — split the p5 upgrade, 1.7.x first
- Add 8 WIP sketches + regenerate the launcher (106 → 114)</description>
    </item>
    <item>
      <title>Pipeworks v0.6.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/pipeworks</link>
      <guid isPermaLink="false">pipeworks@v0.6.0</guid>
      <pubDate>Fri, 17 Jul 2026 22:51:36 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/pipeworks.svg" />
      <description>- feat(promotion): environments as board zones — group a cross-env service&apos;s lanes into a framed zone (slice 2) (#68) (#68)
- feat(promotion): cross-execution promotion — pipeline triggers, dev→staging→prod as linked pipelines (slice 1) (#67) (#67)
- feat(agents): agent specialisation — a compute-optimised class (concurrency vs compute) (#66) (#66)
- hunt(upgrades): lock the upgrade economy — no dominant upgrade, no runaway (#65) (#65)
- feat(quality): build-reliability tiers — invest to roll better builds (#64) (#64)
- hunt(integration): lock the v0.5.0/v0.6.0 stack under aggressive combined play (#63) (#63)
- feat(upgrades): speed modules — cut stage duration at a compute cost (#62) (#62)</description>
    </item>
    <item>
      <title>Pipeworks v0.5.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/pipeworks</link>
      <guid isPermaLink="false">pipeworks@v0.5.0</guid>
      <pubDate>Fri, 17 Jul 2026 18:16:47 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/pipeworks.svg" />
      <description>- chore(release): cut v0.5.0 &quot;Promotion&quot; + open Release 6 — v0.6.0 &quot;Optimization&quot; (#61) (#61)
- feat(canary): automated canary analysis — a scored, non-dominant promotion gate (#60) (#60)
- hunt(regions): per-region queue cap — one unstaffed region no longer starves the org (#59) (#59)
- feat(regions): per-region agent pools — staff the regions you open (slice 2c) (#58) (#58)
- hunt(promotion): balance probe — a real tradeoff, with sound coverage (#57) (#57)
- feat(promotion): multi-environment promotion — dev → staging → prod trains (#56) (#56)</description>
    </item>
    <item>
      <title>Pipeworks v0.4.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/pipeworks</link>
      <guid isPermaLink="false">pipeworks@v0.4.0</guid>
      <pubDate>Fri, 17 Jul 2026 14:08:10 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/pipeworks.svg" />
      <description>- chore(release): cut v0.4.0 &quot;Consequence&quot; + open Release 5 — v0.5.0 &quot;Promotion&quot; (#55) (#55)
- feat(rating): session rating history — the last few runs, not just a peak (#54) (#54)
- feat(promotion): artifact promotion — bake once, deploy many (#53) (#53)
- hunt(regions): the throttle hint misdirected after per-region capacity (#52) (#52)
- feat(regions): per-region capacity + relocate — placement that throttles (slice 2b) (#51) (#51)
- feat(techtree): capability-gate the catalog — progression with teeth (slice 2) (#50)</description>
    </item>
    <item>
      <title>sketchbook v0.2.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/processing-sandbox</link>
      <guid isPermaLink="false">processing-sandbox@v0.2.0</guid>
      <pubDate>Fri, 17 Jul 2026 00:52:45 GMT</pubDate>
      <category>JavaScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/processing-sandbox.svg" />
      <description>- gfx(creative): Harmonic Particle Text glow-up (G1)
- gfx(permutations): rebuild Fibonacci Spiral — the real golden spiral (G1)
- gfx(dynamicprogramming): rebuild Tree Heights DP viz + correct a 1.6 fact (G1)
- gfx(hashing): rebuild Consistent Hashing — correct, legible, and light (G1)
- gfx(surface_drift): make the Shader Sphere a churning nebula (G1/G5 flex)
- gfx(surface_drift): evolve Shader Sphere to reel-ready (G1 fidelity)</description>
    </item>
    <item>
      <title>sketchbook v0.1.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/processing-sandbox</link>
      <guid isPermaLink="false">processing-sandbox@v0.1.0</guid>
      <pubDate>Thu, 16 Jul 2026 22:07:39 GMT</pubDate>
      <category>JavaScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/processing-sandbox.svg" />
      <description>- Add graphics &amp; animation quality roadmap (research-backed, phased, cadenced)
- Stop tracking node_modules (already in .gitignore)
- Add a real launcher index.html — filterable catalog of all sketches (CAT-120/122)
- Add CATHODE improvement backlog — non-breaking, opt-in &apos;The Bench&apos;
- Adding scripts
- Fibonacci spiral
- Tree height visualization
- Fibonacci spiral
- Max subarray sum
- Max subarray sum
- Add animations
- Add .gitignore</description>
    </item>
    <item>
      <title>Pipeworks v0.3.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/pipeworks</link>
      <guid isPermaLink="false">pipeworks@v0.3.0</guid>
      <pubDate>Thu, 16 Jul 2026 21:55:08 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/pipeworks.svg" />
      <description>- chore(release): cut v0.3.0 &quot;Scale &amp; Progression&quot; + open Release 4 — v0.4.0 &quot;Consequence&quot; (#49)
- feat(loadout): on-call auto-defense — the standby-less critical mop-up (#48) (#48)
- feat(regions): regionalise the board (slice 2a) — placement + spatial fuel (#47) (#47)
- hunt(regions): fix an inescapable depletion trap + the trap-feeding hint (#46) (#46)
- feat(rating): session rating + the game&apos;s first cross-session persisted best (#45) (#45)
- feat(techtree): the technology tree — ship to unlock capability (#44) (#44)
- hunt(integration): lock the v0.2.0 depth features against each other (#43) (#43)
- feat(stages): Restrict Execution During Time Window — a recurring deploy freeze (#42)</description>
    </item>
    <item>
      <title>PH1 v0.5.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/nebula-drift</link>
      <guid isPermaLink="false">nebula-drift@v0.5.0</guid>
      <pubDate>Thu, 16 Jul 2026 05:51:31 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/nebula-drift.svg" />
      <description>- chore(release): 0.5.0 — Two Sandboxes (#347)
- feat(brand): remove the broadcasting theme — no CRT chrome, no broadcast voice (only earthy palette + pixellation) (#346)
- feat(loot): the loot engine core — rolled rarity + affixes, per-area density (Diablo × Soulslike) (#345)
- fix(look): de-neon the space backdrop — the starfield &amp; nebula clouds still shimmered pre-earthy neon (#344)
- rename(brand): the display name is PH1, not GRAVEYARD SLOT — operator correction of #342 (#343)
- feat(brand): rename the game RINGED AND RUINOSE → GRAVEYARD SLOT + establish the design canon (#342)
- feat(eve): the combat fit is buildable — industry blueprints for a weapon, tackle and the armor repairer (#341)
- feat(surface): prospecting reach scales with the Survey Scope — the recon upgrade finally pays on the surface (#340)
- fix(eve): a cap-starved afterburner/web kept its sustained effect for free — gate on running, not toggled (#339)
- feat(eve): armor repairer — an active rep for the armor layer, completing the shield/armor tank symmetry (#338)
- feat(surface): prospecting scan — press P to surface rich ground pockets and chase a vein (#337)
- feat(surface): plasma lamps light the night — day-pace work beside a lamp, with a warm glow (#336)</description>
    </item>
    <item>
      <title>Pipeworks v0.2.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/pipeworks</link>
      <guid isPermaLink="false">pipeworks@v0.2.0</guid>
      <pubDate>Thu, 16 Jul 2026 04:33:05 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/pipeworks.svg" />
      <description>- chore(release): cut v0.2.0 &quot;Depth&quot; + open Release 3 — v0.3.0 (#41) (#41)
- feat(loadout): operator capability loadout — progression without a character (#40) (#40)
- feat(regions): finite compute budgets — depletion forces expansion (#39) (#39)
- hunt(validate): lock the rules kernel against degenerate + malformed input (#38)
- hunt(balance): lock automation-as-relief — powered parallelism beats per-deploy speed (#37) (#37)
- feat(observability): fog-of-war — instrument to see, or fly blind (#36) (#36)
- feat(stages): Run Job — an external-call stage with its own latency, no local compute (#35)
- feat(hud): show where a run failed in the executions feed — an audit detail (#34)
- docs(release): define the v0.2.0 milestone — burn-up + burn-down (#33) (#33)
- feat(stages): Check Preconditions — a minimum-soak gate before deploy (#32)
- feat(triggers): tune each service&apos;s commit cadence — a demand lever (#31)
- hunt(balance): retune Red/Black out of a strictly-dominated dead zone (#30) (#30)</description>
    </item>
    <item>
      <title>Pipeworks v0.1.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/pipeworks</link>
      <guid isPermaLink="false">pipeworks@v0.1.0</guid>
      <pubDate>Wed, 15 Jul 2026 03:39:34 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/pipeworks.svg" />
      <description>- feat: Pipeworks v0.1.0 — Factorio-inspired Spinnaker CI/CD delivery-factory sim</description>
    </item>
    <item>
      <title>PH1 v0.4.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/nebula-drift</link>
      <guid isPermaLink="false">nebula-drift@v0.4.0</guid>
      <pubDate>Tue, 14 Jul 2026 18:17:26 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/nebula-drift.svg" />
      <description>- chore(release): 0.4.0 — Groundfall (#216)
- hunt(surface): refund mined blocks + cap builds to the collision window (#215)
- feat(a11y): reduced-motion mode — mute camera shake + full-screen flashes (#214)
- feat(eve): HUD sec-status readout — highsec/lowsec/nullsec at a glance (#213)
- feat(surface): persist per-planet dig/build edits + bank ore on leave (#212)
- feat(surface): wire progressive mining into SurfaceScene — the tactile loop (#211)
- feat(surface): progressive tool-gated tile mining — tedious but worth it (pure) (#210)
- feat(eve): ship fitting — modules into hull slots vs CPU/PG/cap budgets (pure) (#209)
- feat(survive): Evade Dash — an active dodge with i-frames on a cooldown (#206)
- feat(surface): effective-ground model — dig/build affect where you stand (pure) (#208)
- feat(eve): capacitor — the module-energy resource with EVE recharge (pure) (#207)
- feat(surface): placement &amp; building model — the inverse of digging (pure) (#205)</description>
    </item>
    <item>
      <title>PH1 v0.3.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/nebula-drift</link>
      <guid isPermaLink="false">nebula-drift@v0.3.0</guid>
      <pubDate>Mon, 13 Jul 2026 23:27:31 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/nebula-drift.svg" />
      <description>- chore(release): v0.3.0 — The Deep Field (#153)
- feat(survive): the Coil — a spiraler that winds its orbit in to the kill (#152)
- hunt: freeze the descent star-field under the Survey Scope soft-pause (#151)
- docs(todo): burndown + descent-scenery status for POI-by-altitude (#150)
- feat(descent): surface POIs resolve by altitude — distant lights → silhouettes → features (#150)
- feat(descent): parallax cloud layers driven by the planet&apos;s atmosphere (#149)
- feat(survive): survival milestones — punctuation + reward for the endless run (#148)
- hunt: consume the run seed so it can&apos;t leak into later random runs (#147)
- hunt: freeze Prospect&apos;s asteroid respawn while the Survey Scope is up (#146)
- feat(survive): the Phantom — a telegraphed blink-stalker (#145)
- feat(survive): per-hull signatures — Interceptor pierce, Bulwark orbital (#144)
- hunt: freeze Prospect&apos;s mission clock while the Survey Scope is up (#142)</description>
    </item>
    <item>
      <title>PH1 v0.2.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/nebula-drift</link>
      <guid isPermaLink="false">nebula-drift@v0.2.0</guid>
      <pubDate>Sun, 12 Jul 2026 23:45:42 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/nebula-drift.svg" />
      <description>- chore(release): v0.2.0 — &quot;The Big Turn&quot; (#67)
- hunt(survive): soft-cap the enemy HP scaling so endless runs stay killable (#66)
- feat(universe): jump-gates — the universe is navigable, flown sector to sector (#65)
- feat(universe): Prospect is sector-aware — mine your universe&apos;s home sector (#64)
- feat(survive): the Splitter — a foe that bursts into Seekers on death (#63)
- feat(universe): surface survey — the descent tells you what you&apos;re landing on (#62)
- hunt(prospect): drone mine-hover uses the asteroid&apos;s scaled radius, not the base (#61)
- feat(survive): kill-combo credit multiplier — streak juice (#60)
- feat(universe): per-sector state — the pure model for depletion &amp; discovery (#59)
- feat(universe): sector navigation &amp; fog-of-war — the pure model for a navigable universe (#58)
- polish(universe): the planet descent is genuinely reversible — abort to orbit (#57)
- feat(universe): the planet descent is playable — a real DescentScene (#56)</description>
    </item>
    <item>
      <title>LRGQ v0.2.23</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/lrge</link>
      <guid isPermaLink="false">lrge@v0.2.23</guid>
      <pubDate>Wed, 08 Jul 2026 03:27:21 GMT</pubDate>
      <category>C++</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/lrge.svg" />
      <description>- [GD-2] ImGui composition bridge: RAII scope guards
- [GD-2] Bug hunt: guard default-floor row against int overflow
- feat(bp): add String To Upper / To Lower Event Graph nodes
- feat(bp): add Exp2 (float) Event Graph node
- feat(bp): add String Starts With / Ends With Event Graph nodes
- [GD-2] Bug hunt: restore runAction switch exhaustiveness for Min/Max/WrapVector
- [GD-2] Bug hunt: keep a &lt;br&gt; in a table cell from overflowing the row
- feat(bp): add Log10 (float) Event Graph node
- [GD-2] Bug hunt: reject case-insensitive profile-name collisions
- feat(bp): add Log2 (float) Event Graph node
- feat(bp): add Asinh / Acosh (float) Event Graph nodes
- feat(bp): add Atanh (float) Event Graph node</description>
    </item>
    <item>
      <title>GCP Terraform Labs v0.1.1</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/gcp-terraform-labs</link>
      <guid isPermaLink="false">gcp-terraform-labs@v0.1.1</guid>
      <pubDate>Tue, 07 Jul 2026 15:50:25 GMT</pubDate>
      <category>HCL</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/gcp-terraform-labs.svg" />
      <description>- feat(jm-likes): swappable Discord webhook secret for like notifications (#23)
- feat(jm-likes): salt secret + Firestore TTL for the Like-counter hardening (#22)
- feat(jm-likes): Firestore + SA/IAM + invoker for the jm portfolio Like backend (#21)
- fix(desktop-updates): stream large installer downloads (Cloud Run 32 MiB cap) (#20)
- feat(dev): private token-gated auto-update feed for the jm desktop app + adopt WIF/fleet infra into state (#19)
- feat(cloud-functions-demo): ephemeral Gen2 HTTP function (source-&gt;build-&gt;run) + public invoker (#18)
- feat(cloud-run-demo): ephemeral Cloud Run v2 service + dedicated runtime SA + invoker IAM (#17)
- feat(secret-manager-demo): ephemeral SM secret + version + secret-scoped reader SA (#16)
- feat(artifact-registry-demo): ephemeral AR Docker repo + repo-scoped CI push SA (#15)
- feat(scheduler-demo): ephemeral Cloud Scheduler job + Pub/Sub topic + scheduler-&gt;topic IAM (#14)
- feat(dev): Terraform for jm portfolio infra, deploy SA perms &amp; Burn Fleet bucket (#3)
- feat(bigquery-demo): ephemeral BigQuery dataset + inline-schema table (#13)</description>
    </item>
    <item>
      <title>NetSentry v0.1.1</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/netsentry</link>
      <guid isPermaLink="false">netsentry@v0.1.1</guid>
      <pubDate>Tue, 07 Jul 2026 15:17:26 GMT</pubDate>
      <category>PowerShell</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/netsentry.svg" />
      <description>- docs(todo): backlog the deferred remediation items from the 2026-07-07 sweep
- feat(alert): NS-ALERT-6 acknowledge/snooze findings via Confirm-Finding.ps1 (#87)
- hunt(lib): guard ConvertTo-NSMask against a negative fill count on malformed IPv6 (#86)
- feat(sec): NS-SEC-8 ready-to-install pre-commit secrets guard (#85)
- hunt(gui): fix Findings Log tab pill never reading REVIEW on real anomalies (#84)
- hunt(det): mask the matched external IP in Watch-IOCMatch&apos;s CSV/console (#83)
- docs(NS-DOC-2): add THREAT-MODEL.md (#82)
- feat(det): NS-DET-1 extend UA signatures from real Cloud Run log evidence (#81)
- feat(det): NS-DET-2 signature-pack versioning (#80)
- feat(net): NS-NET-7 passive mDNS/SSDP/Bonjour service enumeration (#79)
- feat(perf): NS-PERF-1 wire gcloud retry into Audit-CloudRunIAM (#78)
- feat(ops): NS-OPS-5 GitHub Actions CI (PSScriptAnalyzer + Pester) (#77)</description>
    </item>
    <item>
      <title>ue5-experiments v0.1.2</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/ue5-experiments</link>
      <guid isPermaLink="false">ue5-experiments@v0.1.2</guid>
      <pubDate>Mon, 06 Jul 2026 18:34:09 GMT</pubDate>
      <category>C++</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/ue5-experiments.svg" />
      <description>- feat(MirrorGrid): kaleidoscope reflection component over a source mesh (#139)
- hunt(Vortex): floor MinRadius at the point of use so the ω=BaseRate/r divisor can&apos;t NaN (#138)
- feat(Terminal): theme builtin over the palette registry + 4 preset palettes (#137)
- hunt(DirectionalMovementComponent): drop dead store + brace Oscillate case (#136)
- feat(FlockingFormation): spring-damped agents converging on formation slots (#135)
- feat(PhoenixEnigmaComponent): terminal-driven death/rebirth ember ring (#134)
- feat(Terminal): help / man builtins over the command registry (#133)
- feat(DistanceLods): pure-logic distance-LOD driver with edge-triggered OnLodChanged (#132)
- hunt(Pulsar): floor PulseFrequency in the phase term too so a sub-clamp write can&apos;t freeze the pulse (#131)
- feat(Terminal): command registry + dispatcher foundation (#130)
- feat(ArchimedeanSpiralSwarm): arithmetic-spiral swarm with inward flow (#129)
- hunt(SwarmComponent): weight boids separation by 1/distance so the closest neighbours dominate (#128)</description>
    </item>
    <item>
      <title>Forge Engine v0.1.3</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/smol</link>
      <guid isPermaLink="false">smol@v0.1.3</guid>
      <pubDate>Mon, 06 Jul 2026 18:20:32 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/smol.svg" />
      <description>- feat(render): froxel light assignment — binLightsToClusters crosses tiles with depth slices (M3-6 advance) (#283)
- hunt(editor): guard gizmo snap against an infinite step (no NaN&apos;d coordinate) (#282)
- feat(nav): flow-field path extraction — flowFieldPath follows the field downhill to the goal (nav advance) (#281)
- hunt(blueprint): dedup a duplicated sequence exec-out pin so it fires once (#280)
- hunt(material): length-guard codegen normalize to match the CPU eval (no NaN) (#279)
- feat(material): elementary material nodes — divide / negate / round (M4-5 advance) (#278)
- hunt(physics): pin capsuleVsMesh zero-distance normal to the triangle winding (#277)
- feat(render): clustered lighting depth-slice core — clusterZSlice / clusterZSliceRange / lightZSliceSpan / clusterIndex (M3-6 advance) (#276)
- hunt(editor): refresh the Inspector undo baseline on every focus (#275)
- hunt(blueprint): coerce add codegen operands to Number, matching the VM (#274)
- feat(physics): anisotropic principal-frame angular acceleration — bodyAngularAcceleration with the gyroscopic term (M5-3 advance) (#273)
- hunt(blueprint): coerce ordering-comparison codegen operands to Number, matching the VM (#272)</description>
    </item>
    <item>
      <title>adk-sandbox v0.1.3</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/adk-sandbox</link>
      <guid isPermaLink="false">adk-sandbox@v0.1.3</guid>
      <pubDate>Mon, 06 Jul 2026 18:19:24 GMT</pubDate>
      <category>Python</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/adk-sandbox.svg" />
      <description>- burn: record PR #92 in BURNDOWN/BURN_LOG
- hunt(project_builder_agent): add Windows venv activation command to Flask/FastAPI READMEs
- burn: record PR #90 in BURNDOWN/BURN_LOG
- hunt(project_builder_agent): fix run_project&apos;s inconsistent return shape on timeout
- burn: record PR #89 in BURNDOWN/BURN_LOG
- hunt(youtube_shorts_assistant): fix README&apos;s pip install instruction inconsistent with repo convention
- burn: record PR #88 in BURNDOWN/BURN_LOG
- hunt(youtube_shorts_assistant): fix suggest_hashtags overpromising &quot;up to 15&quot; hashtags
- burn: record PR #87 in BURNDOWN/BURN_LOG
- hunt(docs): fix _extract_tools silently corrupting docs on nested-fn name collision
- burn: record PR #86 in BURNDOWN/BURN_LOG
- hunt(docs): fix stale &quot;80+ cities&quot; claim to match the real count (76)</description>
    </item>
    <item>
      <title>ffmpeg-util v0.1.4</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/ffmpeg-util</link>
      <guid isPermaLink="false">ffmpeg-util@v0.1.4</guid>
      <pubDate>Mon, 06 Jul 2026 18:04:53 GMT</pubDate>
      <category>Python</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/ffmpeg-util.svg" />
      <description>- hunt(sidecar): stop /run/stream leaking the chapters ffmetadata manifest
- hunt(chapters): guard chapter start times past the input duration
- hunt(renderer): fix dead Ctrl+Enter/Batch mode on Scene thumbs tab
- hunt(renderer): add missing inline validator for scene_thumbs threshold field
- hunt(cli): auto-probe xfade-concat offset from clip 1 like the UI sidecar
- hunt(concat): guard reencode path against fewer than two inputs
- hunt(renderer): add missing inline validator for fps-fps field
- hunt(sidecar): guard /run/stream poster-frame against unprobeable duration
- hunt(renderer): add missing inline validator for xfade-concat duration
- hunt(renderer): add missing inline validators for blur sigma fields
- hunt(cli): fix concat --reencode --dry-run assuming no audio in every input
- hunt(commands): guard waveform against video-only input</description>
    </item>
    <item>
      <title>AWS Terraform Infra v0.1.3</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/terraform-aws</link>
      <guid isPermaLink="false">terraform-aws@v0.1.3</guid>
      <pubDate>Mon, 06 Jul 2026 17:56:32 GMT</pubDate>
      <category>HCL</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/terraform-aws.svg" />
      <description>- hunt(bootstrap): align verify-vpc-endpoints.sh with sibling verify scripts (#118)
- hunt(docs): fix verify-bootstrap.sh doc drift (missing DynamoDB + CloudTrail sections) (#117)
- hunt(monitoring): wire threshold vars into examples/monitoring (#116)
- hunt(bootstrap): add missing cloudtrail_access_logs_bucket_name output (#115)
- hunt(bootstrap): add missing logs:AssociateKmsKey IAM grant (#114)
- hunt(compute): add tmpfs mounts for ECS Exec under a read-only root filesystem (#113)
- hunt(bootstrap): add DynamoDB + CloudTrail checks to verify-bootstrap.sh (#112)
- hunt(bootstrap): check all 6 S3 buckets in verify-teardown.sh (#111)
- hunt(bootstrap): add missing S3 bucket-ownership-controls IAM grants (#110)
- hunt(iam): add missing SSM/ECS-Exec row to modules/iam README&apos;s Policy design table (#109)
- hunt(bootstrap): check all 3 TerraformDeploy IAM policies in verify-teardown.sh (#108)
- feat(docs): refresh infrastructure.md structure + next-steps (#107)</description>
    </item>
    <item>
      <title>Spinnaker Sandbox v0.1.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/spinnaker-sandbox</link>
      <guid isPermaLink="false">spinnaker-sandbox@v0.1.0</guid>
      <pubDate>Mon, 06 Jul 2026 17:52:32 GMT</pubDate>
      <category>JavaScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/spinnaker-sandbox.svg" />
      <description>- Fix: null element in a stage config array no longer crashes the Lab Console (#69)
- Add lab 54: Traffic management (progressive SMI/Istio traffic shift) (#68)
- Fix: non-array judgmentInputs no longer crashes the console in pause mode (#67)
- Add lab 53: Rollout management (rolling restart, pause/resume, undo) (#66)
- Add lab 52: Kustomize bake + deploy (#65)
- docs: add Halyard/Minikube quickstart to run a lab for real (#213) (#64)
- Fix: canary render&apos;s threshold label no longer contradicts its verdict (#63)
- Add lab 51: Helm3 bake + deploy (bake a chart, then apply &amp; verify the rollout) (#62)
- docs(readme): list all 32 labs grouped by track (#61)
- chore(coverage): publish Lab Console engine coverage for the jm portfolio
- Fix: non-array `regions` crashed the Lab Console engine (#59)
- docs: add a Lab Console demo.gif to the README (#58)</description>
    </item>
    <item>
      <title>PH1 v0.1.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/nebula-drift</link>
      <guid isPermaLink="false">nebula-drift@v0.1.0</guid>
      <pubDate>Mon, 06 Jul 2026 14:39:50 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/nebula-drift.svg" />
      <description>- feat(survive): Second Barrel augment — a rear-facing volley each shot (#19)
- feat(survive): off-screen hostile indicators — edge arrows at nearby foes (#18)
- hunt(combat): the player&apos;s contact-hit shove was inert (never moved the ship) (#17)
- feat(prospect): airbrake — hold Space for a retro-burn that kills drift (#16)
- feat(mine): drones steer clear of the player&apos;s hull and asteroid cores (#15)
- hunt(prospect): honour the cracked-node respawn delay (it warped back instantly) (#14)
- feat(mine): camera leads ahead at speed + a high-velocity hull rumble (#13)
- feat(prospect): boost-energy meter — the afterburner can&apos;t be held forever (#12)
- feat(prospect): cargo hold — capacity, resource identity &amp; a Tab cargo panel (#11)
- hunt(pickups): stop a magnetised pickup fleeing when the player outruns it (#10)
- feat(mine): drifting size-varied asteroids in belts + clusters (#9)
- hunt(entities): stop charger knockback compounding during its dash (#8)</description>
    </item>
    <item>
      <title>cloud-portfolio v0.1.2</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/cloud-portfolio</link>
      <guid isPermaLink="false">cloud-portfolio@v0.1.2</guid>
      <pubDate>Mon, 06 Jul 2026 01:21:46 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/cloud-portfolio.svg" />
      <description>- chore(coverage): publish src coverage report for the jm portfolio
- docs: cache-bust the README demo.gif reference
- chore: update demo.gif to a full-site walkthrough
- fix(certs): correct Spring Certified Professional issuer to Broadcom
- fix(skills): remove proficiency progress bars under each skill
- feat: redesign /projects, migrate CRA→Vite, remove Resume/Art/Blog</description>
    </item>
    <item>
      <title>go-labs v0.1.2</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/go-labs</link>
      <guid isPermaLink="false">go-labs@v0.1.2</guid>
      <pubDate>Mon, 06 Jul 2026 00:38:41 GMT</pubDate>
      <category>Go</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/go-labs.svg" />
      <description>- chore(coverage): publish util library coverage report for the jm portfolio
- docs(readme): regenerate demo.gif from a GUI playground runner (#7)
- feat(errors): add 13_error_handling topic with runnable examples
- docs(topics): add per-topic READMEs across the curriculum
- feat(sandbox): self-contained web UI with live code execution
- hunt(util): size Banner border by rune count, not bytes (#6)</description>
    </item>
    <item>
      <title>ffmpeg-util v0.1.3</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/ffmpeg-util</link>
      <guid isPermaLink="false">ffmpeg-util@v0.1.3</guid>
      <pubDate>Sat, 04 Jul 2026 23:09:33 GMT</pubDate>
      <category>Python</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/ffmpeg-util.svg" />
      <description>- Update README.md
- hunt(ui): queue runner attributes results to the on-screen tab, not the queued item&apos;s
- feat(trim): trim multiple segments from one clip and join them
- feat(ui): operation queue — line up ops from several tabs, run them in sequence
- hunt(ui): fix Save-As default ignoring the active tab when no output history exists
- feat(cli): read global-flag defaults from a config file
- feat(ui): chain-to-tab — send output to another tab as input after a run
- feat(metadata): add chapters from a list — core/CLI/sidecar/UI
- feat(ui): job history strip — recent runs with re-run / reveal buttons
- hunt(pip): label overlay output [v] and map it so video is included
- feat(ui): before/after compare slider (drag a divider over input↔output)
- hunt(concat): bound silent-input re-encode with -shortest so it can&apos;t hang</description>
    </item>
    <item>
      <title>AWS Terraform Infra v0.1.2</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/terraform-aws</link>
      <guid isPermaLink="false">terraform-aws@v0.1.2</guid>
      <pubDate>Sat, 04 Jul 2026 22:54:37 GMT</pubDate>
      <category>HCL</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/terraform-aws.svg" />
      <description>- hunt(network): guard the ingestion NLB against accidental deletion (#37)
- hunt(network): scope SNS/SQS/Logs interface VPC endpoint policies to this account (#36)
- hunt(messaging): enforce HTTPS-only access on the SNS alerts topic (#35)
- hunt(network): restrict S3 gateway VPC endpoint to own-account buckets (#34)
- hunt(messaging): enforce HTTPS-only access on SQS queues (#33)
- feat(messaging): add S3 lifecycle expiration to the telemetry access-logs bucket (#32)
- hunt(messaging): enforce HTTPS-only access on the telemetry access-logs bucket (#31)
- feat(bootstrap): add AWS Budgets monthly-cost alarm (#30)
- feat(messaging): add S3 server access logging to telemetry bucket (#29)
- feat(monitoring): add CloudWatch operator dashboard via modules/monitoring (#28)
- feat(network): add CloudWatch NLB unhealthy-host alarm (#27)
- feat(compute): add ECS auto-scaling with CPU target-tracking policy (#26)</description>
    </item>
    <item>
      <title>ue5-experiments v0.1.1</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/ue5-experiments</link>
      <guid isPermaLink="false">ue5-experiments@v0.1.1</guid>
      <pubDate>Sat, 04 Jul 2026 22:49:56 GMT</pubDate>
      <category>C++</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/ue5-experiments.svg" />
      <description>- feat(PolygonLibrary): 2-D polygon geometry BlueprintPure library (#76)
- feat(InventoryComponent): slot-based stacking inventory (#75)
- feat(ShockwaveRingComponent): expanding evaporating shockwave ring (#74)
- hunt(PulsarComponent): guard divide-by-zero in pulse-period computation (#73)
- feat(DistanceFieldLibrary): pure BlueprintPure SDF primitives and boolean operators (#72)
- feat(SplineLibrary): Catmull-Rom spline evaluation library (#71)
- feat(WaveformLibrary): pure BlueprintPure periodic waveform generators (#70)
- feat(SquishStretchComponent): squish-stretch anticipation animation component (#69)
- hunt(DirectionalMovementComponent): cap DeltaTime in TickComponent (#68)
- hunt(MagneticFieldComponent): fix Euler speed drift with Boris rotation (#67)
- feat(VerletRopeComponent): verlet rope with moveable anchor and wind force (#66)
- feat(MagneticFieldComponent): charged particles gyrating in a magnetic field (#65)</description>
    </item>
    <item>
      <title>LRGQ v0.2.22</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/lrge</link>
      <guid isPermaLink="false">lrge@v0.2.22</guid>
      <pubDate>Sat, 04 Jul 2026 22:48:54 GMT</pubDate>
      <category>C++</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/lrge.svg" />
      <description>- [GD-2] Bug hunt: guard Animator against an out-of-range frame index
- [GD-2] Markdown: render &lt;angle-bracket&gt; URL autolinks
- [GD-2] Bug hunt: reject a non-finite tile collision box on load
- [GD-2] Bug hunt: keep a maximized dock panel&apos;s restore size when minimizing
- [GD-2] chore(editor): tooltip the dock-panel header chrome buttons
- [GD-2] chore(settings): tooltip the appearance-profile + splash-image buttons
- [GD-2] chore(editor): tooltip the Console Output panel&apos;s Clear + Auto-scroll controls
- [GD-2] Bug hunt: keep Console auto-scroll following output past the buffer cap
- [GD-2] feat(editor): add Console Output panel and route Print nodes to it
- [GD-2] Bug hunt: expire coyote time on an upward impulse launch
- [GD-2] Bug hunt: add smoke tests for OnOverlapBegin and OnOverlapEnd nodes
- ﻿[GD-2] feat(editor): add node-body hover tooltip in the Event Graph</description>
    </item>
    <item>
      <title>Forge Engine v0.1.2</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/smol</link>
      <guid isPermaLink="false">smol@v0.1.2</guid>
      <pubDate>Sat, 04 Jul 2026 22:48:53 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/smol.svg" />
      <description>- feat(asset): gamma-correct sRGB mip generation (M9-3 advance) (#194)
- hunt(material): mix node collapsed a vec3 t to its first component (#193)
- feat(audio): distance-attenuation models (linear/inverse/exponential) for spatial gain (M10-2 advance) (#192)
- chore(docs): burndown log Sprint 180 — dry hunt (no new defects) (#191)
- feat(anim): morph-target NORMAL deltas — blend + renormalize, glTF import (M6-7 advance) (#190)
- feat(material): add sqrt/exp/log/tan, radians/degrees, atan2, distance, reflect graph nodes (M4-5 advance) (#189)
- hunt(scene): default a partial transform doc&apos;s missing TRS channel instead of crashing (#188)
- feat(editor): dock splitter handles + drag-resize math (M8-1 advance) (#187)
- hunt(ecs): retire entity ids instead of recycling them (#186)
- hunt(physics): stop dynamic boxes being double-resolved as phantom spheres (#185)
- feat(render): frame-graph core -- pass ordering, culling, resource lifetimes (M3-2 advance) (#181)
- feat(m3-9): TAA history buffer + temporal resolve pass — Sprint 173 (#180)</description>
    </item>
    <item>
      <title>adk-sandbox v0.1.2</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/adk-sandbox</link>
      <guid isPermaLink="false">adk-sandbox@v0.1.2</guid>
      <pubDate>Sat, 04 Jul 2026 22:22:07 GMT</pubDate>
      <category>Python</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/adk-sandbox.svg" />
      <description>- burn: log PR #48 (hunt: api false-match fix) in BURNDOWN/BURN_LOG
- hunt(youtube_shorts_assistant): fix bare &quot;api&quot; false-match in _NICHE_KEYWORDS[&quot;tech&quot;]
- hunt(youtube_shorts_assistant): fix &quot;code&quot;/&quot;web&quot; false-match in _NICHE_KEYWORDS[&quot;tech&quot;]
- hunt(city_data): strip whitespace in format_city before display
- feat(tools): extract shared city_data module from multi_tool_agent
- burn(docs): add Sphinx extension auto-listing root_agent tools per agent
- burn(docs): add per-agent README with adk run + adk web entry points
- burn(sandbox): strip credentials from run_project subprocess env
- feat(deps): pin google-adk&gt;=1.18.0 and google-genai&gt;=1.49.0 in pyproject.toml
- burn: add happy-path tool tests for every agent</description>
    </item>
    <item>
      <title>NetSentry v0.1.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/netsentry</link>
      <guid isPermaLink="false">netsentry@v0.1.0</guid>
      <pubDate>Sat, 04 Jul 2026 22:14:32 GMT</pubDate>
      <category>PowerShell</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/netsentry.svg" />
      <description>- hunt(net): fix Get-NSMaskedIp unmasking compressed IPv6 WAN addresses (#47)
- feat(cloud): NS-CLOUD-9 Audit-IAMDrift.ps1 - GCP project IAM member-drift baseline (#46)
- feat(docs): NS-DOC-1 split Install-Schedule.ps1 SYNOPSIS/DESCRIPTION (#45)
- hunt(secrets): fix AclReadable never consulted in credential-file severity (#44)
- hunt(alerting): fix single-quoted backtick-r-n replace never matching CRLF in Audit-LLMNRSpooler (#43)
- feat(host): NS-HOST-4 Audit-LLMNRSpooler.ps1 - LLMNR + Spooler advisory (#42)
- feat(host): NS-HOST-8 Audit-SoftwareInventory.ps1 - installed-software + hotfix inventory (#41)
- feat(alerting): NS-ALERT-2 severity levels on Send-NSAlert (CRIT/WARN/INFO) (#40)
- feat(detection): NS-DET-4 Watch-NewPersistence.ps1 - service + task creation watch (#39)
- feat(net): NS-NET-8 Watch-WANAddress.ps1 - WAN/public-IP change detection (#38)
- hunt(net): fix Scan-HomeNetwork false anomaly when no baseline exists (#37)
- feat(secrets): NS-SEC-6 Scan-CredentialFiles.ps1 - home-dir credential-file sweep (#36)</description>
    </item>
    <item>
      <title>GCP Terraform Labs v0.1.0</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/gcp-terraform-labs</link>
      <guid isPermaLink="false">gcp-terraform-labs@v0.1.0</guid>
      <pubDate>Wed, 01 Jul 2026 00:56:54 GMT</pubDate>
      <category>HCL</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/gcp-terraform-labs.svg" />
      <description>- ci: add Terraform CI + release workflows and CI badge (#6)
- feat(translate-demo): ephemeral Cloud Translation API env + seed todo.md
- Cloud Run service IAM member
- feat(gemini-demo): ephemeral free-tier Gemini env for adk-sandbox demo (#4)
- BigQuery permissions
- Update TF configs for technical demo backend services
- Add Google Cloud SQL endpoints
- Configuring Cloud SQL / PostgreSQL
- Upgrade provider
- Renaming
- Update README.md
- Edit documentation</description>
    </item>
    <item>
      <title>Workflow Dispatcher v0.1.1</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/cicd-frontend-react-ts</link>
      <guid isPermaLink="false">cicd-frontend-react-ts@v0.1.1</guid>
      <pubDate>Wed, 01 Jul 2026 00:56:02 GMT</pubDate>
      <category>TypeScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/cicd-frontend-react-ts.svg" />
      <description>- ci: add build/lint CI workflow, README status badges, and burndown todo (#3)</description>
    </item>
    <item>
      <title>LRGQ v0.2.21</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/lrge</link>
      <guid isPermaLink="false">lrge@v0.2.21</guid>
      <pubDate>Wed, 01 Jul 2026 00:55:53 GMT</pubDate>
      <category>C++</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/lrge.svg" />
      <description>- ci: add build+test workflow and burndown todo backlog (#189)
- [GD-2] Bug hunt: fix jump-buffer not cleared on player respawn
- ﻿[GD-2] Event Graph: add description tooltips to add-node popup
- [GD-2] feat(editor): add search filter to Blueprint node-add popup
- [GD-2] Event Graph: add Reset exec-in to Do Once node
- [GD-2] Bug hunt: add smoke tests for 16 untested node types
- ﻿[GD-2] Event Graph: Atan2Float + VectorFromAngle nodes
- ﻿[GD-2] Event Graph: StringEquals / StringLength / StringContains nodes
- [GD-2] Bug hunt: fix Print using stale float cache after preceding action
- ﻿[GD-2] Event Graph: wire 11 missing nodes into add-node popup
- [GD-2] Bug hunt: scale bp wire-drop snap radius with canvas zoom
- [GD-2] Bug hunt: fix IsKey pure nodes ignoring wired String key inputs</description>
    </item>
    <item>
      <title>Recall v0.1.1</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/recall</link>
      <guid isPermaLink="false">recall@v0.1.1</guid>
      <pubDate>Wed, 01 Jul 2026 00:55:30 GMT</pubDate>
      <category>JavaScript</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/recall.svg" />
      <description>- ci: add CI workflow, README badge, and burndown backlog (#8)</description>
    </item>
    <item>
      <title>go-labs v0.1.1</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/go-labs</link>
      <guid isPermaLink="false">go-labs@v0.1.1</guid>
      <pubDate>Wed, 01 Jul 2026 00:55:20 GMT</pubDate>
      <category>Go</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/go-labs.svg" />
      <description>- docs(readme): add CI + release status badges (#5)</description>
    </item>
    <item>
      <title>Token Validator v0.1.1</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/token-validator-service</link>
      <guid isPermaLink="false">token-validator-service@v0.1.1</guid>
      <pubDate>Wed, 01 Jul 2026 00:55:18 GMT</pubDate>
      <category>Python</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/token-validator-service.svg" />
      <description>- docs(todo): add burndown backlog (High/Medium/Later + log) (#10)
- feat(desktop): add Electron token-validator desktop UI (#9)</description>
    </item>
    <item>
      <title>adk-sandbox v0.1.1</title>
      <link>https://jm-portfolio-5afqr6ijoq-uc.a.run.app/#/project/adk-sandbox</link>
      <guid isPermaLink="false">adk-sandbox@v0.1.1</guid>
      <pubDate>Wed, 01 Jul 2026 00:55:15 GMT</pubDate>
      <category>Python</category>
      <media:thumbnail url="https://jm-portfolio-5afqr6ijoq-uc.a.run.app/og/adk-sandbox.svg" />
      <description>- chore(infra): add CI badge to README + seed todo.md burndown (#39)
- hunt(youtube_shorts_assistant): fix &quot;data&quot; false-match in _NICHE_KEYWORDS[&quot;tech&quot;]
- hunt(youtube_shorts_assistant): fix first-match niche priority in suggest_hashtags
- hunt(youtube_shorts_assistant): fix &quot;app&quot; false-match in _NICHE_KEYWORDS
- hunt(multi_tool_agent): fix deprecated IANA tz name for Yangon
- hunt(project_builder_agent): strip leading . and _ from npm name
- hunt(conf): exclude BURNDOWN.md and BURN_LOG.md from Sphinx build
- ﻿hunt(project_builder_agent): use sys.executable in run_project
- hunt(claude-readme): fix stale directory-tree comments
- hunt(readme): fix stale agent catalog descriptions
- hunt(project_builder_agent): add __main__ uvicorn entry point to FastAPI template
- hunt(youtube_shorts_assistant): guard estimate_speaking_time against negative word_count</description>
    </item>
  </channel>
</rss>
