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.
- Concurrent steps support in workflow definitions
- Workflows can now specify nested arrays of step IDs to indicate steps that can run in parallel
- Example:
steps: [setup, [task_a, task_b, task_c], finalize]runs task_a/b/c concurrently - Single-item arrays indicate a step with multiple parallel instances (e.g.,
[fetch_campaign_data]runs for each campaign) - New
WorkflowStepEntrydataclass in parser for sequential/concurrent step groups - Meta-skill template renders concurrent steps as "Background Task 1/2/3" with clear instructions
- Added
get_step_entry_position_in_workflow()andget_concurrent_step_info()methods to JobDefinition - Full backward compatibility: existing workflows with simple step arrays continue to work
- Agent delegation field for job.yml steps
- New
agentfield on steps allows specifying an agent type (e.g.,agent: general-purpose) - When
agentis set, generated Claude Code skills automatically includecontext: forkandagent:in frontmatter - Enables steps to delegate execution to specific agent types
- Updated
deepwork_jobs.definestep instructions with agent delegation guidance - Updated
job_spec.mddoc spec with "Agent Delegation" section
- New
- Explicit workflow definitions in job.yml for distinguishing multi-step workflows from standalone skills
- New
workflowssection in job.yml withname,summary, and orderedstepsarray - Workflows are shown separately from standalone skills in generated meta-skills
- Step skills now display workflow context (e.g., "Step 2/3 in new_job workflow")
- Standalone skills are clearly marked as "can be run anytime"
- Backward compatible: jobs without
workflowssection use dependency-based detection
- New
- Skill templates now show workflow-aware progress (e.g., "new_job step 2/3 complete")
- Meta-skill template reorganized to show "Workflows" and "Standalone Skills" sections separately
- Updated
deepwork_jobsstandard job to v1.0.0 with explicitnew_jobworkflow - SessionStart hook now skips non-initial sessions (resume, compact/clear) by checking the
sourcefield in stdin JSON, reducing noise and redundant checks
- Fixed skill template generating malformed YAML frontmatter with fields concatenated on single lines
- Removed over-aggressive
{%-whitespace stripping from Jinja template - Fields like
user-invocableandhooksnow render on proper separate lines - Affects
src/deepwork/templates/claude/skill-job-step.md.jinja
- Removed over-aggressive
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.