Skip to content

commit_docs: false is ignored — .planning/ files still committed to git #790

@AbdelrhmanHamouda

Description

@AbdelrhmanHamouda

GSD Version

1.21.0

Runtime

Claude Code

What happened?

With commit_docs set to false in .planning/config.json, GSD still commits .planning/ files to git. This happens across multiple workflows (executor, planner, researcher, synthesizer, etc.).

In my project there are 66 commits touching .planning/ — all made while commit_docs: false was set:

$ git log --all --oneline -- .planning/ | wc -l
      66

Example commits that should not have been made:

9cf0a41 docs(roadmap): add gap closure phase 31
360e9ba docs(phase-29): complete phase execution — verification passed
0fb9d54 docs: create milestone v2.1 roadmap (4 phases)
c2a3f5d docs: define milestone v2.1 requirements

This also causes a painful side effect: once .planning/ files are committed, they become tracked by git. .gitignore only applies to untracked files, so git add . re-stages them. Running git rm -r --cached .planning/ to untrack never sticks because GSD re-commits them on the next phase execution.

What did you expect?

With commit_docs: false, no .planning/ files should ever be committed to git. All agent workflows and gsd-tools.cjs commit should respect this setting completely.

Steps to reproduce

  1. Run /gsd:settings and set commit_docs to false
  2. Confirm .planning/config.json shows "commit_docs": false
  3. Add .planning/ to .gitignore
  4. Run /gsd:plan-phase followed by /gsd:execute-phase
  5. Check git log --oneline -- .planning/ — commits to .planning/ files appear despite the setting

Relevant logs or error messages

# .planning/config.json
{
  "model_profile": "quality",
  "commit_docs": false,
  "workflow": {
    "research": true,
    "plan_check": true,
    "verifier": true,
    "auto_advance": false,
    "nyquist_validation": true
  },
  "git": {
    "branching_strategy": "none"
  }
}

# .gitignore entry
.planning/

# The gate exists in commands.cjs but is not effective:
# if (!config.commit_docs) {
#     const result = { committed: false, hash: null, reason: 'skipped_commit_docs_false' };
#     output(result, raw, 'skipped');
#     return;
# }
#
# All doc-committing agents route through gsd-tools.cjs commit
# (executor, planner, researcher, synthesizer), so the gate should work.
# Possible causes:
# - loadConfig(cwd) not resolving the correct config.json
# - Default commit_docs: true in core.cjs winning if config loading fails silently
# - Orchestrator commands bypassing gsd-tools.cjs commit entirely

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-triageNew issue awaiting maintainer review

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions