FE-1494: Keep Brunch strategy and control records coherent - #9311
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
1 Skipped Deployment
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9311 +/- ##
=======================================
Coverage 60.22% 60.23%
=======================================
Files 1430 1431 +1
Lines 140558 140561 +3
Branches 6609 6609
=======================================
+ Hits 84658 84663 +5
+ Misses 54823 54821 -2
Partials 1077 1077 Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
PR SummaryMedium Risk Overview Strategic control is split into one mutable Agent entry changes: Reviewed by Cursor Bugbot for commit 35b3307. Bugbot is set up for automated code reviews on this repo. Configure here. |
a39ed9c to
4729584
Compare
Carry the graph selection mode into rendering so --all reports an issue total rather than labeling closed issues as open, with a regression test at the CLI projection seam. Exclude Brunch's agent-maintained Markdown from oxfmt and markdownlint, while replacing strategy-log hard breaks with check-clean field paragraphs. Amp-Thread-ID: https://ampcode.com/threads/T-01a0342a-1cca-73fc-9cf1-0f4caac18911 Co-authored-by: Amp <amp@ampcode.com>
Normalize final newlines so the repository-wide formatting gate accepts the imported layout fixtures. Co-authored-by: Cursor <cursoragent@cursor.com>
5aa6516 to
35b3307
Compare
Benchmark results
|
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| resolve_policies_for_actor | user: empty, selectivity: high, policies: 2002 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: medium, policies: 1002 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: high, policies: 3314 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: medium, policies: 1527 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: high, policies: 2078 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: medium, policies: 1033 | Flame Graph |
policy_resolution_medium
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| resolve_policies_for_actor | user: empty, selectivity: high, policies: 102 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: medium, policies: 52 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: high, policies: 269 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: medium, policies: 108 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: high, policies: 133 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: medium, policies: 63 | Flame Graph |
policy_resolution_none
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| resolve_policies_for_actor | user: empty, selectivity: high, policies: 2 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: medium, policies: 2 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: high, policies: 8 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: medium, policies: 3 | Flame Graph |
policy_resolution_small
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| resolve_policies_for_actor | user: empty, selectivity: high, policies: 52 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: medium, policies: 26 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: high, policies: 94 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: medium, policies: 27 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: high, policies: 66 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: medium, policies: 29 | Flame Graph |
read_scaling_complete
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| entity_by_id;one_depth | 1 entities | Flame Graph | |
| entity_by_id;one_depth | 10 entities | Flame Graph | |
| entity_by_id;one_depth | 25 entities | Flame Graph | |
| entity_by_id;one_depth | 5 entities | Flame Graph | |
| entity_by_id;one_depth | 50 entities | Flame Graph | |
| entity_by_id;two_depth | 1 entities | Flame Graph | |
| entity_by_id;two_depth | 10 entities | Flame Graph | |
| entity_by_id;two_depth | 25 entities | Flame Graph | |
| entity_by_id;two_depth | 5 entities | Flame Graph | |
| entity_by_id;two_depth | 50 entities | Flame Graph | |
| entity_by_id;zero_depth | 1 entities | Flame Graph | |
| entity_by_id;zero_depth | 10 entities | Flame Graph | |
| entity_by_id;zero_depth | 25 entities | Flame Graph | |
| entity_by_id;zero_depth | 5 entities | Flame Graph | |
| entity_by_id;zero_depth | 50 entities | Flame Graph |
read_scaling_linkless
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| entity_by_id | 1 entities | Flame Graph | |
| entity_by_id | 10 entities | Flame Graph | |
| entity_by_id | 100 entities | Flame Graph | |
| entity_by_id | 1000 entities | Flame Graph | |
| entity_by_id | 10000 entities | Flame Graph |
representative_read_entity
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/block/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/book/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/building/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/organization/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/page/v/2
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/person/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/playlist/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/song/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/uk-address/v/1
|
Flame Graph |
representative_read_entity_type
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| get_entity_type_by_id | Account ID: bf5a9ef5-dc3b-43cf-a291-6210c0321eba
|
Flame Graph |
representative_read_multiple_entities
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| entity_by_property | traversal_paths=0 | 0 | |
| entity_by_property | traversal_paths=255 | 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true | |
| entity_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false | |
| entity_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true | |
| entity_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true | |
| entity_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true | |
| link_by_source_by_property | traversal_paths=0 | 0 | |
| link_by_source_by_property | traversal_paths=255 | 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true | |
| link_by_source_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false | |
| link_by_source_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true | |
| link_by_source_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true | |
| link_by_source_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true |
scenarios
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| full_test | query-limited | Flame Graph | |
| full_test | query-unlimited | Flame Graph | |
| linked_queries | query-limited | Flame Graph | |
| linked_queries | query-unlimited | Flame Graph |

🌟 What is the purpose of this PR?
Brunch's current strategy, documentation roles, and Linear ownership rules were spread across overlapping records, which made priorities and issue reachability hard to verify. This pull request sits on the monorepo import and gives those records one compact home each: a current-strategy document, an append-only log of material decisions, and explicit locations for documentation, evaluation assets, and tracker facts.
🔗 Related links
libs/@hashintel/brunch-agent/docs/agents/documentation.mdlibs/@hashintel/brunch-agent/docs/control/STEERING.mdlibs/@hashintel/brunch-agent/docs/control/STRATEGY-LOG.md🚫 Blocked by
🔍 What does this change?
Documents that used to live under effort-shaped
planning/andhistory/trees now live under role-based paths: current strategy and the obligation ledger underdocs/control/, required behavior underdocs/specs/, accepted decisions underdocs/adr/, observed proof underdocs/evidence/, and settled history underdocs/archive/. Executable evaluation cases and runners move out of docs intoevaluations/. Incoming Petrinaut net files land indocs/inbox/SDCPNs/. Architecture tests now check that those locations, the strategy log's required fields, and Linear project assignment/lifecycle rules stay coherent.🏗️ Agent notes
Stacked as
main→ln/fe-1437-hash-monorepo-import→ this branch →ln/fe-1495-typescript-contracts→ln/fe-1480-resolve-decision.Commits
77860d7d05Add September steering model0e2d21226bRegister incoming SDCPN nets8ffbf2d4b3Correct SDCPN corpus inventoryd8d026e1a7Add strategic steering protocol4ebf3d71f5precedent doc refinementsde7046a642Organize Brunch documentation by role53569fda62Separate evaluation assets from evidencee61b9bf611Reconcile Brunch control surfacesfc42e865d2Consolidate Brunch strategic controlsa39ed9c73aResolve Brunch control audit discrepanciesPlacement
docs/agents/documentation.mdis the authority for the role topology.docs/INDEX.mdis updated atomically with the moves. Retireddocs/planning/anddocs/history/paths must not remain live. Linear and local pointers to moved paths are repaired in the same change.STEERING.mdis the one mutable current-strategy document.STRATEGY-LOG.mdis append-only rationale for material strategic choices and is distinct from ADRs.SPEC-LEDGER.mdremains a separate obligation ledger.docs/agents/steering.mdis the operating protocol for when to run a steering pass.Evaluation split
Executable cases and protocols live under
evaluations/with localAGENTS.md. Immutable run readouts stay underdocs/evidence/evaluations/. The corebaseline:runscript path follows the moved runner.Tracker and formatting
scripts/linear-project-graph.tsandlinear-project-graph.test.tscheck assignment and lifecycle behavior for project issues.control-surfaces.test.tsanddocs-index.test.tscheck the new control documents and index. Brunch Markdown is excluded from oxfmt and markdownlint because agents create and maintain it.Pre-Merge Checklist 🚀
🚢 Has this modified a publishable library?
This PR:
Brunch packages remain private. No changeset.
📜 Does this require a change to the docs?
The changes in this PR:
Brunch operating, strategy, and index documentation are the change. No Petrinaut user-guide pages are affected.
🕸️ Does this require a change to the Turbo Graph?
The changes in this PR:
The core
baseline:runscript path changes; noturbo.jsonor workspace identity change.None beyond the stack parent: this branch is not meant to merge before #9274.
🐾 Next steps
🛡 What tests cover this?
packages/core/test/architecture/docs-index.test.ts— index completeness and retired-path absencepackages/core/test/architecture/control-surfaces.test.ts—STEERING.md/STRATEGY-LOG.mdshapepackages/core/test/architecture/linear-project-graph.test.ts— assignment and lifecycle checkspackages/core/test/architecture/baseline-runner.test.ts— runner path after the evaluation movepackages/core/test/architecture/boundaries.test.ts— path updates❓ How to test this?
Run:
Confirm
libs/@hashintel/brunch-agent/docs/planning/anddocs/history/are absent, and thatdocs/INDEX.md,docs/control/STEERING.md, anddocs/control/STRATEGY-LOG.mdexist.Optionally run
yarn workspace @hashintel/brunch-agent linear:graphif Linear credentials are available.📹 Demo
Not applicable — documentation, tracker, and architecture-test changes only.