mishkan-harness 0.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/LICENSE +21 -0
- package/README.md +205 -0
- package/bin/mishkan.js +221 -0
- package/docs/design/MISHKAN_agent_aliases.md +140 -0
- package/docs/design/MISHKAN_decisions.md +172 -0
- package/docs/design/MISHKAN_harness_design.md +820 -0
- package/docs/design/MISHKAN_ontology.md +87 -0
- package/docs/design/MISHKAN_token_optimisation.md +181 -0
- package/docs/engineer/README.md +37 -0
- package/docs/engineer/profile.example.md +79 -0
- package/docs/usage/01-installation.md +178 -0
- package/docs/usage/02-project-init.md +151 -0
- package/docs/usage/03-orchestration.md +218 -0
- package/docs/usage/04-memory-layer.md +201 -0
- package/docs/usage/05-selective-ingest.md +177 -0
- package/docs/usage/06-llm-providers.md +195 -0
- package/docs/usage/07-troubleshooting.md +316 -0
- package/docs/usage/08-glossary.md +154 -0
- package/docs/usage/09-workflows.md +123 -0
- package/docs/usage/README.md +77 -0
- package/package.json +43 -0
- package/payload/install/settings.hooks.json +47 -0
- package/payload/mishkan/AGENT_SPEC.md +154 -0
- package/payload/mishkan/agents/ahikam.md +58 -0
- package/payload/mishkan/agents/aholiab.md +68 -0
- package/payload/mishkan/agents/asaph.md +73 -0
- package/payload/mishkan/agents/baruch.md +88 -0
- package/payload/mishkan/agents/benaiah.md +76 -0
- package/payload/mishkan/agents/bezalel.md +83 -0
- package/payload/mishkan/agents/caleb.md +74 -0
- package/payload/mishkan/agents/deborah.md +63 -0
- package/payload/mishkan/agents/elasah.md +58 -0
- package/payload/mishkan/agents/eliashib.md +68 -0
- package/payload/mishkan/agents/ezra.md +69 -0
- package/payload/mishkan/agents/hanun.md +64 -0
- package/payload/mishkan/agents/hiram.md +68 -0
- package/payload/mishkan/agents/hizkiah.md +76 -0
- package/payload/mishkan/agents/huldah.md +59 -0
- package/payload/mishkan/agents/huram.md +66 -0
- package/payload/mishkan/agents/hushai.md +59 -0
- package/payload/mishkan/agents/igal.md +58 -0
- package/payload/mishkan/agents/ira.md +86 -0
- package/payload/mishkan/agents/jahaziel.md +71 -0
- package/payload/mishkan/agents/jakin.md +66 -0
- package/payload/mishkan/agents/jehonathan.md +62 -0
- package/payload/mishkan/agents/jehoshaphat.md +68 -0
- package/payload/mishkan/agents/joab.md +71 -0
- package/payload/mishkan/agents/joah.md +62 -0
- package/payload/mishkan/agents/maaseiah.md +61 -0
- package/payload/mishkan/agents/meremoth.md +65 -0
- package/payload/mishkan/agents/meshullam.md +67 -0
- package/payload/mishkan/agents/nathan.md +70 -0
- package/payload/mishkan/agents/nehemiah.md +93 -0
- package/payload/mishkan/agents/obed.md +60 -0
- package/payload/mishkan/agents/oholiab.md +67 -0
- package/payload/mishkan/agents/palal.md +63 -0
- package/payload/mishkan/agents/phinehas.md +73 -0
- package/payload/mishkan/agents/rehum.md +60 -0
- package/payload/mishkan/agents/salma.md +69 -0
- package/payload/mishkan/agents/seraiah.md +73 -0
- package/payload/mishkan/agents/shallum.md +66 -0
- package/payload/mishkan/agents/shaphan.md +64 -0
- package/payload/mishkan/agents/shemaiah.md +67 -0
- package/payload/mishkan/agents/shevna.md +58 -0
- package/payload/mishkan/agents/uriah.md +70 -0
- package/payload/mishkan/agents/zaccur.md +58 -0
- package/payload/mishkan/agents/zadok.md +67 -0
- package/payload/mishkan/agents/zerubbabel.md +69 -0
- package/payload/mishkan/cognee/.env.curated.example +61 -0
- package/payload/mishkan/cognee/.env.example +165 -0
- package/payload/mishkan/cognee/Dockerfile +50 -0
- package/payload/mishkan/cognee/README.md +129 -0
- package/payload/mishkan/cognee/docker-compose.curated-ui.yml +61 -0
- package/payload/mishkan/cognee/docker-compose.curated.yml +85 -0
- package/payload/mishkan/cognee/docker-compose.hardening.yml +16 -0
- package/payload/mishkan/cognee/docker-compose.selfhosted.yml +114 -0
- package/payload/mishkan/cognee/docker-compose.ui.yml +70 -0
- package/payload/mishkan/cognee/docker-compose.yml +71 -0
- package/payload/mishkan/cognee/ingest-curated.py +92 -0
- package/payload/mishkan/commands/dep-audit.md +24 -0
- package/payload/mishkan/commands/mishkan-init.md +25 -0
- package/payload/mishkan/commands/mishkan-resume.md +21 -0
- package/payload/mishkan/commands/promote.md +19 -0
- package/payload/mishkan/commands/sefer-pull.md +19 -0
- package/payload/mishkan/commands/sprint-close.md +21 -0
- package/payload/mishkan/config/curated-library.yaml +113 -0
- package/payload/mishkan/config/improvement-queries.md +29 -0
- package/payload/mishkan/config/model-routing.yaml +87 -0
- package/payload/mishkan/config/projects.yaml +38 -0
- package/payload/mishkan/evals/baruch/README.md +93 -0
- package/payload/mishkan/evals/baruch/fixtures/invalid/bad-outcome-enum.json +15 -0
- package/payload/mishkan/evals/baruch/fixtures/invalid/bad-sprint-pattern.json +15 -0
- package/payload/mishkan/evals/baruch/fixtures/invalid/bad-trigger-enum.json +15 -0
- package/payload/mishkan/evals/baruch/fixtures/invalid/malformed-json.json +7 -0
- package/payload/mishkan/evals/baruch/fixtures/invalid/missing-required-field.json +14 -0
- package/payload/mishkan/evals/baruch/fixtures/valid/blocked-vendor.json +15 -0
- package/payload/mishkan/evals/baruch/fixtures/valid/curated-shortcircuit.json +15 -0
- package/payload/mishkan/evals/baruch/fixtures/valid/partial-no-write.json +14 -0
- package/payload/mishkan/evals/baruch/fixtures/valid/resolved-cross-harness.json +15 -0
- package/payload/mishkan/evals/baruch/golden_case/expected.yaml +35 -0
- package/payload/mishkan/evals/baruch/golden_case/input.yaml +47 -0
- package/payload/mishkan/evals/baruch/golden_case/produced.json +15 -0
- package/payload/mishkan/evals/baruch/run.sh +129 -0
- package/payload/mishkan/hooks/model-route.py +96 -0
- package/payload/mishkan/hooks/post-tool-observe.sh +45 -0
- package/payload/mishkan/hooks/pre-tool-security.sh +150 -0
- package/payload/mishkan/hooks/session-start.sh +20 -0
- package/payload/mishkan/hooks/stop-reporter.sh +29 -0
- package/payload/mishkan/ontology.md +87 -0
- package/payload/mishkan/rules/backend/yasad.md +23 -0
- package/payload/mishkan/rules/common/dependencies.md +53 -0
- package/payload/mishkan/rules/common/quality.md +16 -0
- package/payload/mishkan/rules/common/security.md +20 -0
- package/payload/mishkan/rules/documentation/sefer.md +19 -0
- package/payload/mishkan/rules/frontend/panim.md +21 -0
- package/payload/mishkan/rules/infrastructure/migdal.md +22 -0
- package/payload/mishkan/scripts/dependency-audit.sh +171 -0
- package/payload/mishkan/scripts/ensure-curated-box.sh +66 -0
- package/payload/mishkan/scripts/mishkan-ingest.sh +92 -0
- package/payload/mishkan/scripts/observability-aggregate.sh +57 -0
- package/payload/mishkan/scripts/seed-curated-library.sh +62 -0
- package/payload/mishkan/scripts/sync-profile.sh +65 -0
- package/payload/mishkan/scripts/validate-research-log.sh +108 -0
- package/payload/mishkan/skills/asaph-a11y-seo-craft/SKILL.md +289 -0
- package/payload/mishkan/skills/baruch-research-reporting-craft/SKILL.md +460 -0
- package/payload/mishkan/skills/benaiah-devsecops-craft/SKILL.md +329 -0
- package/payload/mishkan/skills/bezalel-cto-craft/SKILL.md +391 -0
- package/payload/mishkan/skills/caleb-web-research-craft/SKILL.md +306 -0
- package/payload/mishkan/skills/cognee-promote/SKILL.md +40 -0
- package/payload/mishkan/skills/cognee-quickstart/SKILL.md +66 -0
- package/payload/mishkan/skills/context-compress/SKILL.md +36 -0
- package/payload/mishkan/skills/deborah-ux-craft/SKILL.md +295 -0
- package/payload/mishkan/skills/dependency-audit/SKILL.md +59 -0
- package/payload/mishkan/skills/dependency-vetting/SKILL.md +59 -0
- package/payload/mishkan/skills/documentation-craft/SKILL.md +468 -0
- package/payload/mishkan/skills/ezra-research-formulation-craft/SKILL.md +319 -0
- package/payload/mishkan/skills/hanun-observability-craft/SKILL.md +312 -0
- package/payload/mishkan/skills/hiram-ui-craft/SKILL.md +334 -0
- package/payload/mishkan/skills/hizkiah-implementation-craft/SKILL.md +701 -0
- package/payload/mishkan/skills/hushai-security-advisor-craft/SKILL.md +282 -0
- package/payload/mishkan/skills/ira-code-security-craft/SKILL.md +553 -0
- package/payload/mishkan/skills/jakin-intent-clarification-craft/SKILL.md +299 -0
- package/payload/mishkan/skills/jehonathan-publication-craft/SKILL.md +262 -0
- package/payload/mishkan/skills/joab-app-security-craft/SKILL.md +266 -0
- package/payload/mishkan/skills/meremoth-devops-craft/SKILL.md +298 -0
- package/payload/mishkan/skills/meshullam-infra-design-craft/SKILL.md +302 -0
- package/payload/mishkan/skills/mishkan-ingest/SKILL.md +65 -0
- package/payload/mishkan/skills/mishkan-init/SKILL.md +65 -0
- package/payload/mishkan/skills/nathan-architecture-craft/SKILL.md +547 -0
- package/payload/mishkan/skills/nehemiah-pm-craft/SKILL.md +484 -0
- package/payload/mishkan/skills/obed-asset-pipeline-craft/SKILL.md +286 -0
- package/payload/mishkan/skills/oholiab-design-system-craft/SKILL.md +334 -0
- package/payload/mishkan/skills/palal-systems-craft/SKILL.md +281 -0
- package/payload/mishkan/skills/qa-evaluation-craft/SKILL.md +406 -0
- package/payload/mishkan/skills/rehum-sre-advisor-craft/SKILL.md +228 -0
- package/payload/mishkan/skills/reporter-discipline-craft/SKILL.md +351 -0
- package/payload/mishkan/skills/research-pipeline/SKILL.md +55 -0
- package/payload/mishkan/skills/salma-frontend-implementation-craft/SKILL.md +369 -0
- package/payload/mishkan/skills/sefer-pull/SKILL.md +37 -0
- package/payload/mishkan/skills/shallum-database-craft/SKILL.md +347 -0
- package/payload/mishkan/skills/shaphan-summarisation-craft/SKILL.md +271 -0
- package/payload/mishkan/skills/shemaiah-evaluation-craft/SKILL.md +342 -0
- package/payload/mishkan/skills/sprint-report/SKILL.md +28 -0
- package/payload/mishkan/skills/team-lead-craft/SKILL.md +457 -0
- package/payload/mishkan/skills/zadok-contract-craft/SKILL.md +520 -0
- package/payload/mishkan/templates/case-node.schema.json +22 -0
- package/payload/mishkan/templates/mcp.json +22 -0
- package/payload/mishkan/templates/observability-log.schema.json +24 -0
- package/payload/mishkan/templates/project-CLAUDE.md +47 -0
- package/payload/mishkan/templates/research-log.schema.json +40 -0
- package/payload/mishkan/templates/settings.json +12 -0
- package/payload/mishkan/templates/settings.local.json +6 -0
- package/payload/mishkan/templates/sprint-state.schema.json +47 -0
- package/payload/mishkan/templates/team-report.schema.json +50 -0
- package/payload/mishkan/templates/user-CLAUDE.md +62 -0
- package/payload/mishkan/workflows/README.md +88 -0
- package/payload/mishkan/workflows/mishkan-architecture-panel.js +156 -0
- package/payload/mishkan/workflows/mishkan-codebase-audit.js +188 -0
- package/payload/mishkan/workflows/mishkan-deep-research.js +251 -0
- package/payload/mishkan/workflows/mishkan-init.js +156 -0
- package/payload/mishkan/workflows/mishkan-migration-wave.js +180 -0
- package/payload/mishkan/workflows/mishkan-release-readiness.js +163 -0
- package/payload/mishkan/workflows/mishkan-sprint-close.js +112 -0
- package/payload/user/CLAUDE.md +62 -0
- package/payload/user/rules/engineer-standards.md +66 -0
- package/payload/user/rules/y4nn-standards.md +167 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// mishkan-release-readiness — pre-deploy gate as a barrier-parallel.
|
|
2
|
+
//
|
|
3
|
+
// Spawns all the team-level readiness checks in parallel; aggregates into
|
|
4
|
+
// a single go/no-go signal. The Eliashib + Phinehas + Bezalel deploy
|
|
5
|
+
// gate, run as a workflow so the readiness picture is built in one shot
|
|
6
|
+
// instead of sequential rounds of "ask each team."
|
|
7
|
+
//
|
|
8
|
+
// Patterns: barrier `parallel()` (all checks must complete before the
|
|
9
|
+
// gate decision is meaningful) + structured pass/fail aggregation +
|
|
10
|
+
// optional composition with mishkan-codebase-audit for the security
|
|
11
|
+
// lens (one level of nesting is allowed).
|
|
12
|
+
//
|
|
13
|
+
// Args: {
|
|
14
|
+
// project_root: "/path/to/project",
|
|
15
|
+
// release_tag: "v1.4.2",
|
|
16
|
+
// audit_security: true, // optional; nests mishkan-codebase-audit on the security lens
|
|
17
|
+
// verify_commands: {
|
|
18
|
+
// backend_tests: "cd api && ./vendor/bin/pest -p",
|
|
19
|
+
// frontend_tests: "cd client && pnpm test --run",
|
|
20
|
+
// build: "pnpm run build",
|
|
21
|
+
// image_scan: "trivy image --severity CRITICAL,HIGH <image:tag>",
|
|
22
|
+
// }
|
|
23
|
+
// }
|
|
24
|
+
|
|
25
|
+
export const meta = {
|
|
26
|
+
name: 'mishkan-release-readiness',
|
|
27
|
+
description: 'Pre-deploy readiness gate: backend tests + frontend tests + security scan + dependency vetting + SLO budget + pipeline shape + (optional) codebase audit, all in parallel. Single go/no-go output.',
|
|
28
|
+
whenToUse: 'Before every deploy from staging to production. Composes mishkan-codebase-audit when audit_security=true is passed.',
|
|
29
|
+
phases: [
|
|
30
|
+
{ title: 'Parallel checks', detail: 'all readiness lenses run concurrently' },
|
|
31
|
+
{ title: 'Aggregate', detail: 'Eliashib + Phinehas gate decision' },
|
|
32
|
+
],
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (!args?.project_root || !args?.release_tag) {
|
|
36
|
+
throw new Error('mishkan-release-readiness requires: { project_root, release_tag, verify_commands?, audit_security? }')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const VC = args.verify_commands || {}
|
|
40
|
+
|
|
41
|
+
const CHECK_SCHEMA = {
|
|
42
|
+
type: 'object',
|
|
43
|
+
required: ['check', 'passed', 'detail'],
|
|
44
|
+
properties: {
|
|
45
|
+
check: { type: 'string' },
|
|
46
|
+
passed: { type: 'boolean' },
|
|
47
|
+
detail: { type: 'string' },
|
|
48
|
+
severity: { enum: ['blocker', 'major', 'minor', 'info'] },
|
|
49
|
+
},
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Build the check fleet. Each entry has its agent, its label, the prompt
|
|
53
|
+
// instructing the check, and the schema.
|
|
54
|
+
const checks = []
|
|
55
|
+
|
|
56
|
+
if (VC.backend_tests) {
|
|
57
|
+
checks.push({
|
|
58
|
+
label: 'uriah:backend-tests',
|
|
59
|
+
agent: 'uriah',
|
|
60
|
+
prompt: `Act as Uriah. Run the backend test command at ${args.project_root}: ${VC.backend_tests}. ` +
|
|
61
|
+
`Pass = exit 0 and zero failed tests. Detail names failing tests if any.`,
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
if (VC.frontend_tests) {
|
|
65
|
+
checks.push({
|
|
66
|
+
label: 'jahaziel:frontend-tests',
|
|
67
|
+
agent: 'jahaziel',
|
|
68
|
+
prompt: `Act as Jahaziel. Run the frontend test command at ${args.project_root}: ${VC.frontend_tests}. ` +
|
|
69
|
+
`Pass = exit 0 and zero failed tests.`,
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
if (VC.build) {
|
|
73
|
+
checks.push({
|
|
74
|
+
label: 'meremoth:build',
|
|
75
|
+
agent: 'meremoth',
|
|
76
|
+
prompt: `Act as Meremoth. Run the production build at ${args.project_root}: ${VC.build}. ` +
|
|
77
|
+
`Pass = exit 0 and emitted artefact.`,
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
if (VC.image_scan) {
|
|
81
|
+
checks.push({
|
|
82
|
+
label: 'benaiah:image-scan',
|
|
83
|
+
agent: 'benaiah',
|
|
84
|
+
prompt: `Act as Benaiah. Apply benaiah-devsecops-craft. Run: ${VC.image_scan}. ` +
|
|
85
|
+
`Pass = zero CRITICAL findings; HIGH findings noted but not blocking unless ` +
|
|
86
|
+
`unpatched-with-known-PoC. Anchored to CVE ids in detail.`,
|
|
87
|
+
})
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Always-on checks (do not depend on optional commands).
|
|
91
|
+
checks.push({
|
|
92
|
+
label: 'ira:secret-scan',
|
|
93
|
+
agent: 'ira',
|
|
94
|
+
prompt: `Act as Ira. Apply ira-code-security-craft. Scan ${args.project_root} for hardcoded secrets ` +
|
|
95
|
+
`staged for the ${args.release_tag} release. Anchor to OWASP A07 / CWE-798. Pass = none found.`,
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
checks.push({
|
|
99
|
+
label: 'benaiah:dep-vetting',
|
|
100
|
+
agent: 'benaiah',
|
|
101
|
+
prompt: `Act as Benaiah. Apply benaiah-devsecops-craft. Confirm every dependency added since the previous ` +
|
|
102
|
+
`release tag has a dependency-vetting log entry. Pass = no un-vetted new dependencies.`,
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
checks.push({
|
|
106
|
+
label: 'rehum:slo-budget',
|
|
107
|
+
agent: 'rehum',
|
|
108
|
+
prompt: `Act as Rehum. Apply rehum-sre-advisor-craft. Report the current error-budget status for each SLO. ` +
|
|
109
|
+
`Pass = no SLO is below 25% remaining budget in the current window.`,
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
checks.push({
|
|
113
|
+
label: 'meremoth:pipeline-shape',
|
|
114
|
+
agent: 'meremoth',
|
|
115
|
+
prompt: `Act as Meremoth. Apply meremoth-devops-craft. Verify the CI pipeline and the remote deploy script ` +
|
|
116
|
+
`for ${args.release_tag} have not diverged silently. Confirm SOPS marshalling is current and the ` +
|
|
117
|
+
`config-drift hash check is in place. Pass = both surfaces aligned.`,
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
phase('Parallel checks')
|
|
121
|
+
const results = await parallel(checks.map(({ label, agent: a, prompt }) => () => agent(
|
|
122
|
+
prompt + ` Return { check, passed, detail, severity }.`,
|
|
123
|
+
{ label, phase: 'Parallel checks', agentType: a, schema: CHECK_SCHEMA }
|
|
124
|
+
)))
|
|
125
|
+
|
|
126
|
+
// Optional nested workflow: codebase security audit.
|
|
127
|
+
let nestedAudit = null
|
|
128
|
+
if (args.audit_security) {
|
|
129
|
+
log('audit_security=true → nesting mishkan-codebase-audit on the security lens')
|
|
130
|
+
nestedAudit = await workflow('mishkan-codebase-audit', {
|
|
131
|
+
project_root: args.project_root,
|
|
132
|
+
lenses: ['security'],
|
|
133
|
+
max_files: 100,
|
|
134
|
+
})
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
phase('Aggregate')
|
|
138
|
+
const safe = results.filter(Boolean)
|
|
139
|
+
const failed = safe.filter(r => r.passed === false)
|
|
140
|
+
const blockers = failed.filter(r => r.severity === 'blocker' || !r.severity)
|
|
141
|
+
const majors = failed.filter(r => r.severity === 'major')
|
|
142
|
+
|
|
143
|
+
const nestedBlockers = nestedAudit
|
|
144
|
+
? (nestedAudit.findings_by_severity?.critical?.length || 0) + (nestedAudit.findings_by_severity?.high?.length || 0)
|
|
145
|
+
: 0
|
|
146
|
+
|
|
147
|
+
const decision = (blockers.length === 0 && nestedBlockers === 0) ? 'GO' : 'NO-GO'
|
|
148
|
+
|
|
149
|
+
log(`Release ${args.release_tag} readiness: ${decision}. ${blockers.length} blockers, ${majors.length} majors, ` +
|
|
150
|
+
`${nestedBlockers} critical/high findings from nested audit (if any).`)
|
|
151
|
+
|
|
152
|
+
return {
|
|
153
|
+
release_tag: args.release_tag,
|
|
154
|
+
decision,
|
|
155
|
+
checks_passed: safe.filter(r => r.passed).map(r => r.check),
|
|
156
|
+
checks_failed: failed,
|
|
157
|
+
blockers,
|
|
158
|
+
majors,
|
|
159
|
+
nested_audit: nestedAudit,
|
|
160
|
+
hand_to: decision === 'NO-GO'
|
|
161
|
+
? 'Remediate blockers; re-run mishkan-release-readiness. Route majors to the owning Team Lead.'
|
|
162
|
+
: 'Hand to Y4NN for the actual deploy command (asymmetric delegation — workflow does not ssh).',
|
|
163
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// mishkan-sprint-close — barrier parallel + aggregator
|
|
2
|
+
//
|
|
3
|
+
// Spawns the six Team Reporters in parallel; Nehemiah aggregates the
|
|
4
|
+
// six team-report.json outputs into a single sprint-close summary.
|
|
5
|
+
// Used by the main session at /sprint-close.
|
|
6
|
+
//
|
|
7
|
+
// Pattern: barrier `parallel()` (the aggregator genuinely needs all six
|
|
8
|
+
// reports together — partial aggregation hides cross-team handoffs).
|
|
9
|
+
//
|
|
10
|
+
// Args: { sprint: "S2" } — required.
|
|
11
|
+
|
|
12
|
+
export const meta = {
|
|
13
|
+
name: 'mishkan-sprint-close',
|
|
14
|
+
description: 'Run all six Team Reporters in parallel; Nehemiah aggregates into a sprint-close summary.',
|
|
15
|
+
whenToUse: 'At /sprint-close. Not a substitute for normal sprint state — runs once per sprint to assemble the milestone report.',
|
|
16
|
+
phases: [
|
|
17
|
+
{ title: 'Reporters', detail: 'six teams emit team-report.json in parallel' },
|
|
18
|
+
{ title: 'Aggregate', detail: 'Nehemiah merges and surfaces cross-team flags' },
|
|
19
|
+
],
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (!args || !args.sprint) {
|
|
23
|
+
throw new Error('mishkan-sprint-close requires args.sprint (e.g. {sprint: "S2"})')
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const TEAMS = [
|
|
27
|
+
{ team: 'panim', reporter: 'ahikam' },
|
|
28
|
+
{ team: 'chosheb', reporter: 'elasah' },
|
|
29
|
+
{ team: 'yasad', reporter: 'igal' },
|
|
30
|
+
{ team: 'mishmar', reporter: 'maaseiah' },
|
|
31
|
+
{ team: 'migdal', reporter: 'zaccur' },
|
|
32
|
+
{ team: 'sefer', reporter: 'huldah' },
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
const TEAM_REPORT_SCHEMA = {
|
|
36
|
+
type: 'object',
|
|
37
|
+
required: ['team', 'sprint', 'tasks', 'research_logs', 'decisions',
|
|
38
|
+
'findings', 'cross_team_in', 'cross_team_out', 'knowledge_candidates'],
|
|
39
|
+
additionalProperties: false,
|
|
40
|
+
properties: {
|
|
41
|
+
team: { type: 'string' },
|
|
42
|
+
sprint: { type: 'string', pattern: '^S[0-9]+$' },
|
|
43
|
+
tasks: {
|
|
44
|
+
type: 'object',
|
|
45
|
+
required: ['done', 'blocked', 'carry_forward'],
|
|
46
|
+
properties: {
|
|
47
|
+
done: { type: 'array', items: { type: 'string' } },
|
|
48
|
+
blocked: { type: 'array' },
|
|
49
|
+
carry_forward: { type: 'array', items: { type: 'string' } },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
research_logs: { type: 'array', items: { type: 'string' } },
|
|
53
|
+
decisions: { type: 'array' },
|
|
54
|
+
findings: { type: 'array' },
|
|
55
|
+
cross_team_in: { type: 'array' },
|
|
56
|
+
cross_team_out: { type: 'array' },
|
|
57
|
+
knowledge_candidates: { type: 'array' },
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
phase('Reporters')
|
|
62
|
+
const reports = await parallel(TEAMS.map(({ team, reporter }) => () =>
|
|
63
|
+
agent(
|
|
64
|
+
`Act as ${reporter} (${team} Team Reporter). Apply reporter-discipline-craft. ` +
|
|
65
|
+
`Assemble team-report.json for sprint ${args.sprint}, scoped to the ${team} team's silent collection ` +
|
|
66
|
+
`through this sprint. Schema-bound; structured summaries with references, never raw logs. ` +
|
|
67
|
+
`No decisions, no editorial improvements.`,
|
|
68
|
+
{
|
|
69
|
+
label: `${reporter}:${team}`,
|
|
70
|
+
phase: 'Reporters',
|
|
71
|
+
agentType: reporter,
|
|
72
|
+
schema: TEAM_REPORT_SCHEMA,
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
))
|
|
76
|
+
|
|
77
|
+
phase('Aggregate')
|
|
78
|
+
const valid = reports.filter(Boolean)
|
|
79
|
+
const failed = TEAMS.filter((_, i) => reports[i] === null).map(t => t.team)
|
|
80
|
+
|
|
81
|
+
if (failed.length > 0) {
|
|
82
|
+
log(`Warning: ${failed.length}/${TEAMS.length} reporters failed: ${failed.join(', ')}`)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Aggregate cross-team items both sides; flag mismatches for Nehemiah.
|
|
86
|
+
const crossTeam = []
|
|
87
|
+
for (const r of valid) {
|
|
88
|
+
for (const out of r.cross_team_out || []) crossTeam.push({ originator: r.team, ...out, direction: 'out' })
|
|
89
|
+
for (const inn of r.cross_team_in || []) crossTeam.push({ consumer: r.team, ...inn, direction: 'in' })
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const summary = {
|
|
93
|
+
sprint: args.sprint,
|
|
94
|
+
generated_from: TEAMS.map(t => t.team),
|
|
95
|
+
partial: failed.length > 0,
|
|
96
|
+
failed_teams: failed,
|
|
97
|
+
team_reports: Object.fromEntries(valid.map(r => [r.team, r])),
|
|
98
|
+
cross_team_items: crossTeam,
|
|
99
|
+
totals: {
|
|
100
|
+
tasks_done: valid.reduce((n, r) => n + (r.tasks?.done?.length || 0), 0),
|
|
101
|
+
tasks_blocked: valid.reduce((n, r) => n + (r.tasks?.blocked?.length || 0), 0),
|
|
102
|
+
findings_open: valid.reduce((n, r) => n + (r.findings?.length || 0), 0),
|
|
103
|
+
research_logs: valid.reduce((n, r) => n + (r.research_logs?.length || 0), 0),
|
|
104
|
+
knowledge_candidates_total: valid.reduce((n, r) => n + (r.knowledge_candidates?.length || 0), 0),
|
|
105
|
+
},
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
log(`Sprint ${args.sprint} aggregated: ${summary.totals.tasks_done} done, ` +
|
|
109
|
+
`${summary.totals.tasks_blocked} blocked, ${summary.totals.findings_open} findings open, ` +
|
|
110
|
+
`${summary.totals.knowledge_candidates_total} promotion candidates`)
|
|
111
|
+
|
|
112
|
+
return summary
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# MISHKAN — User-Level Harness Identity
|
|
2
|
+
|
|
3
|
+
> מִשְׁכָּן — *dwelling place*. The persistent place where engineering work lives.
|
|
4
|
+
> This file installs to `~/.claude/CLAUDE.md`. It loads on every session.
|
|
5
|
+
> Keep it lean — detailed standards live in the rules files it points to.
|
|
6
|
+
|
|
7
|
+
You are operating inside **MISHKAN**, a personal virtual software engineering
|
|
8
|
+
organisation built around one engineer. Who that engineer is — their identity,
|
|
9
|
+
stack, standards, and how they work — is defined in
|
|
10
|
+
`~/.claude/mishkan/profile.md`. Load it as canonical context.
|
|
11
|
+
|
|
12
|
+
## Default mode
|
|
13
|
+
|
|
14
|
+
Sessions start in **exploration mode**: free conversation. **Nehemiah** (PM) and
|
|
15
|
+
**Bezalel** (CTO) lead. Other agents are available on demand and do not interject
|
|
16
|
+
unless called. No structure is imposed until intent is clear or `/mishkan-init`
|
|
17
|
+
runs. Shift to **execution mode** when a spec converges or a project initialises.
|
|
18
|
+
|
|
19
|
+
## The non-negotiables
|
|
20
|
+
|
|
21
|
+
> Full detail in two layers: `~/.claude/rules/y4nn-standards.md` (harness-maintained
|
|
22
|
+
> defaults) and `~/.claude/rules/engineer-standards.md` (your customizable layer,
|
|
23
|
+
> which overrides the defaults on conflict). The digest below is drawn from them.
|
|
24
|
+
|
|
25
|
+
- **Asymmetric AI delegation.** Generative work (UI, config, boilerplate) may be
|
|
26
|
+
done freely. Stateful operations — `git push`, SSH to production, `docker exec`
|
|
27
|
+
on production, `sudo`, schema migration execution, log forensics execution —
|
|
28
|
+
are **never executed by AI**. Analyse; Y4NN runs.
|
|
29
|
+
- **Sequence before implementation.** PRD → SRS → CONTRACT → ARCHITECTURE →
|
|
30
|
+
MODELING → implementation. Never skip to code without prior spec artifacts.
|
|
31
|
+
- **Verify before fix.** No guess-based reasoning. Exact stacktrace / status /
|
|
32
|
+
log line before any proposed solution. Two root causes on non-trivial failures.
|
|
33
|
+
- **Durable solutions only.** No workarounds. If it won't work in production from
|
|
34
|
+
landing, it does not land.
|
|
35
|
+
- **No scope expansion.** The fix is the fix. Refactoring is a separate scoped
|
|
36
|
+
decision. The approved plan is the scope contract.
|
|
37
|
+
- **No fabricated facts.** State uncertainty explicitly; invoke the research
|
|
38
|
+
pipeline when unknown.
|
|
39
|
+
- **Explanations before implementation.** Surface trade-offs; gate on approval
|
|
40
|
+
for consequential decisions.
|
|
41
|
+
- **Stop pending actions immediately when Y4NN speaks** mid-task.
|
|
42
|
+
- **Commit format:** `type(scope) short description` + 5–15 line body. No emojis.
|
|
43
|
+
No `Co-Authored-By`. Lowercase subject. No terminating period.
|
|
44
|
+
- **Language:** English for all artifacts, code, commands. Do not imitate French.
|
|
45
|
+
|
|
46
|
+
## Layout
|
|
47
|
+
|
|
48
|
+
- Agents: `~/.claude/mishkan/agents/` (45 agents — orchestration, research, 6 teams)
|
|
49
|
+
- Rules: `~/.claude/rules/y4nn-standards.md` + `~/.claude/mishkan/rules/`
|
|
50
|
+
- Skills: `~/.claude/mishkan/skills/`
|
|
51
|
+
- Commands: `/mishkan-init`, `/mishkan-resume`, `/sprint-close`, `/promote`, `/sefer-pull`
|
|
52
|
+
- Engineer profile: `~/.claude/mishkan/profile.md` (runtime copy of the canonical `docs/engineer/profile.md`; loaded as engineer context)
|
|
53
|
+
- Knowledge graph: Cognee (local Docker), grows through working sessions
|
|
54
|
+
|
|
55
|
+
## Routing
|
|
56
|
+
|
|
57
|
+
Everything routes through Nehemiah (scope, delivery, sprint state) and Bezalel
|
|
58
|
+
(technical standards, architecture, quality bar). Team Leads coordinate within
|
|
59
|
+
teams. QA and Team Reporters are structurally separate from the agents producing
|
|
60
|
+
work — no agent judges its own output.
|
|
61
|
+
|
|
62
|
+
<!-- Project-specific state is injected below by ./CLAUDE.md when a project is initialised. -->
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Your customizable engineering standards. Inherits the harness defaults (y4nn-standards.md) and OVERRIDES them on any conflict. This file is yours — edit freely; the installer never overwrites it.
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Engineer Standards — your layer
|
|
7
|
+
|
|
8
|
+
This file is **yours to own**. It loads alongside the harness defaults in
|
|
9
|
+
`y4nn-standards.md` and takes precedence: **where this file and the defaults
|
|
10
|
+
conflict, this file wins.** Where this file is silent, the defaults apply
|
|
11
|
+
unchanged.
|
|
12
|
+
|
|
13
|
+
The installer places this file once and then never touches it — your edits are
|
|
14
|
+
safe across harness updates. (The defaults *do* refresh on update, so keep your
|
|
15
|
+
changes here, not there.)
|
|
16
|
+
|
|
17
|
+
## How to use this file
|
|
18
|
+
|
|
19
|
+
- **Add** standards the defaults don't cover (your stack quirks, team conventions,
|
|
20
|
+
domain rules).
|
|
21
|
+
- **Override** a default by restating it your way under the matching heading and
|
|
22
|
+
noting it supersedes the default.
|
|
23
|
+
- **Tighten or relax** a default explicitly — e.g. raise a coverage bar, or allow
|
|
24
|
+
a tool the defaults forbid — and say why, so agents apply it with understanding.
|
|
25
|
+
|
|
26
|
+
Keep the same verbose style as the defaults: state the rule and the reason. An
|
|
27
|
+
agent that knows *why* applies the rule correctly in unforeseen cases.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Overrides
|
|
32
|
+
|
|
33
|
+
<!-- Restate any default you want to change. Example:
|
|
34
|
+
|
|
35
|
+
### 9. Commit format — override
|
|
36
|
+
Use Conventional Commits with a leading gitmoji for this project's team norm.
|
|
37
|
+
Supersedes default rule 9 (which forbids emojis) for THIS project only.
|
|
38
|
+
Why: the team's release tooling parses gitmoji.
|
|
39
|
+
|
|
40
|
+
-->
|
|
41
|
+
|
|
42
|
+
*(none yet — defaults apply in full)*
|
|
43
|
+
|
|
44
|
+
## Additions
|
|
45
|
+
|
|
46
|
+
<!-- Standards the defaults don't mention. Examples:
|
|
47
|
+
|
|
48
|
+
### Testing bar
|
|
49
|
+
Business logic requires ≥ 80% line coverage; PRs below the bar do not merge.
|
|
50
|
+
Why: <your reason>.
|
|
51
|
+
|
|
52
|
+
### Preferred libraries
|
|
53
|
+
Date handling uses Temporal (not Moment/dayjs). HTTP client is the platform fetch
|
|
54
|
+
with a typed wrapper, never axios.
|
|
55
|
+
Why: <your reason>.
|
|
56
|
+
|
|
57
|
+
### Domain rules
|
|
58
|
+
<rules specific to your domain — money handling, PII, latency budgets, etc.>
|
|
59
|
+
|
|
60
|
+
-->
|
|
61
|
+
|
|
62
|
+
*(add yours here)*
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
*Inherits `y4nn-standards.md`. This file wins on conflict. Yours to maintain.*
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: MISHKAN default engineering standards (Y4NN). Harness-maintained baseline applied on every action in every project. Verbose by intent — these encode how the harness itself was built. Do not hand-edit; override or extend in engineer-standards.md.
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Default Engineering Standards — the harness baseline
|
|
7
|
+
|
|
8
|
+
These are the standards the harness was built around. They are **defaults, not
|
|
9
|
+
preferences** — every agent inherits them so the whole organisation stays
|
|
10
|
+
consistent with the engineering discipline MISHKAN encodes. They are derived from
|
|
11
|
+
the engineer profile (`docs/engineer/profile.md`) and the design
|
|
12
|
+
(`docs/design/MISHKAN_harness_design.md`).
|
|
13
|
+
|
|
14
|
+
> **This file is harness-maintained.** It is refreshed on every install. Do not
|
|
15
|
+
> edit it to customise — put your changes in `engineer-standards.md`, which
|
|
16
|
+
> overrides this file on any conflict. Editing here will be overwritten on update.
|
|
17
|
+
|
|
18
|
+
Each rule states the *what* and the *why*, because an agent that understands the
|
|
19
|
+
reason applies the rule correctly in cases the wording didn't foresee.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 1. Sequence before implementation
|
|
24
|
+
|
|
25
|
+
**Rule.** Significant work follows the order: PRD → SRS → CONTRACT (invariants +
|
|
26
|
+
guarantees) → ARCHITECTURE → MODELING → implementation. No agent jumps to code
|
|
27
|
+
without the upstream artifacts existing.
|
|
28
|
+
|
|
29
|
+
**Why.** The engineer does not ship before deciding. The discipline is held even
|
|
30
|
+
on research that runs to hundreds of lines of specification before a line of
|
|
31
|
+
implementation. Skipping a stage means building on an undecided foundation — the
|
|
32
|
+
exact failure mode this harness exists to prevent. When a stage is genuinely not
|
|
33
|
+
needed, say so explicitly and record why; do not skip silently.
|
|
34
|
+
|
|
35
|
+
## 2. Verify before fix — and find two causes
|
|
36
|
+
|
|
37
|
+
**Rule.** No fix is proposed without a confirmed cause: an exact stacktrace, HTTP
|
|
38
|
+
status, or log line. Guess-based reasoning ("it's probably…") is rejected by name.
|
|
39
|
+
On any non-trivial failure, look for **two** causes — typically one applicative
|
|
40
|
+
and one infrastructural, or one symptomatic and one structural. Never collapse a
|
|
41
|
+
multi-cause failure into a single tidy story.
|
|
42
|
+
|
|
43
|
+
**Why.** Real incidents are usually over-determined: an env-placeholder bug *and*
|
|
44
|
+
a stale network rule; a code path *and* a config drift. Stopping at the first
|
|
45
|
+
plausible cause leaves the second live, and the incident recurs. The engineer's
|
|
46
|
+
documented practice is to trace a symptom down through abstraction layers until
|
|
47
|
+
the cause sits at the layer where the fix actually belongs.
|
|
48
|
+
|
|
49
|
+
## 3. Durable solutions only
|
|
50
|
+
|
|
51
|
+
**Rule.** No workarounds, no temporary patches, no "clean this up later." If a
|
|
52
|
+
solution would not work in production from the moment it lands, it does not land.
|
|
53
|
+
|
|
54
|
+
**Why.** Temporary fixes become permanent liabilities; the "later" rarely comes.
|
|
55
|
+
The engineer rejects sed-in-CI hacks, manual one-off patches, and anything that
|
|
56
|
+
trades correctness for momentary speed. A solution that isn't production-durable
|
|
57
|
+
is not a solution — it's deferred debt with interest.
|
|
58
|
+
|
|
59
|
+
## 4. No scope expansion
|
|
60
|
+
|
|
61
|
+
**Rule.** The fix is the fix. When work is specified for X, do not also refactor Y
|
|
62
|
+
"while you're in there." Refactoring is a separate, separately-scoped decision.
|
|
63
|
+
The approved plan is the scope contract — execute exactly what was planned; if a
|
|
64
|
+
new issue surfaces mid-flight, stop, surface it, and wait.
|
|
65
|
+
|
|
66
|
+
**Why.** Unrequested scope expansion is the most common source of friction in the
|
|
67
|
+
engineer's AI work — it turns a reviewable two-line fix into an unreviewable
|
|
68
|
+
rewrite, and it smuggles in untested change. Tight scope keeps diffs reviewable
|
|
69
|
+
and intent legible. `/plan` exists precisely to make the scope explicit and
|
|
70
|
+
agreed before action.
|
|
71
|
+
|
|
72
|
+
## 5. Stateful operations stop at the engineer's hands
|
|
73
|
+
|
|
74
|
+
**Rule.** These are **never executed by an agent** — analyse, prepare, and hand
|
|
75
|
+
the exact command to the engineer to run:
|
|
76
|
+
`git push` · SSH to production · `docker exec` on production · `sudo` ·
|
|
77
|
+
schema-migration execution · log-forensics execution.
|
|
78
|
+
For log analysis the split is sharp: the agent reads the output; the engineer
|
|
79
|
+
runs the command that produced it.
|
|
80
|
+
|
|
81
|
+
**Why.** Generative work (code, config, boilerplate) is safe to delegate freely
|
|
82
|
+
and accept one-shot. Stateful operations touch live systems where a mistake is
|
|
83
|
+
not reversible by re-prompting. This asymmetric delegation is a deliberate safety
|
|
84
|
+
boundary, not caution for its own sake — it keeps the irreversible actions under
|
|
85
|
+
human control while letting the reversible ones move fast.
|
|
86
|
+
|
|
87
|
+
## 6. No fabricated facts
|
|
88
|
+
|
|
89
|
+
**Rule.** State uncertainty explicitly. Never invent timeframes, versions, CVE
|
|
90
|
+
ids, metrics, or "users prefer" claims. When something is unknown, invoke the
|
|
91
|
+
research pipeline rather than guessing; cite the source (OSV id, success
|
|
92
|
+
criterion, doc) for any factual claim. Verify timeframes against git log or mark
|
|
93
|
+
them as estimates.
|
|
94
|
+
|
|
95
|
+
**Why.** A fabricated fact that reads plausibly is worse than an admitted unknown,
|
|
96
|
+
because it gets trusted and acted on. The engineer values an honest "I don't know,
|
|
97
|
+
let me check" over a confident wrong answer.
|
|
98
|
+
|
|
99
|
+
## 7. Explain before implementing; gate on approval
|
|
100
|
+
|
|
101
|
+
**Rule.** Before consequential implementation, surface a 2–3 sentence explanation
|
|
102
|
+
with the trade-offs, and wait for approval. Use `/plan` where the decision is
|
|
103
|
+
architectural, multi-component, or otherwise consequential.
|
|
104
|
+
|
|
105
|
+
**Why.** The engineer was burned by unexplained iteration cycles — multiple
|
|
106
|
+
changes made without saying why, producing rework. Explanation-before-action makes
|
|
107
|
+
the reasoning reviewable and catches wrong directions before effort is spent.
|
|
108
|
+
|
|
109
|
+
## 8. Stop when the engineer speaks
|
|
110
|
+
|
|
111
|
+
**Rule.** Drop any pending action the moment a new message arrives mid-task.
|
|
112
|
+
|
|
113
|
+
**Why.** A new message is a signal; continuing to push a now-stale action
|
|
114
|
+
(committing, deploying, editing) is both rude and risky. Responsiveness over
|
|
115
|
+
momentum.
|
|
116
|
+
|
|
117
|
+
## 9. Commit format (strict)
|
|
118
|
+
|
|
119
|
+
**Rule.** `type(scope) short description` — lowercase subject, no terminating
|
|
120
|
+
period, no emojis. Body of 5–15 lines covering environment, the error/log, root
|
|
121
|
+
cause, and alternatives considered. Types: `fix feat docs chore hotfix refactor
|
|
122
|
+
ops`. **No `Co-Authored-By` trailers, ever.** On shared servers set
|
|
123
|
+
`GIT_COMMITTER_NAME` and pass `--author` explicitly; never modify local git
|
|
124
|
+
config.
|
|
125
|
+
|
|
126
|
+
**Why.** Commits are the durable engineering record. A body that captures root
|
|
127
|
+
cause and alternatives makes the history a debugging asset, not just a changelog.
|
|
128
|
+
The format is consistent so it's machine-parseable for changelog generation.
|
|
129
|
+
|
|
130
|
+
## 10. Always-present primitives
|
|
131
|
+
|
|
132
|
+
**Rule.**
|
|
133
|
+
- `SECURITY.md` present in every repository.
|
|
134
|
+
- CVE ids cited inline in dependency files when a pin dodges a vulnerability.
|
|
135
|
+
- **No `:latest` Docker tags — ever.** Pin every image version.
|
|
136
|
+
- **pnpm only** for JS/TS — never npm or yarn; never commit `package-lock.json`
|
|
137
|
+
or `yarn.lock`.
|
|
138
|
+
- Secrets via SOPS/age; never plaintext in version control.
|
|
139
|
+
- Hardening overlay re-applied on every container recreate (not one-time).
|
|
140
|
+
|
|
141
|
+
**Why.** These are the non-negotiable hygiene primitives the engineer applies
|
|
142
|
+
everywhere; encoding them as defaults means no project drifts from them silently.
|
|
143
|
+
|
|
144
|
+
## 11. Naming is load-bearing
|
|
145
|
+
|
|
146
|
+
**Rule.** Choose names for semantic precision. No convenience names, no
|
|
147
|
+
placeholder names in produced artifacts. Brand/typographic precision (e.g.
|
|
148
|
+
required diacritics) is treated as engineering correctness, not cosmetics.
|
|
149
|
+
|
|
150
|
+
**Why.** The same instinct that names 45 agents after biblical figures whose roles
|
|
151
|
+
match their function applies to variables, commits, and modules: a precise name is
|
|
152
|
+
a correct name, and an imprecise one is a latent bug in communication.
|
|
153
|
+
|
|
154
|
+
## 12. Language of output
|
|
155
|
+
|
|
156
|
+
**Rule.** English for all artifacts, code, commands, commit subjects, and
|
|
157
|
+
framework references. Do not imitate the engineer's French in produced output.
|
|
158
|
+
|
|
159
|
+
**Why.** Artifacts are read by a broad audience and future maintainers; English
|
|
160
|
+
keeps them portable. (The engineer may *converse* in French; that's input, not
|
|
161
|
+
output.)
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
*These defaults keep every agent consistent with how MISHKAN was built. Tune your
|
|
166
|
+
own working style in `engineer-standards.md` — it inherits everything here and
|
|
167
|
+
wins on conflict.*
|