Repository navigation
Releases: brawblan/ai-workflow
Release list
v1.5.0
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
- Optional: set protect_instruction_files to true in .cornerstone/config.yaml. Commit the config change alone, with the trailer Role human.
- Then run stone render. Commit the generated files alone, with the trailers Role generator and Actor agent.
- 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
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
specialistsnow 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. AWaiver (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 checkvalidates.cornerstone/profiles/<profile>.yaml, andstone renderapplieschecks_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.0orversioning.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 hasspecialists(D80). The K6 step gets the PR body and the PR author throughenv(D83)..cornerstone/checks/protected_paths.py: K6 reads aWaiver (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
- Set
framework_versionto 1.4.0, and runstone render. - If the repo config has
specialists, G3 now fails on a blocking specialist finding. To pass, fix the finding, or add aWaiver (K20)section with text to the PR body. - If the repo has a file in
.cornerstone/profiles/, runstone checkfirst. Fix each finding. - Commit the changed generated files alone, with the trailers
Role: generatorandActor: agent.
Also in this release
- Evals for 4 roles: shaper, reviewer, implementer, and investigator (#190, #191, #194, #197).
stone check-rulesruns 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
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.envandci.secretsadd anenv:block to theAll checksstep (#163).ci.setupadds steps beforeInstall, for example a Node setup with a package cache (#162).ci.brancheslimits K6, K7, K14, and K20 to PRs into the listed base branches (#164). A promotion PR, for exampledevtostaging, 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
- Set
framework_versionto 1.3.0, and runstone render. - To pass a secret to the tests, add it as a repo secret. List its name in
ci.secrets. - If a test reads a secret, make it skip when the value is empty. A PR from a fork gets an empty value.
- To skip the ticket checks on promotion PRs, set
ci.branchesto the base branches of the ticket PRs. For example, use[dev]. - If you set
ci.branches, require a human review on each base branch that is not in the list (G5). - After a change to the config, run
stone render. - Commit the changed generated files alone, with the trailers
Role: generatorandActor: agent.
Also in this release
One place now checks the keys under ci, so a wrong key gives one error (#181).
v1.2.1
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 hasStructuredOutput.
Steps
- Set
framework_versionto 1.2.1. - Run
stone render. If a formatter changed the indent of.claude/settings.json, render now keeps it. - Commit the changed generated files alone, with the trailers
Role: generatorandActor: 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
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(defaultdocs/plans/) accepts{id}as the last folder level: one folder for each ticket (D67).paths.reports(defaultdocs/reports/) accepts{id}as the last folder level, aspaths.plansdoes (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 aspecialistssection (D66).
Steps to upgrade
- Install the new
stone, and setframework_versionto 1.2.0. - Run
stone upgrade, thenstone upgrade --apply. Commit the changed generated files alone, with the trailersRole: generatorandActor: agent. - With a
specialistssection: add the linesTicketandPersonasto each PR body, and commit each findings report in the PR (D66). - To keep a role on a stronger model, set it in the model profile of the repo. Render again.
- Check the
when.pathsvalues of each specialist. They use the rules ofpaths.tests(D65). A value that starts with./no longer matches. - To give each ticket its own folder, set
paths.plansorpaths.reportsto a value that ends with{id}/, for example.stone/plans/{id}/. Move the old files into ticket folders. Runstone render(D67).
Guide: docs/guides/upgrade-cornerstone.md
v1.1.0
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(defaultci):localwrites no workflow file (D56).adoption(defaultall):opt-inruns the G3 checks only for marked PRs (D58).commits.by(defaultagent),commits.trailers(defaultcommit),commits.message_format(D57).specialists: a list of specialist reviews (D59).tickets.source(defaultgithub) andtickets.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 aspecialistssection.
Steps to upgrade
- Install the new
stone, and setframework_versionto 1.1.0. - Run
stone upgrade, thenstone upgrade --apply. Commit the changed generated files alone, with the trailersRole: generatorandActor: agent. - The link check of
stone checktests fewer files by default (D54). Setchecks.links.paths, or runstone check --links all, to keep the old scope. - A session with no role name gets the implementer rules, also when
STONE_ROLEis empty (D55).
Guide: docs/guides/upgrade-cornerstone.md
Cornerstone 1.0.0
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...