release: v2.0.0 - #11
Merged
Merged
Conversation
The flow was configurable in ways that cost users decisions without
buying them anything. A project could reorder the pipeline, add its own
phases, retarget every path, and flip approval gates — so "Kivax" meant
something different in each repo, and the docs, skills, and error
messages could only describe the default. This makes the workflow the
tool's, and leaves config.yml holding only what a project genuinely
decides.
BREAKING CHANGE: config.yml keys `pipeline`, `gates`, `git.branch_prefix`,
every `paths.*` except `features`, and `stack.*.cmd_lint` are ignored;
`kivax promote` and `.kivax/sync.json` are gone. Old configs keep
working — `kivax doctor` names each dead key and what replaced it.
The flow is now code:
- PIPELINE is fixed at spec → compile → plan → tdd → it → audit → retro,
with GATES alongside it. Both live in kivax_lib, not in any config.
- Users can no longer add agents, skills, or phases to the flow. The
worked example under share/examples/ and the extension paths in the
orchestrator and skills are removed.
- paths_of() derives every path from paths.features, the one a project
still chooses (an existing repo may have docs/spec/ spoken for).
principles and architecture leave the pipeline entirely:
They describe the project, not this week's feature, so asking "does the
file exist yet?" at the head of every feature answered a question about
the repository in the wrong place — two steps in each feature's history
that did nothing. They become one-time setup behind the new kivax-setup
skill, gated by `kivax feature new`, which refuses while either document
is missing. Completion is the file existing on disk; deliberately no
flag in state.yml, which could disagree with it. ARCHITECTURE.md upkeep
already lived in the plan phase, so nothing moves there.
upgrade replaces the three-way sync:
The manifest, hash comparison, conflict reporting, and .upstream sidecar
files existed only to protect local edits to files that are generated
from the store plus config.yml. With nothing left to customize in them,
upgrade overwrites what it manages and prunes what the store no longer
ships, so a renamed skill can't linger as a phase driver the flow never
references. `kivax promote`, which pushed those edits back upstream, has
no purpose left.
Per-agent model selection lands where the choice belongs:
agents:
default: {model: sonnet}
orchestrator: {model: opus}
The value is rendered into each agent file's frontmatter at init/upgrade
in the runtime's own spelling, and doctor rejects an unknown agent name,
which is otherwise silent. It reaches claude, cursor, and opencode;
copilot-cli, vscode-copilot, and codex have no model field to write to.
Co-Authored-By: Claude <noreply@anthropic.com>
feat!: Kivax owns the workflow, and models are selected from config
The flow claimed to end in a draft pull request, but nothing ever pushed.
Commits accumulated locally through tdd, it, and retro, so the PR — if
it was created at all — never received the implementation, and the audit
marked "ready" a pull request the reviewer would find empty.
Three separate holes, found while tracing what the flow actually does to
git:
1. No `git push` existed anywhere in the skills. The branch was created
and committed locally, then `gh pr create` was asked to open a PR for
an unpushed branch — which stops to ask where to push it, a prompt
nothing is there to answer, and which `glab` refuses outright.
2. A missing gh/glab was silently ignored ("if a CLI is available"), and
the audit phase then unconditionally tried to mark a PR that was
never created. Nothing detected it.
3. The base branch came from `origin/HEAD`, which points at the
published branch. On a gitflow repo that is `main`, so every feature
PR targeted production instead of the integration branch.
Gitflow is now the model, explicitly:
- detect_base_branch prefers `develop` when it exists, before falling
back to origin/HEAD. BRANCH_PREFIX is fixed at `feature/`, like the
pipeline — what the branch is called doesn't vary, what it's cut from
does (git.base_branch).
- kivax-plan cuts feature/<NN>-<slug> from the base, commits spec+plan,
pushes with -u, and opens the PR as a draft against the base.
- tdd, it, and retro push before ending. An unpushed commit isn't in the
PR, and the PR is the only thing a human reviews.
- kivax-audit verifies the tree is clean and everything is pushed before
marking the PR ready and writing the reviewer's summary into it.
A forge CLI is now required, not optional. A pull request is a forge
concept, not a git one — no git command creates one — so without gh or
glab the flow cannot deliver what it promises. `kivax doctor` reports it
up front rather than letting the plan phase discover it after the branch
and commits already exist.
New kivax-git skill for merge, release, and hotfix. These stay out of
the flow: it ends at a PR marked ready, and the human merges. The skill
runs only when asked for by name and confirms each irreversible step,
never force-pushes, and never writes directly to main or develop. The
orchestrator's hard rule moves from "you never merge" to "you never
merge on your own initiative", with the distinction spelled out — a
passing audit is what makes a PR reviewable, not a substitute for the
review.
Test robustness: doctor's forge-CLI check would otherwise make the suite
pass or fail on whether the machine happens to have gh installed. An
autouse fixture pins it, and the real-subprocess e2e test asserts
against whatever the machine actually has, since no monkeypatch reaches
a separate process.
Co-Authored-By: Claude <noreply@anthropic.com>
feat(git): finish every feature as a reviewable gitflow pull request
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.
Release v2.0.0: Kivax owns the workflow, gitflow is explicit.
Breaking changes
paths.featuresis configurable; wiki, lessons, state, lock, principles, architecture are derived or hardcoded.kivax promote, sync.json, .upstream files, and the manifest are eliminated. Upgrade now overwrites and prunes.Features
agents:block in config.yml lets you pick a model per agent (Claude Code, Cursor, opencode only; GitLab's glab and VS Code Copilot inherit defaults).feature/<NN>-<slug>, cut fromdevelop(or whatevergit.base_branchsays). The flow ends as a pull request marked ready for review. Every phase pushes before ending, so the PR contains the work.gh(GitHub) orglab(GitLab) must be installed and authenticated.kivax doctorchecks for it.kivax-gitskill: merge, release, hotfix — only when the human asks, with confirmation before each irreversible step. Never force-pushes, never writes directly to main/develop.Migration
Update
.kivax/config.ymltoversion: 3. Delete obsolete keys:pipeline,gates,paths(exceptfeatures),git.branch_prefix,stack.*.cmd_lint. If you see a warning about stale keys, delete them and re-runkivax doctor.Commits: 5 (PRs #9, #10, and prior work on the platform)