@kontourai/flow-agents 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +12 -0
- package/CHANGELOG.md +32 -0
- package/CONTEXT.md +67 -1
- package/README.md +4 -0
- package/build/src/cli/assignment-provider.d.ts +188 -0
- package/build/src/cli/assignment-provider.js +193 -51
- package/build/src/cli/workflow-sidecar.d.ts +16 -6
- package/build/src/cli/workflow-sidecar.js +492 -45
- package/build/src/lib/flow-resolver.d.ts +12 -6
- package/build/src/lib/flow-resolver.js +30 -14
- package/build/src/tools/validate-source-tree.js +2 -1
- package/context/contracts/assignment-provider-contract.md +10 -1
- package/context/contracts/execution-contract.md +78 -0
- package/context/contracts/probe-docs-write-contract.md +187 -0
- package/context/scripts/hooks/config-protection.js +24 -4
- package/context/scripts/hooks/lib/config-protection-remedies.js +9 -0
- package/context/scripts/hooks/stop-goal-fit.js +262 -5
- package/context/scripts/hooks/workflow-steering.js +42 -0
- package/docs/adr/0001-flow-agents-consumes-flow.md +2 -0
- package/docs/adr/0002-flow-kits-as-extension-unit.md +2 -0
- package/docs/adr/0003-flow-agents-coordinates-kits-and-adapters.md +2 -0
- package/docs/adr/0004-gates-expect-surface-claims.md +2 -0
- package/docs/adr/0005-kubernetes-inspired-resource-contracts.md +2 -0
- package/docs/adr/0006-typescript-first-source-policy.md +2 -0
- package/docs/adr/0007-flow-skill-kit-tool-boundary.md +2 -0
- package/docs/adr/0007-skill-audit.md +2 -0
- package/docs/adr/0008-kit-operation-boundary.md +2 -0
- package/docs/adr/0009-canonical-hook-core-kit-boundary.md +2 -0
- package/docs/adr/0010-workflow-trust-state-as-hachure-bundle.md +2 -0
- package/docs/adr/0011-mcp-posture.md +2 -0
- package/docs/adr/0012-agent-coordination-as-liveness-claims.md +2 -0
- package/docs/adr/0013-context-lifecycle.md +2 -0
- package/docs/adr/0014-core-vs-domain-kit-boundary.md +2 -0
- package/docs/adr/0015-flow-flow-agents-boundary-reconciliation.md +2 -0
- package/docs/adr/0016-three-hard-boundary-model.md +2 -0
- package/docs/adr/0017-anti-gaming-trust-security-model.md +2 -0
- package/docs/adr/0018-freeze-local-shell-heuristics.md +2 -0
- package/docs/adr/0019-kit-dependency-ownership.md +2 -0
- package/docs/adr/0020-trust-reconcile-manifest-and-claim-classification.md +2 -0
- package/docs/adr/0021-assignment-leases-and-stale-claim-takeover.md +3 -1
- package/docs/adr/0022-fail-closed-delivery-reconciliation-with-governed-exemptions.md +113 -0
- package/docs/adr/README.md +49 -0
- package/docs/adr/index.md +34 -0
- package/docs/decisions/agent-coordination.md +20 -0
- package/docs/decisions/anti-gaming-trust-security.md +20 -0
- package/docs/decisions/context-lifecycle.md +18 -0
- package/docs/decisions/core-domain-kit-boundary.md +18 -0
- package/docs/decisions/flow-flow-agents-boundary.md +18 -0
- package/docs/decisions/flow-kit.md +20 -0
- package/docs/decisions/flow-skill-kit-tool-boundary.md +20 -0
- package/docs/decisions/graph-knowledge-provider.md +63 -0
- package/docs/decisions/hook-core-kit-boundary.md +18 -0
- package/docs/decisions/index.md +19 -0
- package/docs/decisions/kit-dependency-ownership.md +18 -0
- package/docs/decisions/kit-operation-boundary.md +18 -0
- package/docs/decisions/knowledge-promote-sub-flow.md +59 -0
- package/docs/decisions/kontour-resource-contract.md +18 -0
- package/docs/decisions/mcp-posture.md +18 -0
- package/docs/decisions/three-hard-boundary-model.md +18 -0
- package/docs/decisions/trust-reconcile.md +20 -0
- package/docs/decisions/typescript-source-policy.md +48 -0
- package/docs/decisions/workflow-enforcement.md +18 -0
- package/docs/decisions/workflow-trust-state.md +20 -0
- package/docs/fixture-ownership.md +1 -1
- package/docs/workflow-usage-guide.md +1 -1
- package/evals/ci/run-baseline.sh +6 -0
- package/evals/fixtures/assignment-provider/hostile-effective-state.json +11 -0
- package/evals/integration/test_checkpoint_signing.sh +4 -3
- package/evals/integration/test_current_json_per_actor.sh +516 -0
- package/evals/integration/test_ensure_session_ownership_guard.sh +435 -0
- package/evals/integration/test_gate_lockdown.sh +46 -0
- package/evals/integration/test_model_routing_escalation.sh +145 -0
- package/evals/integration/test_publish_delivery.sh +14 -6
- package/evals/integration/test_pull_work_liveness_preflight.sh +6 -1
- package/evals/integration/test_stop_hook_release.sh +552 -0
- package/evals/integration/test_trust_reconcile_negatives.sh +170 -0
- package/evals/integration/test_workflow_sidecar_writer.sh +12 -3
- package/evals/run.sh +10 -0
- package/evals/static/test_knowledge_providers.sh +13 -4
- package/evals/static/test_model_routing_hints.sh +107 -0
- package/evals/static/test_workflow_skills.sh +15 -2
- package/kits/builder/skills/builder-shape/SKILL.md +10 -0
- package/kits/builder/skills/deliver/SKILL.md +69 -11
- package/kits/builder/skills/design-probe/SKILL.md +47 -0
- package/kits/builder/skills/execute-plan/SKILL.md +13 -0
- package/kits/builder/skills/fix-bug/SKILL.md +17 -0
- package/kits/builder/skills/idea-to-backlog/SKILL.md +10 -0
- package/kits/builder/skills/pickup-probe/SKILL.md +4 -4
- package/kits/builder/skills/plan-work/SKILL.md +9 -0
- package/kits/builder/skills/pull-work/SKILL.md +10 -0
- package/kits/builder/skills/review-work/SKILL.md +11 -0
- package/kits/builder/skills/tdd-workflow/SKILL.md +17 -0
- package/kits/builder/skills/verify-work/SKILL.md +11 -0
- package/kits/knowledge/adapters/default-store/index.js +147 -18
- package/kits/knowledge/adapters/flow-runner/index.js +912 -16
- package/kits/knowledge/adapters/obsidian-store/index.js +97 -14
- package/kits/knowledge/adapters/shared/codec.js +265 -0
- package/kits/knowledge/docs/README.md +121 -2
- package/kits/knowledge/docs/store-contract.md +517 -7
- package/kits/knowledge/evals/audit-freshness/suite.test.js +92 -1
- package/kits/knowledge/evals/consolidate-incremental/suite.test.js +494 -0
- package/kits/knowledge/evals/consolidation/suite.test.js +1 -1
- package/kits/knowledge/evals/contract-suite/suite.test.js +212 -0
- package/kits/knowledge/evals/freshness/suite.test.js +339 -0
- package/kits/knowledge/evals/inbound-references/suite.test.js +351 -0
- package/kits/knowledge/evals/retirement/suite.test.js +1 -1
- package/kits/knowledge/evals/supersede-propagation/suite.test.js +384 -0
- package/kits/knowledge/flows/promote.flow.json +84 -0
- package/kits/knowledge/kit.json +15 -0
- package/kits/knowledge/promote/distill.js +96 -0
- package/kits/knowledge/promote/fixtures/contradiction-registry/CONTEXT.md +7 -0
- package/kits/knowledge/promote/fixtures/contradiction-registry/docs/decisions/cache-eviction-policy.md +12 -0
- package/kits/knowledge/promote/fixtures/contradiction-registry/docs/decisions/cache-eviction.md +12 -0
- package/kits/knowledge/promote/fixtures/repo/CONTEXT.md +11 -0
- package/kits/knowledge/promote/fixtures/repo/docs/decisions/index.md +9 -0
- package/kits/knowledge/promote/fixtures/repo/docs/decisions/liveness-claim.md +12 -0
- package/kits/knowledge/promote/fixtures/session/acceptance.json +9 -0
- package/kits/knowledge/promote/fixtures/session/agents/tool-planner/events.jsonl +1 -0
- package/kits/knowledge/promote/fixtures/session/agents/tool-verifier/events.jsonl +1 -0
- package/kits/knowledge/promote/fixtures/session/agents/tool-worker-1-1/events.jsonl +1 -0
- package/kits/knowledge/promote/fixtures/session/kontourai-flow-agents-287--deliver.md +47 -0
- package/kits/knowledge/promote/fixtures/session/learning.json +35 -0
- package/kits/knowledge/promote/fixtures/session/state.json +19 -0
- package/kits/knowledge/promote/health.js +137 -0
- package/kits/knowledge/promote/index.js +176 -0
- package/kits/knowledge/promote/ingest.js +103 -0
- package/kits/knowledge/promote/lib.js +132 -0
- package/kits/knowledge/promote/link.js +84 -0
- package/kits/knowledge/promote/promote.test.js +174 -0
- package/kits/knowledge/providers/conformance/suite.test.js +18 -0
- package/kits/knowledge/providers/index.js +1 -0
- package/kits/knowledge/providers/neo4j/connection.js +121 -0
- package/kits/knowledge/providers/neo4j/cypher.js +190 -0
- package/kits/knowledge/providers/neo4j/fake-driver.js +123 -0
- package/kits/knowledge/providers/neo4j/fixtures/spike-ground-truth.json +29 -0
- package/kits/knowledge/providers/neo4j/graph-queries.js +210 -0
- package/kits/knowledge/providers/neo4j/index.js +280 -0
- package/kits/knowledge/providers/neo4j/integration.test.js +122 -0
- package/kits/knowledge/providers/neo4j/neo4j.test.js +219 -0
- package/kits/knowledge/providers/neo4j/sync.js +235 -0
- package/package.json +4 -2
- package/schemas/workflow-handoff.schema.json +6 -0
- package/scripts/README.md +1 -0
- package/scripts/ci/mint-attestation.js +33 -6
- package/scripts/ci/trust-reconcile.js +144 -26
- package/scripts/freeze-adrs.mjs +364 -0
- package/scripts/hooks/config-protection.js +24 -4
- package/scripts/hooks/evidence-capture.js +4 -1
- package/scripts/hooks/lib/config-protection-remedies.js +9 -0
- package/scripts/hooks/lib/current-pointer.js +123 -0
- package/scripts/hooks/lib/liveness-heartbeat.js +75 -35
- package/scripts/hooks/stop-goal-fit.js +262 -5
- package/scripts/hooks/workflow-steering.js +42 -0
- package/scripts/statusline/flow-agents-statusline.js +3 -1
- package/src/cli/assignment-provider.ts +239 -59
- package/src/cli/workflow-sidecar.ts +529 -43
- package/src/lib/flow-resolver.ts +35 -14
- package/src/tools/validate-source-tree.ts +2 -1
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0022: Fail-Closed Delivery Reconciliation with Governed Exemptions"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
> **FROZEN — immutable history.** Superseding/current decisions live in [`docs/decisions/`](../decisions/index.md). Do not edit.
|
|
6
|
+
|
|
5
7
|
# ADR 0022: Fail-Closed Delivery Reconciliation with Governed Exemptions
|
|
6
8
|
|
|
7
9
|
**Date:** 2026-07-02
|
|
@@ -461,3 +463,114 @@ the workflow to fake the post-merge no-op path; this is closed by required code-
|
|
|
461
463
|
review on `.github/workflows/trust-reconcile.yml` (#225, not yet server-side enforced),
|
|
462
464
|
the same residual class as every other self-asserted CI input this ADR already carries.
|
|
463
465
|
Step 1 (fresh verify) is unaffected by event scoping either way and always runs.
|
|
466
|
+
|
|
467
|
+
## Addendum (2026-07-04, part 5): per-session delivery paths — concurrent deliveries stop contending (#379)
|
|
468
|
+
|
|
469
|
+
Owner-approved follow-up closing a structural defect the fail-closed gate's first real
|
|
470
|
+
deliveries surfaced repeatedly: the delivery transport used a SINGLE shared path
|
|
471
|
+
(`delivery/trust.bundle` + `delivery/trust.checkpoint.json`), so every sealed delivery
|
|
472
|
+
force-committed to the SAME two files. Any two concurrent deliveries therefore
|
|
473
|
+
merge-conflict by construction — three seal collisions inside 24h (#330, #358, #378) each
|
|
474
|
+
needed manual conflict resolution. Worse than the conflict itself: **GitHub schedules NO
|
|
475
|
+
`pull_request` workflows for a conflicting (DIRTY) PR** — zero checks, no error — so the
|
|
476
|
+
required Trust Reconcile check silently never re-runs. The symptom reads as "CI vanished,"
|
|
477
|
+
not "conflict." This collision class scales with delivery frequency; ADR 0021's own "work
|
|
478
|
+
area" vocabulary predicted it, and #335 named the `resolveDeliveryCandidates()` seam as the
|
|
479
|
+
fix site.
|
|
480
|
+
|
|
481
|
+
**Decision (structural): per-session delivery paths.** `publishDelivery()`
|
|
482
|
+
(`src/cli/workflow-sidecar.ts`) writes to `delivery/<slug>/trust.bundle` (+ checkpoint
|
|
483
|
+
companions), where `<slug>` is the session artifact dir's basename, instead of the shared
|
|
484
|
+
flat path. Concurrent deliveries write to DISTINCT files and cannot contend: two deliveries
|
|
485
|
+
add different `delivery/<slug>/` dirs (add/add of different paths — not a conflict), and both
|
|
486
|
+
deleting the same inherited flat/legacy file is a delete/delete (auto-merges — not a
|
|
487
|
+
conflict). The per-session dir NAME is only a collision-avoidance handle; it carries no
|
|
488
|
+
trust weight.
|
|
489
|
+
|
|
490
|
+
**Reconciler side: ownership-aware discovery, prefer-newest, not first-match.**
|
|
491
|
+
`resolveDeliveryCandidates()` now returns the flat path (FIRST, for full back-compat)
|
|
492
|
+
followed by every `delivery/<slug>/<filename>` (sorted). `discoverBundle()` no longer returns
|
|
493
|
+
the first-existing candidate; it collects every candidate that attests THIS change
|
|
494
|
+
(ancestor-or-equal, the SAME `bundleAttestsThisChange()` binding Addendum part 2 defined) and
|
|
495
|
+
selects the one attesting the **NEWEST** (descendant-most) commit. This prefer-newest rule is
|
|
496
|
+
load-bearing in a **merge-commit** repo (this repo's own history has merge commits, e.g.
|
|
497
|
+
release-please merges): an inherited FLAT bundle's `commit_sha` can be a REAL ancestor of HEAD
|
|
498
|
+
— it was committed on the trunk's linear history before this branch point — so it legitimately
|
|
499
|
+
"owns" the change too, and a naive first-fresh-wins would select that STALE inherited bundle
|
|
500
|
+
purely because it sorts first, reconciling the PREVIOUS delivery's claims against THIS change's
|
|
501
|
+
CI. Prefer-newest makes the fresh per-session bundle win on recency, not on being deleted
|
|
502
|
+
first — which in turn is what lets the cleanup policy leave the flat path in place (below)
|
|
503
|
+
without corrupting selection. (Addendum parts 2/4's squash-merge reasoning still holds for
|
|
504
|
+
squash repos; prefer-newest is the strict generalization that also covers merge-commit repos,
|
|
505
|
+
where "inherited ⇒ non-ancestor" is NOT guaranteed.) `extractBundleCommitSha()` now resolves a
|
|
506
|
+
bundle's sibling checkpoint from the bundle's OWN directory (`path.dirname(bundlePath)`), not a
|
|
507
|
+
global scan — a global scan would pair a per-session bundle with the wrong session's (or the
|
|
508
|
+
flat) checkpoint and read the wrong commit binding. For the flat layout this is byte-identical
|
|
509
|
+
to the prior behavior; for per-session it is the only correct pairing.
|
|
510
|
+
|
|
511
|
+
**Back-compat (retained, deprecation-noted).** The flat `delivery/trust.bundle` path stays
|
|
512
|
+
fully supported on the READ side: an already-committed flat bundle from before this change,
|
|
513
|
+
or an external adopter that has not migrated, still resolves and reconciles exactly as
|
|
514
|
+
before (regression-locked by the negatives suite's flat-owner-coexist case and the
|
|
515
|
+
unchanged `test_publish_delivery.sh` TEST 3/4 flat-fixture cases). Only the WRITE side moved
|
|
516
|
+
to per-session — writing to both flat and per-session would re-introduce the very contention
|
|
517
|
+
this closes, so the flat path is write-deprecated, read-supported.
|
|
518
|
+
|
|
519
|
+
**Cleanup policy: supersede-on-publish, per-session dirs only (delivery/ stays bounded).** A
|
|
520
|
+
publishing session prunes every inherited **per-session** seal dir except its own, then
|
|
521
|
+
commits only `delivery/<slug>/`. Per-session dirs are the growth vector (one per delivery) and
|
|
522
|
+
are UNIQUELY named, so pruning one can never conflict with a concurrent PR: two branches
|
|
523
|
+
deleting the same inherited dir is a delete/delete (auto-merges), and each delivery adds its
|
|
524
|
+
own distinct dir. Leaving an inherited per-session dir would be harmless anyway (prefer-newest
|
|
525
|
+
ignores it) — pruning is purely to stop unbounded accumulation. The alternative,
|
|
526
|
+
retain-as-history, was rejected as unbounded growth of permanently-superseded dirs with no
|
|
527
|
+
reader. Pruning is best-effort: a prune failure is logged, never fatal to the delivery.
|
|
528
|
+
|
|
529
|
+
**The shared flat path is deliberately NOT pruned per-delivery.** An earlier iteration of this
|
|
530
|
+
addendum also pruned the flat `delivery/trust.bundle` legacy seals on every publish (to
|
|
531
|
+
"migrate off" the shared path). That was reverted: during the migration window a concurrent PR
|
|
532
|
+
may still seal to the flat path (this was written while PR #370 had an open flat-path seal),
|
|
533
|
+
and a per-delivery deletion of that file is a **modify/delete conflict** against such a PR → a
|
|
534
|
+
DIRTY PR → precisely the no-CI failure mode this whole change exists to remove. Because the
|
|
535
|
+
flat path is a single fixed location (not a growth vector) and prefer-newest selection makes a
|
|
536
|
+
lingering flat bundle harmless, retaining it costs nothing. Removing the flat legacy seals is a
|
|
537
|
+
one-time cleanup for a **dedicated** PR once no open PR still seals to the flat path — not
|
|
538
|
+
something safely bundled into every delivery.
|
|
539
|
+
|
|
540
|
+
**The SILENT failure mode (documented, not "solved").** No repo-side code can make GitHub
|
|
541
|
+
run `pull_request` workflows on a conflicted PR — that is platform behavior. Per-session
|
|
542
|
+
paths remove the STRUCTURAL cause (the shared-path conflict) for agent-vs-agent delivery
|
|
543
|
+
contention, which is the overwhelming majority of the incidents. The residual — a PR that
|
|
544
|
+
goes DIRTY for some OTHER reason (a genuine same-file edit conflict with `main`) still gets
|
|
545
|
+
no CI silently — is addressed by making the failure mode LOUD where we can: the deliver
|
|
546
|
+
skill now documents the DIRTY→no-CI symptom and its diagnosis (`gh pr view --json
|
|
547
|
+
mergeStateStatus`), and `discoverBundle()` emits a grep-stable `#379: examined N delivery
|
|
548
|
+
candidate(s) … none attests this change …` concurrency hint so the next agent can tell a
|
|
549
|
+
per-session collision apart from a plain stale/absent bundle. #335's detectability half
|
|
550
|
+
(treating `mergeStateStatus=DIRTY` as a first-class steering/doctor input) remains open and
|
|
551
|
+
is explicitly NOT claimed closed here.
|
|
552
|
+
|
|
553
|
+
**Security: the forgery surface moved with the write path.** `scripts/hooks/config-protection.js`
|
|
554
|
+
(and its `context/` mirror) protected only the flat `delivery/trust.bundle` /
|
|
555
|
+
`delivery/trust.checkpoint.json` from direct agent Write/Edit/cp/redirect. Its three
|
|
556
|
+
delivery regexes now carry an optional `(?:[^/]+\/)?` segment so `delivery/<slug>/trust.*`
|
|
557
|
+
is equally blocked — otherwise moving the write path would have opened a hand-forgery hole
|
|
558
|
+
one directory down. Regression-locked by `test_gate_lockdown.sh` AC1.26b/c/d. The
|
|
559
|
+
`delivery/*` gitignore already covers per-session dirs (they are force-added deliberately per
|
|
560
|
+
delivery exactly like the flat path).
|
|
561
|
+
|
|
562
|
+
**Residuals (honest):** (1) the DIRTY→no-CI platform behavior for non-per-session conflicts
|
|
563
|
+
is documented, not eliminated (above). (2) The per-session dir name is derived from the
|
|
564
|
+
local session slug; a colliding slug across two sessions would re-share a path — acceptable
|
|
565
|
+
because ownership is still decided by commit ancestry (a stale same-named sibling is ignored,
|
|
566
|
+
not trusted), and slugs are session-unique in practice. (3) Selection correctness does NOT
|
|
567
|
+
depend on merge strategy: prefer-newest resolves the owning candidate for both squash-merge
|
|
568
|
+
(inherited seals are non-ancestors, trivially not-owning) and merge-commit (inherited seals
|
|
569
|
+
can be ancestors, but attest an OLDER commit than this session's, so they lose on recency)
|
|
570
|
+
histories — the merge-commit case was the concrete defect that forced prefer-newest and is
|
|
571
|
+
regression-locked by `test_trust_reconcile_negatives.sh` §8d against a real git repo. (4) The
|
|
572
|
+
flat legacy seals still on `main` are retained by design (see cleanup policy above) and remain
|
|
573
|
+
until a dedicated one-time cleanup PR; they are harmless (prefer-newest) but do accumulate as a
|
|
574
|
+
single fixed path, not a growth vector. This addendum changes WHERE seals live and HOW the
|
|
575
|
+
owning one is chosen; it does not touch Step 1 (fresh verify), the DECLARED exemption path, or
|
|
576
|
+
any fail-closed verdict — all of which are regression-locked unchanged.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ADR Directory (Frozen)
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Architecture Decision Records — FROZEN
|
|
6
|
+
|
|
7
|
+
**This directory is frozen immutable history. Do not add ADR 0023, and do not
|
|
8
|
+
edit the numbered ADRs here** (each carries a `FROZEN — immutable history.`
|
|
9
|
+
banner). The numbered `docs/adr/NNNN-*.md` files are preserved as provenance for
|
|
10
|
+
the decisions that shaped Flow Agents; their subjects have been carried forward
|
|
11
|
+
into the topic-keyed decision registry.
|
|
12
|
+
|
|
13
|
+
See [`index.md`](./index.md) for the generated list of frozen ADRs.
|
|
14
|
+
|
|
15
|
+
## Where decisions live now
|
|
16
|
+
|
|
17
|
+
New and superseding decisions are recorded as **topic-keyed living decision
|
|
18
|
+
records** under [`docs/decisions/`](../decisions/index.md), one file per decision
|
|
19
|
+
**subject** (a noun from the `CONTEXT.md` glossary), never as a new numbered ADR.
|
|
20
|
+
|
|
21
|
+
- Contract: [`context/contracts/decision-registry-contract.md`](../../context/contracts/decision-registry-contract.md)
|
|
22
|
+
— the normative rules for topic slugs, frontmatter, evidence, and supersession.
|
|
23
|
+
- Frontmatter schema: `schemas/decision-record.schema.json`.
|
|
24
|
+
- Validate + regenerate the index: `npm run check:decisions` /
|
|
25
|
+
`npm run gen:decisions-index`.
|
|
26
|
+
- Glossary: [`../decisions/decision-records.md`](../decisions/decision-records.md)
|
|
27
|
+
explains the registry model; `CONTEXT.md`'s **Decision Records** / **Decision
|
|
28
|
+
Registry** terms are the vocabulary.
|
|
29
|
+
|
|
30
|
+
## How to record a decision
|
|
31
|
+
|
|
32
|
+
1. Consult [`../decisions/index.md`](../decisions/index.md) to decide
|
|
33
|
+
**revise-vs-create**: if the subject already has a topic file, edit it
|
|
34
|
+
(supersession is an edit); otherwise create `docs/decisions/<subject-slug>.md`
|
|
35
|
+
using a subject noun from `CONTEXT.md` (add the term first if absent).
|
|
36
|
+
2. Fill the frontmatter (`status`, `subject`, `decided`, `evidence[]`) per the
|
|
37
|
+
registry contract, then run `npm run gen:decisions-index` and
|
|
38
|
+
`npm run check:decisions`.
|
|
39
|
+
3. Each frozen ADR whose subject you are ratifying is already linked from its
|
|
40
|
+
`needs-decision` stub's `evidence[]`; flip that stub's `status` to `current`
|
|
41
|
+
and add rationale rather than starting a new file.
|
|
42
|
+
|
|
43
|
+
Agent **probes** (`design-probe`, `pickup-probe`) author decision records
|
|
44
|
+
directly per
|
|
45
|
+
[`context/contracts/probe-docs-write-contract.md`](../../context/contracts/probe-docs-write-contract.md)
|
|
46
|
+
(issue [#311](https://github.com/kontourai/flow-agents/issues/311)): each
|
|
47
|
+
crystallized understanding emits a `CONTEXT.md` vocabulary delta, a
|
|
48
|
+
`docs/decisions/<slug>.md` decision delta (revise-vs-create against the index),
|
|
49
|
+
and a transcript-provenance link back to the Probe's session artifact.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ADR Index
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# ADR Index
|
|
6
|
+
|
|
7
|
+
Generated by `node scripts/freeze-adrs.mjs` (`npm run freeze:adrs`). Do not edit by hand.
|
|
8
|
+
Numbered ADRs below are FROZEN immutable history (see the banner on each file). Current and superseding decisions live in [docs/decisions/](../decisions/index.md); a frozen ADR's subject is carried forward there as a `needs-decision` stub or a ratified decision.
|
|
9
|
+
|
|
10
|
+
| Number | Title | Date | Link |
|
|
11
|
+
| --- | --- | --- | --- |
|
|
12
|
+
| 0001 | Flow Agents Consumes Flow For Workflow Enforcement | 2026-05-24 | [0001-flow-agents-consumes-flow.md](./0001-flow-agents-consumes-flow.md) |
|
|
13
|
+
| 0002 | Flow Kits As The Extension Unit | unknown | [0002-flow-kits-as-extension-unit.md](./0002-flow-kits-as-extension-unit.md) |
|
|
14
|
+
| 0003 | Flow Agents Coordinates Kits And Adapters | unknown | [0003-flow-agents-coordinates-kits-and-adapters.md](./0003-flow-agents-coordinates-kits-and-adapters.md) |
|
|
15
|
+
| 0004 | Gates Expect Hachure Trust Bundles | 2026-06-26 | [0004-gates-expect-surface-claims.md](./0004-gates-expect-surface-claims.md) |
|
|
16
|
+
| 0005 | Kubernetes-Inspired Kontour Resource Contracts | 2026-05-27 | [0005-kubernetes-inspired-resource-contracts.md](./0005-kubernetes-inspired-resource-contracts.md) |
|
|
17
|
+
| 0006 | TypeScript-First Source Policy | 2026-05-31 | [0006-typescript-first-source-policy.md](./0006-typescript-first-source-policy.md) |
|
|
18
|
+
| 0007 | Flow / Skill / Kit / Tool Boundary | 2026-06-15 | [0007-flow-skill-kit-tool-boundary.md](./0007-flow-skill-kit-tool-boundary.md) |
|
|
19
|
+
| 0007 | Skill Audit: Flow / Skill / Kit / Tool Boundary | 2026-06-15 | [0007-skill-audit.md](./0007-skill-audit.md) |
|
|
20
|
+
| 0008 | Kit Operation Boundary | 2026-06-15 | [0008-kit-operation-boundary.md](./0008-kit-operation-boundary.md) |
|
|
21
|
+
| 0009 | Canonical Hook Core/Kit Boundary | 2026-06-23 | [0009-canonical-hook-core-kit-boundary.md](./0009-canonical-hook-core-kit-boundary.md) |
|
|
22
|
+
| 0010 | Workflow Trust State as a Hachure Trust Bundle | 2026-06-23 | [0010-workflow-trust-state-as-hachure-bundle.md](./0010-workflow-trust-state-as-hachure-bundle.md) |
|
|
23
|
+
| 0011 | MCP Posture | 2026-06-24 | [0011-mcp-posture.md](./0011-mcp-posture.md) |
|
|
24
|
+
| 0012 | Agent Coordination as Hachure Liveness Claims | 2026-06-24 | [0012-agent-coordination-as-liveness-claims.md](./0012-agent-coordination-as-liveness-claims.md) |
|
|
25
|
+
| 0013 | Context Lifecycle | 2026-06-25 | [0013-context-lifecycle.md](./0013-context-lifecycle.md) |
|
|
26
|
+
| 0014 | Flow Agents core vs domain kits | 2026-06-25 | [0014-core-vs-domain-kit-boundary.md](./0014-core-vs-domain-kit-boundary.md) |
|
|
27
|
+
| 0015 | Flow / Flow Agents Boundary Reconciliation | 2026-06-25 | [0015-flow-flow-agents-boundary-reconciliation.md](./0015-flow-flow-agents-boundary-reconciliation.md) |
|
|
28
|
+
| 0016 | The Three-Hard-Boundary Model — a FlowDefinition-Driven, Kit-Agnostic Core | 2026-06-26 | [0016-three-hard-boundary-model.md](./0016-three-hard-boundary-model.md) |
|
|
29
|
+
| 0017 | The Anti-Gaming Trust Security Model — Layered Defense + External CI Anchor | unknown | [0017-anti-gaming-trust-security-model.md](./0017-anti-gaming-trust-security-model.md) |
|
|
30
|
+
| 0018 | Freeze the Local Shell-Parsing Heuristics; Route New Enforcement to the CI Anchor | unknown | [0018-freeze-local-shell-heuristics.md](./0018-freeze-local-shell-heuristics.md) |
|
|
31
|
+
| 0019 | Kit Dependency Ownership | 2026-07-01 | [0019-kit-dependency-ownership.md](./0019-kit-dependency-ownership.md) |
|
|
32
|
+
| 0020 | Trust-Reconcile Manifest, Claim Classification, and Waivers | unknown | [0020-trust-reconcile-manifest-and-claim-classification.md](./0020-trust-reconcile-manifest-and-claim-classification.md) |
|
|
33
|
+
| 0021 | Assignment Leases and Stale-Claim Takeover | 2026-07-02 | [0021-assignment-leases-and-stale-claim-takeover.md](./0021-assignment-leases-and-stale-claim-takeover.md) |
|
|
34
|
+
| 0022 | Fail-Closed Delivery Reconciliation with Governed Exemptions | 2026-07-02 | [0022-fail-closed-delivery-reconciliation-with-governed-exemptions.md](./0022-fail-closed-delivery-reconciliation-with-governed-exemptions.md) |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Agent coordination
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0012-agent-coordination-as-liveness-claims.md
|
|
8
|
+
- kind: adr
|
|
9
|
+
ref: docs/adr/0021-assignment-leases-and-stale-claim-takeover.md
|
|
10
|
+
---
|
|
11
|
+
# Agent coordination
|
|
12
|
+
|
|
13
|
+
This subject has provenance in frozen ADR history ([0012-agent-coordination-as-liveness-claims.md](../adr/0012-agent-coordination-as-liveness-claims.md), [0021-assignment-leases-and-stale-claim-takeover.md](../adr/0021-assignment-leases-and-stale-claim-takeover.md)) but no living
|
|
14
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
15
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
16
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
17
|
+
|
|
18
|
+
When a living decision is ratified for agent coordination, update this
|
|
19
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
20
|
+
links as provenance for the history that led here.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Anti-gaming trust security
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0017-anti-gaming-trust-security-model.md
|
|
8
|
+
- kind: adr
|
|
9
|
+
ref: docs/adr/0018-freeze-local-shell-heuristics.md
|
|
10
|
+
---
|
|
11
|
+
# Anti-gaming trust security
|
|
12
|
+
|
|
13
|
+
This subject has provenance in frozen ADR history ([0017-anti-gaming-trust-security-model.md](../adr/0017-anti-gaming-trust-security-model.md), [0018-freeze-local-shell-heuristics.md](../adr/0018-freeze-local-shell-heuristics.md)) but no living
|
|
14
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
15
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
16
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
17
|
+
|
|
18
|
+
When a living decision is ratified for Anti-gaming trust security, update this
|
|
19
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
20
|
+
links as provenance for the history that led here.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Context lifecycle
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0013-context-lifecycle.md
|
|
8
|
+
---
|
|
9
|
+
# Context lifecycle
|
|
10
|
+
|
|
11
|
+
This subject has provenance in frozen ADR history ([0013-context-lifecycle.md](../adr/0013-context-lifecycle.md)) but no living
|
|
12
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
13
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
14
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
15
|
+
|
|
16
|
+
When a living decision is ratified for context lifecycle, update this
|
|
17
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
18
|
+
links as provenance for the history that led here.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Core vs domain kit boundary
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0014-core-vs-domain-kit-boundary.md
|
|
8
|
+
---
|
|
9
|
+
# Core vs domain kit boundary
|
|
10
|
+
|
|
11
|
+
This subject has provenance in frozen ADR history ([0014-core-vs-domain-kit-boundary.md](../adr/0014-core-vs-domain-kit-boundary.md)) but no living
|
|
12
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
13
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
14
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
15
|
+
|
|
16
|
+
When a living decision is ratified for core vs domain kit boundary, update this
|
|
17
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
18
|
+
links as provenance for the history that led here.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Flow / Flow Agents boundary
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0015-flow-flow-agents-boundary-reconciliation.md
|
|
8
|
+
---
|
|
9
|
+
# Flow / Flow Agents boundary
|
|
10
|
+
|
|
11
|
+
This subject has provenance in frozen ADR history ([0015-flow-flow-agents-boundary-reconciliation.md](../adr/0015-flow-flow-agents-boundary-reconciliation.md)) but no living
|
|
12
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
13
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
14
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
15
|
+
|
|
16
|
+
When a living decision is ratified for flow / flow agents boundary, update this
|
|
17
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
18
|
+
links as provenance for the history that led here.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Flow Kit
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0002-flow-kits-as-extension-unit.md
|
|
8
|
+
- kind: adr
|
|
9
|
+
ref: docs/adr/0003-flow-agents-coordinates-kits-and-adapters.md
|
|
10
|
+
---
|
|
11
|
+
# Flow Kit
|
|
12
|
+
|
|
13
|
+
This subject has provenance in frozen ADR history ([0002-flow-kits-as-extension-unit.md](../adr/0002-flow-kits-as-extension-unit.md), [0003-flow-agents-coordinates-kits-and-adapters.md](../adr/0003-flow-agents-coordinates-kits-and-adapters.md)) but no living
|
|
14
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
15
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
16
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
17
|
+
|
|
18
|
+
When a living decision is ratified for flow kit, update this
|
|
19
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
20
|
+
links as provenance for the history that led here.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Flow / Skill / Kit / Tool boundary
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0007-flow-skill-kit-tool-boundary.md
|
|
8
|
+
- kind: adr
|
|
9
|
+
ref: docs/adr/0007-skill-audit.md
|
|
10
|
+
---
|
|
11
|
+
# Flow / Skill / Kit / Tool boundary
|
|
12
|
+
|
|
13
|
+
This subject has provenance in frozen ADR history ([0007-flow-skill-kit-tool-boundary.md](../adr/0007-flow-skill-kit-tool-boundary.md), [0007-skill-audit.md](../adr/0007-skill-audit.md)) but no living
|
|
14
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
15
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
16
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
17
|
+
|
|
18
|
+
When a living decision is ratified for flow / skill / kit / tool boundary, update this
|
|
19
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
20
|
+
links as provenance for the history that led here.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: current
|
|
3
|
+
subject: Graph knowledge provider
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: issue
|
|
7
|
+
ref: https://github.com/kontourai/flow-agents/issues/327
|
|
8
|
+
- kind: doc
|
|
9
|
+
ref: docs/spikes/graph-provider-2026-07.md
|
|
10
|
+
- kind: doc
|
|
11
|
+
ref: context/contracts/knowledge-store-contract.md
|
|
12
|
+
- kind: adr
|
|
13
|
+
ref: docs/decisions/knowledge-store-provider.md
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Graph knowledge provider
|
|
17
|
+
|
|
18
|
+
The Knowledge Kit ships a `neo4j` knowledge-store provider: a real, queryable
|
|
19
|
+
graph implementation of the #317 read interface, synced from the file/work-item
|
|
20
|
+
providers. It is the OWNER'S OPT-IN personal default — the file providers remain
|
|
21
|
+
the portfolio default. This decision explicitly overrides the #318 spike's
|
|
22
|
+
defer-as-default verdict at the owner's request ("I still want the graph
|
|
23
|
+
implementation even if it's not the default — it can be my default").
|
|
24
|
+
|
|
25
|
+
## Decision
|
|
26
|
+
|
|
27
|
+
- **Engine: Neo4j Community 5 over Docker.** The #318 spike compared Neo4j and
|
|
28
|
+
Kuzu; Kuzu was abandoned upstream (Oct 2025, repo archived), so Neo4j — actively
|
|
29
|
+
maintained, with the Browser for human exploration and the portable Cypher
|
|
30
|
+
baseline — is the engine when a graph is used. Kuzu, Aura/hosted, and
|
|
31
|
+
graph-as-primary-storage are non-goals.
|
|
32
|
+
- **The graph is a materialized VIEW, never an authority.** File stores stay the
|
|
33
|
+
source of truth. A `sync` command reuses the #317 providers as READERS (no
|
|
34
|
+
forked extractors) and MERGEs their combined graph into Neo4j idempotently
|
|
35
|
+
(content-keyed hash guard: a re-sync of unchanged stores reports zero writes),
|
|
36
|
+
recording a snapshot digest + timestamp. The write side is proposals-only, like
|
|
37
|
+
every other provider — the graph never bypasses the human-curated stores.
|
|
38
|
+
- **Connection by reference, never hardcoded.** Credentials resolve from
|
|
39
|
+
`NEO4J_URI` / `NEO4J_USER` / `NEO4J_PASSWORD` (this repo does not consume
|
|
40
|
+
`@kontourai/datum` yet, so we follow the existing env-reference precedent; a
|
|
41
|
+
future datum adoption resolves the same three names without touching call
|
|
42
|
+
sites).
|
|
43
|
+
- **Cypher-backed query/health verbs when selected.** The five canonical spike
|
|
44
|
+
queries (transitive blocker closure, contradiction candidates, node-type-aware
|
|
45
|
+
orphans, duplicate candidates WITH 5-char stemming, shortest path) run as live
|
|
46
|
+
Cypher when a Neo4j is reachable and fall back to a portable JS spelling
|
|
47
|
+
(same answers) otherwise. The stemming lesson is preserved: exact title tokens
|
|
48
|
+
missed the traverse#14~#8 duplicate; stemming catches it.
|
|
49
|
+
- **Never a hard dependency.** `neo4j-driver` is an optionalDependency, lazily
|
|
50
|
+
imported. A missing driver OR an unreachable server degrades to the file
|
|
51
|
+
providers with a single clear message. CI has no Neo4j: unit tests + the
|
|
52
|
+
conformance suite run against an injected fake driver; the live integration
|
|
53
|
+
test is gated on `NEO4J_URI` (or a detected Docker Neo4j) and skips loudly.
|
|
54
|
+
- **Selection is config-driven, default file.** `KNOWLEDGE_PROVIDER=neo4j`
|
|
55
|
+
(repo/user-level) opts in; anything else stays on the file providers. See the
|
|
56
|
+
README "Graph provider (opt-in)" section for the owner path.
|
|
57
|
+
|
|
58
|
+
## Consequences
|
|
59
|
+
|
|
60
|
+
The one-off spike wins (a missing blocker edge, ADR-0007 contradiction, the
|
|
61
|
+
near-duplicate canary trio) become a standing capability without forcing graph
|
|
62
|
+
ops on any repo or workflow that does not opt in. The provider passes the same
|
|
63
|
+
#317 conformance suite as the file providers on its read side.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Hook core/kit boundary
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0009-canonical-hook-core-kit-boundary.md
|
|
8
|
+
---
|
|
9
|
+
# Hook core/kit boundary
|
|
10
|
+
|
|
11
|
+
This subject has provenance in frozen ADR history ([0009-canonical-hook-core-kit-boundary.md](../adr/0009-canonical-hook-core-kit-boundary.md)) but no living
|
|
12
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
13
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
14
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
15
|
+
|
|
16
|
+
When a living decision is ratified for hook core/kit boundary, update this
|
|
17
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
18
|
+
links as provenance for the history that led here.
|
package/docs/decisions/index.md
CHANGED
|
@@ -10,8 +10,27 @@ Numbered ADRs under `docs/adr/` are frozen history and are not listed here.
|
|
|
10
10
|
|
|
11
11
|
| Topic | Status | Decision |
|
|
12
12
|
| --- | --- | --- |
|
|
13
|
+
| [agent-coordination](./agent-coordination.md) | needs-decision | Agent coordination |
|
|
14
|
+
| [anti-gaming-trust-security](./anti-gaming-trust-security.md) | needs-decision | Anti-gaming trust security |
|
|
15
|
+
| [context-lifecycle](./context-lifecycle.md) | needs-decision | Context lifecycle |
|
|
16
|
+
| [core-domain-kit-boundary](./core-domain-kit-boundary.md) | needs-decision | Core vs domain kit boundary |
|
|
13
17
|
| [decision-records](./decision-records.md) | current | Decision records |
|
|
18
|
+
| [flow-flow-agents-boundary](./flow-flow-agents-boundary.md) | needs-decision | Flow / Flow Agents boundary |
|
|
19
|
+
| [flow-kit](./flow-kit.md) | needs-decision | Flow Kit |
|
|
20
|
+
| [flow-skill-kit-tool-boundary](./flow-skill-kit-tool-boundary.md) | needs-decision | Flow / Skill / Kit / Tool boundary |
|
|
21
|
+
| [graph-knowledge-provider](./graph-knowledge-provider.md) | current | Graph knowledge provider |
|
|
22
|
+
| [hook-core-kit-boundary](./hook-core-kit-boundary.md) | needs-decision | Hook core/kit boundary |
|
|
23
|
+
| [kit-dependency-ownership](./kit-dependency-ownership.md) | needs-decision | Kit dependency ownership |
|
|
24
|
+
| [kit-operation-boundary](./kit-operation-boundary.md) | needs-decision | Kit operation boundary |
|
|
25
|
+
| [knowledge-promote-sub-flow](./knowledge-promote-sub-flow.md) | current | Knowledge promote sub-flow |
|
|
14
26
|
| [knowledge-store-provider](./knowledge-store-provider.md) | current | Knowledge store provider |
|
|
27
|
+
| [kontour-resource-contract](./kontour-resource-contract.md) | needs-decision | Kontour Resource Contract |
|
|
28
|
+
| [mcp-posture](./mcp-posture.md) | needs-decision | MCP posture |
|
|
15
29
|
| [model-routing](./model-routing.md) | current | Model routing |
|
|
16
30
|
| [promotion-gate](./promotion-gate.md) | current | Promotion gate |
|
|
17
31
|
| [standing-directives](./standing-directives.md) | current | Standing directives |
|
|
32
|
+
| [three-hard-boundary-model](./three-hard-boundary-model.md) | needs-decision | Three-hard-boundary model |
|
|
33
|
+
| [trust-reconcile](./trust-reconcile.md) | needs-decision | Trust-reconcile and delivery reconciliation |
|
|
34
|
+
| [typescript-source-policy](./typescript-source-policy.md) | current | TypeScript-first source policy |
|
|
35
|
+
| [workflow-enforcement](./workflow-enforcement.md) | needs-decision | Workflow Enforcement |
|
|
36
|
+
| [workflow-trust-state](./workflow-trust-state.md) | needs-decision | Workflow trust state |
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Kit dependency ownership
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0019-kit-dependency-ownership.md
|
|
8
|
+
---
|
|
9
|
+
# Kit dependency ownership
|
|
10
|
+
|
|
11
|
+
This subject has provenance in frozen ADR history ([0019-kit-dependency-ownership.md](../adr/0019-kit-dependency-ownership.md)) but no living
|
|
12
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
13
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
14
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
15
|
+
|
|
16
|
+
When a living decision is ratified for kit dependency ownership, update this
|
|
17
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
18
|
+
links as provenance for the history that led here.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Kit operation boundary
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0008-kit-operation-boundary.md
|
|
8
|
+
---
|
|
9
|
+
# Kit operation boundary
|
|
10
|
+
|
|
11
|
+
This subject has provenance in frozen ADR history ([0008-kit-operation-boundary.md](../adr/0008-kit-operation-boundary.md)) but no living
|
|
12
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
13
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
14
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
15
|
+
|
|
16
|
+
When a living decision is ratified for kit operation boundary, update this
|
|
17
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
18
|
+
links as provenance for the history that led here.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: current
|
|
3
|
+
subject: Knowledge promote sub-flow
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: issue
|
|
7
|
+
ref: https://github.com/kontourai/flow-agents/issues/313
|
|
8
|
+
- kind: doc
|
|
9
|
+
ref: context/contracts/knowledge-store-contract.md
|
|
10
|
+
- kind: doc
|
|
11
|
+
ref: context/contracts/decision-registry-contract.md
|
|
12
|
+
- kind: session-archive
|
|
13
|
+
ref: .kontourai/flow-agents/decision-registry-shape/decision-registry-shape--idea-to-backlog.md
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Knowledge promote sub-flow
|
|
17
|
+
|
|
18
|
+
Session promotion runs through a Knowledge Kit FlowDefinition
|
|
19
|
+
(`kits/knowledge/flows/promote.flow.json`, id `knowledge.promote`) with four
|
|
20
|
+
steps — **ingest → distill → link → health** — so promotion quality stops
|
|
21
|
+
depending on which agent did it. This is the first codebase-facing Knowledge Kit
|
|
22
|
+
flow and the first "flow within a flow".
|
|
23
|
+
|
|
24
|
+
## Decision
|
|
25
|
+
|
|
26
|
+
- **Four steps.** *ingest* reads a completed session dir (read-only) for its
|
|
27
|
+
plan/evidence/critique/learnings/transcripts; *distill* produces DRAFT deltas —
|
|
28
|
+
decision-registry topic files (validated against
|
|
29
|
+
`schemas/decision-record.schema.json` before proposing), CONTEXT.md vocabulary
|
|
30
|
+
additions, and `docs/learnings` entries; *link* attaches provenance (PR, merge
|
|
31
|
+
SHA, session-archive path, touched topics) as `evidence[]` refs; *health* runs
|
|
32
|
+
contradiction detection over the topic files.
|
|
33
|
+
- **Built on the #317 provider interface, not a forked reader.** Health reads the
|
|
34
|
+
registry through the git-repo knowledge-store provider and reuses the
|
|
35
|
+
provider-agnostic `duplicate-detection` verb: two topics with overlapping
|
|
36
|
+
subject nouns and divergent content are a contradiction. The report names BOTH
|
|
37
|
+
topics; a **merge-repair PROPOSAL** (schema-valid, `status: "proposed"`) names a
|
|
38
|
+
merge target. Merge-repair is a proposal, never an auto-edit.
|
|
39
|
+
- **Proposals-only (R4).** The sub-flow NEVER writes docs directly. Every output
|
|
40
|
+
lands under `<session>/proposals/`; the promote step's human/agent applies the
|
|
41
|
+
drafts it accepts. A filesystem diff during a run shows zero writes outside the
|
|
42
|
+
session/proposal dir.
|
|
43
|
+
- **Composition.** `knowledge.promote` is a true composable FlowDefinition — a
|
|
44
|
+
parent step can `uses_flow: "knowledge.promote"` and the resolver resolves its
|
|
45
|
+
gates (it `exports` every gate claim). It is invoked standalone AND from the
|
|
46
|
+
Builder promote step. The builder edge is a **documented composition** (the
|
|
47
|
+
deliver skill's promote step names it as the assisted path) rather than a nested
|
|
48
|
+
builder gate, because #312's `promote` CLI — not a flow gate — is the recording
|
|
49
|
+
mechanism, and the sub-flow's outputs are proposals a human/agent applies.
|
|
50
|
+
|
|
51
|
+
## Rationale
|
|
52
|
+
|
|
53
|
+
Knowledge Kit had the verbs (capture, compile, link, health) pointed at personal
|
|
54
|
+
knowledge; the codebase was the missing consumer. Promotion (once gated by #312)
|
|
55
|
+
still relied on ad-hoc judgement about WHAT to promote. Making the promote step
|
|
56
|
+
run a Knowledge Kit pipeline over the session artifacts gives the codebase its
|
|
57
|
+
knowledge use case as a composable sub-flow, while proposals-only discipline and
|
|
58
|
+
the shared #317 provider interface keep it from forking a second reader or writing
|
|
59
|
+
into a human-curated store.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Kontour Resource Contract
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0005-kubernetes-inspired-resource-contracts.md
|
|
8
|
+
---
|
|
9
|
+
# Kontour Resource Contract
|
|
10
|
+
|
|
11
|
+
This subject has provenance in frozen ADR history ([0005-kubernetes-inspired-resource-contracts.md](../adr/0005-kubernetes-inspired-resource-contracts.md)) but no living
|
|
12
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
13
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
14
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
15
|
+
|
|
16
|
+
When a living decision is ratified for kontour resource contract, update this
|
|
17
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
18
|
+
links as provenance for the history that led here.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: MCP posture
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0011-mcp-posture.md
|
|
8
|
+
---
|
|
9
|
+
# MCP posture
|
|
10
|
+
|
|
11
|
+
This subject has provenance in frozen ADR history ([0011-mcp-posture.md](../adr/0011-mcp-posture.md)) but no living
|
|
12
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
13
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
14
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
15
|
+
|
|
16
|
+
When a living decision is ratified for MCP posture, update this
|
|
17
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
18
|
+
links as provenance for the history that led here.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: needs-decision
|
|
3
|
+
subject: Three-hard-boundary model
|
|
4
|
+
decided: 2026-07-03
|
|
5
|
+
evidence:
|
|
6
|
+
- kind: adr
|
|
7
|
+
ref: docs/adr/0016-three-hard-boundary-model.md
|
|
8
|
+
---
|
|
9
|
+
# Three-hard-boundary model
|
|
10
|
+
|
|
11
|
+
This subject has provenance in frozen ADR history ([0016-three-hard-boundary-model.md](../adr/0016-three-hard-boundary-model.md)) but no living
|
|
12
|
+
decision has been ratified yet under the topic-keyed decision registry
|
|
13
|
+
(`context/contracts/decision-registry-contract.md`). This stub records that the
|
|
14
|
+
subject is open and links the frozen ADR(s) as provenance; it is not a decision.
|
|
15
|
+
|
|
16
|
+
When a living decision is ratified for Three-hard-boundary model, update this
|
|
17
|
+
file's `status` to `current`, add rationale, and keep the `adr` evidence
|
|
18
|
+
links as provenance for the history that led here.
|