{"content":"Development journal for commit ea7f66ad (feat(metaapp): DSH update-app tool, richer publish approval, and 60s write idempotency).\n\nMetaApp publish/edit parity round 1 (P0). DSH gains bot_browser_update_app: new versions of Bot-owned apps over the stable metaapp:// URI, with ownership verified against the owner list (refuses detached modify pins), target resolution from the fork marker, and the same APP.md/preview/approval discipline as publish. Publish and update now dry-run the project without --confirm and show entry file, package size, and fork provenance in the DSH approval dialog; preflight failures surface before the dialog. Core gains a metaapp write guard (IDBots parity): 60s idempotency window keyed on a stable write hash plus per-app modify/revoke locks, wired into all five daemon publish/update/delete paths so LLM retries and double-clicks cannot double-write the chain. Verification: tests/metaapp/* (142), tests/metaAppSearchApi (14), dsh-plugin/tests/* (330) all green.\n\nVerification:\nnpm run build && node --test --test-concurrency=1 'tests/metaapp/*.test.mjs' tests/metaAppSearchApi.test.mjs && npm --prefix dsh-plugin run build && node --test --test-concurrency=1 'dsh-plugin/tests/*.test.mjs'\n\nFiles:\ndsh-plugin/README.md\ndsh-plugin/src/browser-context.ts\ndsh-plugin/src/browser-tools.ts\ndsh-plugin/tests/browser-tools.test.mjs\nsrc/core/metaapp/ownerService.ts\nsrc/core/metaapp/publish.ts\nsrc/core/metaapp/writeGuard.ts\nsrc/daemon/defaultHandlers.ts\ntests/metaapp/ownerService.test.mjs\ntests/metaapp/publish.test.mjs\ntests/metaapp/writeGuard.test.mjs","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}