cohorte 2.10.1 → 3.0.0-dev.1
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 +7 -0
- package/assets/manifest.json +193 -0
- package/assets/migrations/config/README.md +12 -0
- package/assets/migrations/state/0001_init.sql +154 -0
- package/assets/prompts/README.md +11 -0
- package/assets/prompts/agents/fixer.md +7 -0
- package/assets/prompts/agents/implementer.md +12 -0
- package/assets/prompts/agents/reviewer.md +8 -0
- package/assets/prompts/agents/security-reviewer.md +7 -0
- package/assets/prompts/phases/build.md +5 -0
- package/assets/prompts/phases/review.md +5 -0
- package/assets/prompts/phases/test.md +5 -0
- package/assets/prompts/system.md +11 -0
- package/assets/schemas/agent-output.schema.json +225 -0
- package/assets/schemas/auth-status.schema.json +87 -0
- package/assets/schemas/command-result.schema.json +192 -0
- package/assets/schemas/commands.schema.json +952 -0
- package/assets/schemas/config.schema.json +2259 -0
- package/assets/schemas/doctor-report.schema.json +104 -0
- package/assets/schemas/events.schema.json +8514 -0
- package/assets/schemas/fake-script.schema.json +549 -0
- package/assets/schemas/inspect.schema.json +3133 -0
- package/assets/schemas/manifest.schema.json +79 -0
- package/assets/schemas/ownership.schema.json +52 -0
- package/assets/schemas/policy-verdict.schema.json +282 -0
- package/assets/schemas/project-model.schema.json +783 -0
- package/assets/schemas/project-status.schema.json +217 -0
- package/assets/schemas/reconcile-plan.schema.json +154 -0
- package/assets/schemas/run-diff.schema.json +177 -0
- package/assets/schemas/run-snapshot-manifest.schema.json +2104 -0
- package/assets/schemas/run-state.schema.json +1755 -0
- package/assets/schemas/runtime-capabilities.schema.json +1545 -0
- package/assets/schemas/sandbox-capabilities.schema.json +116 -0
- package/assets/schemas/skill.schema.json +87 -0
- package/assets/schemas/spec.schema.json +202 -0
- package/assets/schemas/tool-catalogue.schema.json +655 -0
- package/assets/schemas/trust-record.schema.json +38 -0
- package/assets/skills/README.md +9 -0
- package/assets/skills/inspect-surface.md +4 -0
- package/dist/agent-host.mjs +2187 -0
- package/dist/agent-host.mjs.map +1 -0
- package/dist/bundle-manifest.json +104 -0
- package/dist/chunks/__host-DgGPyco9.mjs +18 -0
- package/dist/chunks/__host-DgGPyco9.mjs.map +1 -0
- package/dist/chunks/approve-Cv135UqI.mjs +19 -0
- package/dist/chunks/approve-Cv135UqI.mjs.map +1 -0
- package/dist/chunks/auth-BT5oVp76.mjs +132 -0
- package/dist/chunks/auth-BT5oVp76.mjs.map +1 -0
- package/dist/chunks/auth-CYOh60KG.mjs +93 -0
- package/dist/chunks/auth-CYOh60KG.mjs.map +1 -0
- package/dist/chunks/brainstorm-BwKA6yZP.mjs +7 -0
- package/dist/chunks/brainstorm-BwKA6yZP.mjs.map +1 -0
- package/dist/chunks/cancel-KV_cpsqS.mjs +15 -0
- package/dist/chunks/cancel-KV_cpsqS.mjs.map +1 -0
- package/dist/chunks/canonical-C8UxeEmB.mjs +57 -0
- package/dist/chunks/canonical-C8UxeEmB.mjs.map +1 -0
- package/dist/chunks/catalogue-BvwSrM_j.mjs +1549 -0
- package/dist/chunks/catalogue-BvwSrM_j.mjs.map +1 -0
- package/dist/chunks/compose-Dvxunpto.mjs +7307 -0
- package/dist/chunks/compose-Dvxunpto.mjs.map +1 -0
- package/dist/chunks/config-DefHA2Lw.mjs +96 -0
- package/dist/chunks/config-DefHA2Lw.mjs.map +1 -0
- package/dist/chunks/contract-BkMjU1kR.mjs +295 -0
- package/dist/chunks/contract-BkMjU1kR.mjs.map +1 -0
- package/dist/chunks/contract-bQ9FJl4N.mjs +123 -0
- package/dist/chunks/contract-bQ9FJl4N.mjs.map +1 -0
- package/dist/chunks/deny-ClTxSvHJ.mjs +15 -0
- package/dist/chunks/deny-ClTxSvHJ.mjs.map +1 -0
- package/dist/chunks/diff-Qw0II0sj.mjs +101 -0
- package/dist/chunks/diff-Qw0II0sj.mjs.map +1 -0
- package/dist/chunks/discover-eS01-me1.mjs +21 -0
- package/dist/chunks/discover-eS01-me1.mjs.map +1 -0
- package/dist/chunks/doctor-B-H2UK5e.mjs +222 -0
- package/dist/chunks/doctor-B-H2UK5e.mjs.map +1 -0
- package/dist/chunks/fix-D4Tj8RVA.mjs +18 -0
- package/dist/chunks/fix-D4Tj8RVA.mjs.map +1 -0
- package/dist/chunks/gc-BBXlBF5w.mjs +161 -0
- package/dist/chunks/gc-BBXlBF5w.mjs.map +1 -0
- package/dist/chunks/init-BUnzIkeE.mjs +63 -0
- package/dist/chunks/init-BUnzIkeE.mjs.map +1 -0
- package/dist/chunks/inspect-Buby4cQD.mjs +22 -0
- package/dist/chunks/inspect-Buby4cQD.mjs.map +1 -0
- package/dist/chunks/logs-Giq5sUau.mjs +25 -0
- package/dist/chunks/logs-Giq5sUau.mjs.map +1 -0
- package/dist/chunks/migrate-DybihKzZ.mjs +33 -0
- package/dist/chunks/migrate-DybihKzZ.mjs.map +1 -0
- package/dist/chunks/models-Btp6X2YZ.mjs +24 -0
- package/dist/chunks/models-Btp6X2YZ.mjs.map +1 -0
- package/dist/chunks/pause-BASBfKLO.mjs +16 -0
- package/dist/chunks/pause-BASBfKLO.mjs.map +1 -0
- package/dist/chunks/policy-DUIgzF3W.mjs +139 -0
- package/dist/chunks/policy-DUIgzF3W.mjs.map +1 -0
- package/dist/chunks/providers-Dx78imKj.mjs +19 -0
- package/dist/chunks/providers-Dx78imKj.mjs.map +1 -0
- package/dist/chunks/reconcile-Bhy3IIYo.mjs +50 -0
- package/dist/chunks/reconcile-Bhy3IIYo.mjs.map +1 -0
- package/dist/chunks/render-DyZr5Lgi.mjs +53 -0
- package/dist/chunks/render-DyZr5Lgi.mjs.map +1 -0
- package/dist/chunks/resume-GJQRb2Eb.mjs +15 -0
- package/dist/chunks/resume-GJQRb2Eb.mjs.map +1 -0
- package/dist/chunks/retry-CLrUem1H.mjs +15 -0
- package/dist/chunks/retry-CLrUem1H.mjs.map +1 -0
- package/dist/chunks/review-BDdjb6kB.mjs +17 -0
- package/dist/chunks/review-BDdjb6kB.mjs.map +1 -0
- package/dist/chunks/run-CgTWYlcd.mjs +82 -0
- package/dist/chunks/run-CgTWYlcd.mjs.map +1 -0
- package/dist/chunks/run-tool-C3rAv4XF.mjs +26 -0
- package/dist/chunks/run-tool-C3rAv4XF.mjs.map +1 -0
- package/dist/chunks/scan-8Gy_B6kI.mjs +122 -0
- package/dist/chunks/scan-8Gy_B6kI.mjs.map +1 -0
- package/dist/chunks/schema-C9QbUW4H.mjs +578 -0
- package/dist/chunks/schema-C9QbUW4H.mjs.map +1 -0
- package/dist/chunks/send-BdnJ85Nz.mjs +19 -0
- package/dist/chunks/send-BdnJ85Nz.mjs.map +1 -0
- package/dist/chunks/ship-DTuLGoaJ.mjs +19 -0
- package/dist/chunks/ship-DTuLGoaJ.mjs.map +1 -0
- package/dist/chunks/shutdown-BM92Iyv2.mjs +15 -0
- package/dist/chunks/shutdown-BM92Iyv2.mjs.map +1 -0
- package/dist/chunks/skip-DZG5kpcH.mjs +18 -0
- package/dist/chunks/skip-DZG5kpcH.mjs.map +1 -0
- package/dist/chunks/spec-Bq0P3jVh.mjs +20 -0
- package/dist/chunks/spec-Bq0P3jVh.mjs.map +1 -0
- package/dist/chunks/src-CId6kMsY.mjs +1689 -0
- package/dist/chunks/src-CId6kMsY.mjs.map +1 -0
- package/dist/chunks/src-CfAOde7C.mjs +5403 -0
- package/dist/chunks/src-CfAOde7C.mjs.map +1 -0
- package/dist/chunks/src-CmFjh4M0.mjs +928 -0
- package/dist/chunks/src-CmFjh4M0.mjs.map +1 -0
- package/dist/chunks/src-Cu3TxNob.mjs +783 -0
- package/dist/chunks/src-Cu3TxNob.mjs.map +1 -0
- package/dist/chunks/src-DcU4IXMe.mjs +117 -0
- package/dist/chunks/src-DcU4IXMe.mjs.map +1 -0
- package/dist/chunks/src-s7YRvk0t.mjs +2116 -0
- package/dist/chunks/src-s7YRvk0t.mjs.map +1 -0
- package/dist/chunks/status-SMjiOMYy.mjs +29 -0
- package/dist/chunks/status-SMjiOMYy.mjs.map +1 -0
- package/dist/chunks/tail-BuhT-2PH.mjs +25 -0
- package/dist/chunks/tail-BuhT-2PH.mjs.map +1 -0
- package/dist/chunks/update-BXIppsbi.mjs +16 -0
- package/dist/chunks/update-BXIppsbi.mjs.map +1 -0
- package/dist/cli.mjs +175 -0
- package/dist/cli.mjs.map +1 -0
- package/package.json +17 -32
- package/CHANGELOG.md +0 -1461
- package/bin/cli.js +0 -817
- package/bin/report.js +0 -141
- package/core/adapter/render.js +0 -415
- package/core/agents/implementer.template.md +0 -142
- package/core/agents/profile-reader.md +0 -50
- package/core/agents/release.md +0 -58
- package/core/agents/review.md +0 -179
- package/core/commands/cohorte-align-ds.md +0 -33
- package/core/commands/cohorte-audit.md +0 -58
- package/core/commands/cohorte-brainstorm.md +0 -70
- package/core/commands/cohorte-build.md +0 -219
- package/core/commands/cohorte-doctor.md +0 -194
- package/core/commands/cohorte-fix.md +0 -80
- package/core/commands/cohorte-fleet.md +0 -103
- package/core/commands/cohorte-init-pipeline.md +0 -31
- package/core/commands/cohorte-intake.md +0 -92
- package/core/commands/cohorte-patch.md +0 -118
- package/core/commands/cohorte-refactor.md +0 -59
- package/core/commands/cohorte-retro.md +0 -85
- package/core/commands/cohorte-review.md +0 -270
- package/core/commands/cohorte-ship.md +0 -122
- package/core/commands/cohorte-spec.md +0 -101
- package/core/commands/cohorte-update-pipeline.md +0 -165
- package/core/hooks/gate.py +0 -588
- package/core/runtimes/claude.json +0 -74
- package/core/runtimes/codex.json +0 -85
- package/core/runtimes/cursor.json +0 -76
- package/core/runtimes/gemini.json +0 -76
- package/core/runtimes/opencode.json +0 -73
- package/core/templates/agent-handoff.md +0 -34
- package/core/templates/brainstorm-return.md +0 -36
- package/core/templates/decisions.template.md +0 -42
- package/core/templates/design-brief.md +0 -44
- package/core/templates/patch.template.md +0 -86
- package/core/templates/pr-body.md +0 -25
- package/core/templates/review-feedback.md +0 -38
- package/core/templates/spec.template.md +0 -87
- package/core/templates/steps/init-pipeline/01-detect-stack.md +0 -44
- package/core/templates/steps/init-pipeline/02-interview-gaps.md +0 -55
- package/core/templates/steps/init-pipeline/03-draft-profile.md +0 -10
- package/core/templates/steps/init-pipeline/04-write-render.md +0 -145
- package/core/templates/steps/init-pipeline/05-report.md +0 -12
- package/core/workflows/audit.js +0 -240
- package/core/workflows/loop.js +0 -641
- package/core/workflows/refactor.js +0 -276
- package/core/workflows/review.js +0 -456
- package/install.ps1 +0 -103
- package/install.sh +0 -114
- package/lib/doctor.js +0 -534
- package/lib/runtime.js +0 -139
- package/lib/versions.js +0 -149
- package/lib/yaml.js +0 -129
- package/profile/PIPELINE.template.md +0 -259
- package/profile/SCHEMA.md +0 -735
- package/profile/cohorte.config.template.yaml +0 -43
- package/scripts/assert-gate-hook.mjs +0 -75
- package/scripts/kanban-move.sh +0 -313
- package/scripts/metrics/collect.mjs +0 -531
- package/scripts/metrics/prices.json +0 -42
- package/scripts/new-feature.sh.template +0 -98
- package/scripts/preflight.sh +0 -124
- package/scripts/remove-feature.sh.template +0 -56
- package/scripts/test-adapter.mjs +0 -437
- package/scripts/test-gate.mjs +0 -443
- package/scripts/test-kanban.mjs +0 -304
- package/scripts/test-lib.mjs +0 -356
- package/scripts/test-metrics.mjs +0 -156
- package/scripts/test-workflows.mjs +0 -758
- package/scripts/validate-core.mjs +0 -325
package/core/runtimes/codex.json
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "codex",
|
|
3
|
-
"label": "Codex CLI (OpenAI)",
|
|
4
|
-
"docs": "https://learn.chatgpt.com/docs/build-skills",
|
|
5
|
-
"detect": [
|
|
6
|
-
"~/.codex"
|
|
7
|
-
],
|
|
8
|
-
"notes": [
|
|
9
|
-
"Commands ship as SKILLS (.agents/skills/<name>/SKILL.md), not as custom prompts. Prompts are",
|
|
10
|
-
"deprecated, and they are user-scoped only (~/.codex/prompts) \u2014 so a teammate cloning the repo",
|
|
11
|
-
"would get the profile but none of the commands. Skills are discovered from `.agents/skills` in",
|
|
12
|
-
"the repo, which means they travel with it. Invoked as $<name>, or implicitly from `description`.",
|
|
13
|
-
"Skills do NOT substitute arguments, so the preamble explains $ARGUMENTS rather than rewriting it.",
|
|
14
|
-
"Subagents are TOML, one file per agent, and the body lives in `developer_instructions`.",
|
|
15
|
-
"Hooks use the SAME PreToolUse envelope as Claude Code, with one difference that matters:",
|
|
16
|
-
"`permissionDecision: ask` is parsed but not honoured, so gate.py escalates ask to deny here.",
|
|
17
|
-
"Anthropic model aliases are dropped and default to inheritance. Explicit Codex model and model_reasoning_effort values are preserved. Surface agents always live in the current project's .codex/agents, even with a global core; CODEX_HOME does not change."
|
|
18
|
-
],
|
|
19
|
-
"scopes": {
|
|
20
|
-
"global": {
|
|
21
|
-
"root": "~/.codex",
|
|
22
|
-
"core": "~/.cohorte/codex",
|
|
23
|
-
"commands": "~/.agents/skills",
|
|
24
|
-
"agents": "~/.codex/agents",
|
|
25
|
-
"hooks": "~/.cohorte/codex/hooks",
|
|
26
|
-
"hooks_config": "~/.codex/hooks.json",
|
|
27
|
-
"workflows": null,
|
|
28
|
-
"settings": null
|
|
29
|
-
},
|
|
30
|
-
"project": {
|
|
31
|
-
"root": ".codex",
|
|
32
|
-
"core": ".cohorte/codex",
|
|
33
|
-
"commands": ".agents/skills",
|
|
34
|
-
"agents": ".codex/agents",
|
|
35
|
-
"hooks": ".cohorte/codex/hooks",
|
|
36
|
-
"hooks_config": ".codex/hooks.json",
|
|
37
|
-
"workflows": null,
|
|
38
|
-
"settings": null
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
"exclude_commands": [],
|
|
42
|
-
"command": {
|
|
43
|
-
"format": "skill",
|
|
44
|
-
"ext": "/SKILL.md",
|
|
45
|
-
"frontmatter": [
|
|
46
|
-
"name",
|
|
47
|
-
"description"
|
|
48
|
-
],
|
|
49
|
-
"args": null,
|
|
50
|
-
"args_note": "the text you typed after the skill name",
|
|
51
|
-
"invoke": "$<name>"
|
|
52
|
-
},
|
|
53
|
-
"agent": {
|
|
54
|
-
"format": "toml",
|
|
55
|
-
"ext": ".toml",
|
|
56
|
-
"body_key": "developer_instructions",
|
|
57
|
-
"frontmatter": [
|
|
58
|
-
"name",
|
|
59
|
-
"description",
|
|
60
|
-
"model",
|
|
61
|
-
"model_reasoning_effort"
|
|
62
|
-
],
|
|
63
|
-
"readonly_key": "sandbox_mode",
|
|
64
|
-
"readonly_value": "read-only",
|
|
65
|
-
"dispatch": "spawn the named agent; several run in parallel and Codex returns a consolidated result",
|
|
66
|
-
"address": "<name>"
|
|
67
|
-
},
|
|
68
|
-
"hook": {
|
|
69
|
-
"format": "claude",
|
|
70
|
-
"event": "PreToolUse",
|
|
71
|
-
"matcher": "Bash|shell|spawn_agent|Agent",
|
|
72
|
-
"supports_ask": false,
|
|
73
|
-
"config_shape": "json"
|
|
74
|
-
},
|
|
75
|
-
"capabilities": {
|
|
76
|
-
"subagents": true,
|
|
77
|
-
"hooks": true,
|
|
78
|
-
"workflows": false,
|
|
79
|
-
"inline_design": false,
|
|
80
|
-
"mcp": true,
|
|
81
|
-
"tool_restriction": true
|
|
82
|
-
},
|
|
83
|
-
"memory": "AGENTS.md",
|
|
84
|
-
"headless": "codex exec"
|
|
85
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "cursor",
|
|
3
|
-
"label": "Cursor",
|
|
4
|
-
"docs": "https://cursor.com/docs/cli/overview",
|
|
5
|
-
"detect": [
|
|
6
|
-
"~/.cursor"
|
|
7
|
-
],
|
|
8
|
-
"notes": [
|
|
9
|
-
"Cursor commands are plain markdown with NO placeholder substitution: whatever the human",
|
|
10
|
-
"types after the command name is appended to the prompt. The adapter therefore explains the",
|
|
11
|
-
"argument placeholder in the preamble rather than rewriting it to a token.",
|
|
12
|
-
"Subagents are markdown + frontmatter, and `readonly: true` is a real tool restriction \u2014",
|
|
13
|
-
"the review agent gets it. Cursor also reads .claude/agents and .codex/agents.",
|
|
14
|
-
"Hooks use Cursor's own envelope ({\"permission\": \u2026}), not Claude's.",
|
|
15
|
-
"Model pins are NOT carried across: the profile names Anthropic aliases (sonnet/haiku), which are meaningless here and would either error or be silently ignored. Agents and commands inherit this runtime's own model selection instead."
|
|
16
|
-
],
|
|
17
|
-
"scopes": {
|
|
18
|
-
"global": {
|
|
19
|
-
"root": "~/.cursor",
|
|
20
|
-
"core": "~/.cohorte/cursor",
|
|
21
|
-
"commands": "~/.cursor/commands",
|
|
22
|
-
"agents": "~/.cursor/agents",
|
|
23
|
-
"hooks": "~/.cohorte/cursor/hooks",
|
|
24
|
-
"hooks_config": "~/.cursor/hooks.json",
|
|
25
|
-
"workflows": null,
|
|
26
|
-
"settings": null
|
|
27
|
-
},
|
|
28
|
-
"project": {
|
|
29
|
-
"root": ".cursor",
|
|
30
|
-
"core": ".cohorte/cursor",
|
|
31
|
-
"commands": ".cursor/commands",
|
|
32
|
-
"agents": ".cursor/agents",
|
|
33
|
-
"hooks": ".cohorte/cursor/hooks",
|
|
34
|
-
"hooks_config": ".cursor/hooks.json",
|
|
35
|
-
"workflows": null,
|
|
36
|
-
"settings": null
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
"exclude_commands": [],
|
|
40
|
-
"command": {
|
|
41
|
-
"format": "md",
|
|
42
|
-
"ext": ".md",
|
|
43
|
-
"frontmatter": [],
|
|
44
|
-
"args": null,
|
|
45
|
-
"args_note": "the text you typed after the command name",
|
|
46
|
-
"invoke": "/<name>"
|
|
47
|
-
},
|
|
48
|
-
"agent": {
|
|
49
|
-
"format": "md",
|
|
50
|
-
"ext": ".md",
|
|
51
|
-
"frontmatter": [
|
|
52
|
-
"name",
|
|
53
|
-
"description"
|
|
54
|
-
],
|
|
55
|
-
"readonly_key": "readonly",
|
|
56
|
-
"readonly_value": "true",
|
|
57
|
-
"dispatch": "invoke it as /<name> <brief>, or name it in the prompt; several run in parallel",
|
|
58
|
-
"address": "/<name>"
|
|
59
|
-
},
|
|
60
|
-
"hook": {
|
|
61
|
-
"format": "cursor",
|
|
62
|
-
"event": "beforeShellExecution",
|
|
63
|
-
"supports_ask": true,
|
|
64
|
-
"config_shape": "json"
|
|
65
|
-
},
|
|
66
|
-
"capabilities": {
|
|
67
|
-
"subagents": true,
|
|
68
|
-
"hooks": true,
|
|
69
|
-
"workflows": false,
|
|
70
|
-
"inline_design": false,
|
|
71
|
-
"mcp": true,
|
|
72
|
-
"tool_restriction": true
|
|
73
|
-
},
|
|
74
|
-
"memory": "AGENTS.md",
|
|
75
|
-
"headless": "cursor-agent -p"
|
|
76
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "gemini",
|
|
3
|
-
"label": "Gemini CLI",
|
|
4
|
-
"docs": "https://geminicli.com/docs/",
|
|
5
|
-
"detect": [
|
|
6
|
-
"~/.gemini"
|
|
7
|
-
],
|
|
8
|
-
"notes": [
|
|
9
|
-
"Commands are TOML, not markdown: the whole prompt body becomes the `prompt` key, and the",
|
|
10
|
-
"argument placeholder is {{args}}. Sub-directories namespace with ':'.",
|
|
11
|
-
"Subagents ARE markdown + frontmatter (.gemini/agents), and are exposed to the main agent as",
|
|
12
|
-
"a tool of the same name; @agent-name forces one. They cannot call other subagents.",
|
|
13
|
-
"Hooks live in settings.json under `hooks`, event `BeforeTool`, matched on the tool name",
|
|
14
|
-
"(run_shell_command). The envelope is {\"decision\": \"deny\", \"reason\": \u2026} with no ask tier.",
|
|
15
|
-
"Model pins are NOT carried across: the profile names Anthropic aliases (sonnet/haiku), which are meaningless here and would either error or be silently ignored. Agents and commands inherit this runtime's own model selection instead."
|
|
16
|
-
],
|
|
17
|
-
"scopes": {
|
|
18
|
-
"global": {
|
|
19
|
-
"root": "~/.gemini",
|
|
20
|
-
"core": "~/.cohorte/gemini",
|
|
21
|
-
"commands": "~/.gemini/commands",
|
|
22
|
-
"agents": "~/.gemini/agents",
|
|
23
|
-
"hooks": "~/.cohorte/gemini/hooks",
|
|
24
|
-
"hooks_config": "~/.gemini/settings.json",
|
|
25
|
-
"workflows": null,
|
|
26
|
-
"settings": "~/.gemini/settings.json"
|
|
27
|
-
},
|
|
28
|
-
"project": {
|
|
29
|
-
"root": ".gemini",
|
|
30
|
-
"core": ".cohorte/gemini",
|
|
31
|
-
"commands": ".gemini/commands",
|
|
32
|
-
"agents": ".gemini/agents",
|
|
33
|
-
"hooks": ".cohorte/gemini/hooks",
|
|
34
|
-
"hooks_config": ".gemini/settings.json",
|
|
35
|
-
"workflows": null,
|
|
36
|
-
"settings": ".gemini/settings.json"
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
"exclude_commands": [],
|
|
40
|
-
"command": {
|
|
41
|
-
"format": "toml",
|
|
42
|
-
"ext": ".toml",
|
|
43
|
-
"frontmatter": [
|
|
44
|
-
"description"
|
|
45
|
-
],
|
|
46
|
-
"args": "{{args}}",
|
|
47
|
-
"invoke": "/<name>"
|
|
48
|
-
},
|
|
49
|
-
"agent": {
|
|
50
|
-
"format": "md",
|
|
51
|
-
"ext": ".md",
|
|
52
|
-
"frontmatter": [
|
|
53
|
-
"name",
|
|
54
|
-
"description"
|
|
55
|
-
],
|
|
56
|
-
"dispatch": "the subagent is exposed as a tool of the same name; @<name> forces it",
|
|
57
|
-
"address": "@<name>"
|
|
58
|
-
},
|
|
59
|
-
"hook": {
|
|
60
|
-
"format": "gemini",
|
|
61
|
-
"event": "BeforeTool",
|
|
62
|
-
"matcher": "run_shell_command",
|
|
63
|
-
"supports_ask": false,
|
|
64
|
-
"config_shape": "settings"
|
|
65
|
-
},
|
|
66
|
-
"capabilities": {
|
|
67
|
-
"subagents": true,
|
|
68
|
-
"hooks": true,
|
|
69
|
-
"workflows": false,
|
|
70
|
-
"inline_design": false,
|
|
71
|
-
"mcp": true,
|
|
72
|
-
"tool_restriction": false
|
|
73
|
-
},
|
|
74
|
-
"memory": "GEMINI.md",
|
|
75
|
-
"headless": "gemini -p"
|
|
76
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "opencode",
|
|
3
|
-
"label": "OpenCode",
|
|
4
|
-
"docs": "https://opencode.ai/docs/cli/",
|
|
5
|
-
"detect": [
|
|
6
|
-
"~/.config/opencode",
|
|
7
|
-
"~/.opencode"
|
|
8
|
-
],
|
|
9
|
-
"notes": [
|
|
10
|
-
"Markdown agents in agents/ with `mode: subagent`, addressed with @<name>.",
|
|
11
|
-
"The one runtime here with NO hook mechanism \u2014 extension is via plugins (.opencode/plugin/*.js),",
|
|
12
|
-
"which is a different contract from a blocking PreToolUse hook. The gate therefore runs in",
|
|
13
|
-
"explicit --check mode, which is advisory by construction.",
|
|
14
|
-
"`opencode run` is the headless primitive; --agent selects an agent.",
|
|
15
|
-
"Model pins are NOT carried across: the profile names Anthropic aliases (sonnet/haiku), which are meaningless here and would either error or be silently ignored. Agents and commands inherit this runtime's own model selection instead."
|
|
16
|
-
],
|
|
17
|
-
"scopes": {
|
|
18
|
-
"global": {
|
|
19
|
-
"root": "~/.config/opencode",
|
|
20
|
-
"core": "~/.cohorte/opencode",
|
|
21
|
-
"commands": "~/.config/opencode/commands",
|
|
22
|
-
"agents": "~/.config/opencode/agents",
|
|
23
|
-
"hooks": null,
|
|
24
|
-
"workflows": null,
|
|
25
|
-
"settings": null
|
|
26
|
-
},
|
|
27
|
-
"project": {
|
|
28
|
-
"root": ".opencode",
|
|
29
|
-
"core": ".cohorte/opencode",
|
|
30
|
-
"commands": ".opencode/commands",
|
|
31
|
-
"agents": ".opencode/agents",
|
|
32
|
-
"hooks": null,
|
|
33
|
-
"workflows": null,
|
|
34
|
-
"settings": null
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
"exclude_commands": [],
|
|
38
|
-
"command": {
|
|
39
|
-
"format": "md",
|
|
40
|
-
"ext": ".md",
|
|
41
|
-
"frontmatter": [
|
|
42
|
-
"description",
|
|
43
|
-
"agent",
|
|
44
|
-
"subtask"
|
|
45
|
-
],
|
|
46
|
-
"args": "$ARGUMENTS",
|
|
47
|
-
"invoke": "/<name>"
|
|
48
|
-
},
|
|
49
|
-
"agent": {
|
|
50
|
-
"format": "md",
|
|
51
|
-
"frontmatter": [
|
|
52
|
-
"description",
|
|
53
|
-
"mode"
|
|
54
|
-
],
|
|
55
|
-
"defaults": {
|
|
56
|
-
"mode": "subagent"
|
|
57
|
-
},
|
|
58
|
-
"dispatch": "address the subagent with @<name> and give it the full brief in one message",
|
|
59
|
-
"address": "@<name>",
|
|
60
|
-
"ext": ".md"
|
|
61
|
-
},
|
|
62
|
-
"capabilities": {
|
|
63
|
-
"subagents": true,
|
|
64
|
-
"hooks": false,
|
|
65
|
-
"workflows": false,
|
|
66
|
-
"inline_design": false,
|
|
67
|
-
"mcp": true,
|
|
68
|
-
"tool_restriction": false
|
|
69
|
-
},
|
|
70
|
-
"memory": "AGENTS.md",
|
|
71
|
-
"headless": "opencode run",
|
|
72
|
-
"hook": null
|
|
73
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# HANDOFF — <surface> · <feature_id>
|
|
2
|
-
|
|
3
|
-
<!-- REFERENCE COPY — not read at runtime. The AUTHORITATIVE shape is inlined in
|
|
4
|
-
core/agents/implementer.template.md (§"Your return"), because a rendered agent must
|
|
5
|
-
not need a second file read to know its own output format. This file exists for humans
|
|
6
|
-
reading the core; keep it byte-aligned with the template, or delete both together.
|
|
7
|
-
|
|
8
|
-
Keep it tight: the lead only acts on mismatches, test failures, remediation ticks, and TODOs.
|
|
9
|
-
Never list files one by one — the lead has `git diff --stat`. Never paste code excerpts —
|
|
10
|
-
a file:line reference is enough, the code is on disk. One line per item. -->
|
|
11
|
-
|
|
12
|
-
## Summary
|
|
13
|
-
|
|
14
|
-
<2–4 lines: what you built and the approach>
|
|
15
|
-
|
|
16
|
-
## Migrations / schema (only if any)
|
|
17
|
-
|
|
18
|
-
- `<name>` — <additive change>
|
|
19
|
-
|
|
20
|
-
## Tests
|
|
21
|
-
|
|
22
|
-
- Run: <this surface's test_cmd> · result: <pass/fail + counts>
|
|
23
|
-
|
|
24
|
-
## Contract mismatches / assumptions
|
|
25
|
-
|
|
26
|
-
<none, or describe — NEVER edit the contract; report here instead>
|
|
27
|
-
|
|
28
|
-
## Remediation addressed (fix loops only)
|
|
29
|
-
|
|
30
|
-
- <which `## Remediation` items you fixed, by file:line>
|
|
31
|
-
|
|
32
|
-
## TODO / not done
|
|
33
|
-
|
|
34
|
-
- <anything deferred, blocked, or out of scope — or "none">
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# BRAINSTORM RETURN — <feature title>
|
|
2
|
-
|
|
3
|
-
> Paste this into `/cohorte-spec`.
|
|
4
|
-
|
|
5
|
-
**One-liner:** <what we're building, in one sentence>
|
|
6
|
-
|
|
7
|
-
## Problem & value
|
|
8
|
-
|
|
9
|
-
<the problem, who has it, why it matters>
|
|
10
|
-
|
|
11
|
-
## Scope
|
|
12
|
-
|
|
13
|
-
- **In:** <…>
|
|
14
|
-
- **Out (non-goals):** <…>
|
|
15
|
-
|
|
16
|
-
## Roles affected
|
|
17
|
-
|
|
18
|
-
> Only if the profile has `rbac.enabled` — list the roles from `PIPELINE.md` §rbac and what each does;
|
|
19
|
-
> explicitly note the lowest-privilege experience. Omit this section if there is no RBAC.
|
|
20
|
-
|
|
21
|
-
<which roles do what>
|
|
22
|
-
|
|
23
|
-
## Rough shape
|
|
24
|
-
|
|
25
|
-
- **Data:** <entities / fields touched>
|
|
26
|
-
- **Screens:** <key screens/flows — mobile-first if the project has UI>
|
|
27
|
-
- **Interface (rough):** <endpoints / methods we'll need — refined into the contract in /cohorte-spec>
|
|
28
|
-
|
|
29
|
-
## Risks & open questions
|
|
30
|
-
|
|
31
|
-
- <risk / unknown>
|
|
32
|
-
- <open question for /cohorte-spec to resolve>
|
|
33
|
-
|
|
34
|
-
## Panel dissent (what was contested)
|
|
35
|
-
|
|
36
|
-
<the strongest disagreement the panel surfaced — so /cohorte-spec doesn't paper over it>
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# Decisions
|
|
2
|
-
|
|
3
|
-
> The project's **transverse decision journal** — the non-obvious rules a stateless agent would
|
|
4
|
-
> otherwise re-discover or contradict, one feature at a time. `PIPELINE.md` says *how this repo is
|
|
5
|
-
> built* (surfaces, commands, conventions); this file says *what was decided and why*.
|
|
6
|
-
>
|
|
7
|
-
> **Append-only. One line per decision. No prose blocks, no code.** The bound is the point: this file
|
|
8
|
-
> is read by `/cohorte-spec`, `/cohorte-brainstorm` and `/cohorte-audit` — the deciding stages — and by **nothing else**.
|
|
9
|
-
> Implementers and reviewers never read it: they work from the frozen contract, which already tells
|
|
10
|
-
> them what to do; handing them the rationale too would cost `surfaces × dispatches` tokens per
|
|
11
|
-
> feature for a fact they cannot act on.
|
|
12
|
-
>
|
|
13
|
-
> Line shape (≤ ~160 chars, `·`-separated, no wrapping):
|
|
14
|
-
>
|
|
15
|
-
> ```
|
|
16
|
-
> - <YYYY-MM-DD> · <area> · <the decision, imperative> — because <the reason> · <feature_id>
|
|
17
|
-
> ```
|
|
18
|
-
>
|
|
19
|
-
> `<area>` is a short tag, not a path: `auth`, `data`, `api`, `ui`, `deploy`, `naming`, `surfaces`…
|
|
20
|
-
>
|
|
21
|
-
> **Reversing a decision** never edits or deletes a line — append a superseding one and move the old
|
|
22
|
-
> one to `## Superseded`:
|
|
23
|
-
>
|
|
24
|
-
> ```
|
|
25
|
-
> - <YYYY-MM-DD> · <area> · <the new decision> — because <reason> · supersedes <YYYY-MM-DD> <area> · <feature_id>
|
|
26
|
-
> ```
|
|
27
|
-
>
|
|
28
|
-
> **Keep it bounded:** when `## Live` passes ~100 lines, move every superseded line into
|
|
29
|
-
> `## Superseded` (the audit trail survives; the section the deciding stages actually read stays
|
|
30
|
-
> short). Never summarize or merge live lines — a decision either holds or has been superseded.
|
|
31
|
-
>
|
|
32
|
-
> **What does NOT belong here:** anything the code, the tests, `PIPELINE.md` §Conventions or a spec
|
|
33
|
-
> already states; a feature-local choice (that lives in its spec); a task, a TODO or a finding (those
|
|
34
|
-
> are `## Remediation` and `specs/refactor-backlog.md`).
|
|
35
|
-
|
|
36
|
-
## Live
|
|
37
|
-
|
|
38
|
-
<!-- newest last -->
|
|
39
|
-
|
|
40
|
-
## Superseded
|
|
41
|
-
|
|
42
|
-
<!-- moved here when a line above supersedes them; never deleted -->
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# DESIGN BRIEF — <feature title> (`<feature_id>`)
|
|
2
|
-
|
|
3
|
-
> The "spec return". This is §8 of the frozen spec, standalone — `/cohorte-spec` writes it to
|
|
4
|
-
> `specs/design/<feature_id>.md` on freeze. Omit entirely if the project has no UI.
|
|
5
|
-
>
|
|
6
|
-
> **Getting it into the design tool.** By default: paste it there yourself (see `PIPELINE.md` §design).
|
|
7
|
-
> With `design.inline: true`, `/cohorte-spec` instead offers to hand this file straight to `/design`,
|
|
8
|
-
> which reads the codebase, matches the existing UI style, and returns editable artboards in-session.
|
|
9
|
-
>
|
|
10
|
-
> Inline changes who does the pasting, and nothing else. This file is still written to disk first and
|
|
11
|
-
> is still what `/cohorte-build` reads — the artboards are an aid to the human, not an input to the
|
|
12
|
-
> pipeline, and `/design` is a research preview that does not save them for you. Export anything worth
|
|
13
|
-
> keeping before the session ends. If the design floor is unmet, the flag degrades to the paste-it-
|
|
14
|
-
> yourself path with a note, never to an error: a brief that exists is worth more than a step that ran.
|
|
15
|
-
|
|
16
|
-
**Goal:** <one line — what the user accomplishes>
|
|
17
|
-
|
|
18
|
-
**Design system:** use the existing UI kit (`PIPELINE.md` §design → `ui_kit_path`). Mobile-first.
|
|
19
|
-
|
|
20
|
-
## Screens / views
|
|
21
|
-
|
|
22
|
-
For each: purpose, who sees it (role, if RBAC), and the key elements.
|
|
23
|
-
|
|
24
|
-
- **<screen name>** — <purpose> · roles: <…>
|
|
25
|
-
- Elements: <…>
|
|
26
|
-
- States: empty · loading · error · success
|
|
27
|
-
|
|
28
|
-
## Flows
|
|
29
|
-
|
|
30
|
-
<step-by-step of the main user journey, and any role-specific variation>
|
|
31
|
-
|
|
32
|
-
## Responsive
|
|
33
|
-
|
|
34
|
-
- Mobile (base): <layout>
|
|
35
|
-
- Tablet (`md:`): <changes>
|
|
36
|
-
- Desktop (`lg:`): <changes>
|
|
37
|
-
|
|
38
|
-
## Data shown
|
|
39
|
-
|
|
40
|
-
<what fields/values appear on screen — must match the contract in spec §5>
|
|
41
|
-
|
|
42
|
-
## Notes / constraints
|
|
43
|
-
|
|
44
|
-
<accessibility · copy in the profile's `ui_language` · edge cases · theming constraints>
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
feature_id: patch-<slug>
|
|
3
|
-
kind: patch # a bug fix, not a feature — /cohorte-build skips contract authoring, /cohorte-ship commits `fix(…)`
|
|
4
|
-
title: <one line: the bug, from the user's side>
|
|
5
|
-
status: draft # draft → frozen → in-progress → in-review → shipped · blocked (see SCHEMA.md §Spec status)
|
|
6
|
-
severity: <critical | major | minor> # drives nothing mechanical; it is what the human triages on
|
|
7
|
-
branch: <patch_branch_prefix><feature_id>
|
|
8
|
-
created: <YYYY-MM-DD>
|
|
9
|
-
reviewed_base: # merge-base sha at the last SHIP verdict — freshness-gate anchor (written by /cohorte-review)
|
|
10
|
-
reviewed_digest: # sha256 (16 hex) of the reviewed source diff vs reviewed_base, specs excluded — /cohorte-ship re-checks
|
|
11
|
-
design_files: [] # omit unless the fix is itself visual
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# <one line: the bug, from the user's side>
|
|
15
|
-
|
|
16
|
-
## 1. Symptom & repro
|
|
17
|
-
|
|
18
|
-
> What the user sees, and the shortest deterministic path to see it. A repro nobody can run is a
|
|
19
|
-
> hypothesis, not a bug — say so here rather than pretending otherwise.
|
|
20
|
-
|
|
21
|
-
- **Observed:** …
|
|
22
|
-
- **Expected:** …
|
|
23
|
-
- **Repro:** 1. … 2. … 3. …
|
|
24
|
-
- **Since / trigger:** <version, commit, or "unknown">
|
|
25
|
-
|
|
26
|
-
## 2. Impact
|
|
27
|
-
|
|
28
|
-
> Who is affected, how often, and whether there is a workaround. This is what justifies the patch
|
|
29
|
-
> jumping the feature queue — one or two lines.
|
|
30
|
-
|
|
31
|
-
## 3. Cause
|
|
32
|
-
|
|
33
|
-
> Confirmed or hypothesis — label which. Name the `file:line` if you have it. If the cause is
|
|
34
|
-
> unknown at freeze, say so: the implementer's first job is then to find it, and the review will
|
|
35
|
-
> check that the stated cause matches the diff.
|
|
36
|
-
|
|
37
|
-
## 4. Regression test (red first)
|
|
38
|
-
|
|
39
|
-
> The heart of a patch spec — it replaces §5 CONTRACT as the thing the diff is checked against.
|
|
40
|
-
> Name the test file and what it asserts. It must fail on the current code and pass after the fix.
|
|
41
|
-
|
|
42
|
-
- **Test:** `<path/to/test>` · asserts: …
|
|
43
|
-
- **Fails today because:** …
|
|
44
|
-
|
|
45
|
-
## 5. Contract delta
|
|
46
|
-
|
|
47
|
-
> Usually `none`. A fix that *changes* an existing contract entry describes the change here and
|
|
48
|
-
> `/cohorte-build` propagates it to every surface that names it. A fix that needs **new** contract
|
|
49
|
-
> surface area is not a patch — stop and run `/cohorte-spec` instead.
|
|
50
|
-
|
|
51
|
-
`none`
|
|
52
|
-
|
|
53
|
-
## 6. Surface tasks
|
|
54
|
-
|
|
55
|
-
> One `###` subsection per surface the fix touches — a patch may legitimately span several (an
|
|
56
|
-
> unvalidated field on the API *and* the form that sends it). Each TDD: the §4 test first.
|
|
57
|
-
|
|
58
|
-
### <surface.key>
|
|
59
|
-
|
|
60
|
-
- …
|
|
61
|
-
|
|
62
|
-
## 7. Out of scope
|
|
63
|
-
|
|
64
|
-
> The adjacent things this patch deliberately does NOT fix. This is the section that keeps a bug fix
|
|
65
|
-
> from turning into a refactor — the reviewer reads it before flagging what you left alone. Real but
|
|
66
|
-
> out-of-scope findings belong in `specs/refactor-backlog.md`, not in this diff.
|
|
67
|
-
|
|
68
|
-
- …
|
|
69
|
-
|
|
70
|
-
## 9. Acceptance criteria / DoD
|
|
71
|
-
|
|
72
|
-
> §9, not §8 — the number is load-bearing, so don't renumber it. `review.md` and
|
|
73
|
-
> `implementer.template.md` both name "contract §5, acceptance §9" verbatim, so a patch spec pins
|
|
74
|
-
> those two sections to the feature spec's numbers and just has no §8 (the feature spec has no §7 —
|
|
75
|
-
> a gap in the sequence is normal here).
|
|
76
|
-
|
|
77
|
-
- [ ] The §4 regression test exists, and failed before the fix
|
|
78
|
-
- [ ] Each touched surface's tests (TDD) green
|
|
79
|
-
- [ ] `PIPELINE.md` commands.lint · typecheck · test green
|
|
80
|
-
- [ ] The repro in §1 no longer reproduces
|
|
81
|
-
- [ ] Nothing outside §6's surfaces changed
|
|
82
|
-
|
|
83
|
-
## Remediation
|
|
84
|
-
|
|
85
|
-
> Filled by `/cohorte-fix` from a REVIEW REPORT; empty otherwise. Each item:
|
|
86
|
-
> `[ ] <SEVERITY> · <file:line> · <spec-violation|quality|security> · <concrete fix>`
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
## <type>(<scope>): <feature title>
|
|
2
|
-
|
|
3
|
-
**feature_id:** `<feature_id>` · closes/relates: <issue if any>
|
|
4
|
-
|
|
5
|
-
### What & why
|
|
6
|
-
|
|
7
|
-
<2–4 lines: what this ships and the value, from the spec goal>
|
|
8
|
-
|
|
9
|
-
### Changes
|
|
10
|
-
|
|
11
|
-
> One bullet per surface (from `PIPELINE.md` §surfaces), plus the shared contract.
|
|
12
|
-
|
|
13
|
-
- **<surface.key>:** <what changed>
|
|
14
|
-
- **Shared:** `<contract.path>/<feature_id>.<ext>` <(new/changed types: names only; omit if contract.enabled is false)>
|
|
15
|
-
|
|
16
|
-
### Tests
|
|
17
|
-
|
|
18
|
-
- <per surface: test runner · coverage>
|
|
19
|
-
- <PIPELINE.md commands.lint · typecheck · test> — green
|
|
20
|
-
|
|
21
|
-
### Review
|
|
22
|
-
|
|
23
|
-
Verdict: **SHIP** · remediation rounds: <n>
|
|
24
|
-
|
|
25
|
-
🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# REVIEW REPORT
|
|
2
|
-
|
|
3
|
-
<!-- REFERENCE COPY — not read at runtime. The AUTHORITATIVE shape is inlined in
|
|
4
|
-
core/agents/review.md (§"Your return"), because an agent must not need a second
|
|
5
|
-
file read to know its own output format. This file exists for humans reading the
|
|
6
|
-
core; keep it byte-aligned with the agent, or delete both together.
|
|
7
|
-
|
|
8
|
-
Everything in an HTML comment is guidance — do NOT emit it.
|
|
9
|
-
Verdict rules live in the review agent's instructions (SHIP = no CRITICAL/security;
|
|
10
|
-
REVISE = ≥1 CRITICAL; BLOCK = security vulnerability).
|
|
11
|
-
CAPPED: max 20 findings, ONE line each (severity · file:line · type · concrete fix),
|
|
12
|
-
ZERO code excerpts — file:line is enough, the source is on disk. Overflow ⇒ keep all
|
|
13
|
-
CRITICAL/HIGH/security, fill by severity, close with one `+<n> more …` line. -->
|
|
14
|
-
|
|
15
|
-
feature_id: <feature_id> · scope: <surface.key>
|
|
16
|
-
|
|
17
|
-
| Severity | Count |
|
|
18
|
-
| -------- | ----- |
|
|
19
|
-
| CRITICAL | 0 |
|
|
20
|
-
| HIGH | 0 |
|
|
21
|
-
| MEDIUM | 0 |
|
|
22
|
-
| LOW | 0 |
|
|
23
|
-
|
|
24
|
-
Verdict: <SHIP | REVISE | BLOCK>
|
|
25
|
-
|
|
26
|
-
## Findings
|
|
27
|
-
|
|
28
|
-
<!-- Every finding self-sufficient for a stateless agent; order by severity; "None." if none.
|
|
29
|
-
The line format pastes straight into the spec's `## Remediation`. -->
|
|
30
|
-
|
|
31
|
-
- **[CRITICAL]** `<surface.path>/...:42` · spec-violation · <what's wrong vs spec §X> → **Fix:** <concrete change>
|
|
32
|
-
- **[HIGH]** `<path>:88` · quality · <issue> → **Fix:** <concrete change>
|
|
33
|
-
- **[BLOCK/security]** `<path>:line` · security · <vuln> → **Fix:** <concrete change>
|
|
34
|
-
|
|
35
|
-
## Notes
|
|
36
|
-
|
|
37
|
-
<!-- ONLY the RBAC / mobile-first assessment when the profile enables them; omit the section
|
|
38
|
-
otherwise. Never list things verified clean. -->
|