mishkan-harness 0.2.6 → 0.2.7
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/README.md +49 -11
- package/bin/mishkan.js +562 -79
- package/docs/design/MISHKAN_decisions.md +398 -8
- package/docs/design/MISHKAN_observability.md +8 -8
- package/docs/engineer/profile-readable.md +201 -0
- package/docs/engineer/profile.md +754 -0
- package/docs/usage/01-installation.md +22 -8
- package/docs/usage/02-project-init.md +30 -13
- package/docs/usage/03-orchestration.md +46 -7
- package/docs/usage/04-memory-layer.md +135 -69
- package/docs/usage/06-llm-providers.md +2 -1
- package/docs/usage/07-troubleshooting.md +23 -0
- package/docs/usage/08-glossary.md +12 -3
- package/docs/usage/09-workflows.md +15 -3
- package/docs/usage/10-observability.md +3 -3
- package/docs/usage/11-graphify.md +38 -18
- package/docs/usage/12-cli.md +87 -0
- package/docs/usage/12-skill-discovery.md +11 -0
- package/docs/usage/README.md +35 -19
- package/package.json +1 -1
- package/payload/mishkan/AGENT_SPEC.md +3 -1
- package/payload/mishkan/agents/ahikam.md +3 -1
- package/payload/mishkan/agents/aholiab.md +3 -1
- package/payload/mishkan/agents/asaph.md +3 -1
- package/payload/mishkan/agents/baruch.md +8 -1
- package/payload/mishkan/agents/benaiah.md +3 -1
- package/payload/mishkan/agents/bezalel.md +3 -1
- package/payload/mishkan/agents/caleb.md +3 -1
- package/payload/mishkan/agents/deborah.md +3 -1
- package/payload/mishkan/agents/elasah.md +3 -1
- package/payload/mishkan/agents/eliashib.md +3 -1
- package/payload/mishkan/agents/ezra.md +3 -1
- package/payload/mishkan/agents/hanun.md +3 -1
- package/payload/mishkan/agents/hiram.md +3 -1
- package/payload/mishkan/agents/hizkiah.md +3 -1
- package/payload/mishkan/agents/huldah.md +3 -1
- package/payload/mishkan/agents/huram.md +3 -1
- package/payload/mishkan/agents/hushai.md +3 -1
- package/payload/mishkan/agents/igal.md +3 -1
- package/payload/mishkan/agents/ira.md +3 -1
- package/payload/mishkan/agents/jahaziel.md +3 -1
- package/payload/mishkan/agents/jakin.md +3 -1
- package/payload/mishkan/agents/jehonathan.md +3 -1
- package/payload/mishkan/agents/jehoshaphat.md +3 -1
- package/payload/mishkan/agents/joab.md +3 -1
- package/payload/mishkan/agents/joah.md +3 -1
- package/payload/mishkan/agents/maaseiah.md +3 -1
- package/payload/mishkan/agents/meremoth.md +3 -1
- package/payload/mishkan/agents/meshullam.md +3 -1
- package/payload/mishkan/agents/nathan.md +3 -1
- package/payload/mishkan/agents/nehemiah.md +3 -1
- package/payload/mishkan/agents/obed.md +3 -1
- package/payload/mishkan/agents/oholiab.md +3 -1
- package/payload/mishkan/agents/palal.md +3 -1
- package/payload/mishkan/agents/phinehas.md +3 -1
- package/payload/mishkan/agents/rehum.md +3 -1
- package/payload/mishkan/agents/salma.md +3 -1
- package/payload/mishkan/agents/seraiah.md +3 -1
- package/payload/mishkan/agents/shallum.md +3 -1
- package/payload/mishkan/agents/shaphan.md +3 -1
- package/payload/mishkan/agents/shemaiah.md +6 -1
- package/payload/mishkan/agents/shevna.md +3 -1
- package/payload/mishkan/agents/uriah.md +3 -1
- package/payload/mishkan/agents/zaccur.md +3 -1
- package/payload/mishkan/agents/zadok.md +3 -1
- package/payload/mishkan/agents/zerubbabel.md +3 -1
- package/payload/mishkan/cognee/.env.example +11 -0
- package/payload/mishkan/cognee/Dockerfile +20 -0
- package/payload/mishkan/cognee/README.md +34 -14
- package/payload/mishkan/cognee/docker-compose.curated.yml +33 -6
- package/payload/mishkan/cognee/docker-compose.selfhosted.yml +35 -5
- package/payload/mishkan/cognee/docker-compose.work.yml +191 -0
- package/payload/mishkan/cognee/docker-compose.yml +18 -3
- package/payload/mishkan/cognee/patches/cognee-mcp-core-align.py +72 -0
- package/payload/mishkan/cognee/patches/cognee-mcp-recall-user.py +82 -0
- package/payload/mishkan/cognee/promote-curated.py +77 -0
- package/payload/mishkan/cognee/prune-store.py +23 -0
- package/payload/mishkan/commands/mishkan-init.md +4 -1
- package/payload/mishkan/commands/mishkan-org-reference.md +2 -2
- package/payload/mishkan/config/curated-library.yaml +1 -0
- package/payload/mishkan/config/model-routing.yaml +23 -14
- package/payload/mishkan/evals/baruch/fixtures/invalid/bad-curated-candidate.json +22 -0
- package/payload/mishkan/evals/baruch/fixtures/valid/resolved-curated-candidate.json +23 -0
- package/payload/mishkan/hooks/model-route.py +14 -1
- package/payload/mishkan/observability/usage_parser.py +1 -0
- package/payload/mishkan/observability/watch/pyproject.toml +1 -1
- package/payload/mishkan/observability/watch/src/mishkan_watch/__main__.py +78 -21
- package/payload/mishkan/observability/watch/src/mishkan_watch/app.py +56 -3
- package/payload/mishkan/observability/watch/src/mishkan_watch/tabs/knowledge.py +76 -5
- package/payload/mishkan/observability/watch/src/mishkan_watch/tabs/workflows.py +22 -1
- package/payload/mishkan/observability/watchd/pyproject.toml +1 -1
- package/payload/mishkan/observability/watchd/src/mishkan_watchd/__main__.py +35 -7
- package/payload/mishkan/observability/watchd/src/mishkan_watchd/server.py +102 -8
- package/payload/mishkan/observability/watchd/src/mishkan_watchd/sources/cognee_poll.py +136 -49
- package/payload/mishkan/ontology.md +8 -1
- package/payload/mishkan/ontology.ttl +188 -0
- package/payload/mishkan/scripts/ensure-work-store.sh +230 -0
- package/payload/mishkan/scripts/mishkan-ingest.sh +49 -3
- package/payload/mishkan/scripts/promote-curated.sh +77 -0
- package/payload/mishkan/scripts/reset-knowledge-data.sh +70 -0
- package/payload/mishkan/scripts/validate-research-log.sh +27 -0
- package/payload/mishkan/skills/baruch-research-reporting-craft/SKILL.md +42 -8
- package/payload/mishkan/skills/cognee-promote/SKILL.md +13 -0
- package/payload/mishkan/skills/cognee-quickstart/SKILL.md +7 -1
- package/payload/mishkan/skills/ezra-research-formulation-craft/SKILL.md +9 -0
- package/payload/mishkan/skills/mishkan-ingest/SKILL.md +22 -0
- package/payload/mishkan/skills/mishkan-init/SKILL.md +31 -19
- package/payload/mishkan/skills/shemaiah-evaluation-craft/SKILL.md +33 -5
- package/payload/mishkan/skills/team-lead-craft/SKILL.md +66 -0
- package/payload/mishkan/templates/mcp.json +7 -2
- package/payload/mishkan/templates/observability-log.schema.json +1 -1
- package/payload/mishkan/templates/research-log.schema.json +15 -1
- package/payload/mishkan/workflows/README.md +19 -13
- package/payload/mishkan/workflows/chosheb-feature-ship.js +63 -18
- package/payload/mishkan/workflows/migdal-dr-drill.js +4 -0
- package/payload/mishkan/workflows/migdal-infra-change.js +48 -7
- package/payload/mishkan/workflows/mishkan-architecture-panel.js +4 -0
- package/payload/mishkan/workflows/mishkan-blast-radius.js +4 -0
- package/payload/mishkan/workflows/mishkan-codebase-audit.js +4 -0
- package/payload/mishkan/workflows/mishkan-deep-research.js +4 -0
- package/payload/mishkan/workflows/mishkan-init.js +4 -0
- package/payload/mishkan/workflows/mishkan-knowledge-gap-discovery.js +4 -0
- package/payload/mishkan/workflows/mishkan-migration-wave.js +4 -0
- package/payload/mishkan/workflows/mishkan-release-readiness.js +4 -0
- package/payload/mishkan/workflows/mishkan-sprint-close.js +4 -0
- package/payload/mishkan/workflows/mishkan-standards-rollout.js +4 -0
- package/payload/mishkan/workflows/mishmar-security-gate.js +45 -6
- package/payload/mishkan/workflows/panim-ds-rollout.js +4 -0
- package/payload/mishkan/workflows/panim-feature-ship.js +132 -0
- package/payload/mishkan/workflows/sefer-release-notes.js +4 -0
- package/payload/mishkan/workflows/yasad-data-migration-wave.js +4 -0
- package/payload/mishkan/workflows/yasad-feature-ship.js +130 -0
- package/payload/mishkan/workflows/yasad-schema-evolution.js +4 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# MISHKAN — per-project cognee work store (decision D-012).
|
|
2
|
+
#
|
|
3
|
+
# Each project gets its OWN physically-separate cognee-mcp instance with an
|
|
4
|
+
# embedded Ladybug graph + LanceDB vector + SQLite relational store. Isolation
|
|
5
|
+
# is by topology (separate container + separate named volume + separate on-disk
|
|
6
|
+
# graph file), NOT by cognee's datasets= filter (D-012 §Why: filter is advisory-
|
|
7
|
+
# only with ENABLE_BACKEND_ACCESS_CONTROL=false; see issue #1023).
|
|
8
|
+
#
|
|
9
|
+
# Reuses the already-patched mishkan/cognee-mcp image — DO NOT rebuild from a
|
|
10
|
+
# host source checkout. The recall fix (cognee-mcp-recall-user.py + core-align)
|
|
11
|
+
# is baked into that image. Ref: decision D-012, amendment 2026-06-10.
|
|
12
|
+
#
|
|
13
|
+
# REQUIRED env vars (caller must export or set in the shell):
|
|
14
|
+
# COGNEE_MCP_REF — pinned image tag (same ref used to build the base image)
|
|
15
|
+
# WORK_PROJECT — project slug (e.g. "wisemoney", "harness"); becomes part of
|
|
16
|
+
# container_name, volume name, and compose project name
|
|
17
|
+
# WORK_PORT — host port the MCP endpoint binds on (127.0.0.1 only)
|
|
18
|
+
#
|
|
19
|
+
# Bring-up (always with the hardening overlay):
|
|
20
|
+
# export WORK_PROJECT=<slug> WORK_PORT=<port> COGNEE_MCP_REF=<ref>
|
|
21
|
+
# docker compose \
|
|
22
|
+
# -f docker-compose.work.yml \
|
|
23
|
+
# -f docker-compose.hardening.yml \
|
|
24
|
+
# -p mishkan-work-${WORK_PROJECT} \
|
|
25
|
+
# up -d
|
|
26
|
+
#
|
|
27
|
+
# The ensure-work-store.sh script wraps this with port assignment, health-wait,
|
|
28
|
+
# and idempotency — prefer that over calling compose directly.
|
|
29
|
+
#
|
|
30
|
+
# Ollama (embeddings): the cognee-mcp container joins the EXTERNAL network
|
|
31
|
+
# mishkan-cognee_cognee_net (created by docker-compose.selfhosted.yml) so it can
|
|
32
|
+
# reach mishkan-ollama for embedding inference. The shared Ollama is model data,
|
|
33
|
+
# not project data — sharing it does not breach the isolation boundary. If Ollama
|
|
34
|
+
# is not running, cognee will fall back to whatever LLM_PROVIDER / LLM_API_KEY
|
|
35
|
+
# is set in .env (a cloud provider), or fail at cognify time with a clear error.
|
|
36
|
+
#
|
|
37
|
+
# GRAPH_DATABASE_URL: if .env carries a stale NEO4J bolt URI for the old shared
|
|
38
|
+
# work store, it is harmless here: when GRAPH_DATABASE_PROVIDER=ladybug the
|
|
39
|
+
# cognee graph engine factory selects the LadybugAdapter directly and never
|
|
40
|
+
# reads GRAPH_DATABASE_URL. No explicit unset is required; the environment
|
|
41
|
+
# override below ensures the correct provider is always used.
|
|
42
|
+
#
|
|
43
|
+
# Volume layout — the per-project named volume mounts at the Dockerfile-owned,
|
|
44
|
+
# cognee-owned /app/cognee-mcp/.cognee_system (writable by uid 10001). cognee
|
|
45
|
+
# auto-places the embedded stores under the data/system roots (graph_file_path
|
|
46
|
+
# has no env binding in v1.1.0 — it derives from SYSTEM_ROOT_DIRECTORY):
|
|
47
|
+
# .../system/databases/ — Ladybug graph (auto-named cognee_graph_kuzu)
|
|
48
|
+
# .../data , .../system — LanceDB tables + SQLite relational + system metadata
|
|
49
|
+
# This whole tree is the physical isolation boundary — never shared across projects.
|
|
50
|
+
#
|
|
51
|
+
# Migdal compliance: pinned image (no :latest), 127.0.0.1-bound, resource limits,
|
|
52
|
+
# healthcheck, hardening overlay re-applied on every recreate (see Dockerfile
|
|
53
|
+
# comment in docker-compose.hardening.yml).
|
|
54
|
+
|
|
55
|
+
name: mishkan-work-${WORK_PROJECT:?set WORK_PROJECT to a project slug}
|
|
56
|
+
|
|
57
|
+
services:
|
|
58
|
+
cognee-mcp:
|
|
59
|
+
image: mishkan/cognee-mcp:${COGNEE_MCP_REF:?set COGNEE_MCP_REF in .env to a pinned cognee git tag/commit}
|
|
60
|
+
container_name: mishkan-work-${WORK_PROJECT:?set WORK_PROJECT to a project slug}
|
|
61
|
+
restart: unless-stopped
|
|
62
|
+
|
|
63
|
+
# .env supplies LLM/embedding credentials (SOPS-managed by the engineer).
|
|
64
|
+
# The environment: block below OVERRIDES any stale graph/vector/relational
|
|
65
|
+
# provider vars that may be present in .env from the old shared Neo4j stack.
|
|
66
|
+
env_file:
|
|
67
|
+
- .env
|
|
68
|
+
|
|
69
|
+
environment:
|
|
70
|
+
COGNEE_PORT: "7777"
|
|
71
|
+
|
|
72
|
+
# Embedded backends — no server processes. We pin the PROVIDERS explicitly
|
|
73
|
+
# (a future .env change cannot silently redirect to a shared Neo4j), but we
|
|
74
|
+
# do NOT set graph/vector/relational FILE paths: in cognee v1.1.0
|
|
75
|
+
# `graph_file_path` has no env binding (verified, graph/config.py) — it is
|
|
76
|
+
# auto-derived under SYSTEM_ROOT_DIRECTORY. cognee places every embedded
|
|
77
|
+
# store under the data/system roots below, so the roots are what bind the
|
|
78
|
+
# stores to the per-project volume.
|
|
79
|
+
GRAPH_DATABASE_PROVIDER: "ladybug" # cognee v1.1.0 default; embedded, file-based
|
|
80
|
+
VECTOR_DB_PROVIDER: "lancedb" # embedded, file-based
|
|
81
|
+
DB_PROVIDER: "sqlite" # embedded, file-based
|
|
82
|
+
|
|
83
|
+
# Data/system roots MUST live under /app/cognee-mcp/.cognee_system — the path
|
|
84
|
+
# the Dockerfile pre-creates and chowns to the non-root cognee user (uid
|
|
85
|
+
# 10001). A fresh volume at an un-pre-created path (e.g. /app/data) is
|
|
86
|
+
# root-owned and cognee cannot write to it (the persistence/ownership
|
|
87
|
+
# constraint documented in .env.example).
|
|
88
|
+
DATA_ROOT_DIRECTORY: "/app/cognee-mcp/.cognee_system/data"
|
|
89
|
+
SYSTEM_ROOT_DIRECTORY: "/app/cognee-mcp/.cognee_system/system"
|
|
90
|
+
|
|
91
|
+
# Access control off (cognee's multi-user mode needs a per-dataset DB which
|
|
92
|
+
# these embedded backends don't provide — see D-012). Isolation is by
|
|
93
|
+
# topology: this container + its own volume, not the datasets= filter.
|
|
94
|
+
ENABLE_BACKEND_ACCESS_CONTROL: "false"
|
|
95
|
+
|
|
96
|
+
# Session memory OFF on per-project stores so the conversational session
|
|
97
|
+
# cache accumulates ONLY in the shared `cognee-memory` instance (:7777),
|
|
98
|
+
# not fragmented per project. Verified (cognee v1.1.0): CACHING controls
|
|
99
|
+
# the single `caching` field (cache/config.py:26) and disables ONLY the
|
|
100
|
+
# session/conversational cache (+ auto_feedback, off by default) — it does
|
|
101
|
+
# NOT disable embedding/LLM/query caching, and recall/cognify/search keep
|
|
102
|
+
# working (get_cache_engine.py:46; retrievers' no-session completion path).
|
|
103
|
+
# NB: the permanent `claude_code_memory` graph dataset is governed by
|
|
104
|
+
# COGNEE_MCP_AGENT_SCOPED, NOT CACHING — it is unaffected here.
|
|
105
|
+
CACHING: "false"
|
|
106
|
+
|
|
107
|
+
# Agent-scoping OFF so a per-project store NEVER creates a per-client
|
|
108
|
+
# `claude_code_memory` graph dataset (which would fragment session learnings
|
|
109
|
+
# across projects). Verified (cognee v1.1.0, cognee-mcp server.py:1686/1711):
|
|
110
|
+
# default "true" auto-names the default dataset `<client>_memory`; "false"
|
|
111
|
+
# collapses it to `main_dataset`, so this store holds ONLY project knowledge.
|
|
112
|
+
# `claude_code_memory` lives solely in the shared `cognee-memory` instance
|
|
113
|
+
# (which keeps the default). mishkan-ingest writes explicit dataset names so
|
|
114
|
+
# it is unaffected; datasets= is advisory (one store = one project) so
|
|
115
|
+
# whole-graph recall still returns this project's data. Topology, not trust.
|
|
116
|
+
COGNEE_MCP_AGENT_SCOPED: "false"
|
|
117
|
+
|
|
118
|
+
# Ontology (ADR D-013): attach the MISHKAN schema to every cognify so ingested
|
|
119
|
+
# entities matching a class are validated (ontology_valid=true) and enriched
|
|
120
|
+
# with parent / object-property edges. cognee v1.1.0 reads the ontology from
|
|
121
|
+
# the ENVIRONMENT (Pydantic OntologyEnvConfig) — NOT a cognify kwarg, which it
|
|
122
|
+
# silently ignores. The resolver/strategy already default to these values; we
|
|
123
|
+
# set all three explicitly. ONTOLOGY_FILE_PATH points at the ttl that
|
|
124
|
+
# ensure-work-store.sh stages into the container; fail-open — if the file is
|
|
125
|
+
# missing cognee logs a warning and ingests ontology-free.
|
|
126
|
+
ONTOLOGY_RESOLVER: "rdflib"
|
|
127
|
+
MATCHING_STRATEGY: "fuzzy"
|
|
128
|
+
ONTOLOGY_FILE_PATH: "/home/cognee/ontology.ttl"
|
|
129
|
+
|
|
130
|
+
ports:
|
|
131
|
+
# Bound to loopback only. WORK_PORT is assigned by ensure-work-store.sh
|
|
132
|
+
# (deterministic: base 7800 + hash of slug, no conflict with 7777/7730).
|
|
133
|
+
- "127.0.0.1:${WORK_PORT:?set WORK_PORT to the desired host port}:7777"
|
|
134
|
+
|
|
135
|
+
volumes:
|
|
136
|
+
# Per-project named volume mounted at the Dockerfile-owned .cognee_system
|
|
137
|
+
# path (writable by the non-root cognee user). The compose project name
|
|
138
|
+
# (mishkan-work-<slug>) is prepended by Docker → mishkan-work-<slug>_work_data.
|
|
139
|
+
# This volume is the physical isolation boundary: each project's graph,
|
|
140
|
+
# vector, and relational files live here and are never visible to others.
|
|
141
|
+
- work_data:/app/cognee-mcp/.cognee_system
|
|
142
|
+
|
|
143
|
+
networks:
|
|
144
|
+
# Join the shared network so this container can reach mishkan-ollama for
|
|
145
|
+
# embedding inference. This network is created by docker-compose.selfhosted.yml
|
|
146
|
+
# (name: mishkan-cognee, network alias cognee_net → external name
|
|
147
|
+
# mishkan-cognee_cognee_net). If the selfhosted stack is not running, bring
|
|
148
|
+
# it up first or point the embedding config at a cloud provider via .env.
|
|
149
|
+
- cognee_shared_net
|
|
150
|
+
|
|
151
|
+
healthcheck:
|
|
152
|
+
# Conditional probe WITH internal retries: connect up to 3 times (1s apart, no
|
|
153
|
+
# trailing sleep), exit 0 on the first success — absorbs a transient blip
|
|
154
|
+
# without flagging a failure. CMD-SHELL wraps the python connect in the retry
|
|
155
|
+
# loop; `$$i` is escaped so compose passes a literal $i through to the shell.
|
|
156
|
+
test: ["CMD-SHELL", "for i in 1 2 3; do python -c \"import socket; socket.create_connection(('127.0.0.1',7777),2).close()\" 2>/dev/null && exit 0; [ \"$$i\" = 3 ] || sleep 1; done; exit 1"]
|
|
157
|
+
interval: 15s
|
|
158
|
+
timeout: 10s
|
|
159
|
+
retries: 5
|
|
160
|
+
# 300s: cognee-mcp cold-start is slow (~4-5min — cognee lib import + graph
|
|
161
|
+
# init + ollama embedding warmup + DB migrations before it binds :7777). A
|
|
162
|
+
# 40s grace flags a still-booting container unhealthy on every cold start.
|
|
163
|
+
# A generous start_period only delays the first probe; it never slows a
|
|
164
|
+
# healthy container. Matches the shared :7777 box (base compose) at 300s.
|
|
165
|
+
start_period: 300s
|
|
166
|
+
# start_interval (Docker 25+): probe every 5s during start_period so the health
|
|
167
|
+
# flip is caught within ~5s of :7777 binding, not up to 15s later.
|
|
168
|
+
start_interval: 5s
|
|
169
|
+
|
|
170
|
+
deploy:
|
|
171
|
+
resources:
|
|
172
|
+
limits:
|
|
173
|
+
# Lighter than the Neo4j-backed store (no JVM): 1.5 CPU / 2 GB.
|
|
174
|
+
# Ladybug + LanceDB + SQLite are all in-process — no separate server
|
|
175
|
+
# processes sharing the cgroup. Raise if bulk cognify is slow.
|
|
176
|
+
cpus: "1.5"
|
|
177
|
+
memory: 2g
|
|
178
|
+
|
|
179
|
+
volumes:
|
|
180
|
+
work_data:
|
|
181
|
+
# Unnamed here; Docker prefixes the compose project name automatically:
|
|
182
|
+
# mishkan-work-<WORK_PROJECT>_work_data
|
|
183
|
+
# Each project therefore owns a distinct, unambiguously-named volume.
|
|
184
|
+
|
|
185
|
+
networks:
|
|
186
|
+
cognee_shared_net:
|
|
187
|
+
# External: created by the selfhosted stack (mishkan-cognee project,
|
|
188
|
+
# network cognee_net). Join it to reach mishkan-ollama for embeddings.
|
|
189
|
+
# Do NOT re-declare subnet here — Docker will reject a conflicting config.
|
|
190
|
+
external: true
|
|
191
|
+
name: mishkan-cognee_cognee_net
|
|
@@ -39,11 +39,26 @@ services:
|
|
|
39
39
|
# Cognee's local data (graph/vector/sqlite) when using default backends.
|
|
40
40
|
- cognee_data:/app/cognee-mcp/.cognee_system
|
|
41
41
|
healthcheck:
|
|
42
|
-
|
|
42
|
+
# Conditional probe WITH internal retries: connect up to 3 times (1s apart, no
|
|
43
|
+
# trailing sleep), exit 0 on the first success — absorbs a transient blip
|
|
44
|
+
# without flagging a failure. CMD-SHELL wraps the python connect in the retry
|
|
45
|
+
# loop; `$$i` is escaped so compose passes a literal $i through to the shell.
|
|
46
|
+
test: ["CMD-SHELL", "for i in 1 2 3; do python -c \"import socket; socket.create_connection(('127.0.0.1',7777),2).close()\" 2>/dev/null && exit 0; [ \"$$i\" = 3 ] || sleep 1; done; exit 1"]
|
|
43
47
|
interval: 15s
|
|
44
|
-
timeout:
|
|
48
|
+
timeout: 10s
|
|
45
49
|
retries: 5
|
|
46
|
-
|
|
50
|
+
# 300s: cognee-mcp cold-start is genuinely slow — observed ~3.5min just to
|
|
51
|
+
# reach DB migrations (cognee lib import + graph-adapter handshake + ollama
|
|
52
|
+
# embedding warmup) and ~4-5min before it binds :7777. A 40s grace flagged a
|
|
53
|
+
# perfectly-fine, still-booting container unhealthy on EVERY cold start, then
|
|
54
|
+
# cascaded to anything with depends_on: service_healthy. It self-recovers the
|
|
55
|
+
# moment the port listens, but the false-unhealthy window is the bug. start_period
|
|
56
|
+
# must cover the real cold-start; a too-long value only delays the first probe,
|
|
57
|
+
# it never slows a healthy container. Sibling Neo4j is 240s for the same reason.
|
|
58
|
+
start_period: 300s
|
|
59
|
+
# start_interval (Docker 25+): probe every 5s during start_period so the health
|
|
60
|
+
# flip is caught within ~5s of :7777 binding, not up to 15s later.
|
|
61
|
+
start_interval: 5s
|
|
47
62
|
networks:
|
|
48
63
|
- cognee_net
|
|
49
64
|
deploy:
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""MISHKAN overlay patch — align cognee CORE to the pinned cognee-mcp ref.
|
|
3
|
+
|
|
4
|
+
The Dockerfile clones the cognee monorepo at COGNEE_MCP_REF (e.g. v1.1.0) and
|
|
5
|
+
runs `uv sync` inside `cognee-mcp/`. But cognee-mcp's pyproject pins the core
|
|
6
|
+
LOOSELY against PyPI:
|
|
7
|
+
|
|
8
|
+
"cognee[postgres-binary,docs,neo4j]>=1.0.0,<2.0.0"
|
|
9
|
+
|
|
10
|
+
so `uv sync` installs the core from PyPI at whatever the latest 1.x happens to
|
|
11
|
+
be — a DIFFERENT version than the checked-out wrapper. That skew is what breaks
|
|
12
|
+
the read path even after the recall/search `user=` patch (cognee-mcp-recall-
|
|
13
|
+
user.py): the v1.1.0 core's recall() forwards `user=` exactly once, but the
|
|
14
|
+
drifting PyPI core's recall() passes it both positionally and as a keyword, so
|
|
15
|
+
the wrapper's injected `user=` collides:
|
|
16
|
+
|
|
17
|
+
authorized_search() got multiple values for keyword argument 'user'
|
|
18
|
+
|
|
19
|
+
The fix: resolve the core from the LOCAL checkout (`/app`, the monorepo root,
|
|
20
|
+
which is a PEP-517 `cognee` package built by hatchling) via a PEP 508 direct
|
|
21
|
+
reference. Then wrapper + core + their transitive deps are all the same ref, and
|
|
22
|
+
the recall patch — written against that ref — works end to end. This is exactly
|
|
23
|
+
the mechanism the upstream dev left commented out (a `@ file:` direct ref),
|
|
24
|
+
generalised off their hard-coded local path to the in-container clone.
|
|
25
|
+
|
|
26
|
+
Properties (mirrors cognee-mcp-recall-user.py):
|
|
27
|
+
- idempotent: re-running is a no-op (marker = the rewritten dep string).
|
|
28
|
+
- fail-loud: if the loose-pin anchor is not found (a COGNEE_MCP_REF bump moved
|
|
29
|
+
or already fixed it), exits non-zero so the build fails instead of silently
|
|
30
|
+
shipping a still-skewed image.
|
|
31
|
+
|
|
32
|
+
Drop this patch (and its Dockerfile COPY/RUN) once cognee-mcp pins its core
|
|
33
|
+
tightly to the wrapper ref upstream and COGNEE_MCP_REF is bumped to it.
|
|
34
|
+
"""
|
|
35
|
+
from __future__ import annotations
|
|
36
|
+
|
|
37
|
+
import pathlib
|
|
38
|
+
import sys
|
|
39
|
+
|
|
40
|
+
TARGET = pathlib.Path("/app/cognee-mcp/pyproject.toml")
|
|
41
|
+
OLD = '"cognee[postgres-binary,docs,neo4j]>=1.0.0,<2.0.0"'
|
|
42
|
+
NEW = '"cognee[postgres-binary,docs,neo4j] @ file:///app"'
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def main() -> int:
|
|
46
|
+
if not TARGET.is_file():
|
|
47
|
+
print(f"MISHKAN ERROR: {TARGET} not found", file=sys.stderr)
|
|
48
|
+
return 1
|
|
49
|
+
|
|
50
|
+
src = TARGET.read_text()
|
|
51
|
+
if NEW in src:
|
|
52
|
+
print("MISHKAN: cognee core already aligned to /app checkout; skipping")
|
|
53
|
+
return 0
|
|
54
|
+
|
|
55
|
+
count = src.count(OLD)
|
|
56
|
+
if count != 1:
|
|
57
|
+
print(
|
|
58
|
+
f"MISHKAN ERROR: expected exactly 1 core-dep anchor, found {count}. "
|
|
59
|
+
"cognee-mcp/pyproject.toml changed its core pin — review "
|
|
60
|
+
"payload/mishkan/cognee/patches/cognee-mcp-core-align.py against the "
|
|
61
|
+
"pinned COGNEE_MCP_REF.",
|
|
62
|
+
file=sys.stderr,
|
|
63
|
+
)
|
|
64
|
+
return 1
|
|
65
|
+
|
|
66
|
+
TARGET.write_text(src.replace(OLD, NEW))
|
|
67
|
+
print("MISHKAN: cognee core pinned to /app checkout (file:///app)")
|
|
68
|
+
return 0
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
if __name__ == "__main__":
|
|
72
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""MISHKAN overlay patch for cognee-mcp (v1.1.0 .. v1.1.2).
|
|
3
|
+
|
|
4
|
+
Upstream defect (cognee issue #2855): CogneeClient.recall() and .search() in
|
|
5
|
+
direct/local mode call cognee.recall()/cognee.search() WITHOUT a `user=`
|
|
6
|
+
argument, so the core resolves the user itself and — under several conditions
|
|
7
|
+
(notably a Neo4j graph backend, where the non-ACL search branch runs) — the
|
|
8
|
+
read path dereferences `.id` on a None and raises:
|
|
9
|
+
|
|
10
|
+
'NoneType' object has no attribute 'id'
|
|
11
|
+
|
|
12
|
+
The WRITE path works because add()/cognify()/remember() initialise the user and
|
|
13
|
+
datasets; only the READ path is broken. The sibling methods delete() and
|
|
14
|
+
list_datasets() already do `user = await get_default_user()` and pass it — this
|
|
15
|
+
patch makes recall()/search() do the same, mirroring that exact pattern.
|
|
16
|
+
|
|
17
|
+
Properties:
|
|
18
|
+
- idempotent: re-running is a no-op (marker `_mishkan_gdu`).
|
|
19
|
+
- fail-loud: if the two anchor call-sites are not found (e.g. a cognee-mcp
|
|
20
|
+
upgrade moved or fixed them), exits non-zero so the build fails loudly
|
|
21
|
+
instead of silently shipping an unpatched (still-broken) image.
|
|
22
|
+
- indentation-safe: the injected lines copy the anchor line's own indent.
|
|
23
|
+
|
|
24
|
+
Drop this patch (and its Dockerfile COPY/RUN) once a cognee-mcp release lands
|
|
25
|
+
the fix upstream and COGNEE_MCP_REF is bumped to it.
|
|
26
|
+
"""
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
import pathlib
|
|
30
|
+
import sys
|
|
31
|
+
|
|
32
|
+
TARGET = pathlib.Path("/app/cognee-mcp/src/cognee_client.py")
|
|
33
|
+
MARKER = "_mishkan_gdu"
|
|
34
|
+
IMPORT = "from cognee.modules.users.methods import get_default_user as _mishkan_gdu"
|
|
35
|
+
|
|
36
|
+
# (anchor line — matched after lstrip; kwargs-dict the call splats)
|
|
37
|
+
EDITS = [
|
|
38
|
+
("return await self.cognee.recall(query_text=query_text, **kwargs)", "kwargs"),
|
|
39
|
+
("results = await self.cognee.search(**search_kwargs)", "search_kwargs"),
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def main() -> int:
|
|
44
|
+
if not TARGET.is_file():
|
|
45
|
+
print(f"MISHKAN ERROR: {TARGET} not found", file=sys.stderr)
|
|
46
|
+
return 1
|
|
47
|
+
|
|
48
|
+
src = TARGET.read_text()
|
|
49
|
+
if MARKER in src:
|
|
50
|
+
print("MISHKAN: cognee-mcp recall/search user= patch already applied; skipping")
|
|
51
|
+
return 0
|
|
52
|
+
|
|
53
|
+
out: list[str] = []
|
|
54
|
+
applied = 0
|
|
55
|
+
for line in src.splitlines(keepends=True):
|
|
56
|
+
stripped = line.lstrip()
|
|
57
|
+
indent = line[: len(line) - len(stripped)]
|
|
58
|
+
hit = next((kw for anchor, kw in EDITS if stripped.startswith(anchor)), None)
|
|
59
|
+
if hit is not None:
|
|
60
|
+
out.append(f"{indent}{IMPORT}\n")
|
|
61
|
+
out.append(f'{indent}{hit}["user"] = await _mishkan_gdu()\n')
|
|
62
|
+
out.append(line)
|
|
63
|
+
applied += 1
|
|
64
|
+
else:
|
|
65
|
+
out.append(line)
|
|
66
|
+
|
|
67
|
+
if applied != len(EDITS):
|
|
68
|
+
print(
|
|
69
|
+
f"MISHKAN ERROR: expected {len(EDITS)} patch site(s), found {applied}. "
|
|
70
|
+
"cognee-mcp source changed — review payload/mishkan/cognee/patches/"
|
|
71
|
+
"cognee-mcp-recall-user.py against the pinned COGNEE_MCP_REF.",
|
|
72
|
+
file=sys.stderr,
|
|
73
|
+
)
|
|
74
|
+
return 1
|
|
75
|
+
|
|
76
|
+
TARGET.write_text("".join(out))
|
|
77
|
+
print(f"MISHKAN: cognee-mcp recall/search user= patch applied ({applied} sites)")
|
|
78
|
+
return 0
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
if __name__ == "__main__":
|
|
82
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# MISHKAN — ADDITIVE promotion of a single resource into the curated library (D-016).
|
|
2
|
+
# Runs INSIDE the cognee-curated-mcp container (needs the cognee package + the live
|
|
3
|
+
# .env config: graph=Neo4j, vector=pgvector, embeddings=Ollama). Writes ONE typed
|
|
4
|
+
# CuratedResource node via Cognee's low-level DataPoint API — NO LLM extraction
|
|
5
|
+
# (cognify), so it costs only embedding calls.
|
|
6
|
+
#
|
|
7
|
+
# This is the engineer-gated growth path for the curated library: a resource a
|
|
8
|
+
# research run found reusable, vetted by Shemaiah, queued by Baruch, and approved
|
|
9
|
+
# by the engineer via `mishkan knowledge curate`. Invoked by promote-curated.sh;
|
|
10
|
+
# not meant to be run standalone on the host.
|
|
11
|
+
#
|
|
12
|
+
# Candidate JSON path via COGNEE_CANDIDATE_JSON (default /home/cognee/curated-candidate.json)
|
|
13
|
+
#
|
|
14
|
+
# CRITICAL — unlike ingest-curated.py (the seed), this NEVER prunes. The seed wipes
|
|
15
|
+
# and rewrites for a clean reproducible bootstrap; promotion is additive, so every
|
|
16
|
+
# pre-existing curated node MUST survive. Dedup by url is enforced by the caller
|
|
17
|
+
# (promote-curated.sh) against the seed manifest + the promoted ledger before this
|
|
18
|
+
# script is ever invoked — so reaching here means "write this new node".
|
|
19
|
+
import asyncio
|
|
20
|
+
import json
|
|
21
|
+
import os
|
|
22
|
+
|
|
23
|
+
from cognee.low_level import setup, DataPoint
|
|
24
|
+
from cognee.pipelines import run_tasks, Task
|
|
25
|
+
from cognee.tasks.storage import add_data_points
|
|
26
|
+
from cognee.tasks.storage.index_graph_edges import index_graph_edges
|
|
27
|
+
from cognee.modules.users.methods import get_default_user
|
|
28
|
+
from cognee.modules.data.methods import load_or_create_datasets
|
|
29
|
+
|
|
30
|
+
CANDIDATE = os.environ.get("COGNEE_CANDIDATE_JSON", "/home/cognee/curated-candidate.json")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class CuratedResource(DataPoint):
|
|
34
|
+
name: str
|
|
35
|
+
team: str
|
|
36
|
+
url: str
|
|
37
|
+
problem_class: str
|
|
38
|
+
source_tier: str
|
|
39
|
+
metadata: dict = {"index_fields": ["name", "problem_class"]}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def build_node(_data=None):
|
|
43
|
+
with open(CANDIDATE) as fh:
|
|
44
|
+
d = json.load(fh)
|
|
45
|
+
for required in ("name", "team", "url"):
|
|
46
|
+
if not d.get(required):
|
|
47
|
+
raise SystemExit(f"promote-curated: candidate missing required field '{required}'")
|
|
48
|
+
node = CuratedResource(
|
|
49
|
+
name=d["name"],
|
|
50
|
+
team=d["team"],
|
|
51
|
+
url=d["url"],
|
|
52
|
+
problem_class=d.get("problem_class", ""),
|
|
53
|
+
source_tier=d.get("source_tier", "curated"),
|
|
54
|
+
)
|
|
55
|
+
print(f">> built 1 CuratedResource node: {node.name} ({node.url})", flush=True)
|
|
56
|
+
return [node]
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
async def main():
|
|
60
|
+
# NO prune — additive. Pre-existing curated nodes must survive.
|
|
61
|
+
await setup()
|
|
62
|
+
user = await get_default_user()
|
|
63
|
+
datasets = await load_or_create_datasets(["curated_library"], [], user)
|
|
64
|
+
tasks = [Task(build_node), Task(add_data_points)]
|
|
65
|
+
async for status in run_tasks(tasks, datasets[0].id, None, user, "curated_promote"):
|
|
66
|
+
print(">> status:", getattr(status, "status", status), flush=True)
|
|
67
|
+
await index_graph_edges()
|
|
68
|
+
print(">> PROMOTED", flush=True)
|
|
69
|
+
# Enrichment follows the build: memify embeds the relationship/triplet layer
|
|
70
|
+
# (default tasks; embeddings-only, no LLM/quota).
|
|
71
|
+
import cognee
|
|
72
|
+
await cognee.memify(dataset="curated_library")
|
|
73
|
+
print(">> MEMIFIED", flush=True)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
if __name__ == "__main__":
|
|
77
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# MISHKAN — prune a cognee store to empty. Runs INSIDE a cognee-mcp container
|
|
2
|
+
# (needs the cognee package + the live .env config). Wipes ALL data AND system
|
|
3
|
+
# metadata in that container's graph + vector + relational stores.
|
|
4
|
+
#
|
|
5
|
+
# Used by reset-knowledge-data.sh to clear cognee-memory (:7777) during a full
|
|
6
|
+
# knowledge-data reset to the stable baseline. Mirrors the prune the seed does
|
|
7
|
+
# (ingest-curated.py) but standalone — prune only, no re-write.
|
|
8
|
+
#
|
|
9
|
+
# DESTRUCTIVE and IRREVERSIBLE. Not meant to be run standalone on the host;
|
|
10
|
+
# the orchestrator docker-execs it under the engineer's hand.
|
|
11
|
+
import asyncio
|
|
12
|
+
|
|
13
|
+
from cognee import prune
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
async def main():
|
|
17
|
+
await prune.prune_data()
|
|
18
|
+
await prune.prune_system(metadata=True)
|
|
19
|
+
print(">> PRUNED (data + system metadata)", flush=True)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
if __name__ == "__main__":
|
|
23
|
+
asyncio.run(main())
|
|
@@ -18,7 +18,10 @@ Nehemiah → `docs/PRD.md`
|
|
|
18
18
|
→ Benaiah → `docs/THREAT_MODEL.md` (plan first)
|
|
19
19
|
→ Meshullam → `docs/diagrams/C4/` (plan first)
|
|
20
20
|
→ Jehoshaphat → `docs/README.md`, `docs/adr/`, `docs/runbooks/` (plan first)
|
|
21
|
-
→
|
|
21
|
+
→ knowledge setup (D-007 + D-012 + D-015): `mishkan knowledge-stack up` (shared
|
|
22
|
+
infra, idempotent) + `mishkan project-work-store up` (this project's isolated
|
|
23
|
+
store) + `mishkan knowledge ingest --tagged-only` (ONLY `mishkan: ingest`-tagged
|
|
24
|
+
docs — never bulk-ingest the tree; selective by design, prevents PII bleed)
|
|
22
25
|
→ write `./CLAUDE.md` (Sprint S0), copy settings + team rules into `.claude/`
|
|
23
26
|
|
|
24
27
|
Sequence before implementation: no code is written during init. Stateful
|
|
@@ -25,13 +25,13 @@ The data source is `~/.claude/mishkan/org/org.json`, generated from
|
|
|
25
25
|
Invoke the harness CLI:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
npx mishkan-harness org
|
|
28
|
+
npx mishkan-harness org show
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
For a structured JSON dump (e.g. to feed another tool):
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
|
-
npx mishkan-harness org --json
|
|
34
|
+
npx mishkan-harness org show --json
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
Always present the printed reference back to the user verbatim — do not
|
|
@@ -104,6 +104,7 @@ sefer: # Documentation
|
|
|
104
104
|
- { name: "Google Dev Documentation Style Guide", url: "https://developers.google.com/style", problem_class: "technical-writing-style" }
|
|
105
105
|
- { name: "MADR ADR template", url: "https://adr.github.io/madr/", problem_class: "adr-format" }
|
|
106
106
|
- { name: "C4 Model", url: "https://c4model.com/", problem_class: "architecture-diagrams" }
|
|
107
|
+
- { name: "Mermaid — validate diagrams without a browser (mermaid.parse() under jsdom, no Chromium)", url: "https://mermaid.js.org/intro/syntax-reference.html", problem_class: "diagram-as-code-validation" }
|
|
107
108
|
- { name: "Keep a Changelog", url: "https://keepachangelog.com/en/1.1.0/", problem_class: "changelog-convention" }
|
|
108
109
|
- { name: "Semantic Versioning 2.0", url: "https://semver.org/", problem_class: "versioning" }
|
|
109
110
|
- { name: "Conventional Commits", url: "https://www.conventionalcommits.org/en/v1.0.0/", problem_class: "commit-convention" }
|
|
@@ -3,11 +3,18 @@
|
|
|
3
3
|
# every Task/Agent call and injects `model` for any agent LISTED below, which
|
|
4
4
|
# overrides that agent's frontmatter `model:`. So this file is the single source
|
|
5
5
|
# of truth for the 45 MISHKAN agents. Agents NOT listed here (e.g. aiobi-ops,
|
|
6
|
-
# Explore) are left untouched and keep their own frontmatter model.
|
|
7
|
-
# opus, sonnet, haiku
|
|
8
|
-
#
|
|
6
|
+
# Explore) are left untouched and keep their own frontmatter model. The hook
|
|
7
|
+
# accepts four tier values — fable, opus, sonnet, haiku — but `fable` is currently
|
|
8
|
+
# DORMANT (no agent routed to it; see below). (Edit here, not frontmatter —
|
|
9
|
+
# frontmatter is the fallback used only if the hook is removed.)
|
|
9
10
|
#
|
|
10
11
|
# Rationale per tier:
|
|
12
|
+
# fable — SUSPENDED 2026-06-12. Claude Fable 5 (claude-fable-5) was disabled for
|
|
13
|
+
# all customers by a US export-control directive (anthropic.com/news/
|
|
14
|
+
# fable-mythos-access); it now hard-errors on spawn. The Migdal+Mishmar
|
|
15
|
+
# specialists that briefly ran on it (D-002 2026-06-11 amend) are reverted
|
|
16
|
+
# to sonnet below. The tier value is KEPT VALID so re-enabling is a one-line
|
|
17
|
+
# change if Anthropic restores access — but route NO agent here until then.
|
|
11
18
|
# opus — orchestration, team leadership, knowledge publication (judgement-heavy)
|
|
12
19
|
# sonnet — anything that WRITES code/config into the codebase (precision matters
|
|
13
20
|
# on Y4NN's code) + senior specialists + research clarify/formulate/research
|
|
@@ -35,10 +42,10 @@ agents:
|
|
|
35
42
|
|
|
36
43
|
# Mishmar (Security)
|
|
37
44
|
phinehas: opus # lead
|
|
38
|
-
ira: sonnet
|
|
39
|
-
benaiah: sonnet
|
|
40
|
-
joab: sonnet
|
|
41
|
-
hushai: sonnet
|
|
45
|
+
ira: sonnet # was fable (D-002 amend); reverted 2026-06-12 — Fable suspended
|
|
46
|
+
benaiah: sonnet # was fable; reverted 2026-06-12 — Fable suspended
|
|
47
|
+
joab: sonnet # was fable; reverted 2026-06-12 — Fable suspended
|
|
48
|
+
hushai: sonnet # was fable; reverted 2026-06-12 — Fable suspended
|
|
42
49
|
maaseiah: haiku # reporter
|
|
43
50
|
|
|
44
51
|
# Yasad (Backend)
|
|
@@ -67,10 +74,10 @@ agents:
|
|
|
67
74
|
|
|
68
75
|
# Migdal (Infrastructure)
|
|
69
76
|
eliashib: opus # lead
|
|
70
|
-
meshullam: sonnet #
|
|
71
|
-
palal: sonnet #
|
|
72
|
-
meremoth: sonnet #
|
|
73
|
-
hanun: sonnet #
|
|
77
|
+
meshullam: sonnet # was fable (D-002 amend); reverted 2026-06-12 — Fable suspended
|
|
78
|
+
palal: sonnet # was fable; reverted 2026-06-12 — Fable suspended
|
|
79
|
+
meremoth: sonnet # was fable; reverted 2026-06-12 — Fable suspended
|
|
80
|
+
hanun: sonnet # was fable; reverted 2026-06-12 — Fable suspended
|
|
74
81
|
rehum: haiku # advisor — no code
|
|
75
82
|
zaccur: haiku # reporter
|
|
76
83
|
|
|
@@ -82,6 +89,8 @@ agents:
|
|
|
82
89
|
jehonathan: opus # knowledge publication
|
|
83
90
|
huldah: haiku # reporter
|
|
84
91
|
|
|
85
|
-
# Tier totals: opus=9, sonnet=22, haiku=14 (45 agents)
|
|
86
|
-
# Principle:
|
|
87
|
-
#
|
|
92
|
+
# Tier totals: fable=0 (SUSPENDED 2026-06-12), opus=9, sonnet=22, haiku=14 (45 agents)
|
|
93
|
+
# Principle: every agent that writes code/config runs on Sonnet (precision on Y4NN's
|
|
94
|
+
# code); opus for orchestration/leadership/publication; Haiku only for
|
|
95
|
+
# evaluate/collect/advise roles. The fable tier is retained as a valid value but
|
|
96
|
+
# dormant (Fable 5 disabled by export-control directive). See D-002 (amended twice).
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"agent": "benaiah",
|
|
3
|
+
"team": "mishmar",
|
|
4
|
+
"sprint": "S3",
|
|
5
|
+
"trigger": "faced_problem",
|
|
6
|
+
"query_intent": "Authoritative guidance for verifying container provenance with cosign.",
|
|
7
|
+
"tools_invoked": ["jakin", "ezra", "caleb", "shaphan", "shemaiah", "baruch"],
|
|
8
|
+
"research_output_summary": "Cosign verify-attestation covers the verify step. Confidence: high.",
|
|
9
|
+
"applied_to_task": "T-9",
|
|
10
|
+
"outcome": "resolved",
|
|
11
|
+
"knowledge_graph_write": true,
|
|
12
|
+
"curated_library_match": false,
|
|
13
|
+
"cognee_node_id": "casenode-7f3a92",
|
|
14
|
+
"curated_promotion_candidate": {
|
|
15
|
+
"name": "Sigstore cosign",
|
|
16
|
+
"url": "",
|
|
17
|
+
"problem_class": "supply-chain-provenance",
|
|
18
|
+
"team": "mishmar",
|
|
19
|
+
"source_tier": "primary",
|
|
20
|
+
"why": "Reusable across projects that build containers."
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"agent": "benaiah",
|
|
3
|
+
"team": "mishmar",
|
|
4
|
+
"sprint": "S3",
|
|
5
|
+
"trigger": "faced_problem",
|
|
6
|
+
"query_intent": "Authoritative guidance for pinning container base images by digest and verifying provenance with cosign in a GitLab CI pipeline.",
|
|
7
|
+
"tools_invoked": ["jakin", "ezra", "caleb", "shaphan", "shemaiah", "baruch"],
|
|
8
|
+
"research_output_summary": "Sigstore cosign verify-attestation + the SLSA provenance v1 predicate cover the verify step; pinning by digest (not tag) closes the mutable-tag gap. Primary sources: sigstore docs + SLSA spec. Confidence: high. Reusable across any project that builds containers.",
|
|
9
|
+
"applied_to_task": "T-9",
|
|
10
|
+
"outcome": "resolved",
|
|
11
|
+
"knowledge_graph_write": true,
|
|
12
|
+
"curated_library_match": false,
|
|
13
|
+
"cognee_node_id": "casenode-7f3a91",
|
|
14
|
+
"timestamp": "2026-06-11T10:04:00Z",
|
|
15
|
+
"curated_promotion_candidate": {
|
|
16
|
+
"name": "Sigstore cosign — verify-attestation + SLSA provenance",
|
|
17
|
+
"url": "https://docs.sigstore.dev/cosign/verifying/verify/",
|
|
18
|
+
"problem_class": "supply-chain-provenance",
|
|
19
|
+
"team": "mishmar",
|
|
20
|
+
"source_tier": "primary",
|
|
21
|
+
"why": "Vendor-neutral, applies to every project that builds and signs containers — not specific to this codebase."
|
|
22
|
+
}
|
|
23
|
+
}
|