Repository navigation
docs(e0): record 5 owner rulings on merge honesty, add 7 work orders #1121
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,64 @@ | ||
| // SPDX-License-Identifier: CC-BY-SA-4.0 | ||
| // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk> | ||
| = E0-18: Each outcome names its pattern and its kind of match | ||
| :wo-id: E0-18 | ||
| :wo-repo: hyperpolymath/hypatia | ||
| :wo-size: medium | ||
| :wo-agent: e0-executor | ||
| :wo-model: sonnet | ||
| :wo-effort: medium | ||
| :wo-cap-usd: 10 | ||
| :wo-max-turns: 200 | ||
| :wo-branch: feat/e0-18-merge-label | ||
| :wo-depends: none | ||
|
|
||
| == Goal | ||
|
|
||
| Each outcome row records the pattern that it is about and the kind of match | ||
| that chose its recipe: `exact`, `category` or `fuzzy`. A merge of 2 | ||
| findings under 1 recipe then has a label. | ||
|
|
||
| == Authority | ||
|
|
||
| Owner ruling of 2026-11-14 on `docs/design/2026-11-14-merge-honesty.adoc`, decision 1 (option C: label now, split after a measurement). | ||
|
|
||
| == Facts measured | ||
|
|
||
| Commit `b660d08`, read on 2026-11-14. The cited files have no change up to `3b8551c`. | ||
|
|
||
| * `lib/recipe_matcher.ex`, `best_recipe_for_pattern/2` (line 123) tries an | ||
| exact match, then `category_match_recipe/2` (line 142), then | ||
| `fuzzy_match_recipe/2` (line 156). It returns the recipe only. The caller | ||
| cannot see which of the 3 matched. | ||
| * `lib/triangle_router.ex`, `route/3` (line 35) carries no kind of match. | ||
| * `lib/outcome_tracker.ex`, `persist_outcome/6` (line 116) writes | ||
| `"pattern_id" => nil` (line 122). | ||
| * `test/recipe_matcher_test.exs` has the tag `:verisim_data`, so CI does not run it. | ||
|
|
||
| == Steps | ||
|
|
||
| . Measure the facts again. Stop if one no longer holds. | ||
| . Write the tests first, in a new test file that has no `:verisim_data` tag | ||
| and that uses recipes of its own in a temporary folder. | ||
| . Add a function beside `best_recipe_for_pattern/2` that returns the recipe | ||
| and the kind of match. Keep the old function and its result, so that no | ||
| caller breaks. | ||
| . Carry the pattern id and the kind of match from the router to the outcome | ||
| row through the `metadata` map of `record_outcome/5`. Write them as | ||
| `"pattern_id"` and `"match_kind"`. | ||
|
Comment on lines
+46
to
+48
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
The production route and outcome write are not connected in-process: Useful? React with 👍 / 👎. |
||
| . Do not change confidence, the annealing stage or a tier in this work order. | ||
|
|
||
| == Acceptance | ||
|
|
||
| * New tests show the kind `exact`, `category` and `fuzzy`, 1 test for each. | ||
| * A test shows a row with the pattern id and the kind of match of its dispatch. | ||
| * A row from a caller that gives no kind has `"match_kind" => "unknown"`. It | ||
| is not written as `exact`. | ||
| * `mix test` has 0 failures. No file that was formatted before the change is unformatted after it. | ||
|
|
||
| == Stop and ask | ||
|
|
||
| * A path writes an outcome and has no pattern at that point. List each such | ||
| path in the pull request body. Do not invent a pattern id. | ||
| * The change needs a new field in the fleet outcome file of `gitbot-fleet`. | ||
| * The cost reaches the cap before the acceptance checks pass. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,53 @@ | ||
| // SPDX-License-Identifier: CC-BY-SA-4.0 | ||
| // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk> | ||
| = E0-19: A merged match reaches review at most | ||
| :wo-id: E0-19 | ||
| :wo-repo: hyperpolymath/hypatia | ||
| :wo-size: small | ||
| :wo-agent: e0-executor | ||
| :wo-model: sonnet | ||
| :wo-effort: medium | ||
| :wo-cap-usd: 5 | ||
| :wo-max-turns: 120 | ||
| :wo-branch: fix/e0-19-merged-match-tier | ||
| :wo-depends: E0-18 | ||
|
|
||
| == Goal | ||
|
|
||
| A recipe that a `category` match or a `fuzzy` match chose never runs with | ||
| no person. Its highest tier is `review`. Only an `exact` match can reach | ||
| `auto_execute`. | ||
|
|
||
| == Authority | ||
|
|
||
| Owner ruling of 2026-11-14 on `docs/design/2026-11-14-merge-honesty.adoc`, decision 2. | ||
|
|
||
| == Facts measured | ||
|
|
||
| Commit `b660d08`, read on 2026-11-14. | ||
|
|
||
| * `lib/neural/dispatch_guard.ex`, `enforce/2` (line 69) already lowers an | ||
| action for a novel finding. | ||
| * The tiers are: `auto_execute` from confidence 0.95, `review` from 0.85, | ||
| `report_only` below (`.claude/CLAUDE.md`, design constants). | ||
| * `E0-18` gives each dispatch its kind of match. | ||
|
|
||
| == Steps | ||
|
|
||
| . Confirm that `E0-18` is merged. Stop if it is not. | ||
| . Measure the facts again. Find the 1 place where the tier of a dispatch is | ||
| decided, and name it in the pull request body. | ||
| . Write the tests first. | ||
| . Apply the cap there. An unknown kind of match gets the cap too. | ||
|
|
||
| == Acceptance | ||
|
|
||
| * Tests show: confidence 0.99 with `exact` gives `auto_execute`; confidence | ||
| 0.99 with `category`, with `fuzzy` and with `unknown` gives `review`. | ||
| * A test shows that the cap never raises a tier. | ||
| * `mix test` has 0 failures. No file that was formatted before the change is unformatted after it. | ||
|
|
||
| == Stop and ask | ||
|
|
||
| * The tier is decided in more than 1 place and the places disagree. | ||
| * The cost reaches the cap before the acceptance checks pass. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This newly requires receipts to name the match kind, but E0-09 still depends only on E0-05 and E0-08, while the README schedules E0-18 independently “in any order.” If E0-09 runs first, none of its three learning entry points receives the dispatch match kind, so it must either stop under its unfillable-field condition or emit receipts without the owner-required label; no later work order backfills those receipts. Add E0-18 as a dependency of E0-09 and order it before receipt emission.
Useful? React with 👍 / 👎.