diff --git a/.github/actions/prune-repository/prune.py b/.github/actions/prune-repository/prune.py index c49b4f7065c..ddb55e9fbe9 100644 --- a/.github/actions/prune-repository/prune.py +++ b/.github/actions/prune-repository/prune.py @@ -64,11 +64,6 @@ # The app's condition-5 test executes the evaluation runner as a child # process; the context root is not a workspace and must be copied explicitly. "@apps/brunch-agent": ["libs/@hashintel/brunch-agent/evaluations"], - # Repertoire tests read sibling plugin.yaml files by relative URL. - "@hashintel/brunch-agent-repertoire": [ - "libs/@hashintel/brunch-agent/packages/plugin-sdcpn/plugin.yaml", - "libs/@hashintel/brunch-agent/packages/plugin-gherkin/plugin.yaml", - ], } TURBO_QUERY = """ diff --git a/.github/actions/prune-repository/prune_test.py b/.github/actions/prune-repository/prune_test.py index ebdd42e2ea0..d0843f1b07f 100644 --- a/.github/actions/prune-repository/prune_test.py +++ b/.github/actions/prune-repository/prune_test.py @@ -16,7 +16,6 @@ TRANSPORT = "@hashintel/brunch-agent-transport-aisdk" APP = "@apps/brunch-agent" WEBSITE = "@apps/petrinaut-website" -REPERTOIRE = "@hashintel/brunch-agent-repertoire" class BrunchRequestedExtras(unittest.TestCase): @@ -47,15 +46,6 @@ def test_app_job_adds_the_baseline_evaluation_paths(self) -> None: ["libs/@hashintel/brunch-agent/evaluations"], ) - def test_repertoire_job_copies_sibling_plugin_yaml(self) -> None: - self.assertEqual( - extra_paths_for_requested({REPERTOIRE}), - [ - "libs/@hashintel/brunch-agent/packages/plugin-sdcpn/plugin.yaml", - "libs/@hashintel/brunch-agent/packages/plugin-gherkin/plugin.yaml", - ], - ) - def test_sibling_or_website_job_does_not_add_brunch_extras(self) -> None: self.assertEqual(extras_for_requested({TRANSPORT}), frozenset()) self.assertEqual(extras_for_requested({WEBSITE}), frozenset()) diff --git a/libs/@hashintel/brunch-agent/README.md b/libs/@hashintel/brunch-agent/README.md index fdfaac923f6..4454cd92d52 100644 --- a/libs/@hashintel/brunch-agent/README.md +++ b/libs/@hashintel/brunch-agent/README.md @@ -10,11 +10,10 @@ This directory is its context and agent-session root, not a package workspace: - [`docs/INDEX.md`](./docs/INDEX.md) indexes Brunch documentation. - [`docs/control/STEERING.md`](./docs/control/STEERING.md) holds current strategic truth; [`STRATEGY-LOG.md`](./docs/control/STRATEGY-LOG.md) records material strategic decisions. -- [`packages/core/`](./packages/core/) is `@hashintel/brunch-agent`. +- [`packages/core/`](./packages/core/) is `@hashintel/brunch-agent`; its guarded `./prompts` + subpath ships the harness repertoire rendered by bindings and never imported by plugins. - [`packages/binding-flue/`](./packages/binding-flue/) is the Flue binding. - [`packages/transport-aisdk/`](./packages/transport-aisdk/) is the AI SDK transport. -- [`packages/repertoire/`](./packages/repertoire/) is the harness repertoire: the default teaching - for every guidance and runbook key (ADR-0007), rendered by bindings, never imported by plugins. - [`packages/plugin-gherkin/`](./packages/plugin-gherkin/) is the Gherkin target plugin: a feature-anchored `plugin.yaml` and the verbatim-floor proposal type. - [`packages/plugin-sdcpn/`](./packages/plugin-sdcpn/) is the SDCPN target plugin: an diff --git a/libs/@hashintel/brunch-agent/docs/INDEX.md b/libs/@hashintel/brunch-agent/docs/INDEX.md index 9da2fafed2e..ddb1b6adc67 100644 --- a/libs/@hashintel/brunch-agent/docs/INDEX.md +++ b/libs/@hashintel/brunch-agent/docs/INDEX.md @@ -120,6 +120,7 @@ contract requires the spec to carry the new operating truth, in explicitly dated | [0005-model-assisted-sdcpn-realization](adr/0005-model-assisted-sdcpn-realization.md) | accepted | FE-1480 | A pure plugin projection emits an SDCPN scaffold, typed code-obligation sidecar, and loss report; the Brunch agent realizes executable TypeScript through Petrinaut client tools and deterministic compile/simulation gates | | [0006-plugins-per-target-formalism](adr/0006-plugins-per-target-formalism.md) | accepted | design-convergence review 2026-08-25 | Plugins are per target formalism, authored as sectioned Markdown with fixed contract headings and three machine-read tables; domain-neutral by rule; retires the declarative ScopeExpr/firesWhen/DemandTable contract | | [0007-harness-teaching-meets-plugin-content-at-fixed-keys](adr/0007-harness-teaching-meets-plugin-content-at-fixed-keys.md) | accepted | FE-1406 (owner), FE-1431, FE-1393; accepted 2026-08-25, key catalogue converging (decision 9) | Plugin authoring is a fixed set of harness-owned keys in four groups — contract data (`ontology`, `schema`, `patterns`), guidance typed by mechanism (`lenses`, `techniques`, `movements`, `licenses`, `motifs`, `smells`, `rabbit_holes`, `failure_modes`), per-job runbooks (`kickoff`, `trajectory`, `close`), machinery (`checks`, `tools`) — each rendered key → harness default → plugin cell; the repertoire is `packages/repertoire`; amends ADR-0006 decisions 2 and 5 | +| [0008-repertoire-and-plugin-contract-live-in-core](adr/0008-repertoire-and-plugin-contract-live-in-core.md) | accepted | FE-1507; accepted 2026-08-26 | The repertoire is core-owned prompt data behind `@hashintel/brunch-agent/prompts`; plugins must not import that subpath; the standalone repertoire workspace is removed; amends ADR-0007 decision 8 | ## External canonical documents diff --git a/libs/@hashintel/brunch-agent/docs/adr/0008-repertoire-and-plugin-contract-live-in-core.md b/libs/@hashintel/brunch-agent/docs/adr/0008-repertoire-and-plugin-contract-live-in-core.md new file mode 100644 index 00000000000..36acc8e6791 --- /dev/null +++ b/libs/@hashintel/brunch-agent/docs/adr/0008-repertoire-and-plugin-contract-live-in-core.md @@ -0,0 +1,93 @@ +# ADR-0008: Repertoire and plugin contract live in core + +Date: 2026-08-26 +Status: accepted 2026-08-26 (Lu) +Amends: [ADR-0007](0007-harness-teaching-meets-plugin-content-at-fixed-keys.md), +decision 8 (`packages/repertoire` is replaced by a guarded core subpath) +Preserves: ADR-0007 decisions 1–7 and 9; the repertoire remains harness-owned, +plugins fill cells without importing it, and the catalogue still converges by +co-authoring +Decided on: the `ln/w4-topology` branch, from the package-direction audit +commissioned by [S-011](../control/STRATEGY-LOG.md#s-011) + +## Context + +ADR-0007 gave the harness's default teaching a package so the concept had an +executable owner rather than another prose-only home. The implementation proved +that ownership, but the package boundary is not carrying an independent +architectural role. + +The key catalogue, Valibot plugin-definition schema, emitted JSON Schema, +repertoire schema and reader, and instruction renderer all live in +`@hashintel/brunch-agent`. The separate +`@hashintel/brunch-agent-repertoire` workspace contains one YAML document and a +one-line load through core's `readRepertoire`. It has no runtime, deployment, +versioning, or consumer boundary of its own. A Flue binding and the baseline +evaluation import it only to obtain the harness's default prompt data. + +Keeping that workspace makes a core concern look like a peer package and adds +manifest, build, lint, test, and dependency wiring without strengthening the +rule that matters: plugins must not import the repertoire. Moving the default +onto core's root export would remove the workspace but weaken that rule in the +other direction. Core's root is the plugin SDK, so every plugin is allowed to +import it; a root-exported repertoire would make the forbidden dependency +architecturally ordinary. + +## Decision + +1. **The repertoire is core-owned prompt data.** Remove the + `@hashintel/brunch-agent-repertoire` workspace. Its default content and + module-load validation move into `@hashintel/brunch-agent`. + +2. **Default teaching has a guarded subpath.** Core exports the loaded default + as `@hashintel/brunch-agent/prompts`. Bindings and evaluation composition may + import that subpath. Plugin packages may not import it. The root + `@hashintel/brunch-agent` export remains the plugin SDK and harness + mechanism; it does not export the default repertoire. + +3. **The plugin contract already belongs to core.** The key catalogue, + `PluginDefinitionSchema`, readers, repertoire shape, emitted + `schema/plugin.schema.json`, and schema changelog stay in core. This decision + creates no schema package and no public `schemas` subpath. + +4. **Package ownership is the whole decision.** This record does not reorganise + core into `loop/`, `prompts/`, `schemas/`, or `skills/` directories. Those + names remain possible internal roles, not accepted folders. A later move + needs concrete pressure from the files it would separate rather than this + package correction as a pretext. + +5. **The direction is executable.** The architecture suite must fail while the + standalone repertoire workspace exists, require the `./prompts` core export, + and reject a plugin source import of that subpath. It continues to require + plugins to resolve core only and core to import no substrate. + +## Rejected alternatives + +- **Keep the repertoire workspace.** Rejected because the package contains data + plus a thin loader around types and behavior already owned by core. It + encodes no independently useful boundary. +- **Export the repertoire from core's root.** Rejected because the root is the + plugin SDK. Plugins could then import harness defaults through their one + permitted dependency, making ADR-0007's ownership direction invisible to the + package graph. +- **Restructure all of core now.** Rejected because the package audit proves one + boundary is premature; it does not prove the flat internal modules have + become hard to navigate or need four new directory boundaries. + +## Consequences + +- Bindings and the baseline evaluation replace their repertoire-package import + with `@hashintel/brunch-agent/prompts`; plugin imports remain unchanged. +- The repertoire workspace, its manifest and workspace dependency edges are + removed in one mechanical move. The key catalogue and its changelog do not + move. +- That move reconciles the package topology in the elicitation-kernel spec and + its living topology reference. The driver reconciles `CONTEXT.md` and + `docs/INDEX.md` when the lines rejoin; until then this record owns the + accepted shape where those files still name `packages/repertoire`. +- The plugin co-authoring stream keeps the current layout until this decision + is accepted, then takes the mechanical move between cycles; the move changes + no key or repertoire text. +- Removing a workspace is not proof by itself. The import-direction + architecture test is red on the old topology and green only when the guarded + subpath and plugin prohibition both hold. diff --git a/libs/@hashintel/brunch-agent/docs/control/STEERING.md b/libs/@hashintel/brunch-agent/docs/control/STEERING.md index d66c2a4467e..f1c0be710e8 100644 --- a/libs/@hashintel/brunch-agent/docs/control/STEERING.md +++ b/libs/@hashintel/brunch-agent/docs/control/STEERING.md @@ -43,8 +43,8 @@ evidence under [proof evidence](../evidence/proofs/). - [ADR-0007](../adr/0007-harness-teaching-meets-plugin-content-at-fixed-keys.md) — harness-owned fixed keys join defaults to plugin cells; operative force: cycle two froze the catalogue, which reopens only when run evidence forces a key change, while FE-1393 tests gherkin generality. -- ADR-0008 — repertoire defaults are core-owned prompt data behind a guarded - subpath; operative force: plugins never import +- [ADR-0008](../adr/0008-repertoire-and-plugin-contract-live-in-core.md) — repertoire defaults are + core-owned prompt data behind a guarded subpath; operative force: plugins never import `@hashintel/brunch-agent/prompts`, the root remains the plugin SDK, and no broader core reorganisation follows from this package correction. - [S-001](STRATEGY-LOG.md#s-001) — review-and-revise is the current proof, not permanent scope; @@ -114,7 +114,7 @@ evidence under [proof evidence](../evidence/proofs/). FE-1431 (plugin authoring surface). - **Harness teaching has one owner** — repertoire defaults fill every guidance and runbook key; operative force: plugins specialize those keys without importing harness method. Source: - ADR-0008 and + [ADR-0008](../adr/0008-repertoire-and-plugin-contract-live-in-core.md) and [S-008](STRATEGY-LOG.md#s-008). Steering projection: FE-1406 (harness repertoire). - **A second formalism tests generality after the tracer** — gherkin pressures the settled SDCPN @@ -239,9 +239,9 @@ Re-braid (restack and resolve, then diverge again). Length follows how fine the | Triangle edge | Today | Gap | | --- | --- | --- | -| **Panel → Brunch** | W1 routes the real panel's `/api/chat` to the SDCPN elicitor; `yarn dev:brunch` starts both services; `brunch_ask` round-trips. | Re-braid W1 with W2, then conduct the human Proof 0 run. | +| **Panel → Brunch** | W1 routes the real panel's `/api/chat` to the SDCPN elicitor; `yarn dev:brunch` starts both services; `brunch_ask` round-trips. | Conduct the human Proof 0 run from the re-braided `hash-timing` checkout. | | **Persistence modelled** | W1 sends one stable ui-shell principal on every request, resolves it to one target document and namespaced sessions, and stamps an opaque owner key that refuses cross-principal reads and writes. SQLite and per-document JSON remain. | Witness reload against the re-braided live surface; no persistence design gap remains for G0. | -| **Real elicitation** | The production SDCPN elicitor is reachable from the panel on W1; captures, sweep outcomes, and completion are rendered readably, and the attach contract is recorded. | Re-braid timing onto the W1 line, then conduct the eight-turn human run with a screen recording and a plain-language account under proof evidence. | +| **Real elicitation** | The production SDCPN elicitor is reachable from the panel on W1; captures, sweep outcomes, and completion are rendered readably, and the attach contract is recorded. | Conduct the eight-turn human run from `hash-timing`, with a screen recording and a plain-language account under proof evidence. | | **Deployment (G2)** | — | Was Linear-gated behind gherkin via FE-1423 ← FE-1396; that blocker was removed 2026-08-26. FE-1440/FE-1441 remain the owners. | ### Tool inventory — current truth and intent @@ -408,7 +408,7 @@ changes the witness: latency is no longer a number in a transcript but a person subpath, fixed keys, a schema, and gates — never as spec prose alone; its content is not rescoped without run evidence ([S-008](STRATEGY-LOG.md#s-008), [ADR-0007](../adr/0007-harness-teaching-meets-plugin-content-at-fixed-keys.md), - ADR-0008). + [ADR-0008](../adr/0008-repertoire-and-plugin-contract-live-in-core.md)). - The key catalogue is a working set until a cycle changes no key: fix it by writing both plugins against it, not by decree ([S-009](STRATEGY-LOG.md#s-009), ADR-0007 decision 9). - The triangle first, poorly; no layer is optimised for its own sake before the end-to-end flow diff --git a/libs/@hashintel/brunch-agent/docs/reference/architecture/topology.md b/libs/@hashintel/brunch-agent/docs/reference/architecture/topology.md index 1bfcb660c8d..962785d1356 100644 --- a/libs/@hashintel/brunch-agent/docs/reference/architecture/topology.md +++ b/libs/@hashintel/brunch-agent/docs/reference/architecture/topology.md @@ -20,6 +20,9 @@ packages/core LANE 3 (harness; substrate-free) ├─ naming.ts ✓ identity/tool-name policy (ADR-0001) ├─ plugin.ts ✓ plugin identity + one declared proposal floor (FE-1392); grows the │ full catalog/tables/ops contract at FE-1393 +├─ prompts.ts, +│ repertoire.yaml ✓ guarded `./prompts` subpath: validated harness-default teaching; +│ binding/evaluation composition only, never a plugin import (ADR-0008) ├─ testing/ ✓ test utilities subpath (mirrors Flue's own store-contract pattern) ├─ ask-protocol.ts ✓ substrate-free ask/suspension mechanism: affordance minting, guard, │ reply-binding signal, and instruction fragments (FE-1422). See N1. @@ -83,13 +86,11 @@ evaluations/protocols/process-model-elicitation/baseline/run.ts EXPERIMENT PRO refusal), prompt content, and advisory semantics; `useElicitation` contributes only Flue projection, hooks, persistent-state, private-prompt, refresh, and durable-step wiring. A future `binding-pi` reuses both protocol modules. -- **N2 (packs and cards).** Plugin-owned content lives in plugin packages, exported as - `defineSkill`-compatible definitions; the app's agent module _registers_ what the plugin - exports. Never per-agent `skills/` dirs holding plugin content in the app — that puts lane-3 - policy inside lane-1, invisible to the boundary gates. Quiver (FE-1406) content is - harness-shipped: same rule, exported from core (or a `packages/quiver`), registered by hosts. - Card content stays assertable outside the Vite graph (fixture-grade copies; B4's probe - decides the exact shape). +- **N2 (plugin cells and the repertoire; amended by ADR-0007 and ADR-0008).** Plugin-owned content + lives in plugin packages; never in per-agent app `skills/` directories, which would put lane-3 + policy inside lane-1 and outside the boundary gates. Harness-owned teaching lives in core and is + exported only from `@hashintel/brunch-agent/prompts`; bindings and evaluation composition may + import it, plugins may not. The committed YAML remains directly assertable outside the bundle. - **N3 (application composition; amended by ADR-0004 / FE-1437).** There is no dedicated demo shell. The standalone `apps/dev` was imported as `apps/brunch-agent`, which owns the remote Brunch server, target gallery, and diagnostics. `apps/petrinaut-website` owns the user-facing diff --git a/libs/@hashintel/brunch-agent/docs/specs/elicitation-kernel.md b/libs/@hashintel/brunch-agent/docs/specs/elicitation-kernel.md index 71e01b6dde1..d4abe2ad472 100644 --- a/libs/@hashintel/brunch-agent/docs/specs/elicitation-kernel.md +++ b/libs/@hashintel/brunch-agent/docs/specs/elicitation-kernel.md @@ -625,8 +625,8 @@ Bun-workspace monorepo in this repo: ```text packages/core # the harness; plugin SDK is its public export surface +packages/core/prompts # (subpath) the harness's default repertoire; binding/evaluation only packages/core/testing # (subpath) fixtures, arbitraries, replay driver — prod bundles stay clean -packages/repertoire # the harness's own filling of every guidance and runbook key (ADR-0007); depends on core only packages/binding-flue # the Flue binding (implements §10; owns the storage port impl) packages/transport-aisdk # validated UI ingress + harness replies → AI SDK wire; no binding/substrate imports packages/plugin-gherkin @@ -648,12 +648,14 @@ it does not wrap or flatten these package boundaries. a package-manager root: it carries no package manifest, lockfile, or competing toolchain. `apps/brunch-agent` remains at HASH's application root and points back to that context authority. -**ADR-0007 amendment (2026-08-25):** `packages/repertoire` (`@hashintel/brunch-agent-repertoire`) -carries the harness's default teaching for every guidance and runbook key. It depends on `core` -only; bindings depend on it to render instructions; plugins never import it. +**ADR-0007 / ADR-0008 amendment (2026-08-26):** the guarded +`@hashintel/brunch-agent/prompts` subpath carries the harness's default teaching for every guidance +and runbook key. Bindings and evaluation composition may import it to render instructions; plugins +never import it. The root `@hashintel/brunch-agent` export remains the plugin SDK. **Dependency invariants (spec invariants):** plugins depend on `core` only — never on the binding, -never on Flue; the harness imports no substrate; a binding imports both. A transport consumes +never on Flue, and never on the guarded `core/prompts` subpath; the harness imports no substrate; a +binding imports both. A transport consumes harness-level reply parts plus its wire encoder and ingress validator only: `transport-aisdk` depends on `core`, `ai`, and `valibot`, never on a binding or Flue. **Role prefixes name what a package is architecturally**: plugin diff --git a/libs/@hashintel/brunch-agent/evaluations/protocols/process-model-elicitation/baseline/harness-run.ts b/libs/@hashintel/brunch-agent/evaluations/protocols/process-model-elicitation/baseline/harness-run.ts index fe8f1c5525e..b830b1ee1d6 100644 --- a/libs/@hashintel/brunch-agent/evaluations/protocols/process-model-elicitation/baseline/harness-run.ts +++ b/libs/@hashintel/brunch-agent/evaluations/protocols/process-model-elicitation/baseline/harness-run.ts @@ -81,7 +81,7 @@ import { projectFlueHistoryForSweep, } from "@hashintel/brunch-agent-binding-flue"; import { sdcpn, sdcpnDefinition } from "@hashintel/brunch-agent-plugin-sdcpn"; -import { repertoire } from "@hashintel/brunch-agent-repertoire"; +import { repertoire } from "@hashintel/brunch-agent/prompts"; import { createTurnTimingRecorder, diff --git a/libs/@hashintel/brunch-agent/packages/binding-flue/.oxlintrc.json b/libs/@hashintel/brunch-agent/packages/binding-flue/.oxlintrc.json index e0d9643fe1a..b018a9b3088 100644 --- a/libs/@hashintel/brunch-agent/packages/binding-flue/.oxlintrc.json +++ b/libs/@hashintel/brunch-agent/packages/binding-flue/.oxlintrc.json @@ -34,11 +34,8 @@ "message": "Brunch libraries must not depend on Petrinaut implementations." }, { - "group": [ - "@hashintel/brunch-agent-*", - "!@hashintel/brunch-agent-repertoire" - ], - "message": "A binding may depend inward on the harness and render its repertoire, not depend on other Brunch extensions." + "group": ["@hashintel/brunch-agent-*"], + "message": "A binding may depend inward on the harness, not depend on other Brunch extensions." } ] } diff --git a/libs/@hashintel/brunch-agent/packages/binding-flue/package.json b/libs/@hashintel/brunch-agent/packages/binding-flue/package.json index b6ee0a543ea..d7a4463edbb 100644 --- a/libs/@hashintel/brunch-agent/packages/binding-flue/package.json +++ b/libs/@hashintel/brunch-agent/packages/binding-flue/package.json @@ -22,7 +22,6 @@ "@flue/runtime": "2.0.3", "@flue/sdk": "2.0.3", "@hashintel/brunch-agent": "workspace:*", - "@hashintel/brunch-agent-repertoire": "workspace:*", "valibot": "1.4.2" }, "devDependencies": { diff --git a/libs/@hashintel/brunch-agent/packages/binding-flue/src/index.ts b/libs/@hashintel/brunch-agent/packages/binding-flue/src/index.ts index 4eb130de583..4885df836ec 100644 --- a/libs/@hashintel/brunch-agent/packages/binding-flue/src/index.ts +++ b/libs/@hashintel/brunch-agent/packages/binding-flue/src/index.ts @@ -59,7 +59,7 @@ import { type Plugin, type SweepState, } from "@hashintel/brunch-agent"; -import { repertoire } from "@hashintel/brunch-agent-repertoire"; +import { repertoire } from "@hashintel/brunch-agent/prompts"; import { capturedUserEntryIdsForSession } from "./capture-accounting"; import { diff --git a/libs/@hashintel/brunch-agent/packages/core/package.json b/libs/@hashintel/brunch-agent/packages/core/package.json index ecabeede0eb..bb1a6cb8639 100644 --- a/libs/@hashintel/brunch-agent/packages/core/package.json +++ b/libs/@hashintel/brunch-agent/packages/core/package.json @@ -14,6 +14,10 @@ "types": "./src/client-tools.ts", "import": "./dist/client-tools.js" }, + "./prompts": { + "types": "./src/prompts.ts", + "import": "./dist/prompts.js" + }, "./storage": { "types": "./src/storage.ts", "import": "./dist/storage.js" diff --git a/libs/@hashintel/brunch-agent/packages/core/src/prompts.ts b/libs/@hashintel/brunch-agent/packages/core/src/prompts.ts new file mode 100644 index 00000000000..d6c1e8f3354 --- /dev/null +++ b/libs/@hashintel/brunch-agent/packages/core/src/prompts.ts @@ -0,0 +1,15 @@ +import { readRepertoire } from "./repertoire"; +import repertoireYaml from "./repertoire.yaml?raw"; + +/** + * The harness's validated default teaching. + * + * The repertoire fills every guidance and runbook key before a plugin adds its + * formalism-specific cells. Every entry names its evidence source, and reading + * fails at module load if a key is empty or unsourced. Bindings and evaluation + * composition may import `@hashintel/brunch-agent/prompts`; plugins may not. + * + * @see ADR-0007 for the repertoire contract. + * @see ADR-0008 for its placement in the core package. + */ +export const repertoire = readRepertoire(repertoireYaml); diff --git a/libs/@hashintel/brunch-agent/packages/repertoire/src/raw-imports.d.ts b/libs/@hashintel/brunch-agent/packages/core/src/raw-imports.d.ts similarity index 100% rename from libs/@hashintel/brunch-agent/packages/repertoire/src/raw-imports.d.ts rename to libs/@hashintel/brunch-agent/packages/core/src/raw-imports.d.ts diff --git a/libs/@hashintel/brunch-agent/packages/core/src/repertoire.ts b/libs/@hashintel/brunch-agent/packages/core/src/repertoire.ts index 7b91f737a5d..6d5d42a363d 100644 --- a/libs/@hashintel/brunch-agent/packages/core/src/repertoire.ts +++ b/libs/@hashintel/brunch-agent/packages/core/src/repertoire.ts @@ -2,11 +2,10 @@ * The repertoire's shape: the harness's own filling of every guidance and * runbook key (ADR-0007 decisions 3, 7, 8). * - * The repertoire is shipped by `packages/repertoire`, which depends only on - * this package; this module is the type and the reader, so that the harness - * can define what a repertoire must be without importing one. Two rules the - * reader enforces that a plugin definition does not: every key is filled, and - * every entry names its source — admission is by evidence, not plausibility. + * The repertoire is shipped from this package's guarded `./prompts` subpath; + * this module is the type and the reader. Two rules the reader enforces that a + * plugin definition does not: every key is filled, and every entry names its + * source — admission is by evidence, not plausibility. */ import * as v from "valibot"; diff --git a/libs/@hashintel/brunch-agent/packages/repertoire/repertoire.yaml b/libs/@hashintel/brunch-agent/packages/core/src/repertoire.yaml similarity index 100% rename from libs/@hashintel/brunch-agent/packages/repertoire/repertoire.yaml rename to libs/@hashintel/brunch-agent/packages/core/src/repertoire.yaml diff --git a/libs/@hashintel/brunch-agent/packages/core/test/architecture/boundaries.test.ts b/libs/@hashintel/brunch-agent/packages/core/test/architecture/boundaries.test.ts index 2e2183a7689..0e52d1fccd1 100644 --- a/libs/@hashintel/brunch-agent/packages/core/test/architecture/boundaries.test.ts +++ b/libs/@hashintel/brunch-agent/packages/core/test/architecture/boundaries.test.ts @@ -90,7 +90,7 @@ describe("role prefixes name what a package is architecturally (spec §12.2)", ( test("every package under packages/ is core or carries a role prefix", () => { for (const pkg of PACKAGES.filter((p) => p.kind === "package")) { expect(pkg.dir).toMatch( - /^(core|repertoire|plugin-[a-z0-9-]+|binding-[a-z0-9-]+|transport-[a-z0-9-]+)$/, + /^(core|plugin-[a-z0-9-]+|binding-[a-z0-9-]+|transport-[a-z0-9-]+)$/, ); } }); @@ -159,6 +159,7 @@ describe("dependency direction (spec §4, §12.2)", () => { CORE, ); expect(specifier).not.toBe(`${CORE}/storage`); + expect(specifier).not.toBe(`${CORE}/prompts`); } } } @@ -182,16 +183,26 @@ describe("dependency direction (spec §4, §12.2)", () => { } }); - test("the repertoire depends on core only, and only bindings depend on it (ADR-0007)", () => { - const repertoire = PACKAGES.find((pkg) => pkg.dir === "repertoire"); - expect(repertoire).toBeDefined(); - expect(runtimeDependencies(repertoire!)).toEqual([CORE]); - for (const pkg of PACKAGES) { - if (pkg.dir === "repertoire" || pkg.dir.startsWith("binding-")) continue; - expect({ - pkg: pkg.dir, - dependsOnRepertoire: allDependencies(pkg).includes(repertoire!.name), - }).toEqual({ pkg: pkg.dir, dependsOnRepertoire: false }); + test("repertoire defaults are guarded core prompt data (ADR-0008)", () => { + expect(PACKAGES.map((pkg) => pkg.dir)).not.toContain("repertoire"); + + const promptImporters = PACKAGES.flatMap((pkg) => + sourceFiles(pkg) + .filter((file) => importedPackages(file).includes(`${CORE}/prompts`)) + .map((file) => ({ pkg: pkg.dir, file: file.relPath })), + ); + expect(promptImporters.length).toBeGreaterThan(0); + for (const importer of promptImporters) { + expect(importer.pkg).toMatch(/^binding-/u); + } + + // Plugin-only CI lints the plugin and does not run this suite. The + // oxlint path ban is the gate that fires then; this assertion keeps + // that gate from disappearing while the suite still runs. + for (const plugin of byRole("plugin")) { + expect( + readFileSync(join(plugin.path, ".oxlintrc.json"), "utf8"), + ).toContain(`"name": "${CORE}/prompts"`); } }); @@ -413,14 +424,22 @@ describe("recorded Flue constraints hold by construction (spec §10)", () => { }); describe("core auxiliary subpaths stay in their assigned lanes (spec §12.2)", () => { - test("core exposes browser contracts, storage support and testing as explicit subpaths", () => { + test("core exposes browser contracts, prompts, storage support and testing as explicit subpaths", () => { const core = PACKAGES.find((pkg) => pkg.name === CORE)!; expect(Object.keys(core.manifest.exports ?? {})).toEqual([ ".", "./client-tools", + "./prompts", "./storage", "./testing", ]); + expect(core.manifest.exports?.["./prompts"]).toEqual({ + types: "./src/prompts.ts", + import: "./dist/prompts.js", + }); + + const rootEntry = readFileSync(join(core.path, "src/index.ts"), "utf8"); + expect(rootEntry).not.toMatch(/\bfrom\s+["']\.\/prompts["']/u); }); test("no package source imports core/testing", () => { diff --git a/libs/@hashintel/brunch-agent/packages/repertoire/test/repertoire.test.ts b/libs/@hashintel/brunch-agent/packages/core/test/prompts.test.ts similarity index 97% rename from libs/@hashintel/brunch-agent/packages/repertoire/test/repertoire.test.ts rename to libs/@hashintel/brunch-agent/packages/core/test/prompts.test.ts index 923b897701b..5f4e8740b57 100644 --- a/libs/@hashintel/brunch-agent/packages/repertoire/test/repertoire.test.ts +++ b/libs/@hashintel/brunch-agent/packages/core/test/prompts.test.ts @@ -2,17 +2,13 @@ import { readFileSync } from "node:fs"; import { describe, expect, test } from "vitest"; +import { GUIDANCE_KEYS, JOBS, MOVEMENTS, RUNBOOK_KEYS } from "../src/keys"; import { - GUIDANCE_KEYS, guidanceEntries, - JOBS, - MOVEMENTS, readPluginDefinition, - RUNBOOK_KEYS, runbookEntries, -} from "@hashintel/brunch-agent"; - -import { repertoire } from "../src/index"; +} from "../src/plugin-definition"; +import { repertoire } from "../src/prompts"; /** Words that would mean the repertoire teaches a formalism or a domain. */ const FORMALISM_OR_DOMAIN = diff --git a/libs/@hashintel/brunch-agent/packages/core/vite.config.ts b/libs/@hashintel/brunch-agent/packages/core/vite.config.ts index fc0aa45b6c5..c59aef178ec 100644 --- a/libs/@hashintel/brunch-agent/packages/core/vite.config.ts +++ b/libs/@hashintel/brunch-agent/packages/core/vite.config.ts @@ -12,6 +12,7 @@ export default defineConfig({ new URL("src/client-tools.ts", import.meta.url), ), index: fileURLToPath(new URL("src/index.ts", import.meta.url)), + prompts: fileURLToPath(new URL("src/prompts.ts", import.meta.url)), storage: fileURLToPath(new URL("src/storage.ts", import.meta.url)), "testing/index": fileURLToPath( new URL("src/testing/index.ts", import.meta.url), diff --git a/libs/@hashintel/brunch-agent/packages/plugin-gherkin/.oxlintrc.json b/libs/@hashintel/brunch-agent/packages/plugin-gherkin/.oxlintrc.json index 52c387bca8c..0b4ce17b4f7 100644 --- a/libs/@hashintel/brunch-agent/packages/plugin-gherkin/.oxlintrc.json +++ b/libs/@hashintel/brunch-agent/packages/plugin-gherkin/.oxlintrc.json @@ -23,6 +23,10 @@ "name": "@hashintel/brunch-agent/storage", "message": "Plugins receive harness capabilities and must remain storage-blind." }, + { + "name": "@hashintel/brunch-agent/prompts", + "message": "Plugins fill cells; they must not import harness default teaching (ADR-0008)." + }, { "name": "@hashintel/petrinaut", "message": "Brunch libraries must not depend on Petrinaut implementations." diff --git a/libs/@hashintel/brunch-agent/packages/plugin-sdcpn/.oxlintrc.json b/libs/@hashintel/brunch-agent/packages/plugin-sdcpn/.oxlintrc.json index 52c387bca8c..0b4ce17b4f7 100644 --- a/libs/@hashintel/brunch-agent/packages/plugin-sdcpn/.oxlintrc.json +++ b/libs/@hashintel/brunch-agent/packages/plugin-sdcpn/.oxlintrc.json @@ -23,6 +23,10 @@ "name": "@hashintel/brunch-agent/storage", "message": "Plugins receive harness capabilities and must remain storage-blind." }, + { + "name": "@hashintel/brunch-agent/prompts", + "message": "Plugins fill cells; they must not import harness default teaching (ADR-0008)." + }, { "name": "@hashintel/petrinaut", "message": "Brunch libraries must not depend on Petrinaut implementations." diff --git a/libs/@hashintel/brunch-agent/packages/plugin-sdcpn/plugin.yaml b/libs/@hashintel/brunch-agent/packages/plugin-sdcpn/plugin.yaml index 12f826e9cf9..3e4a25ef885 100644 --- a/libs/@hashintel/brunch-agent/packages/plugin-sdcpn/plugin.yaml +++ b/libs/@hashintel/brunch-agent/packages/plugin-sdcpn/plugin.yaml @@ -8,8 +8,9 @@ # # Migrated from plugin.md (sdcpn/2026-08-25.1) with no semantic change to the three tables. The # guidance the v0 prompt contributed — open with objectives, slice then sweep, probe, keep the -# ledger, close honestly — has moved to the repertoire (packages/repertoire), where every plugin -# inherits it; what remains here is what is true of this formalism and not of interviewing. +# ledger, close honestly — has moved to the repertoire (`@hashintel/brunch-agent/prompts`), where +# every plugin inherits it; what remains here is what is true of this formalism and not of +# interviewing. plugin: id: sdcpn diff --git a/libs/@hashintel/brunch-agent/packages/repertoire/.oxlintrc.json b/libs/@hashintel/brunch-agent/packages/repertoire/.oxlintrc.json deleted file mode 100644 index 6e0289507c0..00000000000 --- a/libs/@hashintel/brunch-agent/packages/repertoire/.oxlintrc.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "extends": ["../../../../../.config/oxlint/brunch/base.json"], - "categories": { - "correctness": "error", - "perf": "warn" - }, - "env": { - "builtin": true, - "es2026": true, - "node": true - }, - "options": { - "typeAware": true, - "typeCheck": true - }, - "rules": { - "no-restricted-imports": [ - "error", - { - "paths": [ - { - "name": "@hashintel/brunch-agent/storage", - "message": "The repertoire is text; it must remain storage-blind." - }, - { - "name": "@hashintel/petrinaut", - "message": "Brunch libraries must not depend on Petrinaut implementations." - } - ], - "patterns": [ - { - "group": ["@local/*"], - "message": "Brunch libraries must remain independent of unpublished HASH packages." - }, - { - "group": ["@hashintel/petrinaut/*", "@hashintel/petrinaut-*"], - "message": "Brunch libraries must not depend on Petrinaut implementations." - }, - { - "group": ["@flue/*", "@earendil-works/*"], - "message": "The repertoire is substrate-independent." - }, - { - "group": ["@hashintel/brunch-agent-*"], - "message": "The repertoire depends inward on the harness only." - } - ] - } - ] - }, - "ignorePatterns": [ - "dist/**", - "build/**", - "coverage/**", - "*.gen.*", - "*.tsbuildinfo", - ".turbo/**" - ] -} diff --git a/libs/@hashintel/brunch-agent/packages/repertoire/LICENSE.md b/libs/@hashintel/brunch-agent/packages/repertoire/LICENSE.md deleted file mode 100644 index c7d627721e2..00000000000 --- a/libs/@hashintel/brunch-agent/packages/repertoire/LICENSE.md +++ /dev/null @@ -1,607 +0,0 @@ -GNU Affero General Public License -================================= - -_Version 3, 19 November 2007_ -_Copyright © 2007 Free Software Foundation, Inc. <>_ - -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. - -## Preamble - -The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - -The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - -When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - -Developers that use our General Public Licenses protect your rights -with two steps: **(1)** assert copyright on the software, and **(2)** offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - -A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - -The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - -An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - -The precise terms and conditions for copying, distribution and -modification follow. - -## TERMS AND CONDITIONS - -### 0. Definitions - -“This License” refers to version 3 of the GNU Affero General Public License. - -“Copyright” also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - -“The Program” refers to any copyrightable work licensed under this -License. Each licensee is addressed as “you”. “Licensees” and -“recipients” may be individuals or organizations. - -To “modify” a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a “modified version” of the -earlier work or a work “based on” the earlier work. - -A “covered work” means either the unmodified Program or a work based -on the Program. - -To “propagate” a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - -To “convey” a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - -An interactive user interface displays “Appropriate Legal Notices” -to the extent that it includes a convenient and prominently visible -feature that **(1)** displays an appropriate copyright notice, and **(2)** -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - -### 1. Source Code - -The “source code” for a work means the preferred form of the work -for making modifications to it. “Object code” means any non-source -form of a work. - -A “Standard Interface” means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - -The “System Libraries” of an executable work include anything, other -than the work as a whole, that **(a)** is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and **(b)** serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -“Major Component”, in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - -The “Corresponding Source” for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - -The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - -The Corresponding Source for a work in source code form is that -same work. - -### 2. Basic Permissions - -All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - -### 3. Protecting Users' Legal Rights From Anti-Circumvention Law - -No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - -When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - -### 4. Conveying Verbatim Copies - -You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - -### 5. Conveying Modified Source Versions - -You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - -* **a)** The work must carry prominent notices stating that you modified -it, and giving a relevant date. -* **b)** The work must carry prominent notices stating that it is -released under this License and any conditions added under section 7. -This requirement modifies the requirement in section 4 to -“keep intact all notices”. -* **c)** You must license the entire work, as a whole, under this -License to anyone who comes into possession of a copy. This -License will therefore apply, along with any applicable section 7 -additional terms, to the whole of the work, and all its parts, -regardless of how they are packaged. This License gives no -permission to license the work in any other way, but it does not -invalidate such permission if you have separately received it. -* **d)** If the work has interactive user interfaces, each must display -Appropriate Legal Notices; however, if the Program has interactive -interfaces that do not display Appropriate Legal Notices, your -work need not make them do so. - -A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -“aggregate” if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - -### 6. Conveying Non-Source Forms - -You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - -* **a)** Convey the object code in, or embodied in, a physical product -(including a physical distribution medium), accompanied by the -Corresponding Source fixed on a durable physical medium -customarily used for software interchange. -* **b)** Convey the object code in, or embodied in, a physical product -(including a physical distribution medium), accompanied by a -written offer, valid for at least three years and valid for as -long as you offer spare parts or customer support for that product -model, to give anyone who possesses the object code either **(1)** a -copy of the Corresponding Source for all the software in the -product that is covered by this License, on a durable physical -medium customarily used for software interchange, for a price no -more than your reasonable cost of physically performing this -conveying of source, or **(2)** access to copy the -Corresponding Source from a network server at no charge. -* **c)** Convey individual copies of the object code with a copy of the -written offer to provide the Corresponding Source. This -alternative is allowed only occasionally and noncommercially, and -only if you received the object code with such an offer, in accord -with subsection 6b. -* **d)** Convey the object code by offering access from a designated -place (gratis or for a charge), and offer equivalent access to the -Corresponding Source in the same way through the same place at no -further charge. You need not require recipients to copy the -Corresponding Source along with the object code. If the place to -copy the object code is a network server, the Corresponding Source -may be on a different server (operated by you or a third party) -that supports equivalent copying facilities, provided you maintain -clear directions next to the object code saying where to find the -Corresponding Source. Regardless of what server hosts the -Corresponding Source, you remain obligated to ensure that it is -available for as long as needed to satisfy these requirements. -* **e)** Convey the object code using peer-to-peer transmission, provided -you inform other peers where the object code and Corresponding -Source of the work are being offered to the general public at no -charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - -A “User Product” is either **(1)** a “consumer product”, which means any -tangible personal property which is normally used for personal, family, -or household purposes, or **(2)** anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, “normally used” refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - -“Installation Information” for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - -If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - -The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - -### 7. Additional Terms - -“Additional permissions” are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - -* **a)** Disclaiming warranty or limiting liability differently from the -terms of sections 15 and 16 of this License; or -* **b)** Requiring preservation of specified reasonable legal notices or -author attributions in that material or in the Appropriate Legal -Notices displayed by works containing it; or -* **c)** Prohibiting misrepresentation of the origin of that material, or -requiring that modified versions of such material be marked in -reasonable ways as different from the original version; or -* **d)** Limiting the use for publicity purposes of names of licensors or -authors of the material; or -* **e)** Declining to grant rights under trademark law for use of some -trade names, trademarks, or service marks; or -* **f)** Requiring indemnification of licensors and authors of that -material by anyone who conveys the material (or modified versions of -it) with contractual assumptions of liability to the recipient, for -any liability that these contractual assumptions directly impose on -those licensors and authors. - -All other non-permissive additional terms are considered “further -restrictions” within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - -### 8. Termination - -You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - -However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated **(a)** -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and **(b)** permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - -Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - -### 9. Acceptance Not Required for Having Copies - -You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - -### 10. Automatic Licensing of Downstream Recipients - -Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - -An “entity transaction” is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - -### 11. Patents - -A “contributor” is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's “contributor version”. - -A contributor's “essential patent claims” are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, “control” includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - -In the following three paragraphs, a “patent license” is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To “grant” such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - -If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either **(1)** cause the Corresponding Source to be so -available, or **(2)** arrange to deprive yourself of the benefit of the -patent license for this particular work, or **(3)** arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. “Knowingly relying” means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - -A patent license is “discriminatory” if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license **(a)** in connection with copies of the covered work -conveyed by you (or copies made from those copies), or **(b)** primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - -### 12. No Surrender of Others' Freedom - -If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - -### 13. Remote Network Interaction; Use with the GNU General Public License - -Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - -Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - -### 14. Revised Versions of this License - -The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License “or any later version” applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - -Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - -### 15. Disclaimer of Warranty - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -### 16. Limitation of Liability - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - -### 17. Interpretation of Sections 15 and 16 - -If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. diff --git a/libs/@hashintel/brunch-agent/packages/repertoire/README.md b/libs/@hashintel/brunch-agent/packages/repertoire/README.md deleted file mode 100644 index 03551827e57..00000000000 --- a/libs/@hashintel/brunch-agent/packages/repertoire/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# `@hashintel/brunch-agent-repertoire` - -The harness's own teaching, as data: `repertoire.yaml` fills every guidance key -(`lenses`, `techniques`, `movements.slice`, `movements.sweep`, `licenses`, -`motifs`, `smells`, `rabbit_holes`, `failure_modes`) and every runbook key -(`kickoff`, `trajectory`, `close`) of every job (`construct`, -`review-and-revise`) with what an interviewer is taught before any plugin -speaks. The keys, their definitions, and the reader live in the harness -(`packages/core/src/keys.ts`, `repertoire.ts`); this package is the filling. - -Two rules the reader enforces here and not on a plugin: every key is filled, -and every entry names its `source` — a run, a replay, a verified literature -finding, or an accepted decision. Admission is by evidence (ADR-0007 -decision 7). Entries name no formalism and no domain; the test checks. -An entry may declare `for_precision`, a non-empty list of harness precision -words. The renderer includes it only for plugins that demand at least one of -those words. - -## Topology - -Depends on `@hashintel/brunch-agent` only. A binding depends on this package -and renders it interleaved with a plugin definition -(`renderInstructions(repertoire, definition)`), key by key: the harness's -definition of the key, then the default here, then the plugin's cell. A plugin -never imports the repertoire: its cell is written against the harness's -definition of the key, and adds to the default without overriding it. - -## Changing it - -Add an entry when a run, replay, or verified source shows the interviewer -needs it, and cite that source. Add a key only through the harness's catalogue -(`keys.ts`) and its changelog (`packages/core/schema/CHANGELOG.md`), which is -a working set until a co-authoring cycle changes no key (ADR-0007 decision 9). -Reference: `docs/adr/0007-harness-teaching-meets-plugin-content-at-fixed-keys.md`. diff --git a/libs/@hashintel/brunch-agent/packages/repertoire/package.json b/libs/@hashintel/brunch-agent/packages/repertoire/package.json deleted file mode 100644 index d555717a11f..00000000000 --- a/libs/@hashintel/brunch-agent/packages/repertoire/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "@hashintel/brunch-agent-repertoire", - "version": "0.0.0-private", - "private": true, - "description": "The harness repertoire: the default teaching for every guidance and runbook key (ADR-0007).", - "license": "AGPL-3.0", - "type": "module", - "exports": { - ".": { - "types": "./src/index.ts", - "import": "./dist/index.js" - } - }, - "scripts": { - "build": "vite build", - "fix:eslint": "oxlint --fix --type-aware --type-check --report-unused-disable-directives-severity=error .", - "lint:eslint": "oxlint --type-aware --type-check --report-unused-disable-directives-severity=error .", - "lint:tsc": "tsgo --noEmit", - "test:unit": "vitest run" - }, - "dependencies": { - "@hashintel/brunch-agent": "workspace:*" - }, - "devDependencies": { - "@types/node": "22.18.13", - "@typescript/native-preview": "7.0.0-dev.20260511.1", - "oxlint": "1.63.0", - "oxlint-tsgolint": "0.22.1", - "vite": "8.1.0", - "vitest": "4.1.10" - } -} diff --git a/libs/@hashintel/brunch-agent/packages/repertoire/src/index.ts b/libs/@hashintel/brunch-agent/packages/repertoire/src/index.ts deleted file mode 100644 index 267c4e3a846..00000000000 --- a/libs/@hashintel/brunch-agent/packages/repertoire/src/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * `@hashintel/brunch-agent-repertoire` — the harness's own teaching (ADR-0007). - * - * `repertoire.yaml` fills every guidance and runbook key the harness owns with - * the default an interviewer is taught before any plugin speaks; every entry - * names its source. A binding renders it interleaved with a plugin definition - * (`renderInstructions` in the harness); a plugin never imports it — a plugin - * cell is written against the harness's definition of the key, not against - * this text. - * - * **This package resolves `@hashintel/brunch-agent` and nothing else.** - */ - -import { readRepertoire } from "@hashintel/brunch-agent"; - -import repertoireYaml from "../repertoire.yaml?raw"; - -/** The repertoire; reading fails loudly at module load if a key is empty or unsourced. */ -export const repertoire = readRepertoire(repertoireYaml); diff --git a/libs/@hashintel/brunch-agent/packages/repertoire/tsconfig.json b/libs/@hashintel/brunch-agent/packages/repertoire/tsconfig.json deleted file mode 100644 index 844edbd8e66..00000000000 --- a/libs/@hashintel/brunch-agent/packages/repertoire/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "target": "es2024", - "lib": ["ESNext"], - "types": ["node"], - "module": "preserve", - "moduleResolution": "bundler", - "strict": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedIndexedAccess": true, - "resolveJsonModule": true, - "noEmit": true, - "skipLibCheck": true, - "isolatedModules": true - }, - "include": ["src", "test"] -} diff --git a/libs/@hashintel/brunch-agent/packages/repertoire/turbo.json b/libs/@hashintel/brunch-agent/packages/repertoire/turbo.json deleted file mode 100644 index 6d9a1d1f9e5..00000000000 --- a/libs/@hashintel/brunch-agent/packages/repertoire/turbo.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": ["//"], - "tasks": { - "build": { - "dependsOn": ["^build"], - "outputs": ["dist/**"], - "cache": false - } - } -} diff --git a/libs/@hashintel/brunch-agent/packages/repertoire/vite.config.ts b/libs/@hashintel/brunch-agent/packages/repertoire/vite.config.ts deleted file mode 100644 index 7ada2315df0..00000000000 --- a/libs/@hashintel/brunch-agent/packages/repertoire/vite.config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { fileURLToPath } from "node:url"; - -import { defineConfig } from "vitest/config"; - -const packageRoot = fileURLToPath(new URL(".", import.meta.url)); - -export default defineConfig({ - build: { - lib: { - entry: fileURLToPath(new URL("src/index.ts", import.meta.url)), - fileName: "index", - formats: ["es"], - }, - rolldownOptions: { - external: [/^@hashintel\/brunch-agent(?:\/.*)?$/u], - }, - sourcemap: true, - }, - root: packageRoot, - test: { - include: ["test/**/*.test.ts"], - }, -}); diff --git a/yarn.lock b/yarn.lock index f9071161c17..39a3bbcd4bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7557,7 +7557,6 @@ __metadata: "@flue/runtime": "npm:2.0.3" "@flue/sdk": "npm:2.0.3" "@hashintel/brunch-agent": "workspace:*" - "@hashintel/brunch-agent-repertoire": "workspace:*" "@types/node": "npm:22.18.13" "@typescript/native-preview": "npm:7.0.0-dev.20260511.1" oxlint: "npm:1.63.0" @@ -7598,20 +7597,6 @@ __metadata: languageName: unknown linkType: soft -"@hashintel/brunch-agent-repertoire@workspace:*, @hashintel/brunch-agent-repertoire@workspace:libs/@hashintel/brunch-agent/packages/repertoire": - version: 0.0.0-use.local - resolution: "@hashintel/brunch-agent-repertoire@workspace:libs/@hashintel/brunch-agent/packages/repertoire" - dependencies: - "@hashintel/brunch-agent": "workspace:*" - "@types/node": "npm:22.18.13" - "@typescript/native-preview": "npm:7.0.0-dev.20260511.1" - oxlint: "npm:1.63.0" - oxlint-tsgolint: "npm:0.22.1" - vite: "npm:8.1.0" - vitest: "npm:4.1.10" - languageName: unknown - linkType: soft - "@hashintel/brunch-agent-transport-aisdk@workspace:*, @hashintel/brunch-agent-transport-aisdk@workspace:libs/@hashintel/brunch-agent/packages/transport-aisdk": version: 0.0.0-use.local resolution: "@hashintel/brunch-agent-transport-aisdk@workspace:libs/@hashintel/brunch-agent/packages/transport-aisdk"