mirror of
https://github.com/niels-emmer/myace.git
synced 2026-09-13 23:53:30 +02:00
[PR #99] [MERGED] fix: prevent stale SPA shell from resurrecting fixed frontend bugs #99
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
github-mirrors/myace#99
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/niels-emmer/myace/pull/99
Author: @niels-emmer
Created: 8/14/2026
Status: ✅ Merged
Merged: 8/14/2026
Merged by: @niels-emmer
Base:
main← Head:fix/stale-spa-shell-and-safari-blob-download📝 Commits (2)
681afacdocs: rewrite adapters research as current-state adapter referencec0bf340fix: prevent stale SPA shell from resurrecting fixed bugs; defer blob revoke for Safari downloads📊 Changes
9 files changed (+356 additions, -330 deletions)
View changed files
📝
README.md(+7 -9)➖
docs/ADAPTERS_RESEARCH.md(+0 -313)📝
docs/README.md(+4 -3)➕
docs/adapters-research.md(+313 -0)📝
docs/extending.md(+2 -2)📝
frontend/nginx.conf(+18 -0)📝
frontend/src/pages/TargetExporter.test.tsx(+5 -1)📝
frontend/src/pages/TargetExporter.tsx(+6 -1)📝
scripts/sync_wiki.py(+1 -1)📄 Description
Summary
compile_profile()called directly in the backend container) both confirmed the server-side fix is correct and complete — the discrepancy is a stale browser tab/cache serving the pre-#95 frontend bundle, which nothing was forcing to refresh.nginx.confservedindex.htmlwith noCache-Controlheader, so a browser that already loaded the app could keep running an old cached shell (pointing at a JS bundle hash that no longer exists after the next deploy) indefinitely — a normal reload doesn't guarantee a refetch, and users have no way to know their tab is stale. Nowindex.htmlisCache-Control: no-cache(always revalidate) and hashed/assets/*files get long-lived immutable caching, so every deploy is picked up on next load.TargetExporter.tsx:URL.revokeObjectURL()was called synchronously right aftera.click(), which races Safari's native "Save As" dialog — WebKit needs the blob to stay alive until the user responds, so an immediate revoke can make that save fail or truncate. Revocation is now deferred by one tick.Test plan
npm run lintandnpx vitest runpass (updated the download test to await the now-deferredrevokeObjectURLcall)myace-frontendcontainer; confirmedindex.htmlsendsCache-Control: no-cacheand/assets/*.jssendspublic, max-age=31536000, immutablecompile_profile()call against the real "IAC expert" profile (base Software Engineer + 4 additional collections) withtarget=claude-code: correctly produces 35 files (proper CLAUDE.md, individual.claude/skills/*/SKILL.md,.claude/agents/*.md,.claude/commands/*.md), not a single AGENTS.md🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.