Skip to content

SDK reproducible workspaces and context-integrity primitives - #798

Merged
unbraind merged 4 commits into
mainfrom
feat/sdk-reproducible-workspace-integrity
Jul 28, 2026
Merged

SDK reproducible workspaces and context-integrity primitives#798
unbraind merged 4 commits into
mainfrom
feat/sdk-reproducible-workspace-integrity

Conversation

@unbraind

@unbraind unbraind commented Jul 28, 2026

Copy link
Copy Markdown
Owner

Summary

This broad SDK/CLI delivery makes project management = context management more reproducible, truthful, and extension-safe:

  • adds versioned deterministic WorkspaceRecipe execution with isolated seeded identifiers and clocks
  • adds content-addressed workspace snapshot create/list/inspect/restore/delete primitives in the SDK and CLI
  • aligns extension blueprint flag preflight with runtime activation and preserves compatible custom flag forms
  • makes semantically copied output_format identity overrides decline safely
  • removes ambiguous list --all semantics and provides exact migration guidance
  • makes fresh-clone health distinguish authoritative requirements from clone-local runtime directories
  • records the new workspace help surface in the fail-closed token baseline and generates the changelog with pm-changelog 2026.7.28

PM lineage

Verification

  • 6,468 tests pass with 100% statements, branches, functions, and lines
  • lint, duplicate detection, strict static/docstring quality, typecheck, SDK surface, package boundary, token budgets, context evaluation, docs links, and changelog check pass
  • repository secret scan, pnpm audit, GitHub Dependabot, code scanning, and secret scanning are clean
  • isolated manual workspace acceptance verified snapshot create, mutation, byte-identical restore, inspection, deletion, clone health, and list migration guidance
  • live pm health and history drift validation pass with zero in-progress delivery items

Closes #784
Closes #785
Closes #786
Closes #787
Closes #792
Closes #793
Closes #794

Summary by Sourcery

Introduce reproducible workspace execution and content-addressed snapshot primitives in the SDK and CLI, while tightening extension flag validation, refining output_format override semantics, and clarifying health and list behaviors.

New Features:

  • Expose workspace recipe APIs that provide deterministic identifiers and clocks for reproducible SDK executions.
  • Add content-addressed workspace snapshot create/list/inspect/restore/delete operations in the SDK and as pm workspace snapshot CLI commands.

Bug Fixes:

  • Treat copied identity output_format overrides as declined instead of leaking the host payload envelope.
  • Tighten SDK extension blueprint preflight to reject host-owned and malformed long flags in alignment with runtime activation.
  • Relax health checks so clone-local runtime directories and empty extension folders are treated as optional in fresh clones.
  • Remove the ambiguous list --all alias, replacing it with explicit migration guidance and keeping --no-truncate as the only knob.

Enhancements:

  • Centralize extension flag token validation and diagnostics for shared use by blueprint linting and runtime registration.
  • Add opt-in reproducible execution context utilities that drive deterministic time and token generation for recipes.
  • Refine documentation to describe clone-local directory semantics, extension flag lint codes, and the new reproducible workspace and snapshot primitives.

Documentation:

  • Document reproducible workspace recipes and content-addressed snapshots, and link the new guide from the SDK docs and README.

Tests:

  • Add unit and integration tests covering workspace recipes, snapshot lifecycle via SDK and CLI, extension flag validation, list --all migration errors, health directory expectations, and output_format override behavior.

Summary by cubic

Adds deterministic workspace recipes and content‑addressed snapshots for reproducible runs and byte‑identical restores. Finalizes integrity reviews with runtime‑validated, deep‑frozen recipes (clear TS vs runtime guarantees), safe concurrent snapshot temp cleanup without masking filesystem errors, short‑only flag validation parity, and clearer list/health behavior.

  • New Features

    • Reproducible workspace execution: PM_WORKSPACE_RECIPE_SCHEMA, defineWorkspaceRecipe, runWithWorkspaceRecipe, and executeWorkspaceRecipe provide seeded IDs, an injectable clock, validated/deep‑frozen recipes, isolated concurrent scopes, and bounded token generation.
    • Content‑addressed workspace snapshots: createWorkspaceSnapshot, listWorkspaceSnapshots, inspectWorkspaceSnapshot, restoreWorkspaceSnapshot, deleteWorkspaceSnapshot, plus pm workspace snapshot <list|create|inspect|restore|delete>; publishes SNAPSHOT_SCHEMA, enforces atomic publish/restore, and GC safely removes stale temp objects/refs even under concurrent deletion.
  • Migration

    • Replace pm list --all with either pm list --status all --no-truncate or pm list-all --no-truncate (bare --all now errors with guidance).
    • Extension flags: long tokens must start with -- and cannot use host-owned names; short‑only aliases are also validated. Invalid or colliding flags are rejected at lint and activation.
    • output_format overrides that copy the host payload now decline by default; return a handled decision to intentionally replace output.

Written for commit 91f6d3b. Summary will update on new commits.

Review in cubic

Deliver versioned deterministic workspace recipes and content-addressed snapshot lifecycle APIs across the public SDK and CLI. Align extension flag preflight with runtime activation, make copied output identities decline safely, disambiguate list --all, and make fresh-clone health semantics truthful. Include full regression coverage, generated changelog, token-surface baselines, and complete PM lineage/evidence for pm-huolbk, pm-wi301j, pm-q7qojt, pm-0k4o8t, pm-83ov2i, pm-rbcvt2, and pm-dkrmzv.
@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @unbraind, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@unbraind

Copy link
Copy Markdown
Owner Author

@greptileai review
@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This PR adds deterministic workspace recipes and content-addressed snapshot/restore APIs with CLI support, standardizes extension flag validation, rejects ambiguous list usage, adjusts health directory requirements, improves output override detection, and updates public surfaces, documentation, tests, and project records.

Changes

Workspace reproducibility and snapshots

Layer / File(s) Summary
Deterministic execution and recipe APIs
src/core/reproducibility/*, src/core/item/id.ts, src/core/shared/time.ts, src/sdk/workspace-recipe.ts, src/sdk/index.ts
Adds opt-in deterministic clocks, identifiers, validated workspace recipes, ordered replay, and public SDK exports.
Content-addressed snapshot lifecycle
src/sdk/workspace-snapshot.ts, sdk/public-surface.json, tests/unit/sdk/workspace-snapshot.spec.ts
Adds immutable snapshot objects, named references, fingerprint validation, deduplication, atomic restore, deletion, and filesystem safety checks.
Snapshot CLI and cleanup
src/cli/register-operations.ts, src/sdk/governance/gc.ts, tests/integration/workspace-snapshot-cli.integration.spec.ts, tests/unit/commands/gc-command.spec.ts
Adds workspace snapshot commands and runtime cleanup for stale temporary artifacts.
Documentation and verification
docs/README.md, docs/REPRODUCIBLE_WORKSPACES.md, tests/unit/sdk/workspace-reproducibility.spec.ts
Documents and tests deterministic recipes, snapshot behavior, exclusions, restore semantics, and cross-root fingerprints.

Extension contracts

Layer / File(s) Summary
Shared flag validation and linting
src/core/extensions/flag-definition-validation.ts, src/core/extensions/loader.ts, src/sdk/compose.ts, sdk/public-surface.json
Classifies malformed and host-owned flags consistently during blueprint linting and runtime activation.
Output override compatibility
src/core/extensions/extension-hook-runtime.ts, tests/unit/sdk/context-integrity-primitives.spec.ts
Uses stable value equality to decline equivalent legacy payload echoes while preserving explicit handled results.

CLI and health contracts

Layer / File(s) Summary
List option semantics
src/cli/register-list-query.ts, src/cli/registration-helpers.ts, src/sdk/cli-contracts/flag-contracts.ts, tests/fixtures/contracts/full.json
Rejects ambiguous --all usage and removes its pagination alias semantics.
Health directory classification
src/sdk/governance/health.ts, tests/unit/commands/health-command.spec.ts
Treats extensions, locks, and search as clone-optional directories.

Release records and documentation

Layer / File(s) Summary
Release metadata
CHANGELOG.md, docs/SDK.md, scripts/agent-token-surface-baseline.json, sdk/public-surface.json, .agents/pm/**/*
Updates release notes, SDK guidance, generated surface metrics, and feature/issue lifecycle evidence.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

  • unbraind/pm-cli#234: Overlaps with the pm list --all and --no-truncate option handling.
  • unbraind/pm-cli#347: Introduced the blueprint lint machinery extended here for long-flag validation.
  • unbraind/pm-cli#734: Established the host-owned extension flag collision handling used by this change.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed All linked issues [#784,#785,#786,#787,#792,#793,#794] are addressed by the linting, reproducibility, snapshot, health, list, and override changes.
Out of Scope Changes check ✅ Passed No clearly unrelated code changes stand out; the docs, tests, changelog, and .agents/pm records support the stated objectives.
Title check ✅ Passed The title matches the core SDK work on reproducible workspaces and related integrity primitives.
Description check ✅ Passed The description is clearly aligned with the PR changes and objectives, covering the main SDK/CLI updates.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@sourcery-ai

sourcery-ai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Reviewer's Guide

Introduces deterministic workspace recipes and content-addressed workspace snapshots in the SDK/CLI, tightens extension flag validation/shared diagnostics, deprecates the ambiguous list --all alias with explicit migration guidance, refines health semantics for clone-local directories, and hardens output_format overrides against unsafe identity echoes while updating docs, changelog, and agent baselines.

Sequence diagram for workspace snapshot CLI operations

sequenceDiagram
  actor User
  participant CliProgram as pm_cli_program
  participant SnapshotCmd as runWorkspaceSnapshotAction
  participant SnapshotSDK as createWorkspaceSnapshot
  participant SnapshotStore as publishWorkspaceSnapshotObject

  User->>CliProgram: pm workspace snapshot create before-migration
  CliProgram->>SnapshotCmd: runWorkspaceSnapshotAction("create", "before-migration")
  SnapshotCmd->>SnapshotSDK: createWorkspaceSnapshot(pmRoot, { name })
  SnapshotSDK->>SnapshotSDK: buildManifest(pmRoot)
  SnapshotSDK->>SnapshotStore: publishWorkspaceSnapshotObject(temporaryRoot, objectRoot)
  SnapshotStore-->>SnapshotSDK: deduplicated
  SnapshotSDK-->>SnapshotCmd: CreateWorkspaceSnapshotResult
  SnapshotCmd-->>CliProgram: printResult(result)
  CliProgram-->>User: snapshot fingerprint, name, deduplicated

  User->>CliProgram: pm workspace snapshot restore before-migration
  CliProgram->>SnapshotCmd: runWorkspaceSnapshotAction("restore", "before-migration")
  SnapshotCmd->>SnapshotSDK: restoreWorkspaceSnapshot(pmRoot, target)
  SnapshotSDK->>SnapshotSDK: inspectWorkspaceSnapshot(pmRoot, target)
  SnapshotSDK->>SnapshotSDK: swapWorkspaceSnapshotRoot(staging, pmRoot, backup)
  SnapshotSDK-->>SnapshotCmd: WorkspaceSnapshotManifest
  SnapshotCmd-->>CliProgram: printResult(manifest)
  CliProgram-->>User: restored workspace state
Loading

File-Level Changes

Change Details Files
Add CLI wiring and SDK surface for content-addressed workspace snapshots (create/list/inspect/restore/delete).
  • Wire new pm workspace snapshot <action> [target] command to SDK snapshot helpers and enforce target requirements and error messaging.
  • Expose snapshot primitives (createWorkspaceSnapshot, inspectWorkspaceSnapshot, listWorkspaceSnapshots, restoreWorkspaceSnapshot, deleteWorkspaceSnapshot) via the public SDK index.
  • Add unit and integration tests to cover the full snapshot lifecycle, error paths, and CLI routing (including JSON output).
src/cli/register-operations.ts
src/sdk/index.ts
src/sdk/workspace-snapshot.ts
tests/unit/sdk/workspace-snapshot.spec.ts
tests/integration/workspace-snapshot-cli.integration.spec.ts
tests/unit/commands/register-commands.spec.ts
Implement deterministic workspace recipes and reproducible execution context for IDs and timestamps.
  • Introduce ReproducibleExecutionSettings and AsyncLocalStorage-backed context that supplies deterministic timestamps and base36 tokens when active.
  • Wrap item ID generation and nowIso() so they consult the reproducible context first, falling back to the previous random/system behavior when unset.
  • Add workspace-recipe SDK module with schema-validated recipes, runWithWorkspaceRecipe, and executeWorkspaceRecipe helpers plus tests covering determinism, isolation, and byte-identical artifacts across roots.
src/core/reproducibility/context.ts
src/core/item/id.ts
src/core/shared/time.ts
src/sdk/workspace-recipe.ts
tests/unit/sdk/workspace-reproducibility.spec.ts
Tighten extension flag validation and share diagnostics between author-time blueprint lint and runtime activation.
  • Create flag-definition-validation module that classifies host-owned collisions and malformed long-flag tokens, with a shared remediation message.
  • Replace ad-hoc assertExtensionFlagOwnership in the extension loader with the new validator, throwing structured TypeErrors on invalid flags.
  • Extend lintExtensionBlueprint to validate flags from top-level, commands, importers, and exporters, and surface new lint codes; add unit and integration tests for both lint and runtime behaviors.
src/core/extensions/flag-definition-validation.ts
src/core/extensions/loader.ts
src/sdk/compose.ts
tests/unit/core/extension-flag-definition-validation.spec.ts
tests/unit/sdk/sdk-compose.spec.ts
tests/unit/extensions/extension-loader.spec.ts
tests/integration/cli.integration.spec.ts
docs/SDK.md
sdk/public-surface.json
Remove ambiguous list --all semantics and require explicit status/limit flags with migration guidance.
  • Change list command normalization to ignore all and only treat --no-truncate (truncate=false) as the ‘all rows’ control.
  • Make pm list --all a failing path that throws a usage error with explicit replacement examples, and keep --all only as a hidden option that triggers this guidance.
  • Update CLI flag contracts, help text, tests, and docs to reflect the new semantics and validate that migration errors are surfaced via CLI routing.
src/cli/register-list-query.ts
src/cli/registration-helpers.ts
src/sdk/cli-contracts/flag-contracts.ts
tests/unit/cli/registration-helpers.spec.ts
tests/unit/commands/register-commands.spec.ts
tests/integration/workspace-snapshot-cli.integration.spec.ts
Adjust health semantics for clone-local directories and refine output_format override safety.
  • Treat extensions, locks, and search as clone-optional directories in health checks, updating required/optional directory lists and tests so fresh clones are warn-only for these paths.
  • Make legacy output_format payload echoes be detected via deep value equality instead of object identity, so semantically copied envelopes are declined unless the extension explicitly returns a handled result.
  • Update health tests to align with the new directory requirements and add a context-integrity test covering the copied echo behavior.
src/sdk/governance/health.ts
tests/unit/commands/health-command.spec.ts
src/core/extensions/extension-hook-runtime.ts
tests/unit/sdk/context-integrity-primitives.spec.ts
docs/SDK.md
Document reproducible workspace primitives, update agent/issue history, and record changes in the changelog and token baselines.
  • Add REPRODUCIBLE_WORKSPACES.md and link it from the main docs, describing recipes and snapshot behavior and the CLI/SDK surfaces.
  • Extend SDK docs to reference the new recipe and snapshot features and clarify health behavior for clone-local directories.
  • Update CHANGELOG with new Added/Fixed entries and refresh agent history/issues, token surface baselines, and managed extensions metadata to capture the new CLI surface.
docs/REPRODUCIBLE_WORKSPACES.md
docs/SDK.md
docs/README.md
CHANGELOG.md
.agents/pm/features/pm-dkrmzv.toon
.agents/pm/features/pm-rbcvt2.toon
.agents/pm/issues/pm-*.toon
.agents/pm/history/pm-*.jsonl
scripts/agent-token-surface-baseline.json
.agents/pm/extensions/.managed-extensions.json

Assessment against linked issues

Issue Objective Addressed Explanation
#784 Extend extension blueprint linting (and thus assertExtensionPreflight) to emit an error-severity finding when any declared flag’s long token collides with a host-owned global flag (as defined by the host’s flag contracts), so that blueprints declaring such flags are rejected before activation.
#784 Align the diagnostic messaging for host-owned flag collisions between static preflight (lintExtensionBlueprint/assertExtensionPreflight) and runtime activation, reusing a shared description for the remediation text.
#785 Make pm health --json report ok: true when all findings are warn-severity (no error findings), so the top-level ok flag aligns with the exit code for warn-only results.
#785 Adjust health’s directory requirements so fresh clones do not fail health due to clone-local runtime or empty extension/type directories, and document the clone-optional vs required directories accordingly.
#786 Provide a deterministic, seedable source for item IDs so that the same sequence of operations produces the same IDs.
#786 Provide an injectable, deterministic clock so that timestamps (e.g., created_at/updated_at and history entries) can be made reproducible under harness control.
#786 Document and expose a supported workflow for byte-reproducible workspaces and golden-file style evaluation (e.g., via recipes or snapshots), without changing default interactive behavior.
#787 Provide a workspace-level snapshot/restore mechanism (e.g., pm snapshot create <name> / pm snapshot restore <name>) that can cheaply reset a workspace to a known state, preferably content-addressed.
#787 Document the on-disk boundary of a pm workspace, clearly distinguishing authoritative tracker state from derived, clone-local state so external harnesses can implement their own snapshotting safely.
#792 Modify pm health so that the search, locks, and extensions directories are treated as clone-optional/runtime directories instead of required, eliminating missing-directory findings for these paths on a clean clone created via pm init.
#792 Update documentation to describe the new pm health directory semantics, clearly distinguishing required committed tracker directories from clone-local/runtime directories.
#793 Change pm list --all so it is no longer an alias for --no-truncate and instead fails with an explicit, actionable error (preventing partial open-only results from being reported as complete).
#793 Update CLI/SDK surfaces and tests so --all is no longer presented as a valid pagination alias for pm list, and clarify --no-truncate semantics instead.
#794 Treat an output_format service override that returns a value equal to its payload (including semantic copies) as a declined override so that the original rendered command output is preserved and the internal envelope is not printed.
#794 Add validation/guardrails so that output_format overrides which return the host’s internal envelope shape (e.g., an object with global/options/format/result) are detected and either warned about or treated as a declined override rather than printed verbatim. The PR only changes isLegacyOutputPayloadEcho to use stableValueEquals and adds tests to ensure semantically copied payload echoes are treated as declines. It does not add any logic to specifically inspect returned objects for internal envelope keys (global/options/format/result) or to warn/drop such results.
#794 Improve the authoring surface for output_format overrides by accurately typing and documenting ServiceOverrideContext.payload for that service so authors can see that the payload is the internal envelope and that return values are printed verbatim. There are no changes in this PR to the ServiceOverrideContext type, its generics, or its documentation that would specialize payload for output_format or clarify that the returned value is printed verbatim.

Possibly linked issues


Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

@unbraind: Starting a full review of PR #798, including the complete change set and stated objectives.

✅ Action performed

Full review finished.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 59 minutes.

@codspeed-hq

codspeed-hq Bot commented Jul 28, 2026

Copy link
Copy Markdown

Merging this PR will degrade performance by 0.32%

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

⚡ 1 improved benchmark
❌ 1 regressed benchmark
✅ 9 untouched benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Benchmark BASE HEAD Efficiency
createQueryFingerprint 522.3 µs 533.1 µs -2.02%
encodeQueryCursor 102.9 µs 101.5 µs +1.42%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing feat/sdk-reproducible-workspace-integrity (91f6d3b) with main (03fbe18)

Open in CodSpeed

@codecov

codecov Bot commented Jul 28, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Comment thread src/sdk/workspace-snapshot.ts
Comment thread src/sdk/compose.ts
@greptile-apps

greptile-apps Bot commented Jul 28, 2026

Copy link
Copy Markdown

Greptile Summary

Prior Greptile findings on workspace restore rollback and extension blueprint short-flag lint are addressed at HEAD.

  • swapWorkspaceSnapshotRoot only rolls back on failed staging→root activation; backup cleanup runs after activation and cannot undo an active root.
  • collectBlueprintFlagFindings validates long and short tokens (including short-only) via findExtensionFlagTokenFailure, matching runtime activation.
  • Focused unit coverage asserts activation-failure rollback, post-activation cleanup failure without rollback, and reserved --path short-only lint rejection.

Confidence Score: 5/5

Safe to merge; previously reported restore-rollback and short-flag lint gaps are fixed and covered by tests.

No blocking failure remains. Workspace restore no longer rolls back after a successful activation when backup cleanup fails, and extension blueprint lint now rejects reserved short and short-only host flags consistently with runtime validation.

Important Files Changed

Filename Overview
src/sdk/workspace-snapshot.ts Restore swap limits rollback to activation failure; post-activation backup cleanup no longer undoes a live root.
src/sdk/compose.ts Blueprint flag lint routes long and short declarations through the shared token validator, including short-only host collisions.
src/core/extensions/flag-definition-validation.ts Shared host-collision and long-flag shape checks used by both lint preflight and runtime activation.
tests/unit/sdk/workspace-snapshot.spec.ts Proves activation rollback sequence and that injected backup cleanup failure does not reverse a completed swap.
tests/unit/sdk/sdk-compose.spec.ts Proves reserved short-only --path is rejected by blueprint lint alongside other host/malformed cases.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[restoreWorkspaceSnapshot] --> B[stage files + snapshot store]
  B --> C[swapWorkspaceSnapshotRoot]
  C --> D[rename pmRoot to backup]
  D --> E{rename staging to pmRoot}
  E -->|fail| F[rename backup to pmRoot]
  F --> G[remove staging]
  G --> H[throw activation error]
  E -->|ok| I[remove backup]
  I -->|cleanup fails| J[throw cleanup error keep active root]
  I -->|ok| K[restore success]
Loading

Reviews (4): Last reviewed commit: "fix(sdk): resolve final workspace integr..." | Re-trigger Greptile

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 16

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.agents/pm/history/pm-huolbk.jsonl:
- Line 15: Update the canonical PM item through pm so its metadata.actual_result
records the completed fix rather than the pre-fix failure, then regenerate the
projection at .agents/pm/issues/pm-huolbk.toon lines 21-23. Apply the
corresponding completed result in both .agents/pm/history/pm-huolbk.jsonl lines
15-15 and the regenerated projection, preserving the fixed resolution.

In @.agents/pm/issues/pm-83ov2i.toon:
- Around line 19-21: Update the canonical PM item’s actual_result using the PM
CLI so it reflects the fixed behavior: warn-only fresh-clone health is
non-blocking, with a consistent top-level verdict and exit code while warnings
remain visible. Preserve resolution: fixed and synchronize the derived
projection before closing the item.

In `@sdk/public-surface.json`:
- Around line 10994-10999: Export SNAPSHOT_SCHEMA from the workspace-snapshot
module alongside WorkspaceSnapshotManifest, or provide a public alias, so the
manifest’s schema property references an exported symbol in generated
declarations. Preserve the existing schema value and WorkspaceSnapshotManifest
API.

In `@src/cli/register-operations.ts`:
- Around line 529-536: In the normalizedAction === "create" branch, simplify the
options construction passed to createWorkspaceSnapshot by removing the
unnecessary object spread and passing the ternary result directly. Preserve the
existing behavior of supplying either an empty options object or the target
name.
- Around line 538-568: Validate normalizedAction against the supported
create/list/inspect/restore/delete actions before checking whether target is
undefined. Keep the existing unknown-action PmCliError and its details, then
apply the snapshot-target requirement only to actions that require a target,
preserving create/list behavior.

In `@src/core/reproducibility/context.ts`:
- Around line 67-86: Update nextReproducibleToken to validate length after
confirming executionStorage has a reproducibility context and before the
generation loop. Accept only non-negative safe integers; reject Infinity, NaN,
negative, fractional, and oversized values using the function’s existing
invalid-input behavior rather than generating or hanging.

In `@src/sdk/compose.ts`:
- Around line 66-69: Update the extension flag lint validation around the
existing long-flag checks at lines 1187–1203 to validate both fields, including
definitions with an invalid short token such as “--json”. Reuse
findExtensionFlagTokenFailure(definition?.long, definition?.short) so lint and
runtime validation produce the same blocking finding, while preserving the
existing reporting flow.

In `@src/sdk/workspace-recipe.ts`:
- Around line 33-35: Update defineWorkspaceRecipe to invoke the existing
reproducibility-settings validator before returning the recipe, rejecting empty
seeds, invalid clocks, and negative tickMs values during definition while
preserving the existing Readonly<WorkspaceRecipe> return behavior.
- Around line 33-35: Update defineWorkspaceRecipe to use a const generic
constrained to WorkspaceRecipe and return that same generic type, preserving
literal action, input, and recipe-key types while still validating top-level
keys against WorkspaceRecipe.
- Around line 40-59: Update the workspace recipe validation and normalization
around the operations mapping to recursively accept only JSON-compatible input
values, rejecting undefined, functions, Date instances, and other non-JSON
values. Replace the shallow Object.freeze({ ...operation.input }) handling with
recursive cloning and deep-freezing so nested objects and arrays are detached
from the caller and remain immutable, while preserving the existing action
validation and frozen recipe structure.

In `@src/sdk/workspace-snapshot.ts`:
- Around line 234-249: Extend the existing workspace-snapshot garbage-collection
flow, including the runtime/checkpoints scopes registered in
register-operations.ts, to identify and remove stale temporary .create-* and
.ref-* entries under the workspace-snapshot runtime store. Preserve active or
newly created entries as appropriate, and ensure cleanup covers both temporary
object directories created around temporaryRoot and temporary ref files.
- Around line 182-197: Update swapWorkspaceSnapshotRoot so the try/catch covers
only the activation rename from staging to pmRoot; perform removeEntry(backup)
after that rollback scope. Preserve rollback of backup to pmRoot and staging
cleanup only when activation fails, allowing post-activation backup cleanup
errors to propagate without attempting a second restore.
- Around line 214-220: Update createWorkspaceSnapshot to reject options.name
values matching the 64-character lowercase hexadecimal fingerprint pattern
before creating the snapshot, using the existing validation/error mechanism
around validateSnapshotTarget. Keep other valid snapshot-name rules unchanged so
fingerprint-shaped targets cannot be created as names.
- Around line 199-211: Update resolveSnapshotFingerprint and the
reference-loading path in deleteWorkspaceSnapshot to catch missing
reference-file ENOENT errors and translate them into a clear domain error
identifying the unknown snapshot target; preserve existing behavior for
fingerprints, valid references, and unrelated filesystem or parsing errors.

In `@tests/unit/sdk/workspace-reproducibility.spec.ts`:
- Around line 49-55: Update the test case around runWithWorkspaceRecipe to
exercise two distinct recipes concurrently with Promise.all, yielding within
both callbacks before assertions. Verify each concurrent scope preserves its own
clock and token sequence, while retaining the existing outside-scope checks.
- Around line 57-60: Update the defineWorkspaceRecipe tests around RECIPE to
preserve literal inference: add an unannotated object literal marked with
`@ts-expect-error` that verifies an unsupported schema is rejected at compile
time, and add an unannotated call containing an extra property to verify unknown
keys are rejected. Keep the existing runtime validation assertion and use the
builder’s actual type contract.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: bb80ca79-d10d-4a12-bd38-cfe896c2d56e

📥 Commits

Reviewing files that changed from the base of the PR and between 03fbe18 and 56ce101.

📒 Files selected for processing (49)
  • .agents/pm/extensions/.managed-extensions.json
  • .agents/pm/features/pm-dkrmzv.toon
  • .agents/pm/features/pm-rbcvt2.toon
  • .agents/pm/history/pm-0k4o8t.jsonl
  • .agents/pm/history/pm-83ov2i.jsonl
  • .agents/pm/history/pm-bex0ui.jsonl
  • .agents/pm/history/pm-dkrmzv.jsonl
  • .agents/pm/history/pm-huolbk.jsonl
  • .agents/pm/history/pm-q7qojt.jsonl
  • .agents/pm/history/pm-rbcvt2.jsonl
  • .agents/pm/history/pm-wi301j.jsonl
  • .agents/pm/issues/pm-0k4o8t.toon
  • .agents/pm/issues/pm-83ov2i.toon
  • .agents/pm/issues/pm-bex0ui.toon
  • .agents/pm/issues/pm-huolbk.toon
  • .agents/pm/issues/pm-q7qojt.toon
  • .agents/pm/issues/pm-wi301j.toon
  • CHANGELOG.md
  • docs/README.md
  • docs/REPRODUCIBLE_WORKSPACES.md
  • docs/SDK.md
  • scripts/agent-token-surface-baseline.json
  • sdk/public-surface.json
  • src/cli/register-list-query.ts
  • src/cli/register-operations.ts
  • src/cli/registration-helpers.ts
  • src/core/extensions/extension-hook-runtime.ts
  • src/core/extensions/flag-definition-validation.ts
  • src/core/extensions/loader.ts
  • src/core/item/id.ts
  • src/core/reproducibility/context.ts
  • src/core/shared/time.ts
  • src/sdk/cli-contracts/flag-contracts.ts
  • src/sdk/compose.ts
  • src/sdk/governance/health.ts
  • src/sdk/index.ts
  • src/sdk/workspace-recipe.ts
  • src/sdk/workspace-snapshot.ts
  • tests/integration/cli.integration.spec.ts
  • tests/integration/workspace-snapshot-cli.integration.spec.ts
  • tests/unit/cli/registration-helpers.spec.ts
  • tests/unit/commands/health-command.spec.ts
  • tests/unit/commands/register-commands.spec.ts
  • tests/unit/core/extension-flag-definition-validation.spec.ts
  • tests/unit/extensions/extension-loader.spec.ts
  • tests/unit/sdk/context-integrity-primitives.spec.ts
  • tests/unit/sdk/sdk-compose.spec.ts
  • tests/unit/sdk/workspace-reproducibility.spec.ts
  • tests/unit/sdk/workspace-snapshot.spec.ts

Comment thread .agents/pm/history/pm-huolbk.jsonl
Comment thread .agents/pm/issues/pm-83ov2i.toon Outdated
Comment thread sdk/public-surface.json
Comment thread src/cli/register-operations.ts
Comment thread src/cli/register-operations.ts
Comment thread src/sdk/workspace-snapshot.ts
Comment thread src/sdk/workspace-snapshot.ts
Comment thread src/sdk/workspace-snapshot.ts
Comment thread tests/unit/sdk/workspace-reproducibility.spec.ts
Comment thread tests/unit/sdk/workspace-reproducibility.spec.ts
@unbraind

Copy link
Copy Markdown
Owner Author

First-round bot feedback acknowledgement:

The correction commit will be pushed next, followed by a fresh full-review request and exact-head review inventory.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

@unbraind Acknowledged. I’ve noted the coverage-gate context, the intentional GH-797 intake artifacts, and the validation/baseline results. I’ll await the correction commit and the fresh exact-head full-review request.


✏️ Learnings added
Learnt from: unbraind
URL: https://github.com/unbraind/pm-cli/pull/798

Timestamp: 2026-07-28T17:25:45.272Z
Learning: For the pm-cli repository, the enforced documentation coverage gate measures source, exported, and member docstring coverage at 100%; an external 56.41% figure is not the repository gate result and should not be treated as a failing project coverage metric.

Learnt from: unbraind
URL: https://github.com/unbraind/pm-cli/pull/798

Timestamp: 2026-07-28T17:25:45.273Z
Learning: For pm-cli PR `#798`, the `.agents/pm` GH-797 artifacts are intentional intake traceability for a discovered GitHub report. They remain open and unclaimed and do not represent unrelated implementation scope.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

Apply the complete first review round across extension flag parity, deterministic recipes, workspace snapshots, and the public CLI contract.

Validate and deep-freeze portable JSON recipes, isolate concurrent deterministic scopes, bound generated tokens, publish the snapshot schema, preserve activated restores on cleanup failures, translate missing snapshot state, prevent reference/fingerprint ambiguity, and garbage-collect stale atomic publication debris.

Refresh generated contracts, SDK surface and changelog; record PM evidence and closure; add focused type, concurrency, atomicity, filesystem, GC and CLI regressions while preserving exact 100% repository coverage.
@greptile-apps

greptile-apps Bot commented Jul 28, 2026

Copy link
Copy Markdown

Acknowledged — thanks for the thorough round-up.

A few confirmations on my end:

Ready for the correction commit and fresh full-review request whenever you push. I'll anchor the next pass to the exact head SHA you specify.

@unbraind

Copy link
Copy Markdown
Owner Author

@greptileai review

@coderabbitai full review

First-round corrections are pushed at f3c1d7859. Please review the new exact head, including the added regression tests and PM evidence.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

@unbraind: I’ll perform a fresh full review of PR #798, including the correction commit f3c1d7859, added regression tests, and PM evidence.

✅ Action performed

Full review finished.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 8 minutes.

Comment thread src/sdk/compose.ts
Route short-only blueprint declarations through the shared host-owned flag validator so author-time lint and runtime activation stay identical.

Add the exact regression, record second-round PM and review evidence, regenerate the package-owned changelog, and preserve 100/100/100/100 coverage across 6,473 tests.
@unbraind

Copy link
Copy Markdown
Owner Author

@greptileai review

@coderabbitai full review

Second-round short-only flag correction is pushed at 4478fb54c. Please review the new exact head.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

@unbraind: Starting a fresh full review of PR #798 at exact head 4478fb54c, with focus on the second-round short-only flag correction and its regression coverage.

✅ Action performed

Full review finished.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 59 minutes.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
src/sdk/compose.ts (1)

1416-1416: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Update the detection-order comment for the new flag pass.

collectBlueprintFlagFindings is now inserted between command and reserved-field findings, but the comment above still omits this pass and reserved-item findings. Keep the comment aligned with the actual array order.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/sdk/compose.ts` at line 1416, Update the detection-order comment above
the findings array to include collectBlueprintFlagFindings and reserved-item
findings in their actual order between command and reserved-field findings. Do
not change the detection logic or array contents.
.agents/pm/features/pm-dkrmzv.toon (1)

13-19: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Close missing PM-linked evidence before marking these features implemented.

The closed feature metadata records implementation evidence that covers snapshots/restores/coverage and recipe contract/concurrency coverage, but it does not address several accepted criteria as stated in acceptance_criteria:

  • pm-dkrmzv: no covered evidence for restore/faster re-seeding at realistic scale, cross-version compatibility, multi-branch behavior, security boundaries, or packed installed-consumer tests.
  • pm-rbcvt2: no covered evidence for cross-machine/build replay, recipe-generated corpora, CI nondeterminism regression, or “total clock injection” with no wall-clock reads when a clock is supplied.

Capture the missing PM-linked evidence, or update the acceptance and resolution metadata through the PM CLI before release.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/pm/features/pm-dkrmzv.toon around lines 13 - 19, The implemented
metadata lacks PM-linked evidence for several accepted criteria. In
.agents/pm/features/pm-dkrmzv.toon lines 13-19, add evidence for realistic-scale
restore performance, cross-version compatibility, multi-branch behavior,
security boundaries, and packed installed-consumer tests; in
.agents/pm/features/pm-rbcvt2.toon lines 13-19, add evidence for
cross-machine/build replay, recipe-generated corpora, CI nondeterminism
regression, and total clock injection without wall-clock reads. Alternatively,
use the PM CLI to update both features’ acceptance and resolution metadata
before release.

Sources: Coding guidelines, Learnings

src/sdk/workspace-snapshot.ts (1)

411-431: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Serialize concurrent snapshot create/delete operations on the same fingerprint.

deleteWorkspaceSnapshot reads references without holding a lock, then removeSnapshotEntry can delete runtime/workspace-snapshots/objects/<fingerprint> while a concurrent createWorkspaceSnapshot({ name }) is publishing that same fingerprint. Because create deduplicates via rename instead of locking objects/<fingerprint>, this can leave the newly published object as an unreachable, unlinked immutable snapshot. Route both paths through the repo’s existing workspace lock, or acquire and hold an exclusive lock against the fingerprint before listing references and removing the object.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/sdk/workspace-snapshot.ts` around lines 411 - 431, The
deleteWorkspaceSnapshot flow must serialize object deletion with concurrent
createWorkspaceSnapshot publishing for the same fingerprint. Route the
fingerprint-based path through the existing workspace lock, holding an exclusive
lock before listWorkspaceSnapshots and through removeSnapshotEntry; preserve the
separate reference-deletion behavior and return values.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.agents/pm/history/pm-huolbk.jsonl:
- Line 19: Update the canonical actual_result via pm to state that validation
rejects malformed long tokens and detects host-owned collisions for long and
short tokens, without claiming malformed short-token grammar validation;
preserve the append-only hash chain in .agents/pm/history/pm-huolbk.jsonl at
lines 19-19. Regenerate .agents/pm/issues/pm-huolbk.toon from the canonical PM
item at lines 23-23 rather than editing the projection directly.

In `@docs/REPRODUCIBLE_WORKSPACES.md`:
- Around line 43-46: Update the documentation sentence describing
defineWorkspaceRecipe: remove the claim that runtime validation enforces the
exact top-level shape and that inputs are recursively JSON-compatible, unless
the implementation adds those runtime checks. Describe only the fields and
validation behavior actually enforced at runtime, while keeping the separate
TypeScript ExactWorkspaceRecipe<TRecipe> compile-time guarantee accurate.

In `@src/sdk/governance/gc.ts`:
- Around line 222-277: Update sweepWorkspaceSnapshotTemps to handle the
fs.stat(absolutePath) race like removeCacheFile: wrap the stat and subsequent
stale-entry removal flow in try/catch, skip the entry when the error is ENOENT
using isErrno, and rethrow all other errors so runGc still reports unexpected
failures.

In `@tests/unit/sdk/sdk-compose.spec.ts`:
- Around line 660-661: Make the duplicate-option regression test unambiguous by
changing the mixed long-and-short definition near the existing `--valid-long`
entry to use a distinct, non-colliding short token, while retaining `short:
"--path"` only on the short-only definition. Apply the same separation to the
corresponding definitions in the additional assertion around the later test case
so the expected finding can only come from short-only validation.

In `@tests/unit/sdk/workspace-reproducibility.spec.ts`:
- Around line 99-103: Update the Object.isFrozen assertion in the
reproducibility test to safely access the fourth value when operations[0] may be
undefined, ensuring the optional chain covers the trailing index access and
failures remain assertion failures rather than raw TypeErrors. Preserve the
existing frozen-value assertion.

---

Outside diff comments:
In @.agents/pm/features/pm-dkrmzv.toon:
- Around line 13-19: The implemented metadata lacks PM-linked evidence for
several accepted criteria. In .agents/pm/features/pm-dkrmzv.toon lines 13-19,
add evidence for realistic-scale restore performance, cross-version
compatibility, multi-branch behavior, security boundaries, and packed
installed-consumer tests; in .agents/pm/features/pm-rbcvt2.toon lines 13-19, add
evidence for cross-machine/build replay, recipe-generated corpora, CI
nondeterminism regression, and total clock injection without wall-clock reads.
Alternatively, use the PM CLI to update both features’ acceptance and resolution
metadata before release.

In `@src/sdk/compose.ts`:
- Line 1416: Update the detection-order comment above the findings array to
include collectBlueprintFlagFindings and reserved-item findings in their actual
order between command and reserved-field findings. Do not change the detection
logic or array contents.

In `@src/sdk/workspace-snapshot.ts`:
- Around line 411-431: The deleteWorkspaceSnapshot flow must serialize object
deletion with concurrent createWorkspaceSnapshot publishing for the same
fingerprint. Route the fingerprint-based path through the existing workspace
lock, holding an exclusive lock before listWorkspaceSnapshots and through
removeSnapshotEntry; preserve the separate reference-deletion behavior and
return values.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: dd59dcc1-0b98-4ead-836c-11abee7e5b51

📥 Commits

Reviewing files that changed from the base of the PR and between 56ce101 and 4478fb5.

📒 Files selected for processing (25)
  • .agents/pm/extensions/.managed-extensions.json
  • .agents/pm/features/pm-dkrmzv.toon
  • .agents/pm/features/pm-rbcvt2.toon
  • .agents/pm/history/pm-83ov2i.jsonl
  • .agents/pm/history/pm-dkrmzv.jsonl
  • .agents/pm/history/pm-huolbk.jsonl
  • .agents/pm/history/pm-rbcvt2.jsonl
  • .agents/pm/issues/pm-83ov2i.toon
  • .agents/pm/issues/pm-huolbk.toon
  • CHANGELOG.md
  • docs/REPRODUCIBLE_WORKSPACES.md
  • sdk/public-surface.json
  • src/cli/register-operations.ts
  • src/core/reproducibility/context.ts
  • src/sdk/compose.ts
  • src/sdk/governance/gc.ts
  • src/sdk/index.ts
  • src/sdk/workspace-recipe.ts
  • src/sdk/workspace-snapshot.ts
  • tests/fixtures/contracts/full.json
  • tests/integration/workspace-snapshot-cli.integration.spec.ts
  • tests/unit/commands/gc-command.spec.ts
  • tests/unit/sdk/sdk-compose.spec.ts
  • tests/unit/sdk/workspace-reproducibility.spec.ts
  • tests/unit/sdk/workspace-snapshot.spec.ts
💤 Files with no reviewable changes (1)
  • tests/fixtures/contracts/full.json

Comment thread .agents/pm/history/pm-huolbk.jsonl
Comment thread docs/REPRODUCIBLE_WORKSPACES.md Outdated
Comment thread src/sdk/governance/gc.ts
Comment thread tests/unit/sdk/sdk-compose.spec.ts Outdated
Comment thread tests/unit/sdk/workspace-reproducibility.spec.ts
Handle concurrent snapshot temp disappearance without masking unexpected filesystem failures, separate runtime and TypeScript recipe guarantees, and make short-only flag coverage unambiguous.

Record exact 100% coverage and linked-test evidence on the affected PM items, close and release only the active work, and refresh the managed pm-changelog state.
@unbraind

Copy link
Copy Markdown
Owner Author

Final review corrections are pushed at 91f6d3b0d:

  • snapshot temp GC tolerates ENOENT races and rethrows unexpected stat failures, with both branches covered;
  • recipe docs and PM outcome distinguish runtime validation from TypeScript exact-key enforcement;
  • short-only host flag collision coverage is unambiguous;
  • all five findings have inline evidence replies and usefulness reactions;
  • focused PM-linked tests pass, static quality passes, and the full repository run is 6,474 tests at exact 100/100/100/100.

@greptileai please review the new exact head.
@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

@unbraind: Starting a fresh full review of PR #798 at exact head 91f6d3b0d, with focus on the snapshot-GC race handling, recipe validation contract documentation, short-only host-flag parity, and their regression coverage.

✅ Action performed

Full review finished.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 33 minutes.

@unbraind

Copy link
Copy Markdown
Owner Author

@coderabbitai thank you—the exact-head full review completed with no new findings, and all five prior threads are resolved. The repository-owned static gate independently reports 100% overall, exported, and member docstring coverage, so the walkthrough's 50% external heuristic warning is not a merge blocker. @greptileai also passed exact head 91f6d3b0d with no new finding. Every bot finding, acknowledgement, review envelope, and updated top-level review artifact has now been read and rated by usefulness.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

@unbraind Thank you for the thorough final verification and review follow-through. Acknowledged: exact head 91f6d3b0d is clean, all five prior findings are resolved, and the repository-owned 100% documentation-coverage gate is the relevant merge criterion—not the external walkthrough heuristic.

@greptile-apps

greptile-apps Bot commented Jul 28, 2026

Copy link
Copy Markdown

Thanks for the thorough follow-through. All threads resolved, head 91f6d3b0 clean, and the 50% heuristic correctly ruled out as a false positive against the static gate's 100% actual coverage — no blockers from this review. Good to merge.

@unbraind
unbraind merged commit 85e4b0b into main Jul 28, 2026
33 checks passed
@unbraind
unbraind deleted the feat/sdk-reproducible-workspace-integrity branch July 28, 2026 18:11
@unbraind

unbraind commented Aug 4, 2026

Copy link
Copy Markdown
Owner Author

Tracked in PM: pm-0k4o8t, pm-83ov2i, pm-dkrmzv, pm-huolbk, pm-q7qojt, pm-rbcvt2, pm-wi301j.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment