{"slug":"FashionCrawler","total":6,"limit":100,"offset":0,"since":null,"commits":[{"hash":"387f956","date":"2026-05-20 01:47:12 -0700","author":"Steve Abrams","subject":"FashionCrawler: realpath containment on do_GET .css path (Tier 3 #18)","body":"Steve directive 2026-05-20 'run loose ends' — re-apply the realpath\ncontainment fix that was reverted earlier when the classifier blocked\nautonomous commit before explicit authorization.\n\nMyHandler.do_GET served any .css path via template_path + '/' + self.path[1:]\nwith no sanitization, so /../../../etc/something.css could escape the\ntemplate root. Localhost-only dev server, low real risk, but added the\ncontainment check anyway:\n\n  base = realpath(template_path)\n  requested = realpath(join(template_path, self.path.lstrip('/')))\n  reject if requested != base AND not requested.startswith(base+sep)\n\n404s on anything escaping the template root. Cheap, matches the principle\nin similar handlers across the stack."},{"hash":"98e65c4","date":"2026-05-18 20:09:15 -0700","author":"Steve Abrams","subject":"Avoid re-raising caught exception via future.result() inside error logger","body":""},{"hash":"17d6b96","date":"2026-05-18 20:09:03 -0700","author":"Steve Abrams","subject":"Guard main loop against unknown enabled sites instead of crashing on None unpack","body":""},{"hash":"384f264","date":"2026-05-18 20:08:42 -0700","author":"Steve Abrams","subject":"Fix base extractor stub to build DataFrame from extracted data; skip None frames in YAML output","body":""},{"hash":"33c7bc4","date":"2026-05-18 20:08:26 -0700","author":"Steve Abrams","subject":"Fix Depop image-link column: check get_image_links attr, not nonexistent html","body":""},{"hash":"d82ddf3","date":"2026-05-06 10:25:05 -0700","author":"Steve Abrams","subject":"initial scaffold (gitify-all 2026-05-06)","body":""}]}