All notable changes to DeepWork will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
review_depth: lightweightannotation for review blocks injob.ymlstep outputs and.deepreviewrules — when set, the workflow'scommon_job_infopreamble is omitted from review instruction files, reducing token overhead for trivial or reversible intermediate steps (closes #86)- Hung-reviewer retry policy in quality gate guidance: reviewers completing with 0 tool uses are retried up to
REVIEWER_MAX_RETRIES(default: 1) times before being skipped with a "manual review recommended" note; fast-fails (elapsed <REVIEWER_FAST_FAIL_SECONDS, default: 30s) are retried immediately (closes #408)
0.14.0 - 2026-04-20
- New
PLUG-REQ-001.15: Hook Script CLI Invocationrequirement indoc/specs/deepwork/cli_plugins/PLUG-REQ-001-claude-code-plugin.md
claude_plugin_hook_deepwork_invocationreview rule now requires plugin hook scripts to invoke the CLI viauvx deepworkinstead of merely providing auvx deepworkfallback (PLUG-REQ-001.15)- Plugin hook scripts (
post_commit_reminder.sh,deepschema_write.sh,post_compact.sh) now invoke thedeepworkCLI exclusively viauvx deepwork ..., matching the MCP server launch inplugins/claude/.mcp.json - Flake
shellHookno longer runsuv tool install -e— the editable user-leveldeepworkinstall is redundant now that plugin hooks go throughuvx
- Plugin hooks no longer fail when the end user has a stale user-level
deepworkinstall (e.g.,uv tool install deepworkpinned to an older release) that wins PATH lookup but lacks the hook module being requested. The 0.13.9 fallback still used PATH first; this release bypasses PATH entirely so hooks resolve to the sameuvxcache that the MCP server populated
0.13.9 - 2026-04-16
- New
claude_plugin_hook_deepwork_invocationreview rule inplugins/claude/.deepreviewthat flags plugin hook scripts which call baredeepworkwithout auvx deepworkfallback
0.13.8 - 2026-04-14
- Renamed default reviewer agent from
reviewertodeepwork:reviewer(plugin-namespaced) in review instructions output /reviewskill now checks fordeepwork:revieweragent availability before proceeding and directs users to/reload-pluginsif missing
0.13.7 - 2026-04-14
0.13.6 - 2026-04-14
- Deprecated the
steps/folder pattern for job definitions — step instructions are now inlined injob.yml; moved supplemental reference files fromsteps/to job root directories - Repair workflow now instructs agents to
git rmstep instruction files after inlining - Moved
specs/todoc/specs/and consolidateddocs/intodoc/to reduce root directory clutter
coverage_report.md(stale snapshot)job_refactor.md(superseded planning notes)CLAUDE_PLUGINS_README.md(redundant with README.md)
0.13.5 - 2026-04-12
0.13.4 - 2026-04-11
- Post-commit review reminder hook now short-circuits when all applicable (non-catch-all) review rules for the committed files are already marked as passed, emitting "No re-review needed" instead of nagging
- Renamed all "Task tool" references to "Agent tool" across codebase to match Claude Code's current tool naming
- Review formatter now emits
description,subagent_type, andpromptfields (droppednamefield) to match Agent tool signature - Hook wrapper tool mappings updated:
Task/task→Agent/agent
- Review instruction files now include a
## Project Rootdirective stating the absolute project root so reviewer subagents read files from the correct working tree — fixes spurious findings in git-worktree setups where the subagent's cwd differed from the worktree the commits actually lived in (REVIEW-REQ-005.1.9)
- Removed automatic DeepPlan workflow injection from startup_context.sh hook (no longer forces plan mode into DeepPlan)
- Deprecated JOBS-REQ-014.5.1 (startup hook DeepPlan trigger) and REVIEW-REQ-006.3.3a (name field in review output)
0.13.3 - 2026-04-10
/recordskill: "watch and learn" approach to creating DeepWork workflows — users do their work normally, then/deepwork learnturns it into a repeatable job/new_userskill: guided onboarding that introduces DeepWork, offers review rule setup for code projects, and offers to record a first workflow/deepwork learnnow routes to thenew_jobworkflow when invoked after/deepwork:record- Requirements specs PLUG-REQ-002 (record skill) and PLUG-REQ-003 (new user skill)
- Anonymous DeepSchemas for both new skills
- README install commands consolidated into a single
&&-joined command ending with/deepwork:new_user deepwork setupnow openshttps://www.deepwork.md/successin the default browser after completing configuration
0.13.2 - 2026-04-09
deepwork setupCLI command that auto-configures Claude Code settings (marketplace, plugin, MCP permissions, auto-update) (#343)deepwork setupalso grants project-root-relativeRead/Write/Editpermissions for/.deepwork/**/*so the plugin can operate on.deepwork/in every project without per-prompt approval- Integration tests for quality gate review caching (JOBS-REQ-004.5.7)
- Requirements traceability coverage now at 100% (#346)
- Added section-level REQ ID annotations to 32 existing test files for traceability
- Wrote 218 new tests across 5 files for learning-agents requirements (LA-REQ-001, 003, 004, 005, 006, 010, 011)
- Added 6 anonymous DeepSchemas for judgment-based learning-agents skill requirements (LA-REQ-002, 007, 008, 009, 012)
- Added new PLUG-REQ-001.12 tests for session/agent identity injection hooks
- New
req-ids-in-commentsrequirement in the standard DeepSchema definition: requirement IDs must be placed in YAML comments, not requirement body text
- JOBS-REQ-004.5.7 strengthened to explicit MUST requirement for skipping already-passed reviews
- DeepSchema PostToolUse hook (
deepschema_write) no longer reportsFile is not valid JSONfor YAML files whose name has no extension (e.g..deepreview). The hook now parses target files and the referenced JSON Schema as YAML, which is a superset of JSON, so both formats are accepted regardless of file extension. DW-REQ-011.7.3 updated to match. (Mirrors the fix shipped in #338 for the workflow quality gate.) review:blocks declared ontype: stringstep outputs are now actually executed. Previously they were silently dropped because the review pipeline only matched against file paths, leaving authors with misconfigured-but-silent quality gates. String output reviews now produce syntheticReviewTaskobjects with the string value carried on a newReviewTask.inline_contentfield and rendered into the instruction file as a "Content to Review" section. New requirements: JOBS-REQ-004.8, REVIEW-REQ-005.1.8, REVIEW-REQ-009.1.7. (#350)
0.13.1 - 2026-04-06
0.13.0 - 2026-04-03
- Add DeepPlan — structured planning workflow that produces executable DeepWork job definitions (#331)
- New
deepplanstandard job withcreate_deep_planworkflow (5 steps: explore, design alternatives, synthesize, enrich, present) - New
register_session_jobandget_session_jobMCP tools for transient session-scoped job definitions - New
/deepplanskill for Claude Code plugin - Startup context hook auto-triggers DeepPlan when entering plan mode
- Session jobs are discoverable by
start_workflowand take priority over standard discovery
- New
/reviewskill now checks changelog accuracy and PR description during reviews (#331).deepreviewrules can now declare aprecomputed_info_for_reviewer_bash_commandthat runs before the review and injects stdout into the instruction file as precomputed context (#337)- Commands run in parallel across rules with a 60-second timeout and graceful error handling
- Applied to
requirements_traceabilityandpython_lintrules to eliminate redundant agent tool calls
- New
deepreviewstandard DeepSchema with semantic quality requirements for.deepreviewconfig files (#337) Makefilewithlinttarget that auto-fixes formatting/linting and runs type checking (#337)
- Quality gate
validate_json_schemas()now usesyaml.safe_load(a JSON superset) instead ofjson.loads, so YAML output files are validated correctly
0.12.0 - 2026-04-03
0.11.0 - 2026-03-31
0.10.0 - 2026-03-29
0.9.8 - 2026-03-26
0.9.7 - 2026-03-24
- Add shared_jobs workflow for installing library jobs from the DeepWork library (#273)
- Add research job to library (moved from standard jobs) (#274)
- Add platform_engineer job to library (#268)
- Add repo job for repository setup and health auditing (#266)
- Add slash command creation guide to shared jobs readme (#277)
- Rewrite README around "trustworthy agents" framing and enrich Reviews coverage (#271)
- Require DRY and comment accuracy in language convention files (#267)
- Shared_jobs workflow references library jobs instead of copying (#275)
0.9.6 - 2026-03-09
- Add file-based status reporting for external consumers (#257)
- Add AGENTS.md → CLAUDE.md symlink rule and create symlinks for existing files (#259)
- Refactor state management to use session-scoped persistent storage (#255)
- Harden e2e CI tests and copy job schema at MCP startup (#252)
0.9.5 - 2026-03-03
0.9.4 - 2026-03-02
0.9.3 - 2026-02-27
0.9.2 - 2026-02-24
0.9.1 - 2026-02-23
0.9.0 - 2026-02-22
0.8.0 - 2026-02-16
- MCP Server Architecture - New Model Context Protocol server for checkpoint-based workflow execution
- Improved
deepwork_jobssteps for workflow management - JSON Schema for job.yml validation (
src/deepwork/schemas/job.schema.json) - Reference documentation for calling Claude in print mode (
doc/reference/calling_claude_in_print_mode.md) - Migrated to uv2nix for reproducible Python builds in flake.nix
- BREAKING: Simplified skill generation to single
/deepworkentry point skill - BREAKING: Workflow execution now happens through MCP tool calls instead of slash commands
- Streamlined
deepwork_jobs.defineanddeepwork_jobs.implementfor MCP workflow - Updated
deepwork_jobs.learnwith simplified instructions - Simplified adapter templates - removed complex skill templates
- MCP server registered in
.claude/settings.jsonduring install
- BREAKING: Rules system removed
- BREAKING: Removed per-step skill generation templates and logic
- Removed per-step skill generation templates and logic
- Removed
commitjob from library (was example job) - Removed
manual_tests/directory andmanual_testsjob - Removed
add_platformbespoke job - Removed many hook scripts that are no longer needed with MCP architecture
- Removed Gemini per-step skill templates (
.gemini/skills/now only has entry point)
- Run
deepwork installto get the new MCP server configuration - Workflows are now executed via
/deepworkwhich uses MCP tools internally - Rules system is completely removed - consider implementing validation logic in quality criteria instead
- Existing job definitions still work but are executed through MCP checkpoints
- The
.deepwork/rules/directory can be safely deleted
0.5.1 - 2026-01-24
0.5.0 - 2026-01-24
- Installer now auto-adds permission for
make_new_job.shscript, allowing Claude to run job creation without manual configuration - Manual release workflow (
create-release.yml) that automates version releases:- Takes version number as input, validates format
- Updates CHANGELOG.md: converts Unreleased section to new version with date
- Adds fresh Unreleased section with placeholder categories
- Updates pyproject.toml version and runs uv sync for lock file
- Commits changes directly to main, creates tag, and publishes GitHub release
- Commit job now requires changelog entries go to
[Unreleased]section and explicitly prohibits modifying version numbers
0.4.2 - 2026-01-24
- Added closing tag comments to jinja templates for improved readability
0.4.1 - 2026-01-23
- Disabled prompt-based stop hooks in Claude templates due to upstream bug (#20221)
- Quality validation now uses sub-agent review pattern instead of prompt hooks
0.4.0 - 2026-01-23
- Doc specs (document specifications) as a first-class feature for formalizing document quality criteria
- New
src/deepwork/schemas/doc_spec_schema.pywith JSON schema validation - New
src/deepwork/core/doc_spec_parser.pywith parser for frontmatter markdown doc spec files - Doc spec files stored in
.deepwork/doc_specs/directory with quality criteria and example documents - Auto-creates
.deepwork/doc_specs/directory duringdeepwork install
- New
- Extended job.yml output schema to support doc spec references
- Outputs can now be strings (backward compatible) or objects with
fileand optionaldoc_specfields - Example:
outputs: [{file: "report.md", doc_spec: ".deepwork/doc_specs/monthly_report.md"}] - The
doc_specuses the full path to the doc spec file, making references self-documenting
- Outputs can now be strings (backward compatible) or objects with
- Doc spec-aware skill generation
- Step skills now include doc spec quality criteria, target audience, and example documents
- Both Claude and Gemini templates updated for doc spec rendering
- Document detection workflow in
deepwork_jobs.define- Steps 1.5, 1.6, 1.7 guide users through creating doc specs for document-oriented jobs
- Pattern indicators: "report", "summary", "create", "monthly", "for stakeholders"
- Doc spec improvement workflow in
deepwork_jobs.learn- Steps 3.5, 4.5 capture doc spec-related learnings and update doc spec files
- New
OutputSpecdataclass in parser for structured output handling - Comprehensive doc spec documentation in
doc/doc-specs.md - New test fixtures for doc spec validation and parsing
- Comprehensive tests for generator doc spec integration (9 new tests)
test_load_doc_spec_returns_parsed_spec- Verifies doc spec loadingtest_load_doc_spec_caches_result- Verifies caching behaviortest_load_doc_spec_returns_none_for_missing_file- Graceful handling of missing filestest_generate_step_skill_with_doc_spec- End-to-end skill generation with doc spectest_build_step_context_includes_doc_spec_info- Context building verification
- BREAKING: Renamed
document_typetodoc_specthroughout the codebase- Job.yml field:
document_type→doc_spec(e.g.,outputs: [{file: "report.md", doc_spec: ".deepwork/doc_specs/report.md"}]) - Class:
DocumentTypeDefinition→DocSpec(backward compat alias provided) - Methods:
has_document_type()→has_doc_spec(),validate_document_type_references()→validate_doc_spec_references() - Template variables:
has_document_type→has_doc_spec,document_type→doc_spec - Internal:
_load_document_type()→_load_doc_spec(),_doc_type_cache→_doc_spec_cache
- Job.yml field:
Step.outputschanged fromlist[str]tolist[OutputSpec]for richer output metadataSkillGenerator.generate_all_skills()now acceptsproject_rootparameter for doc spec loading- Updated
deepwork_jobsto v0.6.0 with doc spec-related quality criteria
- Fixed COMMAND rules promise handling to properly update queue status
- When an agent provides a promise tag for a FAILED command rule, the queue entry is now correctly updated to SKIPPED status
- Previously, FAILED queue entries remained in FAILED state even after being acknowledged via promise
- This ensures the rules queue accurately reflects rule state throughout the workflow
- Fixed quality criteria validation logic in skill template (#111)
- Changed promise condition from AND to OR: promise OR all criteria met now passes
- Changed failure condition from OR to AND: requires both criteria NOT met AND promise missing to fail
- This corrects the logic so the promise mechanism properly serves as a bypass for quality criteria
- Update job.yml files: Change
document_type:todoc_spec:in output definitions - Update any code importing
DocumentTypeDefinition: UseDocSpecinstead (alias still works) - Run
deepwork installto regenerate skills with updated terminology
0.3.1 - 2026-01-20
createdrule mode for matching only newly created files (#76)- Rules with
mode: createdonly fire when files are first added, not on modifications - Useful for enforcing patterns on new files without triggering on existing file edits
- Rules with
- Fixed
createdmode rules incorrectly firing on modified files (#83) - Fixed
compare_to: promptmode not detecting files that were committed during agent response- Rules like
uv-lock-syncnow correctly fire even when changes are committed before the Stop hook runs
- Rules like
0.3.0 - 2026-01-18
- Cross-platform hook wrapper system for writing hooks once and running on multiple platforms
wrapper.py: Normalizes input/output between Claude Code and Gemini CLIclaude_hook.shandgemini_hook.sh: Platform-specific shell wrappersrules_check.py: Cross-platform rule evaluation hook
- Platform documentation in
doc/platforms/with hook references and learnings - Claude Code platform documentation (
doc/platforms/claude/) update.jobfor maintaining standard jobs (#41)make_new_job.shscript and templates directory for job scaffolding (#37)- Default rules template file created during
deepwork install(#42) - Full e2e test suite: define → implement → execute workflow (#45)
- Automated tests for all shell scripts and hook wrappers (#40)
- Rules system v2 with frontmatter markdown format in
.deepwork/rules/- Detection modes: trigger/safety (default), set (bidirectional), pair (directional)
- Action types: prompt (show instructions), command (run idempotent commands)
- Variable pattern matching with
{path}(multi-segment) and{name}(single-segment) - Queue system in
.deepwork/tmp/rules/queue/for state tracking and deduplication
- New core modules:
pattern_matcher.py: Variable pattern matching with regex-based capturerules_queue.py: Queue system for rule state persistencecommand_executor.py: Command action execution with variable substitution
- Updated
rules_check.pyhook to use v2 system with queue-based deduplication
- BREAKING: Refactored "commands" terminology to "skills" throughout the codebase
- Directory structure changed from
.claude/commands/to.claude/skills/ - Directory structure changed from
.gemini/commands/to.gemini/skills/ - Class renamed:
CommandGenerator→SkillGenerator - Enum renamed:
CommandLifecycleHook→SkillLifecycleHook - Class attributes renamed:
commands_dir→skills_dir,command_template→skill_template - Methods renamed:
get_commands_dir()→get_skills_dir(),generate_all_commands()→generate_all_skills(), etc. - Template files renamed:
command-job-step.md.jinja→skill-job-step.md.jinja, etc.
- Directory structure changed from
- BREAKING: Removed
uw.prefix convention for hidden steps- Step skills now use clean filenames (e.g.,
job_name.step_id.mdinstead ofuw.job_name.step_id.md) - Hidden steps use
user-invocable: falsein YAML frontmatter instead - The
exposedfield in job.yml now controls theuser-invocablefrontmatter setting
- Step skills now use clean filenames (e.g.,
- CLI output messages updated to use "skills" terminology
- Standardized on "ask structured questions" phrasing across all jobs (#48)
- deepwork_jobs bumped to v0.5.0, deepwork_rules to v0.2.0
- Documentation updated with v2 rules examples and configuration
- Stop hooks now properly return blocking JSON (#38)
- Various CI workflow fixes (#35, #46, #47, #51, #52)
- Command rule errors now include promise skip instructions with the exact rule name
- Previously, failed command rules only showed "Command failed" with no guidance
- Now each failed rule shows:
To skip, include <promise>Rule Name</promise> in your response - This allows agents to understand how to proceed when a command rule fails
- v1 rules format (
.deepwork.rules.yml) - now only v2 frontmatter markdown format is supported
- Run
deepwork install --platform claudeto regenerate skills in the new location - Remove old
.claude/commands/and.gemini/commands/directories manually - Update any custom code that imports
CommandGeneratororCommandLifecycleHook
0.1.1 - 2026-01-15
compare_tooption in rules system for flexible change detection (#34)base(default): Compare to merge-base with default branchdefault_tip: Two-dot diff against default branch tipprompt: Compare to state captured at prompt submission
- New
learncommand replacingrefinefor conversation-driven job improvement (#27)- Analyzes conversations where DeepWork jobs were run
- Classifies learnings as generalizable (→ instructions) or bespoke (→ AGENTS.md)
- Creates learning_summary.md documenting all changes
- "Think deeply" prompt in learn step for enhanced reasoning (#33)
- Supplementary markdown file support for job steps (#19)
- Browser automation capability consideration in job definition (#32)
- Platform-specific reload instructions in adapters (#31)
- Version and changelog update rule to enforce version tracking on src changes
- Added claude and copilot to CLA allowlist (#26)
- Moved git diff logic into evaluate_rules.py for per-rule handling (#34)
- Renamed
capture_work_tree.shtocapture_prompt_work_tree.sh(#34) - Updated README with PyPI install instructions using pipx, uv, and pip (#22)
- Updated deepwork_jobs job version to 0.2.0
- Stop hooks now correctly return blocking JSON when rules fire
- Added shell script tests to verify stop hook blocking behavior
refinestep (replaced bylearncommand) (#27)get_changed_files.shhook (logic moved to Python rule evaluator) (#34)
0.1.0 - Initial Release
Initial version.