simt-dev 0.7.0 → 0.8.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/CHANGELOG.md +191 -870
- package/README.md +188 -213
- package/bin/simt.mjs +19 -55
- package/docs/decisions/ADR-014-workspace-is-configuration.md +2 -2
- package/docs/decisions/ADR-025-a-baseline-is-a-region-in-a-file-the-repo-owns.md +1 -1
- package/docs/decisions/ADR-026-a-config-without-a-region-is-a-file-the-repo-owns.md +1 -1
- package/docs/decisions/ADR-027-the-one-gitattributes-line-that-is-neither-dangerous-nor-empty.md +1 -1
- package/docs/decisions/ADR-028-a-base-file-is-a-floor-so-the-disagreement-it-cannot-repair-becomes-a-check.md +1 -1
- package/docs/decisions/ADR-029-the-pins-a-repository-declares-are-its-own.md +1 -1
- package/docs/decisions/ADR-030-what-a-plan-does-not-ship-is-a-decision-with-a-record.md +1 -1
- package/docs/decisions/ADR-048-a-baseline-carries-only-keys-a-reader-honours.md +1 -1
- package/docs/decisions/ADR-082-the-tracker-override-is-a-manifest-key.md +1 -1
- package/docs/decisions/ADR-099-the-release-verifies-served-bytes-and-the-formula-mirrors-them.md +1 -1
- package/docs/decisions/ADR-117-the-darwin-release-builds-on-supported-macos-15-runners-and-a-re-run-is-idempotent.md +81 -0
- package/docs/decisions/ADR-118-the-bench-corpus-is-keyed-on-history-is-append-only-and-is-portable-as-a-sealed-document.md +91 -0
- package/docs/decisions/ADR-119-the-environment-variable-points-into-a-workspace-the-repo-declared.md +90 -0
- package/docs/decisions/ADR-120-a-pre-push-whose-tree-is-already-proven-green-skips-the-test-gate-on-that-evidence.md +96 -0
- package/docs/decisions/ADR-122-the-shims-move-into-the-state-directory-and-the-legacy-directory-removes-itself.md +94 -0
- package/docs/decisions/ADR-123-a-surplus-positional-is-not-refused-because-arity-is-not-in-the-source.md +57 -0
- package/docs/decisions/ADR-124-the-manifest-has-a-schema-in-the-tool-and-its-unknown-keys-stay-the-repositorys.md +64 -0
- package/docs/decisions/ADR-125-a-shared-context-belongs-to-a-read-and-a-writer-reads-directly.md +65 -0
- package/docs/decisions/ADR-126-the-mcp-surface-stays-a-reader-so-there-is-no-write-path-to-build.md +68 -0
- package/docs/decisions/ADR-127-the-mcp-tool-list-is-written-by-hand-and-roots-is-not-asked-for.md +65 -0
- package/docs/decisions/ADR-128-a-research-plan-is-a-plan-and-the-tracker-reads-it.md +42 -0
- package/ecosystems/bun.json +6 -0
- package/ecosystems/cargo.json +25 -0
- package/ecosystems/composer.json +6 -0
- package/ecosystems/dart.json +24 -0
- package/ecosystems/deno.json +21 -0
- package/ecosystems/devcontainers.json +6 -0
- package/ecosystems/docker-compose.json +6 -0
- package/ecosystems/docker.json +6 -0
- package/ecosystems/dotnet.json +25 -0
- package/ecosystems/elixir.json +23 -0
- package/ecosystems/gitsubmodule.json +6 -0
- package/ecosystems/go.json +25 -0
- package/ecosystems/gradle.json +13 -0
- package/ecosystems/maven.json +23 -0
- package/ecosystems/node.json +25 -0
- package/ecosystems/python.json +20 -0
- package/ecosystems/ruby.json +23 -0
- package/ecosystems/swift.json +25 -0
- package/ecosystems/terraform.json +6 -0
- package/ecosystems/uv.json +6 -0
- package/harnesses/antigravity.json +162 -0
- package/harnesses/claude.json +206 -0
- package/harnesses/codex.json +136 -0
- package/harnesses/copilot.json +88 -0
- package/harnesses/cursor.json +140 -0
- package/harnesses/deepseek.json +99 -0
- package/harnesses/gemini.json +122 -0
- package/harnesses/opencode.json +173 -0
- package/package.json +12 -2
- package/rules/core.md +7 -0
- package/rules/mdc/intake-questions.mdc +8 -0
- package/rules/mdc/slice-commit.mdc +57 -4
- package/src/advice/advice.mjs +3 -2
- package/src/agenthooks/prompt.mjs +5 -2
- package/src/agenthooks/render.mjs +86 -180
- package/src/agenthooks/shim.mjs +1 -1
- package/src/agents/render.mjs +15 -18
- package/src/api.mjs +31 -0
- package/src/argv.mjs +48 -3
- package/src/bench/ablate.mjs +3 -4
- package/src/bench/adapters.json +163 -105
- package/src/bench/adapters.mjs +466 -0
- package/src/bench/arms.mjs +333 -0
- package/src/bench/grade.mjs +33 -73
- package/src/bench/graders.mjs +42 -0
- package/src/bench/mine.mjs +121 -475
- package/src/bench/probe-ledger.mjs +149 -0
- package/src/bench/probes.catalog.mjs +918 -0
- package/src/bench/probes.mjs +79 -1064
- package/src/bench/render.mjs +111 -0
- package/src/bench/report.mjs +120 -962
- package/src/bench/run.mjs +185 -802
- package/src/bench/variants.mjs +4 -5
- package/src/bench/workspace.mjs +160 -0
- package/src/brief/assemble.mjs +48 -15
- package/src/ci/dependabot.mjs +25 -55
- package/src/ci/workflow.mjs +30 -7
- package/src/cli.mjs +45 -0
- package/src/commands/agent.mjs +4 -13
- package/src/commands/agenthook.mjs +70 -40
- package/src/commands/bench.mjs +191 -18
- package/src/commands/brief.mjs +5 -4
- package/src/commands/ci.mjs +13 -14
- package/src/commands/compare.mjs +42 -42
- package/src/commands/completions.mjs +2 -6
- package/src/commands/decide.mjs +4 -4
- package/src/commands/distill.mjs +4 -3
- package/src/commands/docs.mjs +88 -0
- package/src/commands/doctor.mjs +11 -7
- package/src/commands/evidence.mjs +6 -9
- package/src/commands/explain.mjs +0 -1
- package/src/commands/gate.mjs +26 -25
- package/src/commands/graph.mjs +2 -3
- package/src/commands/harness.mjs +6 -5
- package/src/commands/help.mjs +168 -19
- package/src/commands/hooks.mjs +119 -49
- package/src/commands/ignore.mjs +13 -8
- package/src/commands/impact.mjs +8 -15
- package/src/commands/index.mjs +318 -193
- package/src/commands/init-scan.mjs +90 -0
- package/src/commands/init.mjs +124 -105
- package/src/commands/lease.mjs +73 -25
- package/src/commands/lessons.mjs +10 -9
- package/src/commands/local.mjs +3 -3
- package/src/commands/map.mjs +24 -14
- package/src/commands/mcp.mjs +2 -18
- package/src/commands/pack.mjs +9 -6
- package/src/commands/plan.mjs +6 -5
- package/src/commands/plugin.mjs +2 -2
- package/src/commands/prbody.mjs +3 -3
- package/src/commands/repoindex.mjs +12 -11
- package/src/commands/review.mjs +2 -2
- package/src/commands/rules.mjs +37 -16
- package/src/commands/shared.mjs +14 -19
- package/src/commands/skills.mjs +33 -32
- package/src/commands/skillscompile.mjs +7 -8
- package/src/commands/skillsinstall.mjs +7 -6
- package/src/commands/slice.mjs +220 -74
- package/src/commands/spec.mjs +167 -0
- package/src/commands/status.mjs +27 -18
- package/src/commands/sync.mjs +27 -25
- package/src/commands/tests.mjs +18 -21
- package/src/commands/tokens.mjs +21 -26
- package/src/commands/undo.mjs +5 -15
- package/src/commands/upgrade.mjs +15 -7
- package/src/commands/why.mjs +15 -21
- package/src/compare/hooksstate.mjs +2 -6
- package/src/compare/learn.mjs +3 -1
- package/src/compare/row.mjs +0 -2
- package/src/context.mjs +64 -0
- package/src/decisions/index-doc.mjs +46 -0
- package/src/decisions/index.mjs +3 -2
- package/src/diff.mjs +1 -1
- package/src/distill/distill.mjs +14 -1
- package/src/distill/engine.mjs +5 -1
- package/src/docs/commands.mjs +65 -0
- package/src/ecosystem/records.mjs +219 -0
- package/src/explain.mjs +31 -0
- package/src/gates/index.mjs +385 -0
- package/src/graph/compile.mjs +8 -4
- package/src/graph/load.mjs +6 -2
- package/src/graph/spec.mjs +10 -8
- package/src/harness/records.mjs +143 -0
- package/src/hooks/capability.mjs +7 -5
- package/src/hooks/dispatcher.mjs +209 -60
- package/src/hooks/gates.mjs +10 -43
- package/src/hooks/resolve.mjs +4 -14
- package/src/hooks/shim.mjs +5 -2
- package/src/hooks/where.mjs +2 -7
- package/src/identity.mjs +31 -12
- package/src/index/coverage.mjs +58 -0
- package/src/index/extract.mjs +6 -16
- package/src/index/gate.mjs +1 -1
- package/src/index/govern.mjs +26 -9
- package/src/index/impact.mjs +4 -8
- package/src/index/map.mjs +14 -15
- package/src/index/open.mjs +173 -0
- package/src/index/persist.mjs +224 -57
- package/src/index/store.mjs +82 -39
- package/src/index/tests.mjs +2 -6
- package/src/journal.mjs +94 -20
- package/src/kernel/card.mjs +37 -63
- package/src/kernel/checks.mjs +4 -10
- package/src/lease.mjs +102 -7
- package/src/ledger/index.mjs +150 -14
- package/src/local/client.mjs +4 -6
- package/src/locate.mjs +33 -9
- package/src/manifest/schema.mjs +213 -0
- package/src/mcp/paginate.mjs +33 -0
- package/src/mcp/resources.mjs +7 -10
- package/src/mcp/schemas.mjs +512 -0
- package/src/mcp/server.mjs +119 -25
- package/src/mcp/tools-facts.mjs +326 -0
- package/src/mcp/tools-read.mjs +221 -0
- package/src/mcp/tools.mjs +4 -967
- package/src/measure/corpus.mjs +150 -0
- package/src/measure/metrics.mjs +236 -0
- package/src/measure/records.mjs +211 -0
- package/src/measure/session.mjs +3 -2
- package/src/measure/stats.mjs +538 -0
- package/src/measure/task-schema.mjs +125 -0
- package/src/measure/tasks.mjs +69 -0
- package/src/memory/decide.mjs +6 -15
- package/src/memory/lesson-text.mjs +61 -0
- package/src/memory/lessons.mjs +29 -82
- package/src/name.mjs +7 -0
- package/src/node-version.mjs +37 -0
- package/src/output/index.mjs +209 -10
- package/src/packs/manage.mjs +32 -12
- package/src/packs.mjs +20 -2
- package/src/plan/index.mjs +1 -1
- package/src/plugins.mjs +22 -16
- package/src/prbody.mjs +7 -11
- package/src/projection/loaders.mjs +7 -692
- package/src/projection/lock.mjs +11 -1
- package/src/projection/manifest.mjs +29 -468
- package/src/projection/mdc.mjs +7 -8
- package/src/projection/project.mjs +126 -221
- package/src/projection/region.mjs +561 -0
- package/src/projection/rules.mjs +20 -550
- package/src/projection/surfaces.mjs +43 -210
- package/src/projection/targets.mjs +5 -5
- package/src/repo-root.mjs +31 -0
- package/src/resolve/eval.mjs +2 -1
- package/src/resolve/fingerprint.mjs +19 -22
- package/src/resolve/resolve.mjs +1 -41
- package/src/review/critic.mjs +10 -13
- package/src/run.mjs +98 -0
- package/src/secrets.mjs +14 -22
- package/src/state/events.mjs +129 -0
- package/src/status-snapshot.mjs +233 -0
- package/src/status.mjs +2 -6
- package/src/sys/git.mjs +82 -0
- package/src/sys/proc.mjs +151 -0
- package/src/testing/parsers.mjs +265 -0
- package/src/testing/patches.mjs +23 -0
- package/src/testing/paths.mjs +49 -0
- package/src/testing/runners.mjs +186 -0
- package/src/testing/vault.mjs +68 -0
- package/src/text/frontmatter.mjs +49 -0
- package/src/text/tokens.mjs +52 -0
- package/src/toolwords.mjs +3 -0
- package/src/util/fs.mjs +20 -0
- package/src/util/sort.mjs +12 -0
- package/src/workspace.mjs +58 -11
- package/src/write/plan.mjs +82 -0
- package/templates/plan/tracker.json +1 -0
- package/docs/decisions/ADR-033-three-plan-rows-closed-by-decision-not-by-authoring.md +0 -82
- package/docs/decisions/ADR-102-the-two-queued-review-rows-are-closed-by-ruling.md +0 -49
- package/docs/decisions/README.md +0 -600
- package/src/bench/tasks.mjs +0 -36
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "cursor",
|
|
3
|
+
"loaderOrder": 4,
|
|
4
|
+
"surfaceOrder": 2,
|
|
5
|
+
"surface": {
|
|
6
|
+
"id": "cursor",
|
|
7
|
+
"label": "Cursor rules",
|
|
8
|
+
"readers": "Cursor",
|
|
9
|
+
"primary": null,
|
|
10
|
+
"kind": "file",
|
|
11
|
+
"rule": ".cursor/rules/{name}.mdc",
|
|
12
|
+
"readsAgentsMd": "all",
|
|
13
|
+
"configDirs": [
|
|
14
|
+
".cursor"
|
|
15
|
+
],
|
|
16
|
+
"documentedKeys": [
|
|
17
|
+
"description",
|
|
18
|
+
"alwaysApply",
|
|
19
|
+
"globs"
|
|
20
|
+
],
|
|
21
|
+
"readsPrimary": true,
|
|
22
|
+
"substitutions": {
|
|
23
|
+
"askTool": "Use the interactive `AskQuestion` tool"
|
|
24
|
+
},
|
|
25
|
+
"verified": "Cursor project rules (.cursor/rules/*.mdc, description + alwaysApply + globs); alwaysApply: false with globs is \"auto-attached when a matching file is in context\", and the docs warn that alwaysApply: false with no description is manual @-mention only",
|
|
26
|
+
"note": "The only surface that reads `.mdc`. Every other row here is a plain `.md` or a symlink."
|
|
27
|
+
},
|
|
28
|
+
"loader": {
|
|
29
|
+
"id": "cursor",
|
|
30
|
+
"label": "Cursor",
|
|
31
|
+
"readers": "Cursor",
|
|
32
|
+
"surface": "cursor",
|
|
33
|
+
"start": [
|
|
34
|
+
{
|
|
35
|
+
"scope": "project",
|
|
36
|
+
"path": ".cursor/rules/{name}.mdc",
|
|
37
|
+
"tree": "nested",
|
|
38
|
+
"dir": ".cursor/rules",
|
|
39
|
+
"suffix": ".mdc",
|
|
40
|
+
"frontmatter": {
|
|
41
|
+
"alwaysApply": "true"
|
|
42
|
+
},
|
|
43
|
+
"atStart": true,
|
|
44
|
+
"why": "Cursor rules docs: alwaysApply: true alone means the rule is always included; alwaysApply: false attaches on a matching file, on a description match, or only on an @-mention"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"scope": "project",
|
|
48
|
+
"path": "AGENTS.md",
|
|
49
|
+
"tree": "chain",
|
|
50
|
+
"atStart": true,
|
|
51
|
+
"why": "Cursor rules docs: AGENTS.md is supported in the project root and in subdirectories, combined with parent files, with the more specific one winning"
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"alsoReads": [
|
|
55
|
+
{
|
|
56
|
+
"what": ".cursor/rules/*.mdc with alwaysApply: false",
|
|
57
|
+
"atStart": false,
|
|
58
|
+
"why": "Cursor rules docs: globs auto-attach on a matching file, a description lets the model decide, and a rule with neither loads only on an @-mention"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"what": "team and user rules",
|
|
62
|
+
"atStart": true,
|
|
63
|
+
"why": "Cursor rules docs: precedence is Team Rules, then Project Rules, then User Rules; the latter two are configured in the app, not in a file this tool can project"
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"order": "team rules, then project rules, then user rules",
|
|
67
|
+
"cap": null,
|
|
68
|
+
"capNote": "no byte cap published; the docs recommend keeping rules under 500 lines, which is guidance and not a limit the reader enforces",
|
|
69
|
+
"imports": {
|
|
70
|
+
"syntax": null,
|
|
71
|
+
"depth": 0,
|
|
72
|
+
"why": "Cursor rules docs: an @file in a rule body is not inlined — \"the file's contents are not inlined into the prompt\""
|
|
73
|
+
},
|
|
74
|
+
"nested": "cumulative — nested AGENTS.md files are combined with their parents and the more specific one wins; .cursor/rules/ may hold folders",
|
|
75
|
+
"skills": [],
|
|
76
|
+
"skillsNote": "no project skill directory is documented for Cursor",
|
|
77
|
+
"hooks": {
|
|
78
|
+
"path": ".cursor/hooks.json",
|
|
79
|
+
"verified": "Cursor agent hooks docs: <project-root>/.cursor/hooks.json and ~/.cursor/hooks.json"
|
|
80
|
+
},
|
|
81
|
+
"agents": {
|
|
82
|
+
"dir": ".cursor/agents",
|
|
83
|
+
"ext": ".md",
|
|
84
|
+
"verified": "Cursor subagents docs (cursor.com/docs/subagents, read 2026-10-30): project subagents are markdown files with name and description frontmatter under .cursor/agents/"
|
|
85
|
+
},
|
|
86
|
+
"mcp": {
|
|
87
|
+
"path": ".cursor/mcp.json",
|
|
88
|
+
"key": null,
|
|
89
|
+
"verified": "Cursor MCP docs (read 2026-10-14): \"Create .cursor/mcp.json in your project\""
|
|
90
|
+
},
|
|
91
|
+
"verified": "Cursor rules documentation (cursor.com/docs/context/rules, read 2026-10-14) — only .cursor/rules/*.mdc is read, a plain .md there is ignored; alwaysApply decides whether a rule costs bytes at start; @file references in a rule body are not inlined; AGENTS.md is read in the project root and in subdirectories, combined with parents",
|
|
92
|
+
"note": "A rule with alwaysApply: false is listed under alsoReads rather than start, because it costs nothing until something matches."
|
|
93
|
+
},
|
|
94
|
+
"scopeKey": true,
|
|
95
|
+
"hooks": {
|
|
96
|
+
"id": "cursor",
|
|
97
|
+
"event": "preToolUse",
|
|
98
|
+
"matcher": "Shell|Write|Edit",
|
|
99
|
+
"denyExit": 2,
|
|
100
|
+
"verified": "cursor.com/docs/agent/hooks, read 2026-10-16",
|
|
101
|
+
"prompt": null,
|
|
102
|
+
"post": null,
|
|
103
|
+
"deny": {
|
|
104
|
+
"permission": "deny",
|
|
105
|
+
"user_message": "__SIMT_TEXT__",
|
|
106
|
+
"agent_message": "__SIMT_TEXT__"
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"payload": {
|
|
110
|
+
"toolKey": "tool_name",
|
|
111
|
+
"inputKey": "tool_input",
|
|
112
|
+
"shellTools": [
|
|
113
|
+
"Shell"
|
|
114
|
+
],
|
|
115
|
+
"commandKey": "command",
|
|
116
|
+
"writeTools": [
|
|
117
|
+
"Write",
|
|
118
|
+
"Edit"
|
|
119
|
+
],
|
|
120
|
+
"pathKeys": [
|
|
121
|
+
"file_path",
|
|
122
|
+
"path"
|
|
123
|
+
],
|
|
124
|
+
"rootKeys": [
|
|
125
|
+
[
|
|
126
|
+
"working_directory"
|
|
127
|
+
],
|
|
128
|
+
[
|
|
129
|
+
"cwd"
|
|
130
|
+
]
|
|
131
|
+
]
|
|
132
|
+
},
|
|
133
|
+
"pluginOrder": 3,
|
|
134
|
+
"plugin": {
|
|
135
|
+
"rootVar": null,
|
|
136
|
+
"projectVar": "CURSOR_PROJECT_DIR",
|
|
137
|
+
"hooksPath": ".cursor/hooks.json",
|
|
138
|
+
"runtimeDir": ".cursor/simt"
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "deepseek",
|
|
3
|
+
"loaderOrder": 8,
|
|
4
|
+
"loader": {
|
|
5
|
+
"id": "deepseek",
|
|
6
|
+
"label": "DeepSeek harness",
|
|
7
|
+
"readers": "DeepSeek harness",
|
|
8
|
+
"surface": null,
|
|
9
|
+
"chainMerge": "all",
|
|
10
|
+
"dedupe": "trim",
|
|
11
|
+
"start": [
|
|
12
|
+
{
|
|
13
|
+
"scope": "project",
|
|
14
|
+
"path": "AGENTS.md",
|
|
15
|
+
"tree": "chain",
|
|
16
|
+
"atStart": true,
|
|
17
|
+
"why": "DeepSeek harness agent-instructions docs: AGENTS.md is the first base candidate in each directory from the project root down to the session working directory"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"scope": "project",
|
|
21
|
+
"path": "CLAUDE.md",
|
|
22
|
+
"tree": "chain",
|
|
23
|
+
"atStart": true,
|
|
24
|
+
"why": "DeepSeek harness agent-instructions docs: CLAUDE.md is the second base candidate and loads beside AGENTS.md unless the two are identical after trimming"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"scope": "project",
|
|
28
|
+
"path": "AGENTS.local.md",
|
|
29
|
+
"tree": "chain",
|
|
30
|
+
"atStart": true,
|
|
31
|
+
"why": "DeepSeek harness agent-instructions docs: AGENTS.local.md is a local overlay loaded after the base candidates in the same directory"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"scope": "project",
|
|
35
|
+
"path": "CLAUDE.local.md",
|
|
36
|
+
"tree": "chain",
|
|
37
|
+
"atStart": true,
|
|
38
|
+
"why": "DeepSeek harness agent-instructions docs: CLAUDE.local.md is the second local overlay, under the same per-directory trim dedup"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"scope": "user",
|
|
42
|
+
"path": "~/.dsh/AGENTS.md",
|
|
43
|
+
"tree": "single",
|
|
44
|
+
"atStart": true,
|
|
45
|
+
"why": "DeepSeek harness agent-instructions docs: the user-global file is $DSH_HOME/AGENTS.md, defaulting to ~/.dsh/AGENTS.md"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"scope": "user",
|
|
49
|
+
"path": "~/.agents/AGENTS.md",
|
|
50
|
+
"tree": "single",
|
|
51
|
+
"atStart": true,
|
|
52
|
+
"why": "DeepSeek harness agent-instructions docs: the shared agents root is $DSH_AGENTS_HOME or ~/.agents, and a copy that matches the harness-home file collapses behind it"
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
"alsoReads": [
|
|
56
|
+
{
|
|
57
|
+
"what": "AGENTS.md below the session working directory",
|
|
58
|
+
"atStart": false,
|
|
59
|
+
"why": "DeepSeek harness agent-instructions docs: a successful read, write or edit that reaches a deeper directory loads that directory's instruction file on the next request; shell navigation does not"
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"order": "user-global ~/.dsh/AGENTS.md, then ~/.agents/AGENTS.md, then every project candidate from the project root down to the working directory, broad to specific; within one directory, base files then local overlays",
|
|
63
|
+
"cap": {
|
|
64
|
+
"bytes": 65536,
|
|
65
|
+
"scope": "chain",
|
|
66
|
+
"config": "maxBytes",
|
|
67
|
+
"drop": "broader",
|
|
68
|
+
"why": "DeepSeek harness agent-instructions docs: dsh-base sets maxBytes to 65536, and rendering drops whole broader files before truncating the most specific one"
|
|
69
|
+
},
|
|
70
|
+
"alsoCaps": [
|
|
71
|
+
{
|
|
72
|
+
"bytes": 1048576,
|
|
73
|
+
"scope": "file",
|
|
74
|
+
"appliesTo": "one source file before rendering",
|
|
75
|
+
"config": "maxSourceBytes",
|
|
76
|
+
"why": "DeepSeek harness agent-instructions docs: maxSourceBytes defaults to 1048576, and a larger source file is ignored rather than truncated into the chain"
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
"imports": {
|
|
80
|
+
"syntax": null,
|
|
81
|
+
"depth": 0,
|
|
82
|
+
"why": "DeepSeek harness agent-instructions docs: @path imports are not interpreted; a reference inside an instruction file is not an include"
|
|
83
|
+
},
|
|
84
|
+
"nested": "on touch — the baseline is the root-to-cwd chain; a deeper AGENTS.md loads after a successful read, write or edit in that directory, not because the shell changed directory",
|
|
85
|
+
"skills": [],
|
|
86
|
+
"skillsNote": "the agent-instructions package does not document a project skill directory; shared agent configuration lives at ~/.agents, which is user scope and is not measured here",
|
|
87
|
+
"hooks": null,
|
|
88
|
+
"hooksNote": "DeepSeek harness hooks docs: the Claude Code and Codex bridges take an explicit configPath, and project-local hooks.json discovery is still marked TODO, so no repository path is loaded by default",
|
|
89
|
+
"agents": null,
|
|
90
|
+
"agentsNote": "no file-based agents are documented for the DeepSeek harness in any first-party page checked on 2026-10-30",
|
|
91
|
+
"mcp": {
|
|
92
|
+
"path": null,
|
|
93
|
+
"key": "@deepseek-ai/dsh-mcp-client",
|
|
94
|
+
"verified": "DeepSeek harness MCP docs: a server is a profile plugin row (@deepseek-ai/dsh-mcp-client), not a project file this tool can project"
|
|
95
|
+
},
|
|
96
|
+
"verified": "DeepSeek harness agent-instructions package (deepseek-ai/deepseek-harness packages/context/agent-instructions/README.md, read 2026-10-14) — the baseline loads ~/.dsh/AGENTS.md, ~/.agents/AGENTS.md, then AGENTS.md and CLAUDE.md plus the local overlays from the project root down to the working directory; trimmed duplicates in one directory collapse; dsh-base caps the rendered baseline at 65536 bytes and ignores a source file over 1048576 bytes",
|
|
97
|
+
"note": "A drifted CLAUDE.md beside AGENTS.md is loaded in full. A symlink or a byte-identical copy is not. That is why this reader does not share Codex's one-file-per-directory rule."
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "gemini",
|
|
3
|
+
"loaderOrder": 6,
|
|
4
|
+
"loader": {
|
|
5
|
+
"id": "gemini",
|
|
6
|
+
"label": "Gemini CLI",
|
|
7
|
+
"readers": "Gemini CLI (google-gemini/gemini-cli)",
|
|
8
|
+
"surface": null,
|
|
9
|
+
"start": [
|
|
10
|
+
{
|
|
11
|
+
"scope": "project",
|
|
12
|
+
"path": "GEMINI.md",
|
|
13
|
+
"tree": "chain",
|
|
14
|
+
"atStart": true,
|
|
15
|
+
"why": "Gemini CLI context docs (docs/cli/gemini-md/): GEMINI.md is collected from the working directory upward through parent directories until the first directory holding a boundary marker (.git by default) or home"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"scope": "user",
|
|
19
|
+
"path": "~/.gemini/GEMINI.md",
|
|
20
|
+
"tree": "single",
|
|
21
|
+
"atStart": true,
|
|
22
|
+
"why": "Gemini CLI context docs: the user-global ~/.gemini/GEMINI.md opens the concatenation, before any project file"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"alsoReads": [
|
|
26
|
+
{
|
|
27
|
+
"what": "the context file under another name — settings.json context.fileName, a string or an array",
|
|
28
|
+
"atStart": true,
|
|
29
|
+
"why": "Gemini CLI configuration docs: context.fileName renames the context file (a string or an array), so an installation listing AGENTS.md there reads AGENTS.md as its GEMINI.md"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"what": "GEMINI.md (or the renamed context file) in subdirectories below the working directory",
|
|
33
|
+
"atStart": false,
|
|
34
|
+
"why": "Gemini CLI context docs: directories a tool touches are scanned for a context file up to a trusted root, bounded by context.discoveryMaxDirs (200) - not at session start"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"order": "user-global ~/.gemini/GEMINI.md first, then the project chain general to specific - project-root side first (upward traversal stops at the first directory holding a boundary marker, .git by default) down through each directory to the working directory - then just-in-time files a tool touch discovered; the whole result is one concatenation with origin separators",
|
|
38
|
+
"cap": null,
|
|
39
|
+
"capNote": "no byte cap is published for the merged Gemini CLI context (checked 2026-10-26)",
|
|
40
|
+
"imports": {
|
|
41
|
+
"syntax": "@path",
|
|
42
|
+
"depth": 5,
|
|
43
|
+
"why": "Gemini CLI context docs: @path imports resolve relative or absolute to a maximum depth of 5, with cycles prevented by skipping files already on the stack"
|
|
44
|
+
},
|
|
45
|
+
"nested": "general to specific, all loaded — unlike Codex, every context file on the walk contributes; a nearer file cannot hide a parent one, it just concatenates after it; subdirectory files wait for a tool touch",
|
|
46
|
+
"skills": [],
|
|
47
|
+
"skillsNote": "no project skill directory is documented for Gemini CLI; extensions are the distribution mechanism, and they are tooling not context",
|
|
48
|
+
"hooks": {
|
|
49
|
+
"path": ".gemini/settings.json",
|
|
50
|
+
"verified": "Gemini CLI hooks reference (geminicli.com/docs/hooks/reference/, read 2026-10-26): a project .gemini/settings.json carries a top-level hooks object whose events are arrays of {matcher, hooks:[{type:\"command\",command,timeout? (milliseconds)}]} — the same shape Claude and Codex use; BeforeTool denies with {decision:\"deny\",reason}, BeforeAgent and AfterTool inject via hookSpecificOutput.additionalContext"
|
|
51
|
+
},
|
|
52
|
+
"agents": {
|
|
53
|
+
"dir": ".gemini/agents",
|
|
54
|
+
"ext": ".md",
|
|
55
|
+
"verified": "Gemini CLI subagents docs (geminicli.com/docs/core/subagents, read 2026-10-30): project subagents are markdown files with name and description frontmatter under .gemini/agents/"
|
|
56
|
+
},
|
|
57
|
+
"mcp": {
|
|
58
|
+
"path": ".gemini/settings.json",
|
|
59
|
+
"key": "mcpServers",
|
|
60
|
+
"verified": "Gemini CLI configuration docs (docs/reference/configuration/, read 2026-10-26): a project .gemini/settings.json (a user ~/.gemini/settings.json merged behind it, objects merged key by key) carries a top-level mcpServers object whose entries name a command, a url or an httpUrl"
|
|
61
|
+
},
|
|
62
|
+
"verified": "Gemini CLI context and configuration docs (geminicli.com/docs/cli/gemini-md/ and docs/reference/configuration/, read 2026-10-26) — settings live at project .gemini/settings.json and user ~/.gemini/settings.json, merged for objects; the context is user ~/.gemini/GEMINI.md plus the context file (GEMINI.md unless context.fileName renames it, an array is allowed) from the working directory upward through parents to the first .git or home, with @path imports to depth 5; server registration is the mcpServers object in those same settings files; no byte cap is published",
|
|
63
|
+
"note": "The configuration reference this table once recorded as 404ing is live again as of 2026-10-26, which is why the row is full instead of thin. What still shapes a byte count is the pair of absences the docs confirm rather than deny: no cap, and no promise that AGENTS.md is read at all — context.fileName decides that, and it may name anything."
|
|
64
|
+
},
|
|
65
|
+
"hooks": {
|
|
66
|
+
"id": "gemini",
|
|
67
|
+
"event": "BeforeTool",
|
|
68
|
+
"matcher": "run_shell_command|write_file|replace",
|
|
69
|
+
"timeout": 10000,
|
|
70
|
+
"denyExit": 0,
|
|
71
|
+
"verified": "geminicli.com/docs/hooks/reference/, read 2026-10-26",
|
|
72
|
+
"prompt": {
|
|
73
|
+
"event": "BeforeAgent",
|
|
74
|
+
"verified": "geminicli.com/docs/hooks/reference/, read 2026-10-26",
|
|
75
|
+
"delivery": {
|
|
76
|
+
"hookSpecificOutput": {
|
|
77
|
+
"additionalContext": "__SIMT_TEXT__"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"post": {
|
|
82
|
+
"event": "AfterTool",
|
|
83
|
+
"verified": "geminicli.com/docs/hooks/reference/, read 2026-10-26",
|
|
84
|
+
"delivery": {
|
|
85
|
+
"hookSpecificOutput": {
|
|
86
|
+
"additionalContext": "__SIMT_TEXT__"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"deny": {
|
|
91
|
+
"decision": "deny",
|
|
92
|
+
"reason": "__SIMT_TEXT__"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"payload": {
|
|
96
|
+
"toolKey": "tool_name",
|
|
97
|
+
"inputKey": "tool_input",
|
|
98
|
+
"shellTools": [
|
|
99
|
+
"run_shell_command"
|
|
100
|
+
],
|
|
101
|
+
"commandKey": "command",
|
|
102
|
+
"writeTools": [
|
|
103
|
+
"write_file",
|
|
104
|
+
"replace"
|
|
105
|
+
],
|
|
106
|
+
"pathKeys": [
|
|
107
|
+
"file_path"
|
|
108
|
+
],
|
|
109
|
+
"rootKeys": [
|
|
110
|
+
[
|
|
111
|
+
"cwd"
|
|
112
|
+
]
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
"pluginOrder": 2,
|
|
116
|
+
"plugin": {
|
|
117
|
+
"rootVar": "extensionPath",
|
|
118
|
+
"projectVar": null,
|
|
119
|
+
"hooksPath": "hooks/hooks.json",
|
|
120
|
+
"runtimeDir": "."
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "opencode",
|
|
3
|
+
"loaderOrder": 1,
|
|
4
|
+
"surfaceOrder": 1,
|
|
5
|
+
"surface": {
|
|
6
|
+
"id": "opencode",
|
|
7
|
+
"label": "opencode (AGENTS.md + .agents/skills)",
|
|
8
|
+
"readers": "OpenCode v2, and AGENTS.md is also read natively by Codex, Cursor, Windsurf, Zed, Amp, Jules, Copilot CLI and the DeepSeek harness; Claude Code falls back to it, Antigravity and Gemini CLI accept GEMINI.md as an equal name",
|
|
9
|
+
"primary": "AGENTS.md",
|
|
10
|
+
"kind": "region",
|
|
11
|
+
"rule": null,
|
|
12
|
+
"foldRules": true,
|
|
13
|
+
"readsAgentsMd": "all",
|
|
14
|
+
"configDirs": [
|
|
15
|
+
".opencode"
|
|
16
|
+
],
|
|
17
|
+
"skills": ".agents/skills",
|
|
18
|
+
"documentedSkillsPaths": [
|
|
19
|
+
".opencode/skills",
|
|
20
|
+
".claude/skills",
|
|
21
|
+
".agents/skills"
|
|
22
|
+
],
|
|
23
|
+
"readLimits": [
|
|
24
|
+
{
|
|
25
|
+
"reader": "Codex",
|
|
26
|
+
"bytes": 32768,
|
|
27
|
+
"verified": "Codex project_doc_max_bytes defaults to 32 KiB"
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"verified": "OpenCode v2 instructions and skills docs (opencode.ai/v2/docs, read 2026-10-14) — AGENTS.md only, combined from the workspace up to the project root; CLAUDE.md is not a fallback; skills at .opencode/skills/, .claude/skills/ and .agents/skills/<name>/SKILL.md, with the model shown name and description",
|
|
31
|
+
"note": ".agents/skills is one of the three skill locations opencode documents, so the same directory serves the standard surface without a symlink."
|
|
32
|
+
},
|
|
33
|
+
"loader": {
|
|
34
|
+
"id": "opencode",
|
|
35
|
+
"label": "OpenCode v2",
|
|
36
|
+
"readers": "OpenCode v2",
|
|
37
|
+
"surface": "opencode",
|
|
38
|
+
"start": [
|
|
39
|
+
{
|
|
40
|
+
"scope": "project",
|
|
41
|
+
"path": "AGENTS.md",
|
|
42
|
+
"tree": "chain",
|
|
43
|
+
"atStart": true,
|
|
44
|
+
"why": "OpenCode v2 instructions docs: every AGENTS.md from the workspace directory up to the project root is loaded and combined; V2 recognizes AGENTS.md only and does not fall back to CLAUDE.md"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"scope": "user",
|
|
48
|
+
"path": "~/.config/opencode/AGENTS.md",
|
|
49
|
+
"tree": "single",
|
|
50
|
+
"atStart": true,
|
|
51
|
+
"why": "OpenCode v2 instructions docs: the global file is loaded first, before the project chain"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"scope": "project",
|
|
55
|
+
"path": ".claude/skills/{name}/SKILL.md",
|
|
56
|
+
"tree": "nested",
|
|
57
|
+
"dir": ".claude/skills",
|
|
58
|
+
"suffix": "/SKILL.md",
|
|
59
|
+
"atStart": true,
|
|
60
|
+
"metadata": true,
|
|
61
|
+
"why": "OpenCode v2 skills docs: .claude/skills is a project compatibility source, registered before .agents/skills"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"scope": "project",
|
|
65
|
+
"path": ".agents/skills/{name}/SKILL.md",
|
|
66
|
+
"tree": "nested",
|
|
67
|
+
"dir": ".agents/skills",
|
|
68
|
+
"suffix": "/SKILL.md",
|
|
69
|
+
"atStart": true,
|
|
70
|
+
"metadata": true,
|
|
71
|
+
"why": "OpenCode v2 skills docs: .agents/skills is a project compatibility source; the model is shown the id, name and description, not the body"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"scope": "project",
|
|
75
|
+
"path": ".opencode/skills/{name}/SKILL.md",
|
|
76
|
+
"tree": "nested",
|
|
77
|
+
"dir": ".opencode/skills",
|
|
78
|
+
"suffix": "/SKILL.md",
|
|
79
|
+
"atStart": true,
|
|
80
|
+
"metadata": true,
|
|
81
|
+
"why": "OpenCode v2 skills docs: .opencode/skills is the project source and outranks .agents/skills and .claude/skills for the same id"
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"alsoReads": [
|
|
85
|
+
{
|
|
86
|
+
"what": "AGENTS.md below the workspace",
|
|
87
|
+
"atStart": false,
|
|
88
|
+
"why": "OpenCode v2 instructions docs: instruction files below the workspace load when the agent reads or lists that area, not at session start"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"what": "opencode.json `instructions` array",
|
|
92
|
+
"atStart": false,
|
|
93
|
+
"why": "OpenCode v2 instructions docs: the config schema accepts an instructions array, but V2 does not resolve its files, globs or URLs"
|
|
94
|
+
}
|
|
95
|
+
],
|
|
96
|
+
"order": "global ~/.config/opencode/AGENTS.md, then project AGENTS.md files from the workspace directory up to the project root (nearest first); files are combined, not overridden",
|
|
97
|
+
"cap": null,
|
|
98
|
+
"capNote": "no byte cap published for AGENTS.md; V2 accepts an instructions array and does not load it, so there is no fetch timeout to apply",
|
|
99
|
+
"imports": {
|
|
100
|
+
"syntax": null,
|
|
101
|
+
"depth": 0,
|
|
102
|
+
"why": "OpenCode v2 instructions docs: an AGENTS.md reference to another file is not an include; V2 loads AGENTS.md files by discovery, not by @path expansion"
|
|
103
|
+
},
|
|
104
|
+
"nested": "cumulative up to the project root at session start; files below the workspace load when that area is read",
|
|
105
|
+
"skills": [
|
|
106
|
+
".agents/skills",
|
|
107
|
+
".opencode/skills",
|
|
108
|
+
".claude/skills"
|
|
109
|
+
],
|
|
110
|
+
"hooks": {
|
|
111
|
+
"path": ".opencode/plugins/simt-dev.js",
|
|
112
|
+
"verified": "OpenCode v2 plugins docs: direct .ts and .js files and immediate plugin packages are loaded from every discovered .opencode/plugins/ directory, and the plugins array in opencode.json(c)"
|
|
113
|
+
},
|
|
114
|
+
"agents": {
|
|
115
|
+
"dir": ".opencode/agents",
|
|
116
|
+
"ext": ".md",
|
|
117
|
+
"verified": "OpenCode v2 agents docs (opencode.ai/v2/docs/agents, read 2026-10-30): subagents are markdown files with a description frontmatter under .opencode/agents/"
|
|
118
|
+
},
|
|
119
|
+
"mcp": {
|
|
120
|
+
"path": "opencode.json",
|
|
121
|
+
"key": "mcp.servers",
|
|
122
|
+
"verified": "OpenCode v2 MCP servers docs (read 2026-10-14): servers are named under mcp.servers; V2 does not place server names directly under mcp"
|
|
123
|
+
},
|
|
124
|
+
"verified": "OpenCode v2 instructions, skills, plugins and MCP docs (opencode.ai/v2/docs, read 2026-10-14) — V2 loads AGENTS.md only, combining the global file with every project AGENTS.md from the workspace up to the project root; CLAUDE.md is not a fallback; the instructions array is accepted and not loaded; skills advertise name and description from .opencode/skills, .claude/skills and .agents/skills",
|
|
125
|
+
"note": "This row is OpenCode v2. V1 read CLAUDE.md when AGENTS.md was absent and loaded the instructions array; V2 does neither, so a meter that still did would bill bytes this reader does not pay."
|
|
126
|
+
},
|
|
127
|
+
"hooks": {
|
|
128
|
+
"id": "opencode",
|
|
129
|
+
"event": "execute.before",
|
|
130
|
+
"matcher": "shell|write|edit",
|
|
131
|
+
"file": true,
|
|
132
|
+
"denyExit": 2,
|
|
133
|
+
"verified": "opencode.ai/v2/docs/build/plugins/server, read 2026-10-29",
|
|
134
|
+
"prompt": {
|
|
135
|
+
"event": "prompt",
|
|
136
|
+
"verified": "opencode.ai/v2/docs/build/plugins/server, read 2026-10-29",
|
|
137
|
+
"delivery": {
|
|
138
|
+
"text": "__SIMT_TEXT__"
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
"post": null,
|
|
142
|
+
"deny": {
|
|
143
|
+
"reason": "__SIMT_TEXT__"
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
"payload": {
|
|
147
|
+
"toolKey": "tool",
|
|
148
|
+
"inputKey": "input",
|
|
149
|
+
"shellTools": [
|
|
150
|
+
"shell"
|
|
151
|
+
],
|
|
152
|
+
"commandKey": "command",
|
|
153
|
+
"writeTools": [
|
|
154
|
+
"write",
|
|
155
|
+
"edit"
|
|
156
|
+
],
|
|
157
|
+
"pathKeys": [
|
|
158
|
+
"path"
|
|
159
|
+
],
|
|
160
|
+
"rootKeys": [
|
|
161
|
+
[
|
|
162
|
+
"cwd"
|
|
163
|
+
]
|
|
164
|
+
]
|
|
165
|
+
},
|
|
166
|
+
"pluginOrder": 4,
|
|
167
|
+
"plugin": {
|
|
168
|
+
"rootVar": null,
|
|
169
|
+
"projectVar": null,
|
|
170
|
+
"hooksPath": "server.js",
|
|
171
|
+
"runtimeDir": "."
|
|
172
|
+
}
|
|
173
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "simt-dev",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "An intelligence amplifier for AI coding agents: rules and dual gates adopted by one command, plus local retrieval, task briefs, benches and repo memory — deterministic by default, with local-model adapters that propose and never select.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Said Elimam",
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
"templates",
|
|
28
28
|
"agents",
|
|
29
29
|
"skills",
|
|
30
|
+
"ecosystems",
|
|
31
|
+
"harnesses",
|
|
30
32
|
"docs/decisions",
|
|
31
33
|
"CHANGELOG.md"
|
|
32
34
|
],
|
|
@@ -44,6 +46,14 @@
|
|
|
44
46
|
],
|
|
45
47
|
"scripts": {
|
|
46
48
|
"test": "node --test --test-concurrency=$(node -p 'os.cpus().length') test/*.test.mjs",
|
|
47
|
-
"lint": "node bin/simt.mjs
|
|
49
|
+
"lint": "node bin/simt.mjs graph lint",
|
|
50
|
+
"verify:shipped": "node --test test/shipped.test.mjs",
|
|
51
|
+
"build:sea": "node scripts/build-sea.mjs",
|
|
52
|
+
"verify:wheel": "node scripts/verify-wheel.mjs"
|
|
53
|
+
},
|
|
54
|
+
"exports": {
|
|
55
|
+
".": "./src/api.mjs",
|
|
56
|
+
"./package.json": "./package.json",
|
|
57
|
+
"./src/*": "./src/*"
|
|
48
58
|
}
|
|
49
59
|
}
|
package/rules/core.md
CHANGED
|
@@ -24,9 +24,16 @@ commands belongs in this repository, not here.
|
|
|
24
24
|
|
|
25
25
|
## Git
|
|
26
26
|
|
|
27
|
+
The commit and push procedure - order, message format, worktrees - is the `slice-commit`
|
|
28
|
+
rule; follow it for every commit and push.
|
|
29
|
+
|
|
27
30
|
- Commit locally, report the SHA. **Push only on explicit approval.** (ADR-001)
|
|
28
31
|
- Before asking for push approval, state whether the push triggers a deployment, a migration
|
|
29
32
|
or any remote mutation.
|
|
33
|
+
- Once approved, you may push directly without the pre-push gate re-running the full suite
|
|
34
|
+
when you already ran that suite green on the current state and changed nothing since: cite
|
|
35
|
+
the already-passing run as the pass, and the gate recognizes the evidence and skips the
|
|
36
|
+
re-run rather than paying for it again. (ADR-120)
|
|
30
37
|
- Never use `--no-verify`, amend, rebase, reset or rewrite history unless explicitly asked.
|
|
31
38
|
- Never commit failing, partial, secret-bearing or unrelated work.
|
|
32
39
|
|
|
@@ -41,6 +41,14 @@ the list to reach it, and never split one decision into several questions to fit
|
|
|
41
41
|
- If that is not available, present numbered choices with `(recommended)` on the first option.
|
|
42
42
|
- Do not ask operational or procedural choices; apply the best documented option.
|
|
43
43
|
|
|
44
|
+
## Small work (no plan file)
|
|
45
|
+
|
|
46
|
+
When the whole of the work is small — fewer than three slices — do not create a plan file.
|
|
47
|
+
Plan it and implement it directly, in a single slice: state the slice and its acceptance
|
|
48
|
+
checks, resolve any material decisions, and build it. The `{{plansGlob}}` tracker table and
|
|
49
|
+
its `NNNN-slug.md` deliverable are for work that spans multiple slices; a single slice has
|
|
50
|
+
nothing to track. The slice-commit procedure still applies to the one commit it produces.
|
|
51
|
+
|
|
44
52
|
## Required First Turn
|
|
45
53
|
|
|
46
54
|
1. State the smallest independently valuable slice, the owning repo, the active plan
|