@kontourai/flow-agents 2.4.0 → 3.1.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/CODEOWNERS +8 -0
- package/.github/workflows/ci.yml +20 -0
- package/.github/workflows/trust-reconcile.yml +62 -4
- package/CHANGELOG.md +38 -0
- package/CONTEXT.md +88 -1
- package/README.md +4 -0
- package/build/src/cli/assignment-provider.d.ts +144 -0
- package/build/src/cli/assignment-provider.js +805 -0
- package/build/src/cli/effective-assignment-provider-settings.d.ts +1 -0
- package/build/src/cli/effective-assignment-provider-settings.js +125 -0
- package/build/src/cli/validate-workflow-artifacts.js +5 -1
- package/build/src/cli/workflow-sidecar.d.ts +2 -2
- package/build/src/cli/workflow-sidecar.js +549 -145
- package/build/src/cli.js +6 -0
- 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 -0
- package/context/contracts/artifact-contract.md +2 -0
- package/context/contracts/assignment-provider-contract.md +248 -0
- package/context/contracts/builder-kit-workflow-state-contract.md +2 -0
- package/context/contracts/decision-registry-contract.md +2 -0
- package/context/contracts/delivery-contract.md +2 -0
- package/context/contracts/execution-contract.md +25 -0
- package/context/contracts/governance-adapter-contract.md +2 -0
- package/context/contracts/knowledge-store-contract.md +197 -0
- package/context/contracts/planning-contract.md +2 -0
- package/context/contracts/probe-docs-write-contract.md +187 -0
- package/context/contracts/review-contract.md +2 -0
- package/context/contracts/sandbox-policy.md +2 -0
- package/context/contracts/standing-directives.md +13 -0
- package/context/contracts/verification-contract.md +2 -0
- package/context/contracts/work-item-contract.md +2 -0
- package/context/scripts/hooks/config-protection.js +14 -1
- package/context/scripts/hooks/lib/config-protection-remedies.js +9 -0
- package/context/scripts/hooks/stop-goal-fit.js +4 -2
- package/context/scripts/hooks/workflow-steering.js +42 -0
- package/context/settings/assignment-provider-settings.json +33 -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 +182 -0
- package/docs/adr/README.md +49 -0
- package/docs/adr/index.md +34 -0
- package/docs/context-map.md +1 -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 +22 -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/knowledge-store-provider.md +51 -0
- package/docs/decisions/kontour-resource-contract.md +18 -0
- package/docs/decisions/mcp-posture.md +18 -0
- package/docs/decisions/model-routing.md +63 -0
- package/docs/decisions/standing-directives.md +66 -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 -0
- package/docs/workflow-shared-contracts.md +2 -1
- package/docs/workflow-usage-guide.md +7 -1
- package/evals/ci/run-baseline.sh +10 -0
- package/evals/fixtures/assignment-provider/actor-a.json +6 -0
- package/evals/fixtures/assignment-provider/actor-b.json +6 -0
- package/evals/fixtures/assignment-provider/github-issue-claimed.json +27 -0
- package/evals/fixtures/assignment-provider/github-issue-unassigned.json +7 -0
- package/evals/fixtures/assignment-provider/hostile-effective-state.json +11 -0
- package/evals/fixtures/assignment-provider/liveness-fresh.json +9 -0
- package/evals/fixtures/assignment-provider/liveness-stale.json +9 -0
- package/evals/integration/test_assignment_provider_github.sh +318 -0
- package/evals/integration/test_assignment_provider_local_file.sh +222 -0
- package/evals/integration/test_critique_supersession_roundtrip.sh +182 -0
- 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_fixture_retirement_audit.sh +2 -2
- package/evals/integration/test_gate_lockdown.sh +10 -0
- package/evals/integration/test_publish_delivery.sh +21 -4
- package/evals/integration/test_pull_work_assignment_join.sh +132 -0
- package/evals/integration/test_pull_work_liveness_preflight.sh +20 -7
- package/evals/integration/test_reconcile_soundness.sh +33 -9
- package/evals/integration/test_trust_reconcile.sh +9 -8
- package/evals/integration/test_trust_reconcile_negatives.sh +608 -0
- package/evals/integration/test_workflow_sidecar_writer.sh +91 -3
- package/evals/run.sh +14 -0
- package/evals/static/test_flowdef_codeowners_coverage.sh +6 -0
- package/evals/static/test_knowledge_providers.sh +32 -0
- package/evals/static/test_workflow_skills.sh +15 -2
- package/kits/builder/skills/deliver/SKILL.md +36 -0
- package/kits/builder/skills/design-probe/SKILL.md +37 -0
- package/kits/builder/skills/pickup-probe/SKILL.md +4 -4
- package/kits/builder/skills/pull-work/SKILL.md +78 -10
- package/kits/knowledge/adapters/default-store/index.js +92 -4
- package/kits/knowledge/adapters/obsidian-store/index.js +69 -4
- package/kits/knowledge/adapters/shared/codec.js +141 -0
- package/kits/knowledge/docs/README.md +121 -2
- package/kits/knowledge/docs/store-contract.md +112 -4
- package/kits/knowledge/evals/contract-suite/suite.test.js +176 -0
- package/kits/knowledge/flows/promote.flow.json +84 -0
- package/kits/knowledge/kit.json +50 -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/fixtures/git-repo/CONTEXT.md +12 -0
- package/kits/knowledge/providers/conformance/fixtures/git-repo/docs/decisions/old-sprocket-shape.md +13 -0
- package/kits/knowledge/providers/conformance/fixtures/git-repo/docs/decisions/sprocket-shape.md +14 -0
- package/kits/knowledge/providers/conformance/fixtures/git-repo/docs/decisions/widget-format.md +14 -0
- package/kits/knowledge/providers/conformance/fixtures/git-repo/docs/learnings/fixture-learning.md +7 -0
- package/kits/knowledge/providers/conformance/fixtures/work-item/issues.json +30 -0
- package/kits/knowledge/providers/conformance/suite.test.js +143 -0
- package/kits/knowledge/providers/git-repo/index.js +236 -0
- package/kits/knowledge/providers/health/health-pass.test.js +99 -0
- package/kits/knowledge/providers/health/index.js +153 -0
- package/kits/knowledge/providers/index.js +25 -0
- package/kits/knowledge/providers/lib/model.js +91 -0
- package/kits/knowledge/providers/lib/schema-validate.js +119 -0
- package/kits/knowledge/providers/markdown-vault/index.js +169 -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/kits/knowledge/providers/work-item/index.js +204 -0
- package/package.json +7 -3
- package/schemas/assignment-provider-settings.schema.json +125 -0
- package/schemas/knowledge/edge.schema.json +54 -0
- package/schemas/knowledge/health-report.schema.json +45 -0
- package/schemas/knowledge/node.schema.json +49 -0
- package/schemas/knowledge/proposal.schema.json +53 -0
- package/scripts/README.md +1 -0
- package/scripts/ci/trust-reconcile.js +521 -24
- package/scripts/freeze-adrs.mjs +364 -0
- package/scripts/hooks/config-protection.js +14 -1
- 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 +4 -2
- package/scripts/hooks/workflow-steering.js +42 -0
- package/scripts/statusline/flow-agents-statusline.js +3 -1
- package/src/cli/assignment-provider.ts +927 -0
- package/src/cli/effective-assignment-provider-settings.ts +112 -0
- package/src/cli/validate-workflow-artifacts.ts +5 -1
- package/src/cli/workflow-sidecar.ts +577 -139
- package/src/cli.ts +6 -0
- package/src/lib/flow-resolver.ts +35 -14
- package/src/tools/validate-source-tree.ts +2 -0
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: ADR 0003: Flow Agents Coordinates Kits And Adapters
|
|
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 0003: Flow Agents Coordinates Kits And Adapters
|
|
6
8
|
|
|
7
9
|
Flow Agents will not own the builder, or knowledge workflows as core behavior. Those out-of-the-box behaviors will be extracted into normal Flow Kits that use the same manifest, Flow Definition, skill, doc, provider, and eval contracts as third-party kits. Flow Agents owns kit validation, installation, runtime adapter selection, provider wiring, status/control commands, and runtime-specific export; Runtime Adapters own target-specific integration for local agent runtimes and API/framework agents.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: ADR 0004: Gates Expect Hachure Trust Bundles
|
|
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 0004: Gates Expect Hachure Trust Bundles
|
|
6
8
|
|
|
7
9
|
Flow-backed kits will model rich gate evidence as claim expectations using the Hachure trust.bundle format rather than provider-specific requirements. A gate expectation can require `kind: "trust.bundle"`, a domain claim type such as `builder.verify.tests`, accepted trust statuses such as `verified`, and whether the expectation blocks the transition; project or runtime config maps claim types to trusted Surface producers and authority traces. This lets the Builder Kit use repo governance, command checks, CI, human decisions, or future producers without naming a specific provider in the Flow Definition.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: ADR 0005: Kubernetes-Inspired Kontour Resource Contracts
|
|
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 0005: Kubernetes-Inspired Kontour Resource Contracts
|
|
6
8
|
|
|
7
9
|
Date: 2026-05-27
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0007: Flow / Skill / Kit / Tool Boundary"
|
|
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 0007: Flow / Skill / Kit / Tool Boundary
|
|
6
8
|
|
|
7
9
|
**Date:** 2026-06-15
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "Skill Audit 2026-06-15: Flow / Skill / Kit / Tool Boundary"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
> **FROZEN — immutable history.** Superseding/current decisions live in [`docs/decisions/`](../decisions/index.md). Do not edit.
|
|
6
|
+
|
|
5
7
|
# Skill Audit: Flow / Skill / Kit / Tool Boundary
|
|
6
8
|
|
|
7
9
|
**Date:** 2026-06-15
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0010: Workflow Trust State as a Hachure Trust Bundle"
|
|
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 0010: Workflow Trust State as a Hachure Trust Bundle
|
|
6
8
|
|
|
7
9
|
**Date:** 2026-06-23
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0011: MCP Posture — Enforcement Stays Hooks; Surface Owns MCP Projection; No Auto-Injected Config"
|
|
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 0011: MCP Posture
|
|
6
8
|
|
|
7
9
|
**Date:** 2026-06-24
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0012: Agent Coordination as Hachure Liveness Claims"
|
|
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 0012: Agent Coordination as Hachure Liveness Claims
|
|
6
8
|
|
|
7
9
|
**Date:** 2026-06-24
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0013: Context Lifecycle — Workflow-Boundary Compaction, Freshness-Gated Reuse, and the Learning Split"
|
|
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 0013: Context Lifecycle
|
|
6
8
|
|
|
7
9
|
**Date:** 2026-06-25
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0014: Flow Agents core vs domain kits — the generic/kit boundary"
|
|
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 0014: Flow Agents core vs domain kits
|
|
6
8
|
|
|
7
9
|
**Date:** 2026-06-25
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0015: Flow / Flow Agents Boundary Reconciliation"
|
|
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 0015: Flow / Flow Agents Boundary Reconciliation
|
|
6
8
|
|
|
7
9
|
**Date:** 2026-06-25
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0016: The Three-Hard-Boundary Model — a FlowDefinition-Driven, Kit-Agnostic Core"
|
|
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 0016: The Three-Hard-Boundary Model — a FlowDefinition-Driven, Kit-Agnostic Core
|
|
6
8
|
|
|
7
9
|
**Date:** 2026-06-26
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0017: The Anti-Gaming Trust Security Model — Layered Defense + External CI Anchor"
|
|
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 0017: The Anti-Gaming Trust Security Model — Layered Defense + External CI Anchor
|
|
6
8
|
|
|
7
9
|
Status: Accepted
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0018: Freeze the Local Shell-Parsing Heuristics; Route New Enforcement to the CI Anchor"
|
|
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 0018: Freeze the Local Shell-Parsing Heuristics; Route New Enforcement to the CI Anchor
|
|
6
8
|
|
|
7
9
|
Status: Accepted
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0020: Trust-Reconcile Manifest, Claim Classification, and Waivers"
|
|
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 0020: Trust-Reconcile Manifest, Claim Classification, and Waivers
|
|
6
8
|
|
|
7
9
|
Status: Accepted
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
title: "ADR 0021: Assignment Leases and Stale-Claim Takeover"
|
|
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 0021: Assignment Leases and Stale-Claim Takeover
|
|
6
8
|
|
|
7
9
|
**Date:** 2026-07-02
|
|
@@ -98,7 +100,7 @@ Five touchpoints, one policy:
|
|
|
98
100
|
|---|---|---|
|
|
99
101
|
| `workflow-steering.js`, every turn | read | one-line liveness digest; "superseded" interrupt for the held subject |
|
|
100
102
|
| `pull-work` | read + write | exclude held; claim (liveness + provider) on selection |
|
|
101
|
-
| `ensure-session` / pickup | read + write | refuse entry to a session dir under a fresh other-actor claim; supersede-then-enter if stale |
|
|
103
|
+
| `ensure-session` / pickup | read + write | refuse entry to a session dir under a fresh other-actor claim; supersede-then-enter if stale (**implemented by #291**) |
|
|
102
104
|
| `advance-state` + tool activity | write | heartbeat rides existing writes; no bespoke timer |
|
|
103
105
|
| **publish (push / PR / merge)** | **read, blocking** | **verify-hold**: hard-stop if not the fresh, non-superseded holder |
|
|
104
106
|
|
|
@@ -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
|
|
@@ -281,3 +283,183 @@ ADR 0018 §Decision.
|
|
|
281
283
|
- #274 — the issue this ADR resolves; #269 — the first live capture-backed bundle publish
|
|
282
284
|
cited in Context; #265 — the last PR to merge before that (i.e. the boundary of "every PR
|
|
283
285
|
before #265 passed Trust Reconcile trivially via absence").
|
|
286
|
+
|
|
287
|
+
## Addendum (2026-07-03): compound `scope` (space-separated AND) — security-review hardening
|
|
288
|
+
|
|
289
|
+
A security review of the #300 implementation found that `ref:`/`branch-prefix:` scope
|
|
290
|
+
conditions match against `GITHUB_HEAD_REF` (or the `TRUST_RECONCILE_REF` override), and on a
|
|
291
|
+
**fork PR `GITHUB_HEAD_REF` is pusher-controlled** — any contributor who can open a PR can
|
|
292
|
+
name their branch to satisfy a `ref:`- or `branch-prefix:`-only scope. A `delivery/DECLARED`
|
|
293
|
+
entry written to exempt one specific bot (e.g. `ref:release-please--branches--main`) is
|
|
294
|
+
therefore satisfiable by anyone who pushes a branch with that exact name, not only by the
|
|
295
|
+
automation it names. `author:` (bound to the platform-set `GITHUB_ACTOR`, not attacker-chosen
|
|
296
|
+
in the same way) does not have this weakness alone, but a single `author:` condition cannot
|
|
297
|
+
express "and also narrow the blast radius to this branch pattern" — the two properties needed
|
|
298
|
+
combining, not substituting for each other.
|
|
299
|
+
|
|
300
|
+
**Decision:** `scope` may contain multiple space-separated conditions, each one of the four
|
|
301
|
+
forms specified in §2 (`ref:`, `commit:`/`commit:a..b`, `author:`, `branch-prefix:`); a
|
|
302
|
+
compound scope matches only if **every** condition matches (AND, not OR). A single-condition
|
|
303
|
+
scope is unchanged and remains valid (backward compatible — it is the N=1 case of the same
|
|
304
|
+
rule). Matching is still string equality/prefix only, per condition — no `RegExp` is
|
|
305
|
+
constructed from marker content in either the single- or compound-condition path. An
|
|
306
|
+
unrecognized-prefix condition anywhere in a compound scope makes the **whole** scope never
|
|
307
|
+
match, the same fail-closed behavior a malformed single-condition scope already had.
|
|
308
|
+
|
|
309
|
+
**`ref:`/`branch-prefix:` alone are insufficient for identity exemptions and MUST be combined
|
|
310
|
+
with `author:`.** Per the finding above, a scope meant to identify a specific bot/automation
|
|
311
|
+
actor (as opposed to a specific commit range or branch, where the identity question does not
|
|
312
|
+
arise) should not rely on `ref:`/`branch-prefix:` in isolation — combine it with `author:` so
|
|
313
|
+
the platform-set actor identity, not just a self-chosen branch name, has to match too. The
|
|
314
|
+
migration marker this ADR's Consequences named for release-please is updated accordingly:
|
|
315
|
+
|
|
316
|
+
```json
|
|
317
|
+
{
|
|
318
|
+
"scope": "author:github-actions[bot] branch-prefix:release-please--",
|
|
319
|
+
"reason": "release-please automation PR; no agent delivery involved",
|
|
320
|
+
"approved_by": "briananderson1222",
|
|
321
|
+
"declared_at": "<ISO timestamp>"
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
(`dependabot[bot]`'s entry, `author:dependabot[bot]`, was already a single `author:` condition
|
|
326
|
+
— security-review-confirmed sound as-is and left unchanged.)
|
|
327
|
+
|
|
328
|
+
**`/delivery/DECLARED` CODEOWNERS landed with #300/#301.** `.github/CODEOWNERS` now lists
|
|
329
|
+
`/delivery/DECLARED` under the same owner as `/scripts/ci/`, `/package.json`, and
|
|
330
|
+
`/evals/run.sh` (§2's original intent, made concrete); `evals/static/test_flowdef_codeowners_coverage.sh`
|
|
331
|
+
carries a regression-lock assertion for the entry. This closes the file-level half of #301;
|
|
332
|
+
server-side enforcement of CODEOWNERS review on `main` remains tracked separately (#225).
|
|
333
|
+
|
|
334
|
+
## Addendum (2026-07-03, part 2): bundle-ownership staleness check — "for THIS change"
|
|
335
|
+
|
|
336
|
+
Owner-approved follow-up to the compound-scope addendum above, closing a second gap the same
|
|
337
|
+
security review surfaced, this time against a **live incident**: PR #278 (the same open
|
|
338
|
+
dependabot PR cited in Baseline/Consequences) carries a `delivery/trust.checkpoint.json`
|
|
339
|
+
inherited byte-for-byte from `main` (dependabot never runs the deliver skill on its own
|
|
340
|
+
branch — the file only exists there because `main`'s tree already had it). Prior to this
|
|
341
|
+
addendum, `discoverBundle()` finding *any* file at `delivery/trust.bundle` or
|
|
342
|
+
`delivery/trust.checkpoint.json` — regardless of whether it says anything about the change
|
|
343
|
+
actually being reconciled — was sufficient to route into Step 2. A stale, inherited
|
|
344
|
+
checkpoint from a completely unrelated prior PR would therefore either (a) reconcile
|
|
345
|
+
against claims/evidence that have nothing to do with the current diff (if it were a full
|
|
346
|
+
`trust.bundle`), or (b), as in the checkpoint-only case, hit the existing
|
|
347
|
+
`checkpoint-bypass` divergence — **coincidentally fail-closed today only because a bare
|
|
348
|
+
checkpoint has no `evidence[]`/`claims[]` to reconcile**, not because the reconciler
|
|
349
|
+
recognized the file as stale. A future stale *full* `trust.bundle` (not just a checkpoint)
|
|
350
|
+
inherited the same way would not have that accidental protection.
|
|
351
|
+
|
|
352
|
+
**Decision:** "bundle-required" (ADR 0022 §1) means a bundle **for this change**, not any
|
|
353
|
+
bundle merely reachable at the checkout. `discoverBundle()`'s result is now checked against
|
|
354
|
+
a commit-identity binding before Step 2 is allowed to run against it:
|
|
355
|
+
|
|
356
|
+
- **Binding chosen:** `trust.checkpoint.json`'s `commit_sha` field (stamped by
|
|
357
|
+
`sealTrustCheckpoint()` in `src/cli/workflow-sidecar.ts` from `git rev-parse HEAD` at seal
|
|
358
|
+
time) — the strongest identity signal available today. `trust.bundle` itself carries no
|
|
359
|
+
commit/branch metadata (schema: `{schemaVersion, source, claims, evidence, policies,
|
|
360
|
+
events}` — confirmed by inspection), so when the auto-discovered file is `trust.bundle`,
|
|
361
|
+
the check falls through to its sibling `delivery/trust.checkpoint.json` (same
|
|
362
|
+
`resolveDeliveryCandidates()` seam; `publishDelivery()` always writes both together).
|
|
363
|
+
- **Match rule:** the bundle's `commit_sha` equals this change's own sha
|
|
364
|
+
(`TRUST_RECONCILE_SHA`/`GITHUB_SHA`), OR is a git-ancestor of it, via the same `git
|
|
365
|
+
merge-base --is-ancestor` primitive `commit:` scopes already use. Exact equality alone was
|
|
366
|
+
considered and rejected: `sealTrustCheckpoint()` necessarily stamps a commit that precedes
|
|
367
|
+
its own delivery commit (a checkpoint cannot contain its own future commit's sha), so
|
|
368
|
+
requiring exact equality would reject every legitimately fresh delivery, not just stale
|
|
369
|
+
ones. Ancestor-or-equal correctly accepts "sealed earlier in this same open PR's own
|
|
370
|
+
linear history" while — because this repo squash-merges PRs into `main` — correctly
|
|
371
|
+
rejecting a checkpoint inherited from `main`: a squash-merged commit's checkpoint records
|
|
372
|
+
the pre-squash feature-branch tip as `commit_sha`, which is provably **not** an ancestor of
|
|
373
|
+
any later branch (squash discards the original commit graph), so any checkpoint that ever
|
|
374
|
+
lands on `main` becomes permanently unmatchable by a later, unrelated branch — exactly the
|
|
375
|
+
PR #278 shape.
|
|
376
|
+
- **Fail closed on ambiguity:** no extractable `commit_sha` (missing from both the bundle and
|
|
377
|
+
its sibling checkpoint), or this change's own sha unresolvable — never treated as owned. A
|
|
378
|
+
stale/unowned bundle prints a loud, grep-stable line (`stale bundle ignored — attests
|
|
379
|
+
<theirs>, this change is <ours>`) and is then treated exactly as if `discoverBundle()` had
|
|
380
|
+
returned nothing: it falls through to `delivery/DECLARED` resolution.
|
|
381
|
+
- **Scope:** this check applies ONLY to **auto-discovered** bundles. An explicit
|
|
382
|
+
`--bundle`/`TRUST_RECONCILE_BUNDLE` remains untouched — it is a deliberate caller choice
|
|
383
|
+
(test fixtures, a programmatic caller passing a specific bundle), not something silently
|
|
384
|
+
picked up from committed git tree state, and the real `.github/workflows/trust-reconcile.yml`
|
|
385
|
+
never passes `--bundle`; it always relies on auto-discovery, which is exactly the path the
|
|
386
|
+
incident went through.
|
|
387
|
+
|
|
388
|
+
**Residual, honestly named:** this binding is still self-reported (the checkpoint's own
|
|
389
|
+
`commit_sha`, not a cryptographic commit signature) and still only as strong as
|
|
390
|
+
`sealTrustCheckpoint()`'s local `git rev-parse HEAD` call — an adversarial agent that
|
|
391
|
+
controls its own local git state before delivery could, in principle, stamp an arbitrary
|
|
392
|
+
sha. This does not reopen the PR #278 gap (a human/bot PR that never runs the deliver skill
|
|
393
|
+
at all still cannot forge a checkpoint it never writes), but it is not a full defense against
|
|
394
|
+
a fully agent-controlled delivery pipeline; that class of residual is the same
|
|
395
|
+
"trust-the-humans boundary" ADR 0017/0020 already name, not newly introduced here.
|
|
396
|
+
|
|
397
|
+
## Addendum (2026-07-03, part 3): CI-context contract for the staleness check
|
|
398
|
+
|
|
399
|
+
A re-review found a launch-blocking gap in the staleness check (Addendum part 2, above):
|
|
400
|
+
`isAncestorCommit()`'s `git merge-base --is-ancestor` call is only meaningful if the CI
|
|
401
|
+
checkout actually has the parent commit objects, and if the sha compared against is a
|
|
402
|
+
commit a checkpoint could plausibly have been sealed at. Neither held under
|
|
403
|
+
`.github/workflows/trust-reconcile.yml`'s prior configuration: the default
|
|
404
|
+
`actions/checkout` fetch depth is a **shallow clone (`fetch-depth: 1`)**, which has no
|
|
405
|
+
parent objects — `git merge-base` against a missing object exits 128, so the ancestor
|
|
406
|
+
check would be unresolvable for every real PR, not just stale ones, falsely staling
|
|
407
|
+
**every legitimately fresh delivery** on a required, admin-enforced check. Separately, on
|
|
408
|
+
a `pull_request` trigger `GITHUB_SHA` resolves to GitHub's synthetic merge commit
|
|
409
|
+
(`refs/pull/N/merge`), a commit that never existed at the time any real `seal-checkpoint`
|
|
410
|
+
run stamped `commit_sha` — so even a correctly-resolving ancestor check would compare
|
|
411
|
+
against the wrong target. Both are now fixed at the workflow layer, not by loosening the
|
|
412
|
+
reconciler's own fail-closed contract: the checkout step sets `fetch-depth: 0` (full
|
|
413
|
+
history), and the trust-reconcile step sets `TRUST_RECONCILE_SHA:
|
|
414
|
+
${{ github.event.pull_request.head.sha || github.sha }}` so the ownership comparison
|
|
415
|
+
always uses the PR's own head commit on a `pull_request` trigger (falling back to
|
|
416
|
+
`github.sha`, which is already correct, on `push`/`workflow_dispatch`). The checkout ref
|
|
417
|
+
itself is unchanged — Step 1 (fresh verify) runs against the same tree it always has;
|
|
418
|
+
only the identity used for the Step-2 ownership comparison changes. This is a narrow,
|
|
419
|
+
deliberate, owner-recorded functional amendment to the "workflow YAML: comments only"
|
|
420
|
+
scoping the original Wave 1 plan set for this file — an unavoidable consequence of
|
|
421
|
+
closing the HIGH finding, not scope creep. `scripts/ci/trust-reconcile.js`'s own contract
|
|
422
|
+
is unchanged and stays fail-closed either way: a shallow/missing-object condition still
|
|
423
|
+
resolves to "not an ancestor" (never silently accepted), so a misconfigured downstream
|
|
424
|
+
adopter that keeps the shallow default degrades safely (falsely stales real bundles,
|
|
425
|
+
loudly, with a diagnosable line) rather than unsafely (accepting a bundle it cannot
|
|
426
|
+
actually verify).
|
|
427
|
+
|
|
428
|
+
## Addendum (2026-07-03, part 4): event-scoped enforcement — gates gate PRs, not `main`
|
|
429
|
+
|
|
430
|
+
Final review found a second, more severe HIGH launch-blocker in the staleness check
|
|
431
|
+
(Addendum part 3, above): even with full-history checkout and correct sha binding, a
|
|
432
|
+
`push` run on `main` immediately after a squash-merge would still falsely stale the
|
|
433
|
+
just-merged, genuinely legitimate bundle — because `git merge --squash` (this repo's
|
|
434
|
+
merge strategy) discards the original commit graph, the resulting squash commit on `main`
|
|
435
|
+
has **no** git ancestry back to the feature-branch commit its checkpoint was sealed
|
|
436
|
+
against, by design, not by defect. Empirically reproduced with a synthetic squash pair.
|
|
437
|
+
Left unfixed, every delivery would fail the required Trust Reconcile check on `main`
|
|
438
|
+
immediately post-merge, and Phase 2 attestation minting (which runs only after Step 2
|
|
439
|
+
passes) would stop entirely — a regression far worse than the bug this whole ADR closes.
|
|
440
|
+
|
|
441
|
+
**Decision (reviewer option (a) — enforcement is event-scoped):** bundle-required
|
|
442
|
+
enforcement (§1's `bundle-required-no-declared-marker` fail-closed branch, and the
|
|
443
|
+
staleness-gate consequence of it, Addendum part 2) applies only when a run is **gating a
|
|
444
|
+
proposed change** — detected via `TRUST_RECONCILE_EVENT` (set from `github.event_name` by
|
|
445
|
+
the workflow), with a conservative default: an absent/unrecognized event value is treated
|
|
446
|
+
as gating (enforce), so every existing local/test caller and any misconfigured CI event
|
|
447
|
+
keeps today's stricter behavior. Only the literal value `push` is treated as a post-merge
|
|
448
|
+
run. On `push`, an absent or stale auto-discovered bundle is a loud, exit-0 no-op
|
|
449
|
+
(`push event: ... — skipping Step 2 (gating happened on the PR run)`) rather than a
|
|
450
|
+
failure or a `delivery/DECLARED` requirement — there is no "change" being gated on a push
|
|
451
|
+
to a protected branch (direct pushes are already excluded by branch protection; a push
|
|
452
|
+
run's own job is Step 1 fresh-verify, which is unaffected by this scoping and always
|
|
453
|
+
runs, plus Step 2 reconcile IF the bundle happens to still attest that exact commit,
|
|
454
|
+
forming the Phase 2 attestation basis). `pull_request` gating is completely unaffected —
|
|
455
|
+
the exact same squash-shape fixture used to prove the push no-op also proves the
|
|
456
|
+
identical shape still fails closed when `TRUST_RECONCILE_EVENT=pull_request`, confirming
|
|
457
|
+
this scoping narrows *when* enforcement applies, not *how strictly* it applies when it
|
|
458
|
+
does. Residual (HIGH, documented not solved): `TRUST_RECONCILE_EVENT`'s
|
|
459
|
+
source value (`github.event_name`) is authoritative GitHub Actions context, but the
|
|
460
|
+
workflow FILE that assigns it to the env var is itself PR-editable content on a
|
|
461
|
+
`pull_request` run — a PR could hardcode `TRUST_RECONCILE_EVENT: push` in its own copy of
|
|
462
|
+
the workflow to fake the post-merge no-op path; this is closed by required code-owner
|
|
463
|
+
review on `.github/workflows/trust-reconcile.yml` (#225, not yet server-side enforced),
|
|
464
|
+
the same residual class as every other self-asserted CI input this ADR already carries.
|
|
465
|
+
Step 1 (fresh verify) is unaffected by event scoping either way and always runs.
|
|
@@ -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) |
|
package/docs/context-map.md
CHANGED
|
@@ -51,6 +51,7 @@ Machine-readable workflow state lives beside Markdown artifacts in `.kontourai/f
|
|
|
51
51
|
|
|
52
52
|
| Schema | Title | ID |
|
|
53
53
|
| --- | --- | --- |
|
|
54
|
+
| assignment-provider-settings.schema.json | Flow Agents Assignment Provider Settings | https://flow-agents.dev/schemas/assignment-provider-settings.schema.json |
|
|
54
55
|
| backlog-provider-settings.schema.json | Flow Agents Backlog Provider Settings | https://flow-agents.dev/schemas/backlog-provider-settings.schema.json |
|
|
55
56
|
| decision-record.schema.json | Flow Agents Decision Record | https://flow-agents.dev/schemas/decision-record.schema.json |
|
|
56
57
|
| flow-agents-settings.schema.json | Flow Agents Settings | https://flow-agents.dev/schemas/flow-agents-settings.schema.json |
|
|
@@ -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.
|