From bc340830fc32582a34086d49fb072c1fe53323a6 Mon Sep 17 00:00:00 2001 From: Dikshant Date: Fri, 2 Oct 2026 19:08:06 -0700 Subject: [PATCH 1/2] WIP checkpoint: release: preserve frozen8488ed4 final public CI and passing early gates (2026-10-02 19:08) --- docs/plans/engineering-team/RESUME.md | 14 +++++++++---- .../evidence/public-release-0.11.0.json | 20 ++++++++++++++++--- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/docs/plans/engineering-team/RESUME.md b/docs/plans/engineering-team/RESUME.md index 495acb3..5113296 100644 --- a/docs/plans/engineering-team/RESUME.md +++ b/docs/plans/engineering-team/RESUME.md @@ -53,6 +53,13 @@ Final root Bash passed259 assertions/11files (50 focused), reference/JSON/ staged+unstaged diff checks passed. Checkpoint/push and exact-head public CI remain. No merge. +Corrected candidate8488ed44ee30c7fa5b2c20370827093715130d36 is pushed. +Final PR CI37088621735 is active; duplicate push37088621359 cancelled. +Freeze this exact remote head until all four jobs succeed. Subsequent local +documentation checkpoints are recovery notes, not a new publication target. +Merge only the exact tested remote head, verify identical merged tree, then +create v0.11.0 assets/tag from the exact merge commit. No tag/release yet. + Rejected private diagnostic RELEASE+cancel cleanup overlapped import and raised stale-phase ConflictError. Independent read-only triage: fail-closed completion fence, no duplicate-writer/false-cancel evidence. No error-time @@ -113,11 +120,10 @@ released run its normal scoped plugin updater and verify0.11.0. ## Exact next action -1. Root integrated watchdog Bash259/affected45/reference/diff/JSON gates pass. - Both receipt/dead-wait test repairs are integrated/reviewed; root33 passes. - Final Bash/JSON/reference/diff checks passed; checkpoint the corrected candidate. +1. Final corrected remote head8488ed4 is frozen; final PR CI37088621735 + is active. All root affected/Bash/reference/JSON/diff gates passed. Core source/full/native/installed gates need no unchanged repeat. -2. Push codex/engineering-team, require final exact-head public CI green: +2. Require final exact-head public CI green: legacy Bash3.2, core Python3.11 and3.14, optional MCP. Earlier CI 37082086201/37082130929 was cancelled after true legacy failure; optional MCP passed, cancelled core is NOT accepted. Core now fetches full history diff --git a/docs/plans/engineering-team/evidence/public-release-0.11.0.json b/docs/plans/engineering-team/evidence/public-release-0.11.0.json index 7884de0..c824016 100644 --- a/docs/plans/engineering-team/evidence/public-release-0.11.0.json +++ b/docs/plans/engineering-team/evidence/public-release-0.11.0.json @@ -1,7 +1,7 @@ { "schema_version": 1, "recorded_on": "2026-10-02", - "status": "delivery_phase_corrected_root_gate_passed_next_public_ci_pending", + "status": "delivery_phase_corrected_final_exact_head_public_ci_active", "authorization": "User chose public GitHub release in existing joshidikshant/devsquad; no package registry or hosted service", "pull_request": "https://github.com/joshidikshant/devsquad/pull/1", "frozen_core_candidate": "b83dda7fbf691503d3adf3c9ea6ecebd4071ba16", @@ -161,7 +161,7 @@ "antigravity": "agyCLI1.2.14 updated-release MCP status verified; automatic worker roles unverified and IDE out of scope", "whole_plan": "not complete" }, - "remaining": "Final Bash/JSON/reference/diff checks passed. Checkpoint and push delivery-test-corrected candidate. Require all final exact-head public CI jobs green; merge PR1, publish exact-merge verified v0.11.0 assets, scoped local Claude plugin update. Preserve unconfirmed diagnostic concurrency follow-up plus original Council/desktop/MCP reconnect residuals separately.", + "remaining": "Corrected8488ed4 pushed; final PR CI37088621735 active. Require all four exact-head public CI jobs green; merge PR1, publish exact-merge verified v0.11.0 assets, scoped local Claude plugin update. Preserve unconfirmed diagnostic concurrency follow-up plus original Council/desktop/MCP reconnect residuals separately.", "integrated_legacy_gate": { "source_checkpoint": "3fdc6bd065c577a9ed59566573fdce399e9b585a", "adapter_blob": "1847357c19677f276b06886386e2ac93e586b203", @@ -354,7 +354,21 @@ } }, "reference_json_staged_unstaged_diff": "passed", - "next_public_ci": "pending" + "next_public_ci": "37088621735_active_on8488ed44ee30c7fa5b2c20370827093715130d36" + }, + "publication_candidate_ci": { + "head": "8488ed44ee30c7fa5b2c20370827093715130d36", + "run_id": 37088621735, + "url": "https://github.com/joshidikshant/devsquad/actions/runs/37088621735", + "status": "active_not_yet_accepted", + "duplicate_push_run": 37088621359, + "duplicate_push_status": "completed_cancelled", + "legacy": "completed_success", + "optional_mcp": "completed_success", + "required": ["Legacy Bash 3.2", "Core Python 3.11", "Core Python 3.14", "Optional MCP 2.2.0"], + "core_tree": "62eea7fa31153ef732fd5e9dfd97951d95b367d8", + "plugin_tree": "940e792825cca45d82135bc1caf738924b1d176c", + "later_local_docs_checkpoints": "Recovery metadata only; do not merge/tag an untested changed remote head" }, "diagnostic_cleanup_overlap_triage": { "source": "independent read-only code/output triage; no new probes", From befc7e8a00c9b9251af0a83e3a77f12adae5db11 Mon Sep 17 00:00:00 2001 From: Dikshant Date: Fri, 2 Oct 2026 19:37:40 -0700 Subject: [PATCH 2/2] WIP checkpoint: release: correct Claude hook envelope in0.11.1 with actual validator and offline regressions (2026-10-02 19:37) --- .claude-plugin/marketplace.json | 4 +- CHANGELOG.md | 10 ++ CONTRIBUTING.md | 4 + docs/plans/engineering-team/RESUME.md | 56 ++++++----- docs/plans/engineering-team/backlog.json | 6 +- .../evidence/public-release-0.11.0.json | 97 ++++++++++++++++-- .../evidence/public-release-0.11.1.json | 36 +++++++ plugin/.claude-plugin/plugin.json | 2 +- plugin/hooks/hooks.json | 98 ++++++++++--------- test/test_m7_packaging.sh | 57 +++++++++++ 10 files changed, 287 insertions(+), 83 deletions(-) create mode 100644 docs/plans/engineering-team/evidence/public-release-0.11.1.json diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 4021e6b..7d54827 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -5,14 +5,14 @@ }, "metadata": { "description": "DevSquad - Engineering Manager that coordinates AI coding agents", - "version": "0.11.0" + "version": "0.11.1" }, "plugins": [ { "name": "devsquad", "source": "./plugin", "description": "Engineering Manager that coordinates AI coding agents through enforced delegation", - "version": "0.11.0" + "version": "0.11.1" } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 51d7da0..829ce21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to DevSquad are documented here. > **Note:** Project was renumbered from 2.x to 0.x semver in Feb 2026 to reflect pre-stable status. Entries below have been renumbered accordingly. +## [0.11.1] — 2026-10-02 + +### Fixed +- Wrap the Claude plugin hook events in the required top-level `hooks` object. + Claude's actual plugin validator rejected the old event-only file during + the post-release local update. Hook commands, matchers and timeouts are + unchanged; the standalone core remains 0.1.0 with the same payload. +- Offline packaging checks now reject the old hook shape and verify the + four hook registrations and consistent marketplace/plugin versions. + ## [0.11.0] — 2026-10-02 ### Added diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b46285a..6af89a2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -64,3 +64,7 @@ tests cover Claude-free installation, idempotence, actual payload drift, plugin contents and an active run surviving a release switch. The operator commands and supported/deferred surface boundaries live in [docs/RUNTIME-GUIDE.md](docs/RUNTIME-GUIDE.md). + +When Claude is installed, run `claude plugin validate ./plugin` before +publication and validate the actual installed plugin after its normal update. +An updater exit code of zero alone does not prove that plugin hooks loaded. diff --git a/docs/plans/engineering-team/RESUME.md b/docs/plans/engineering-team/RESUME.md index 5113296..ff7af57 100644 --- a/docs/plans/engineering-team/RESUME.md +++ b/docs/plans/engineering-team/RESUME.md @@ -9,7 +9,9 @@ reset or restart from main. Detailed receipts and failed gates remain in evidenc The user authorized a public **GitHub release in joshidikshant/devsquad**. Release v0.11.0 ships plugin0.11.0 and standalone core0.1.0; no registry or hosted service. PR1: https://github.com/joshidikshant/devsquad/pull/1. -Publication is pending final public CI, merge and exact-commit release assets. +v0.11.0 is published and assets verified, but actual local Claude update found +a plugin hook-envelope defect. A narrow0.11.1 correction is now locally tested +and independently reviewed; publication/update of that correction is next. The whole engineering-team plan remains incomplete. Latest public CI37084805784 on5a576d3: Bash259/11 files (50 focused) and @@ -54,11 +56,26 @@ staged+unstaged diff checks passed. Checkpoint/push and exact-head public CI remain. No merge. Corrected candidate8488ed44ee30c7fa5b2c20370827093715130d36 is pushed. -Final PR CI37088621735 is active; duplicate push37088621359 cancelled. -Freeze this exact remote head until all four jobs succeed. Subsequent local -documentation checkpoints are recovery notes, not a new publication target. -Merge only the exact tested remote head, verify identical merged tree, then -create v0.11.0 assets/tag from the exact merge commit. No tag/release yet. +Final PR CI37088621735 passed all four jobs: Bash259/11, optionalMCP23/4.656s +(one optional skip), Python3.11.9 full604/804.964s and Python3.14.7 full604/ +1110.004s (two SDK skips each/no failures/errors/unraisable). PR1 merged as +e7ec4ce9f889dc5fa083fe4289b5bfc3d424edfa; treebc76f192 equals tested8488. +v0.11.0 published2026-10-03T02:29:54Z, release402283042; tag exactmerge, +not draft/prerelease, source/plugin header hashes match. All three downloaded +assets and SHA256SUMS match. Source/plugin/wheel hashes are in public evidence. +Duplicate push/main CI was cancelled after tree equality, not accepted. + +Actual scoped Claude updater installed0.11.0/enabled/exit0, but plugin list +and actual installed validator failed: hooks expected record/undefined. +Old hooks/hooks.json lacked outer hooks object. v0.11.0 notes now disclose it; +retain original tag/assets. Corrective0.11.1 only wraps existing event map, +bumps three metadata versions and adds offline shape/negative/version tests. +Core tree62ee unchanged, commands/matchers/timeouts exactly unchanged. +Six-file diff0542f696c655c801a541d6b7066e37bddf2ea59066a83c4f0ab1bf992ad509da +independently reviewed clean. Actual Claude2.1.220 corrected validator passes; +independent exact-old shape exits1, corrected exits0/.362s, packaging9 passes. +Root Bash261/11 passes. Checkpoint/push/PR2/fullCI/merge0.11.1 and actual +installed no-error validation remain. Original core/full/live gates stay valid. Rejected private diagnostic RELEASE+cancel cleanup overlapped import and raised stale-phase ConflictError. Independent read-only triage: fail-closed @@ -115,25 +132,20 @@ This chat's existing Codex MCP server returned SCHEMA_UNSUPPORTED because it still uses an old package. New CLI and agy succeed on the same saved run. A scoped DevSquad-only reconnect request is pending; do not change global settings or repeatedly probe the unchanged old connection. This does not block -the public CLI release. Local Claude plugin is still0.10.0: after main is -released run its normal scoped plugin updater and verify0.11.0. +the public CLI release. Local Claude plugin is0.11.0 but has the confirmed +hook load error above; complete0.11.1 and verify actual installed validation +and plugin list without errors. Do not claim local plugin usability yet. ## Exact next action -1. Final corrected remote head8488ed4 is frozen; final PR CI37088621735 - is active. All root affected/Bash/reference/JSON/diff gates passed. - Core source/full/native/installed gates need no unchanged repeat. -2. Require final exact-head public CI green: - legacy Bash3.2, core Python3.11 and3.14, optional MCP. Earlier CI - 37082086201/37082130929 was cancelled after true legacy failure; optional - MCP passed, cancelled core is NOT accepted. Core now fetches full history - for immutable migration fixtures and uses the tracked failfast runner. -3. Merge PR1 with exact-head fence without deleting engineering branch. Build - source/plugin archives from exact merged commit; old b83 archives are stale. - The unchanged-core wheel may be reused only after tree/hash verification. -4. Publish v0.11.0 on that exact merge SHA with verified assets/SHA256SUMS. - Verify tag, published-not-draft state and downloaded asset hashes. Update - release evidence/backlog/this checkpoint and local Claude plugin. End clean. +1. Checkpoint/push independently reviewed0.11.1 hook correction. Create PR2 + to main and freeze its exact head for final all-four public CI gates. +2. Merge exact tested head, prove merged tree equality; regenerate source/ + plugin0.11.1 archives from exact merge, reuse unchanged core wheel only + after tree/hash equality. Publish/verify tag, release and downloads. +3. Normal scoped Claude plugin update, actual installed validator and plugin + list must have no load errors. Update evidence/backlog/checkpoint, end clean. + Core source/full/native/installed/provider gates need no unchanged repeat. ## Residual scope and boundaries diff --git a/docs/plans/engineering-team/backlog.json b/docs/plans/engineering-team/backlog.json index 7cc1106..b0dfa1a 100644 --- a/docs/plans/engineering-team/backlog.json +++ b/docs/plans/engineering-team/backlog.json @@ -21,7 +21,7 @@ "status": "partial", "artifact": "evidence/public-release-0.11.0.json", "scope": "R3-R6 core runtime accepted: frozen604-test core, exact native EOF audit clean/accepted, pristine trusted-check integrity, installed schema17/no drift, nine actual installed SDK tests, updated agy1.2.14 actual MCP status. Legacy watchdog3fdc6bd independently reviewed and integrated without core source changes. Earlier accepted Claude delivery/handoff and Grok receipts retained separately.", - "next_action": "Complete final integrated Bash/affected checks, exact-head public CI, PR1 merge and verified v0.11.0 GitHub release; normal local Claude plugin update. Preserve original R7/C1 and R8 residual gates separately; do not repeat unchanged accepted proofs.", + "next_action": "v0.11.0 final public CI/PR1 merge/tag/downloaded assets passed. Normal local plugin update exposed missing hooks envelope; narrow0.11.1 correction reviewed/actual validator/Bash261 passed. Finish exact-head CI/PR2 merge/corrective release and actual installed plugin no-error validation. Preserve original R7/C1 and R8 residual gates separately; do not repeat unchanged accepted proofs.", "limitations": "Whole-plan closure is not claimed. Council is integrated/offline-tested but native-unavailable, comparison inconclusive and automaticOFF. Claude Code-tab proof remains unverified/TCC. Antigravity means agy CLI, not IDE; Grok/agy MCP status does not prove automatic writer/reviewer roles. Current CodexApp MCP connection needs DevSquad-only reconnect after schema17 upgrade. Jev off/single pilot spent; no paid API fallback or reset use authorized." }, "planning_checkpoint": { @@ -49,7 +49,7 @@ {"id": "R5", "title": "Public saved-run outcomes and bounded experiments", "status": "complete", "milestones": ["M6"], "depends_on": ["R3", "R4"], "items": ["G1"], "evidence": "evidence/R5-closure-2026-10-02.json", "checkpoint": "Accepted dfe9976/source equivalent f87060b and installed schema16. Initial native findings repaired; exact follow-up e046a174 clean/accepted. Full 504 tests/511.241s, two optional SDK skips/no errors/failures/unraisable; nine actual installed SDK tests pass/no skips. Public complete trial/evaluate/qualify/promote/new-run/held-out regression/rollback, shared call/active deadline and all terminal projection origins pass. Safe old-schema upgrade and idempotence/drift gates pass. Failed history retained; automatic experimentation and Jev stay off."}, {"id":"R6","title":"Normal terminal experience and readiness","status":"complete","milestones":["M5","M7"],"depends_on":["R1","R2","R4","R5"],"items":["G3","G4"],"evidence":"evidence/public-release-0.11.0.json","checkpoint":"Accepted core terminal/readiness package: exact native EOF cb68 succeeded22/clean, pristine60 trusted-check integrity, frozen604 full tests/793.462s and installed schema17/nine SDK tests/no drift. Independently reviewed legacy watchdog3fdc6bd integrated with unchanged core tree;259 Bash/45 affected agent gates pass, root integrated gates recorded in release evidence. Public CI/publication remain release gates; desktop UI/Council residuals remain separate."}, {"id":"R7","title":"Complete Council within existing runner","status":"in_progress","milestones":["C1"],"depends_on":["R1","R2","R3","R4","R5","R6"],"items":["G5"],"checkpoint":"Council reconciliation0e7dd319/EOF4f integrated, schema17 actually installed; mechanical comparison/cancel/recovery/old16 fences and frozen604 core gate pass. Final nongenerating diagnostic exhausted: sandbox network_request_failed/noHTTP and unsandboxed strict-response rejection, zero generating calls. Native quality/usage unavailable; fixture comparison inconclusive; automaticOFF. No more network attempts or permission widening. Original C1 native acceptance remains incomplete, not a core-publication blocker under user-selected release scope."}, - {"id":"R8","title":"Installed proofs, external gates and closure audit","status":"in_progress","milestones":["M4","M5","M6","M7","C1"],"depends_on":["R1","R2","R3","R4","R5","R6"],"items":[],"note":"Core installed proofs may proceed before R7; full-delivery closure also requires R7. Auth/key-dependent subgates remain separately blocked.","evidence":"evidence/R8-installed-workflows-2026-10-01.json","checkpoint":"Safe updated schema17 install/no drift/nine actual SDK tests and updated agy1.2.14 actual saved-run MCP proof accepted; earlier live Claude handoff/delivery and Grok MCP retained. PR1/v0.11.0 public release pending exact-head CI/merge/assets. Existing CodexApp old MCP server needs scoped reconnect; Claude desktop Code-tab/TCC and whole-plan closure remain separate."} + {"id":"R8","title":"Installed proofs, external gates and closure audit","status":"in_progress","milestones":["M4","M5","M6","M7","C1"],"depends_on":["R1","R2","R3","R4","R5","R6"],"items":[],"note":"Core installed proofs may proceed before R7; full-delivery closure also requires R7. Auth/key-dependent subgates remain separately blocked.","evidence":"evidence/R8-installed-workflows-2026-10-01.json","checkpoint":"Safe updated schema17 install/no drift/nine actual SDK tests and updated agy1.2.14 actual saved-run MCP proof accepted; earlier live Claude handoff/delivery and Grok MCP retained. PR1/v0.11.0 public CI/merge/release/download checks passed. Actual local plugin update found hook envelope defect; reviewed narrow0.11.1 correction/validator/Bash261 pass, final CI/release/installed validation pending (public-release-0.11.1 evidence). Existing CodexApp old MCP server needs scoped reconnect; Claude desktop Code-tab/TCC and whole-plan closure remain separate."} ], "milestones": [ { @@ -245,7 +245,7 @@ "availability": "portable_redacted" } ], - "blocker": "Claude authentication and actual CLI/MCP handoff now pass. Claude local Code-tab operation remains unverified. The user's October 2 clarification excludes Antigravity IDE: verify the updated agy CLI against the final accepted installation. Portable Claude CLI proof is not substituted for the local Code-tab proof." + "blocker": "Claude authentication and actual CLI/MCP handoff pass; updated agy1.2.14 CLI against schema17 is verified and IDE excluded. Claude local Code-tab operation remains unverified; current CodexApp DevSquad-only reconnect remains. Portable Claude CLI proof is not substituted for local Code-tab proof." }, { "id": "M5", diff --git a/docs/plans/engineering-team/evidence/public-release-0.11.0.json b/docs/plans/engineering-team/evidence/public-release-0.11.0.json index c824016..c3df7e6 100644 --- a/docs/plans/engineering-team/evidence/public-release-0.11.0.json +++ b/docs/plans/engineering-team/evidence/public-release-0.11.0.json @@ -1,7 +1,7 @@ { "schema_version": 1, "recorded_on": "2026-10-02", - "status": "delivery_phase_corrected_final_exact_head_public_ci_active", + "status": "published_verified_core_plugin_hook_issue_found_corrective0111_pending", "authorization": "User chose public GitHub release in existing joshidikshant/devsquad; no package registry or hosted service", "pull_request": "https://github.com/joshidikshant/devsquad/pull/1", "frozen_core_candidate": "b83dda7fbf691503d3adf3c9ea6ecebd4071ba16", @@ -161,7 +161,7 @@ "antigravity": "agyCLI1.2.14 updated-release MCP status verified; automatic worker roles unverified and IDE out of scope", "whole_plan": "not complete" }, - "remaining": "Corrected8488ed4 pushed; final PR CI37088621735 active. Require all four exact-head public CI jobs green; merge PR1, publish exact-merge verified v0.11.0 assets, scoped local Claude plugin update. Preserve unconfirmed diagnostic concurrency follow-up plus original Council/desktop/MCP reconnect residuals separately.", + "remaining": "v0.11.0 published and downloaded asset hashes verified; standalone core works. Scoped local plugin updater installed0.11.0, but actual loader/validator exposed missing hooks envelope. Preserve original tag/assets, publicly note issue, complete reviewed/tested0.11.1 corrective release and verify actual installed plugin without load errors. Original Council/desktop/MCP reconnect residuals remain separate.", "integrated_legacy_gate": { "source_checkpoint": "3fdc6bd065c577a9ed59566573fdce399e9b585a", "adapter_blob": "1847357c19677f276b06886386e2ac93e586b203", @@ -354,21 +354,104 @@ } }, "reference_json_staged_unstaged_diff": "passed", - "next_public_ci": "37088621735_active_on8488ed44ee30c7fa5b2c20370827093715130d36" + "next_public_ci": "37088621735_completed_success_on8488ed44ee30c7fa5b2c20370827093715130d36" }, "publication_candidate_ci": { "head": "8488ed44ee30c7fa5b2c20370827093715130d36", "run_id": 37088621735, "url": "https://github.com/joshidikshant/devsquad/actions/runs/37088621735", - "status": "active_not_yet_accepted", + "status": "completed_success_all_four_jobs_accepted", "duplicate_push_run": 37088621359, "duplicate_push_status": "completed_cancelled", - "legacy": "completed_success", - "optional_mcp": "completed_success", + "legacy": { + "status": "completed_success", + "job_id": 111103957387, + "assertions": 259, + "files": 11, + "focused_legacy_assertions": 50, + "timings_seconds": {"fast": 0.348, "ignored_TERM": 0.301, "pre_open_cancel": 0.257, "TERM_resistant": 3.389, "slow_ps": 1.429} + }, + "optional_mcp": { + "status": "completed_success", + "job_id": 111103957249, + "tests": 23, + "seconds": 4.656, + "skips": 1, + "failures": 0, + "errors": 0 + }, + "python311": { + "version": "3.11.9", + "status": "completed_success", + "job_id": 111103957440, + "tests": 604, + "seconds": 804.964, + "monotonic_seconds": 805.4974165420003, + "utc_seconds": 805.497415, + "skips": 2, + "failures": 0, + "errors": 0, + "unraisable": [] + }, + "python314": { + "version": "3.14.7", + "status": "completed_success", + "job_id": 111103957414, + "tests": 604, + "seconds": 1110.004, + "monotonic_seconds": 1110.538552125, + "utc_seconds": 1110.538559, + "skips": 2, + "failures": 0, + "errors": 0, + "unraisable": [] + }, "required": ["Legacy Bash 3.2", "Core Python 3.11", "Core Python 3.14", "Optional MCP 2.2.0"], "core_tree": "62eea7fa31153ef732fd5e9dfd97951d95b367d8", "plugin_tree": "940e792825cca45d82135bc1caf738924b1d176c", - "later_local_docs_checkpoints": "Recovery metadata only; do not merge/tag an untested changed remote head" + "later_local_docs_checkpoints": "Recovery metadata only; merge/tag target is the exact accepted8488ed4 and identical-tree merge" + }, + "publication_merge": { + "commit": "e7ec4ce9f889dc5fa083fe4289b5bfc3d424edfa", + "merged_at": "2026-10-03T02:27:18Z", + "tree": "bc76f192e3bcc7ce4528a040d7e58740278fbb32", + "equals_tested_candidate_tree": true, + "core_and_plugin_trees_unchanged": true, + "duplicate_main_push_run": 37089867565, + "duplicate_main_push_disposition": "completed_cancelled_after_exact_merge_tree_equality; not a passing gate" + }, + "published_release": { + "id": 402283042, + "url": "https://github.com/joshidikshant/devsquad/releases/tag/v0.11.0", + "tag": "v0.11.0", + "tag_commit": "e7ec4ce9f889dc5fa083fe4289b5bfc3d424edfa", + "published_at": "2026-10-03T02:29:54Z", + "is_draft": false, + "is_prerelease": false, + "all_downloaded_checksums_verified": true, + "archive_commit_headers_match_tag": true, + "assets": [ + {"name": "devsquad-0.11.0-source.tar.gz", "bytes": 2728324, "sha256": "1f09c0d9e4d1e112b3895749344e41a40e25a97a527e1143c78d2eea92ffdf96"}, + {"name": "devsquad-plugin-0.11.0.tar.gz", "bytes": 307117, "sha256": "47d758d6896c97c5d21c54cc123e2c971d061d3029ac95d688d97e92c0dd724a"}, + {"name": "devsquad_core-0.1.0-py3-none-any.whl", "bytes": 272189, "sha256": "611086b51604f29b7964e05affbcd70ffa481299b04f645cd9ac2315b2c8bf77"}, + {"name": "SHA256SUMS", "bytes": 295, "sha256": "182a184f75fdca8486246a5e62558fa017d36ccb7bb6e04b4a458298ca8f45fc"} + ], + "private_asset_proof_sha256": "5c8e501f6a0b973bc170dbbf796d03710d1eb0fcfc0e91ceb35fa5e671a4d319", + "bounded_privacy": "No credential/raw-log/cache/database files or recognizable credentials; historical path references retained as filenames only", + "wheel": "Reused only after exact core tree/file equality; all11schemas/17migrations match, digest303a0e0a6c87" + }, + "local_plugin_update": { + "scope": "user; only devsquad@devsquad-marketplace", + "updater_exit": 0, + "installed_version": "0.11.0", + "enabled": true, + "load_error": "Hook load failed: hooks expected record received undefined", + "actual_installed_validator_exit": 1, + "root_cause": "hooks/hooks.json event map missing required outer hooks object", + "standalone_core_affected": false, + "corrective_version": "0.11.1", + "corrected_source_validator": "passed", + "no_successful_plugin_load_claim": true }, "diagnostic_cleanup_overlap_triage": { "source": "independent read-only code/output triage; no new probes", diff --git a/docs/plans/engineering-team/evidence/public-release-0.11.1.json b/docs/plans/engineering-team/evidence/public-release-0.11.1.json new file mode 100644 index 0000000..5c0d0cb --- /dev/null +++ b/docs/plans/engineering-team/evidence/public-release-0.11.1.json @@ -0,0 +1,36 @@ +{ + "schema_version": 1, + "recorded_on": "2026-10-02", + "status": "narrow_hook_envelope_correction_local_pass_review_ci_pending", + "authorization": "Corrective patch within authorized public GitHub release and safe local plugin update; preserve original0.11.0 tag/assets", + "baseline_release": "https://github.com/joshidikshant/devsquad/releases/tag/v0.11.0", + "failure": { + "installed_plugin": "0.11.0", + "claude_version": "2.1.220", + "updater_exit": 0, + "loader": "Hook load failed: hooks expected record received undefined", + "actual_installed_validator_exit": 1, + "cause": "Old event-only hooks/hooks.json omitted the required top-level hooks object", + "official_format": "https://code.claude.com/docs/en/hooks#hook-locations" + }, + "patch": { + "diff_sha256": "0542f696c655c801a541d6b7066e37bddf2ea59066a83c4f0ab1bf992ad509da", + "hook_blob": "fdbd2f3299951aa4e98c2bb354ae05667e8939f0", + "packaging_test_blob": "95d6361f96c51cacd8236c86149ffc5f729f25b5", + "scope": "Required hooks envelope, plugin/marketplace0.11.1, changelog/release validation instructions, offline envelope/negative-shape/version tests", + "commands_matchers_timeouts": "unchanged", + "core_tree": "62eea7fa31153ef732fd5e9dfd97951d95b367d8", + "core_payload_digest": "303a0e0a6c87ff472d1d7b52cb63ea56798a11f345f483736a18669c5f4d2a52", + "core_runtime_changes": 0 + }, + "local": { + "actual_claude_source_validator": "passed", + "offline_packaging_assertions": 9, + "old_event_only_shape": "rejected", + "independent_review": "clean; frozen six-file diff and blobs unchanged before/after bounded independent checks", + "independent_event_values": "parsed exact equality to old inner event map; commands/matchers/timeouts unchanged", + "independent_actual_validator": {"claude": "2.1.220", "corrected_exit": 0, "corrected_seconds": 0.362, "exact_old_shape_exit": 1, "exact_old_shape_seconds": 0.237}, + "root_bash": {"assertions": 261, "files": 11, "failures": 0, "timings_seconds": {"fast": 0.280, "ignored_TERM": 0.236, "pre_open_cancel": 0.218, "TERM_resistant": 3.269, "slow_ps": 1.315}} + }, + "remaining": "Complete independent review/Bash checkpoint, push corrected candidate and PR2; final exact-head public CI, merge, verified0.11.1 assets, actual installed plugin validation and zero loader errors. Do not rerun unchanged paid/live workflows or claim whole-plan completion." +} diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json index bd2b19d..38ad1a0 100644 --- a/plugin/.claude-plugin/plugin.json +++ b/plugin/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "devsquad", - "version": "0.11.0", + "version": "0.11.1", "description": "Engineering Manager that coordinates AI coding agents through enforced delegation", "author": { "name": "Dikshant Joshi", diff --git a/plugin/hooks/hooks.json b/plugin/hooks/hooks.json index bcf36d8..fdbd2f3 100644 --- a/plugin/hooks/hooks.json +++ b/plugin/hooks/hooks.json @@ -1,50 +1,52 @@ { - "SessionStart": [ - { - "matcher": "", - "hooks": [ - { - "type": "command", - "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-start.sh", - "timeout": 15 - } - ] - } - ], - "PreCompact": [ - { - "matcher": "", - "hooks": [ - { - "type": "command", - "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-compact.sh", - "timeout": 15 - } - ] - } - ], - "PreToolUse": [ - { - "matcher": "Read|WebSearch|Bash|Task", - "hooks": [ - { - "type": "command", - "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-tool-use.sh", - "timeout": 15 - } - ] - } - ], - "Stop": [ - { - "matcher": "", - "hooks": [ - { - "type": "command", - "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/stop.sh", - "timeout": 15 - } - ] - } - ] + "hooks": { + "SessionStart": [ + { + "matcher": "", + "hooks": [ + { + "type": "command", + "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-start.sh", + "timeout": 15 + } + ] + } + ], + "PreCompact": [ + { + "matcher": "", + "hooks": [ + { + "type": "command", + "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-compact.sh", + "timeout": 15 + } + ] + } + ], + "PreToolUse": [ + { + "matcher": "Read|WebSearch|Bash|Task", + "hooks": [ + { + "type": "command", + "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-tool-use.sh", + "timeout": 15 + } + ] + } + ], + "Stop": [ + { + "matcher": "", + "hooks": [ + { + "type": "command", + "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/stop.sh", + "timeout": 15 + } + ] + } + ] + } } diff --git a/test/test_m7_packaging.sh b/test/test_m7_packaging.sh index dd84f7b..95d6361 100755 --- a/test/test_m7_packaging.sh +++ b/test/test_m7_packaging.sh @@ -63,5 +63,62 @@ else fail "all packaged schemas must parse and retain stable identifiers" fi +if python3 - "$REPO_ROOT/plugin" <<'PY' >/dev/null 2>&1 +import json +from pathlib import Path +import sys +root = Path(sys.argv[1]) +expected = { + "SessionStart": ("", "session-start.sh"), + "PreCompact": ("", "pre-compact.sh"), + "PreToolUse": ("Read|WebSearch|Bash|Task", "pre-tool-use.sh"), + "Stop": ("", "stop.sh"), +} + +def validate(value): + assert set(value) == {"hooks"} + events = value["hooks"] + assert isinstance(events, dict) and set(events) == set(expected) + for event, (matcher, script) in expected.items(): + assert events[event] == [{ + "matcher": matcher, + "hooks": [{"type": "command", "command": + "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/" + script, + "timeout": 15}], + }] + assert (root / "hooks" / "scripts" / script).is_file() + +value = json.loads((root / "hooks" / "hooks.json").read_text()) +validate(value) +# The pre-0.11.1 event-only file must fail, not silently lose all hooks. +try: + validate(value["hooks"]) +except AssertionError: + pass +else: + raise AssertionError("legacy event-only hook file was accepted") +PY +then + pass +else + fail "plugin hooks need the loader's hooks envelope and exactly four stable registrations" +fi + +if python3 - "$REPO_ROOT" <<'PY' >/dev/null 2>&1 +import json +from pathlib import Path +import sys +root = Path(sys.argv[1]) +plugin = json.loads((root / "plugin/.claude-plugin/plugin.json").read_text()) +marketplace = json.loads((root / ".claude-plugin/marketplace.json").read_text()) +entry = next(item for item in marketplace["plugins"] if item["name"] == plugin["name"]) +assert plugin["version"] == entry["version"] == marketplace["metadata"]["version"] +PY +then + pass +else + fail "plugin and both marketplace versions must match" +fi + echo " m7_packaging: ${PASS} passed, ${FAIL} failed" [ "$FAIL" -eq 0 ]