chore: sync private v5.2.0 (be846d5) - #43
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
v5.2.0.sync/v5.2.0-be846d5.Release notes
Added
node --testsuites (plan-external-review-progress-gate.test.mjs,check-public-deny-links.test.mjs,verify-cli-dashboard-pack.test.mjs,git-hooks-pre-commit-composed.test.mjs) viapnpm test:root-node. Scan scripts themselves already ran in CI.guards.d.mtsnow declares everyexport functionandexport constfromdashboard/lib/guards.mjs(49/49), pinned bypackages/cli/src/dashboard/guards-dts-parity.test.ts.pnpm overlay:hashes(root) /npm run overlay:hashes(packages/cli,src/lifecycle/refresh-known-hashes.ts) appends missing consumer-overlay content hashes toKNOWN_SHIPPED_OVERLAY_HASHESafter L0 command/agent/skill body edits, enumerating the same sources as the overlay coverage tests (L0 overlay artifacts + registry skills core/community). Append-only (existing entries and inline comments are never removed or reordered), idempotent, withoverlay:hashes:checkexiting non-zero listing missing hashes without writing; replaces the manual hand-append step previously documented indocs/marketplace.md.--require-clean-tree(now default inpnpm evidence:knowledge-classification) when tracked in-scope paths carry unstaged edits, closing the regen-poison class behind three stale-ledger incidents (ADR2026-08-13_ledger-regen-clean-tree-guard.md).Changed
/plan-review-triageStep 2b names.cursor/plans/,.cursor/plans/archive/, and HANDOFF Backlog ascloseout_depthsources; Hard stop 5 points at the depth-capped override (Ask Other) instead of a dead-end Write residuals redirect.plan-monitor-harden-cursor-awareness-inventory-cwd.mdfor R2–R4 (factory composed pre-commit,inventoryRootJSON, stamp at resolved root).node --testCI wiring, landing SoR ADR supersession, and triage-guidelines caveat (personalization-context-and-ci-root-tests).2026-08-05_landing-external-design-source-of-recordrecords a dated supersession: rollback is not a self-contained single-file zip; live procedure isdocs/agentkit-landing.md.docs/external-plan-review.mdTriage guidelines caveat Write residuals when closeout is depth-capped or Still open is process-only (ADR2026-08-11_plan-audit-residuals-termination).sonnet(classifier-capable) so--permission-mode autocan run.advisorModelstaysopus(escalate only). ExplicitreviewerModel: "haiku"remains valid and cannot run auto (ADR2026-08-14_audits-haiku-auto-permission-amend.md)..cursor/hooks/agent/session-start.shnow emits a degraded-modeadditional_contextdiagnostic (still exit 0, stateless per session) whenresolve_agent_kitfails, instead of a silent{}; the other four adapters (guard-shell,after-edit-schema,secrets-prompt,pre-compact) stay fail-open silent by accepted design. Boundary documented indocs/marketplace.md("Hook resolution boundary"), smoke checklist section 4 aligned, and both branches pinned bynode --test scripts/hook-session-start-diagnostic.test.mjs.Fixed
renderProjectContextfills the Relevant skills table from installed skill/component rows (generated empty-state when none) instead of a hardcoded(none yet)singleton that ignored livecomponentResults.openBrowserno longer short-circuits to detachedspawnwhenspawnFnis injected withoutspawnSyncFn.runPreferredalways usesspawnSync/which(then detach on linux). Hermetic tests injectspawnSyncFn.pnpm landing:syncfails closed whileUPSTREAM-DESIGN-FIX-PROMPT.mdstill has unchecked tasks. Apply the prompt in Claude Design first, or waive with--waive-upstream-prompt/LANDING_SYNC_WAIVE_UPSTREAM_PROMPT=1.Notaare not items) and ends the section on a Processed heading even without the word Files.start.mjsandstart-broadcast.mjspassrealpathSyncintoresolveContextConfigPath(parity withserve.mjsand the CLI), so symlink-escape checks are not skipped..git(file or directory) when that directory has nodocs/cursor-native-audit.md, so a nested consumer checkout does not inherit a parent kit's Open actions.scripts/public-sync.denylistfails closed (exit 1) instead of loading zero extra patterns. A present comments-only extra-pattern file still dry-runs.CLAUDE.md/.claude/commands/agent-kit.mdorregistry/personas/coreare absent (those paths are not in the public-sync allowlist;registry/**is public-owned). Recurrence oferrors/2026-07-24_public-sync-ci-test-portability.md.TERMINAL_TODO_STATUSES/todoStatsindashboard/lib/semantic-model.mjs), so the bar reaches 100% whenever the lifecycle pill reads COMPLETED (previously a plan with any cancelled to-do could never fill past its completed-only count).progressLabelkeeps the honest completed count and appends· N cancelledwhen present;mergePlansForUi's fallback lifecycle mirrorstodoStats.open === 0;enrichPlans.progressexposescancelled/terminalcounters as the single counter SoT. Vitest pins inplugin-ux-validation.test.ts+semantic-model.test.tslock the math, label, fallback, and the completed-pill ⇒ 100% invariant.var(--border)hairline (invisible at 0%) to 6pxvar(--border-active)with 3px rounded ends, andprogressColorreturns green at 100% / neutral blue otherwise — low progress no longer renders red like an error state. Shimmer stays keyed to lifecycleexecutingonly (never queueRole).acquireCacheLock's ENOENT retry now backs off with the jitteredLOCK_RETRY_MSdelay, re-creates the vanished parent directory, and reports a distinct timeout cause (was a ~3.4k syscalls/sec hot loop with a misleading "Another install may be stuck");releaseCacheLockclaims the owner file atomically (rename + verify + restore-on-mismatch) instead of check-then-rm -rf, so a stale-reclaim + successor republish can no longer lose the successor's lock;writeLockOwneradds a per-write tmp nonce and refreshes are serialized with an in-flight guard; a corrupt/missing owner file is healed on refresh so the fail-closed release cannot strand the lock until stale reclaim. New regression tests cover the ENOENT compensator, successor restore, and refresh heal/no-touch paths.process.exitCode = 1and returns instead ofprocess.exit(1), so the recovery hint cannot be truncated on piped stderr; stale-reclaim mtime semantics documented and pinned by test (residual F: the lock dir mtime tracks the last owner refresh, so reclaim measures liveness, not acquisition age); unusedrmdirimport dropped (residual G).return HEALTH_SEVERITY_CHROME[sev] || { … }form fails loudly if the fallback is refactored (??, extraction), and the negative token pin is whitespace-tolerant (\s*) so a line-wrapped return or double space can no longer skip it silently; regex stays bounded to the fallback object. Mutation-verified: H1/H2/H4 fire the pin, H3 fails the anchor.git-hooks/pre-commitruns the main/master abort first, then.cursor/hooks/pre-commit/JSON validation and secrets scan when that directory exists (ADR2026-08-14_factory-pre-commit-composed-chain.md). Consumer clones without that directory still get the main-guard. Install/reinstall remains HITL. Pin:scripts/git-hooks-pre-commit-composed.test.mjs(inpnpm test:root-node).agent-kit cursor-awareness --check --jsonincludesinventoryRoot(absolute resolved inventory directory, ornullwhen walk-up fails). RelativeinventoryPath/featuresPathare unchanged.--stampread/write.cursor/context/config.jsonunder the resolvedinventoryRoot, not the caller cwd. When walk-up returns null,--stampdoes not create a.cursor/tree at the caller cwd.Source
be846d5sync/v5.2.0-be846d5