Skip to content

Releases: brawblan/ai-workflow

v1.5.0

Choose a tag to compare

@brawblan brawblan released this 31 Oct 20:39
4f3424a

Summary

New optional key protect_instruction_files. With true, K6 and the hook protect the instruction files of the harness in any folder (D87), and check K22 tests their text (D89). New command stone check-dependencies (K23) warns on a new package that the PR body does not name (D90). New optional key framework_commit. G3 installs stone from that commit, and PyYAML from a list of hashes (D92). New command stone check-workflows (K24) warns on an unpinned tool in a changed workflow (D93). Generated YAML and Markdown pass a formatter check with default options, the drift check ignores a change of form only, and the new option stone gate --split-checks gives each command of all_checks its own row (D96). stone eval can run a trigger workflow, with a fake forge CLI for the post job (D101).

Config changes

  • Added protect_instruction_files (default: false): true adds the instruction files of the harness to the protected paths of K6 and the hook (D87).
  • Added instruction_text (default: none): hosts and packages that K22 allows in an instruction file (D89).
  • Added framework_commit (default: none): the commit SHA of the tag v<framework_version>. stone upgrade --apply sets it. G3 installs stone from it (D92).

Steps

  1. Optional: set protect_instruction_files to true in .cornerstone/config.yaml. Commit the config change alone, with the trailer Role human.
  2. Then run stone render. Commit the generated files alone, with the trailers Role generator and Actor agent.
  3. stone upgrade --apply sets framework_commit. Check in the config diff that it is the commit of the tag v1.5.0.

Full changes: #246

v1.4.0

Choose a tag to compare

@brawblan brawblan released this 29 Oct 02:08
012f83a

Summary

K20 blocks by default, and profile override files now work. A repo with no specialists key and no override file keeps its G3 result.

  • Check K20 blocks by default (D80, #153). A repo with specialists now fails G3 on a blocking specialist finding.
    • A stricter check is normally a major change (versioning.md). 1.4.0 is an exception.
    • Reasons: D66 announced the block date in 1.2.0, and no known repo has specialists. A Waiver (K20) section still passes.
  • A Waiver (K6) section passes a bot commit on a protected path, for example a Dependabot update of an action SHA (D83, #201). It applies only if the PR author and the commit author are both bot accounts.
  • Profile override files work (D84, D85, #78). stone check validates .cornerstone/profiles/<profile>.yaml, and stone render applies checks_add, check waivers, and the K7 limit.
  • New command stone check-ready (K21) reports a Definition of Ready field that is missing or empty (D82, #115). It is a warning. Single-ticket and debugging list it.
  • K17 counts a dotted token, such as 1.4.0 or versioning.md, as one word (D79, #112).

Config changes

Key Default Note
none No key is added, renamed, or removed. The new file .cornerstone/profiles/<profile>.yaml is optional.

Changed generated files

  • .github/workflows/cornerstone-checks.yml: the K20 step runs with --mode block, only if the repo config has specialists (D80). The K6 step gets the PR body and the PR author through env (D83).
  • .cornerstone/checks/protected_paths.py: K6 reads a Waiver (K6) section for a bot commit on a PR that a bot opened (D83).
  • With a profile override file, the files that it changes: for example a new K8 step, or a new K7 limit in .cornerstone/checks/change_size.py (D85).

Steps

  1. Set framework_version to 1.4.0, and run stone render.
  2. If the repo config has specialists, G3 now fails on a blocking specialist finding. To pass, fix the finding, or add a Waiver (K20) section with text to the PR body.
  3. If the repo has a file in .cornerstone/profiles/, run stone check first. Fix each finding.
  4. Commit the changed generated files alone, with the trailers Role: generator and Actor: agent.

Also in this release

  • Evals for 4 roles: shaper, reviewer, implementer, and investigator (#190, #191, #194, #197).
  • stone check-rules runs R1 (action pins) and R2 (plugin version bump) for this repo only (D78, #193).
  • The core names no tool and no harness folder (D76, #189).
  • K18 gives a warning for a Personas: label in the middle of a line (D77, #196).
  • A G5 fallback for a base branch that is not in ci.branches (D81, #200).
  • The review of the early blocking of K7, K14, and K17 found no false positive of these checks (D79, #203).

v1.3.0

Choose a tag to compare

@brawblan brawblan released this 27 Oct 14:21
a92b1b0

Summary

Four new optional keys under ci change the G3 workflow. Without them, each rendered file is the same as in 1.2.1.

  • ci.env and ci.secrets add an env: block to the All checks step (#163).
  • ci.setup adds steps before Install, for example a Node setup with a package cache (#162).
  • ci.branches limits K6, K7, K14, and K20 to PRs into the listed base branches (#164). A promotion PR, for example dev to staging, then runs only the other checks.

Config changes

Key Default Note
ci.env none A map of NAME: value for the All checks step. Plain values only (D72).
ci.secrets none A list of repo secret names. The step gets ${{ secrets.NAME }} (D72).
ci.setup none node adds a pinned actions/setup-node step with cache: npm. steps adds uses, with, and run items (D73).
ci.branches none A list of base branches. It must list branches.integration (D74).

Changed generated files

  • .github/workflows/cornerstone-checks.yml: it changes only if you set one of the new keys.

Steps

  1. Set framework_version to 1.3.0, and run stone render.
  2. To pass a secret to the tests, add it as a repo secret. List its name in ci.secrets.
  3. If a test reads a secret, make it skip when the value is empty. A PR from a fork gets an empty value.
  4. To skip the ticket checks on promotion PRs, set ci.branches to the base branches of the ticket PRs. For example, use [dev].
  5. If you set ci.branches, require a human review on each base branch that is not in the list (G5).
  6. After a change to the config, run stone render.
  7. Commit the changed generated files alone, with the trailers Role: generator and Actor: agent.

Also in this release

One place now checks the keys under ci, so a wrong key gives one error (#181).

v1.2.1

Choose a tag to compare

@brawblan brawblan released this 23 Oct 21:00
6e85883

Summary

stone render keeps the indent (a tab, or N spaces) and the final newline of a JSON file that it merges into, for example .claude/settings.json (#165). Each role file lists the tool StructuredOutput, so a trigger run with --json-schema returns its report and the post job posts it (#166).

Config changes

None.

Changed generated files

  • .claude/settings.json: render no longer changes the indent of the file.
  • .claude/agents/{implementer,tester,reviewer,shaper,planner,investigator}.md: the tools list has StructuredOutput.

Steps

  1. Set framework_version to 1.2.1.
  2. Run stone render. If a formatter changed the indent of .claude/settings.json, render now keeps it.
  3. Commit the changed generated files alone, with the trailers Role: generator and Actor: agent.

Also in this release

The plugin workflow is now cornerstone (#167). The skills dev-pr and backlog-sequencer are merged into ticket-delivery (#161). New: the writing guidance eval (#168, #169). The integration branch is dev (#157, #159).

v1.2.0

Choose a tag to compare

@brawblan brawblan released this 23 Oct 01:30
333c6ef

Cornerstone 1.2.0 (minor)

The claude-5 profile uses Sonnet for the implementer and the tester, and sets an effort for each role. The role files tell the role to run the checks once, to stop after 2 failed fixes, and to do one ticket in a session. Check K20 fails a PR with a blocking specialist finding. paths.plans and paths.reports accept {id}, for one folder for each ticket.

Config changes

  • paths.plans (default docs/plans/) accepts {id} as the last folder level: one folder for each ticket (D67).
  • paths.reports (default docs/reports/) accepts {id} as the last folder level, as paths.plans does (D67).
  • No key is renamed or removed.

Generated files that change

  • .claude/agents/implementer.md: model is Sonnet, with effort medium. Has the check run rule, the stop rule, and the session rule (D63).
  • .claude/agents/tester.md: model is Sonnet, with effort medium. Has the check run rule and the session rule (D63).
  • .claude/agents/reviewer.md: effort high and the session rule (D63).
  • .claude/agents/shaper.md: effort medium and the session rule (D63).
  • .github/workflows/cornerstone-checks.yml: a K20 step, only with a specialists section (D66).

Steps to upgrade

  1. Install the new stone, and set framework_version to 1.2.0.
  2. Run stone upgrade, then stone upgrade --apply. Commit the changed generated files alone, with the trailers Role: generator and Actor: agent.
  3. With a specialists section: add the lines Ticket and Personas to each PR body, and commit each findings report in the PR (D66).
  4. To keep a role on a stronger model, set it in the model profile of the repo. Render again.
  5. Check the when.paths values of each specialist. They use the rules of paths.tests (D65). A value that starts with ./ no longer matches.
  6. To give each ticket its own folder, set paths.plans or paths.reports to a value that ends with {id}/, for example .stone/plans/{id}/. Move the old files into ticket folders. Run stone render (D67).

Guide: docs/guides/upgrade-cornerstone.md

v1.1.0

Choose a tag to compare

@brawblan brawblan released this 22 Oct 03:52
ba8f897

Cornerstone 1.1.0 (minor)

Optional settings for a local-only setup, role commits, opt-in adoption, specialist reviews, and ticket files. New commands: stone gate, stone specialists, and stone upgrade. Every default keeps the old behavior.

New config keys (all optional)

  • delivery (default ci): local writes no workflow file (D56).
  • adoption (default all): opt-in runs the G3 checks only for marked PRs (D58).
  • commits.by (default agent), commits.trailers (default commit), commits.message_format (D57).
  • specialists: a list of specialist reviews (D59).
  • tickets.source (default github) and tickets.path: tickets as files (D60).

Generated files that change

  • .cornerstone/checks/protected_paths.py: K6 reads a role from a git note, and skips a human commit in opt-in mode.
  • .cornerstone/hooks/protect-paths.py: a rule for the shaper.
  • .cornerstone/specialists.md: new, only with a specialists section.

Steps to upgrade

  1. Install the new stone, and set framework_version to 1.1.0.
  2. Run stone upgrade, then stone upgrade --apply. Commit the changed generated files alone, with the trailers Role: generator and Actor: agent.
  3. The link check of stone check tests fewer files by default (D54). Set checks.links.paths, or run stone check --links all, to keep the old scope.
  4. A session with no role name gets the implementer rules, also when STONE_ROLE is empty (D55).

Guide: docs/guides/upgrade-cornerstone.md

Cornerstone 1.0.0

Choose a tag to compare

@brawblan brawblan released this 21 Oct 20:10
433c81a

Cornerstone 1.0.0

Cornerstone is a tool-neutral framework for agent-assisted delivery, with the stone CLI. Version 1.0.0 supports all 10 profiles. stone render writes every component that a profile lists, and each profile has a golden-file test.

What blocks in version 1

Check What it tests
K6 An implementer commit must not change a protected path.
K7 A PR must stay under the size limit, or carry a Waiver (P10) heading with text (D46).
K14 A PR body needs Evidence, Decision log, Review findings, and Confidence (D47, D49).
K15 The instruction file must stay under the line limit (D52).
K16 A spike/ branch must not merge into the main or integration branch (D30, D33).
K17 Changed text must follow the writing standard (D45).
K18, K19 Personas, job stories, and specs must be valid (D53).
By-profile steps A failing repo command fails the job (D52).

Each component in the manifest has an eval plan, a review date, an owner, and the models of its results (D43, D50). stone check tests this. Install with the tag: framework_version: 1.0.0.

Known limits

This release is honest about what is not proven. Each limit has an issue.

Limit Issue
Eval coverage is low: 3 of 22 components have an eval folder. The roles for the shaper, implementer, reviewer, and investigator have no eval. #110
K18 and K19 became errors on thin evidence (fixtures and unit tests; no personas file in this repo). #111
K7, K14, K15, K17, and the repo-command steps blocked early, under the replay rule of D45. #112
The protected-path hook does not see a shell write. K6 in CI is the control. #113
K6 trusts the Role: trailer that the committer writes. #81
This repo's own G3 still installs stone from the tag v0.5.0. #114
No deterministic Definition of Ready check (P3). #115
Stated rules that could be checks have none (P6). #116
The core names tools in two places (P12). #117
Decision logs live in PR bodies only (P8). #118
Profile overrides and waivers are not built. #78
Bug-triage does not apply labels, and its outputs and purpose line still promise it. #79
The first blind A/B rating of the writing standard is not done. #67
The hook.protect-paths eval measures the hook and K6 with a task text that lifts the role rule (D48). It does not measure how often a model writes to a protected path on its own. #113

The full audit is in docs/reports/v1-principles-audit.md. Evals and results are on the Evals page of the docs site.


What's Changed

  • docs(readme): link the docs site by @brawblan in #20
  • feat(stone): add specs and stone spec apply by @brawblan in #21
  • feat(stone): add check K19, stone spec sync, and the specs in the roles by @brawblan in #22
  • feat(stone): run K14 in the G3 workflow that render writes by @brawblan in #23
  • feat(stone): render the roles of all 10 profiles, with the investigator by @brawblan in #24
  • feat(stone): add stone eval, the component eval runner by @brawblan in #25
  • feat(stone): render K7 (change size) into the G3 workflow by @brawblan in #26
  • feat(workflow): write a Profile line in skill-made PR bodies by @brawblan in #28
  • feat(stone): render K15 (instruction size) for full-project, with a golden test by @brawblan in #27
  • test(stone): golden-file tests for debugging, dependency-upgrade, adapter-refresh (6f) by @brawblan in #31
  • feat(stone): render label and schedule trigger workflows (6g part 1, D31) by @brawblan in #29
  • feat(stone): render the ci: trigger workflows (6g part 2, D31) by @brawblan in #34
  • feat(stone): render the G3 steps for K10, K12, and the other by-profile checks (6d, D29) by @brawblan in #30
  • fix(framework): debugging investigator writes the findings report by @brawblan in #32
  • feat(stone): render K16 for spike, and golden tests for the report profiles (6e, D30) by @brawblan in #33
  • fix(framework): limit the trigger role reads to the checkout and the event folder (D32) by @brawblan in #36
  • feat(evals): add the role.tester eval and its first result by @brawblan in #35
  • docs(guides): move the working parts to Today for v1 (6h) by @brawblan in #37
  • fix(framework): make K16 block a spike PR into the integration branch by @brawblan in #52
  • test(stone): add golden-file tests for single-ticket and app-slice by @brawblan in #51
  • fix(stone): fail render and check on a branches.* value that is not a string by @brawblan in #56
  • feat(evals): add the role.planner eval and its first result by @brawblan in #57
  • feat(website): add an Evals page that shows the eval results by @brawblan in #58
  • fix(adapters): planner template fixes from the role.planner eval by @brawblan in #59
  • feat(evals): grade the open question form of planner step 7 in P3 by @brawblan in #60
  • chore(adapters): set the first model profile to active by @brawblan in #61
  • fix(adapters): limit the cost of a trigger run and frame the posted report by @brawblan in #71
  • fix(framework): record the shell-write gap of the protected-path hook (D39) by @brawblan in #74
  • docs(guides): add the investigator to run-the-roles by @brawblan in #68
  • docs(guides): add the bug-triage guide by @brawblan in #69
  • docs(guides): add the code-audit guide by @brawblan in #70
  • docs(guides): add the spike guide by @brawblan in #72
  • docs(guides): add the dependency-upgrade guide by @brawblan in #73
  • docs(guides): add the adapter-refresh guide by @brawblan in #75
  • docs(guides): add the refactor-migration guide by @brawblan in #76
  • test(evals): add the grader tests of the hook.protect-paths eval by @brawblan in #82
  • fix(adapter): say the hook guards the file tools only (D39) by @brawblan in #83
  • docs(framework): describe Cornerstone and its prior art by @brawblan in #84
  • fix(stone): make the label prompt report and drop relative links (D41) by @brawblan in #86
  • fix(framework): tester commits the failing test on a ticket/code disagreement (D42) by @brawblan in #87
  • chore(framework): check that each component has an eval plan and a review date (D43) by @brawblan in #88
  • test(stone): pin the D43 component rule and the shared label render by @brawblan in #89
  • fix(evals): remove the hook settings entry in the without variant by @brawblan in #91
  • docs(reports): audit the repo against principles P1 to P12 before v1 by @brawblan in #90
  • fix(stone): make K7 accept a waiver in any heading with "waiver (P10)" by @brawblan in #99
  • feat(framework): block K17 and K7 after a replay shows no false positive by @brawblan in #92
  • docs(framework): align the PR body sections with check K14 by @brawblan in #100
  • fix(evals): lift the role rule in the task text of the hook eval (D48) by @brawblan in #101
  • feat(framework): block K14 in the G3 template (D49) by @brawblan in #102
  • docs(framework): make the docs match the code for K6, K8 rules, overrides, and labels by @brawblan in #103
  • feat(stone): add owner and tested models to the manifest check (P5) by @brawblan in #104
  • feat(stone): change K18 and K19 from a warning to an error by @brawblan in #105
  • feat(framework): block K15 and remove continue-on-error from the step templates (D52) by @brawblan in #106
  • docs(guides): remove the K18 and K19 warning text by @brawblan in #107
  • docs(guides): say that K7, K14, K15, and the by-profile steps block by @brawblan in #108
  • chore(release): prepare version 1.0.0 by @brawblan in #109...
Read more