fdeops 4.1.1 → 5.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/AGENTS.md +2 -2
- package/README.md +85 -246
- package/bin/catalog-doc.js +38 -0
- package/bin/check.js +20 -49
- package/bin/fde.js +2 -2
- package/bin/generate-skills.js +11 -3
- package/bin/install.js +37 -3
- package/bin/skill-catalog.js +283 -16
- package/mcp/fdeops-ingest/package.json +1 -1
- package/package.json +2 -2
- package/plugin.json +1 -1
- package/skills/README.md +7 -0
- package/skills/audit/.fde-generated.json +10 -0
- package/skills/audit/SKILL.md +21 -0
- package/skills/audit/references/discover.md +112 -0
- package/skills/{fde-build → audit}/references/task-context.md +7 -1
- package/skills/board-memo/.fde-generated.json +10 -0
- package/skills/board-memo/SKILL.md +21 -0
- package/skills/{fde-debug → board-memo}/references/task-context.md +7 -1
- package/skills/brief/.fde-generated.json +9 -0
- package/skills/brief/SKILL.md +21 -0
- package/skills/brief/references/land.md +136 -0
- package/skills/{fde-discover → brief}/references/task-context.md +7 -1
- package/skills/{fde-build → build}/.fde-generated.json +2 -2
- package/skills/{fde-build → build}/SKILL.md +2 -2
- package/skills/{fde-evaluate → build}/references/task-context.md +7 -1
- package/skills/business-case/.fde-generated.json +9 -0
- package/skills/business-case/SKILL.md +21 -0
- package/skills/business-case/references/task-context.md +18 -0
- package/skills/connect/.fde-generated.json +12 -0
- package/skills/connect/SKILL.md +21 -0
- package/skills/connect/references/connect.md +24 -0
- package/skills/connect/references/debrief.md +91 -0
- package/skills/connect/references/ingest.md +75 -0
- package/skills/connect/references/source-setup.md +30 -0
- package/skills/connect/references/task-context.md +18 -0
- package/skills/dashboard/.fde-generated.json +9 -0
- package/skills/dashboard/SKILL.md +21 -0
- package/skills/dashboard/references/dashboard.md +40 -0
- package/skills/dashboard/references/task-context.md +18 -0
- package/skills/debrief/.fde-generated.json +12 -0
- package/skills/debrief/SKILL.md +21 -0
- package/skills/debrief/references/connect.md +24 -0
- package/skills/debrief/references/debrief.md +91 -0
- package/skills/debrief/references/ingest.md +75 -0
- package/skills/debrief/references/source-setup.md +30 -0
- package/skills/debrief/references/task-context.md +18 -0
- package/skills/{fde-debug → debug}/.fde-generated.json +2 -2
- package/skills/{fde-debug → debug}/SKILL.md +2 -2
- package/skills/debug/references/task-context.md +18 -0
- package/skills/demo-prep/.fde-generated.json +9 -0
- package/skills/demo-prep/SKILL.md +21 -0
- package/skills/demo-prep/references/demo-prep.md +31 -0
- package/skills/demo-prep/references/task-context.md +18 -0
- package/skills/discover/.fde-generated.json +10 -0
- package/skills/{fde-discover → discover}/SKILL.md +2 -2
- package/skills/discover/references/discover.md +112 -0
- package/skills/discover/references/task-context.md +18 -0
- package/skills/earn-trust/.fde-generated.json +9 -0
- package/skills/earn-trust/SKILL.md +21 -0
- package/skills/earn-trust/references/earn-trust.md +100 -0
- package/skills/earn-trust/references/task-context.md +18 -0
- package/skills/{fde-integrate → evaluate}/.fde-generated.json +2 -2
- package/skills/{fde-evaluate → evaluate}/SKILL.md +2 -2
- package/skills/evaluate/references/task-context.md +18 -0
- package/skills/fde/SKILL.md +11 -10
- package/skills/fde/references/connect.md +14 -24
- package/skills/fde/references/debrief.md +2 -0
- package/skills/fde/references/discover.md +66 -208
- package/skills/fde/references/ingest.md +4 -2
- package/skills/fde/references/plan.md +6 -6
- package/skills/fde/references/runbook.md +52 -120
- package/skills/fde/references/source-setup.md +30 -0
- package/skills/fde/references/task-context.md +7 -1
- package/skills/feedback/.fde-generated.json +9 -0
- package/skills/{fde-feedback → feedback}/SKILL.md +2 -2
- package/skills/feedback/references/task-context.md +18 -0
- package/skills/{fde-handoff → handoff}/.fde-generated.json +2 -2
- package/skills/{fde-handoff → handoff}/SKILL.md +2 -2
- package/skills/handoff/references/task-context.md +18 -0
- package/skills/ingest/.fde-generated.json +12 -0
- package/skills/ingest/SKILL.md +21 -0
- package/skills/ingest/references/connect.md +24 -0
- package/skills/ingest/references/debrief.md +91 -0
- package/skills/ingest/references/ingest.md +75 -0
- package/skills/ingest/references/source-setup.md +30 -0
- package/skills/ingest/references/task-context.md +18 -0
- package/skills/{fde-evaluate → integrate}/.fde-generated.json +2 -2
- package/skills/{fde-integrate → integrate}/SKILL.md +2 -2
- package/skills/integrate/references/task-context.md +18 -0
- package/skills/{fde-options → options}/.fde-generated.json +2 -2
- package/skills/{fde-options → options}/SKILL.md +2 -2
- package/skills/options/references/task-context.md +18 -0
- package/skills/plan/.fde-generated.json +10 -0
- package/skills/plan/SKILL.md +21 -0
- package/skills/plan/references/business-case.md +90 -0
- package/skills/{fde-poc → plan}/references/plan.md +6 -6
- package/skills/plan/references/task-context.md +18 -0
- package/skills/{fde-poc → poc}/.fde-generated.json +4 -4
- package/skills/{fde-poc → poc}/SKILL.md +2 -2
- package/skills/poc/references/audit.md +71 -0
- package/skills/poc/references/business-case.md +90 -0
- package/skills/poc/references/discover.md +112 -0
- package/skills/poc/references/plan.md +167 -0
- package/skills/poc/references/task-context.md +18 -0
- package/skills/prioritize/.fde-generated.json +10 -0
- package/skills/prioritize/SKILL.md +21 -0
- package/skills/prioritize/references/business-case.md +90 -0
- package/skills/prioritize/references/pick-three.md +95 -0
- package/skills/prioritize/references/task-context.md +18 -0
- package/skills/qa/.fde-generated.json +16 -0
- package/skills/{fde-qa → qa}/SKILL.md +2 -2
- package/skills/qa/references/task-context.md +18 -0
- package/skills/{fde-readout → readout}/.fde-generated.json +2 -2
- package/skills/{fde-readout → readout}/SKILL.md +2 -2
- package/skills/readout/references/board-memo.md +108 -0
- package/skills/readout/references/business-case.md +90 -0
- package/skills/readout/references/task-context.md +18 -0
- package/skills/red-team/.fde-generated.json +9 -0
- package/skills/red-team/SKILL.md +21 -0
- package/skills/red-team/references/red-team.md +105 -0
- package/skills/red-team/references/task-context.md +18 -0
- package/skills/rescue/.fde-generated.json +9 -0
- package/skills/rescue/SKILL.md +21 -0
- package/skills/rescue/references/rescue.md +82 -0
- package/skills/rescue/references/task-context.md +18 -0
- package/skills/review/.fde-generated.json +16 -0
- package/skills/{fde-review → review}/SKILL.md +2 -2
- package/skills/review/references/task-context.md +18 -0
- package/skills/rollback/.fde-generated.json +9 -0
- package/skills/rollback/SKILL.md +21 -0
- package/skills/rollback/references/rollback.md +102 -0
- package/skills/rollback/references/task-context.md +18 -0
- package/skills/runbook/.fde-generated.json +11 -0
- package/skills/runbook/SKILL.md +21 -0
- package/skills/runbook/references/close.md +66 -0
- package/skills/runbook/references/encode-pattern.md +96 -0
- package/skills/runbook/references/runbook.md +73 -0
- package/skills/runbook/references/task-context.md +18 -0
- package/skills/scope/.fde-generated.json +9 -0
- package/skills/{fde-scope → scope}/SKILL.md +2 -2
- package/skills/scope/references/task-context.md +18 -0
- package/skills/score-use-cases/.fde-generated.json +10 -0
- package/skills/score-use-cases/SKILL.md +21 -0
- package/skills/score-use-cases/references/business-case.md +90 -0
- package/skills/score-use-cases/references/score-use-cases.md +70 -0
- package/skills/score-use-cases/references/task-context.md +18 -0
- package/skills/ship/.fde-generated.json +16 -0
- package/skills/{fde-ship → ship}/SKILL.md +2 -2
- package/skills/ship/references/task-context.md +18 -0
- package/skills/switch-clients/.fde-generated.json +9 -0
- package/skills/switch-clients/SKILL.md +21 -0
- package/skills/switch-clients/references/switch-clients.md +114 -0
- package/skills/switch-clients/references/task-context.md +18 -0
- package/skills/test-assumptions/.fde-generated.json +9 -0
- package/skills/test-assumptions/SKILL.md +21 -0
- package/skills/test-assumptions/references/task-context.md +18 -0
- package/skills/test-assumptions/references/test-assumptions.md +102 -0
- package/skills/what-breaks/.fde-generated.json +9 -0
- package/skills/what-breaks/SKILL.md +21 -0
- package/skills/what-breaks/references/task-context.md +18 -0
- package/skills/what-breaks/references/what-breaks.md +91 -0
- package/skills/who-decides/.fde-generated.json +9 -0
- package/skills/who-decides/SKILL.md +21 -0
- package/skills/who-decides/references/task-context.md +18 -0
- package/skills/who-decides/references/who-decides.md +91 -0
- package/skills/fde-discover/.fde-generated.json +0 -10
- package/skills/fde-discover/references/discover.md +0 -254
- package/skills/fde-feedback/.fde-generated.json +0 -9
- package/skills/fde-feedback/references/task-context.md +0 -12
- package/skills/fde-handoff/references/task-context.md +0 -12
- package/skills/fde-integrate/references/task-context.md +0 -12
- package/skills/fde-options/references/task-context.md +0 -12
- package/skills/fde-poc/references/discover.md +0 -254
- package/skills/fde-poc/references/task-context.md +0 -12
- package/skills/fde-qa/.fde-generated.json +0 -16
- package/skills/fde-qa/references/task-context.md +0 -12
- package/skills/fde-readout/references/task-context.md +0 -12
- package/skills/fde-review/.fde-generated.json +0 -16
- package/skills/fde-review/references/task-context.md +0 -12
- package/skills/fde-scope/.fde-generated.json +0 -9
- package/skills/fde-scope/references/task-context.md +0 -12
- package/skills/fde-ship/.fde-generated.json +0 -16
- package/skills/fde-ship/references/task-context.md +0 -12
- /package/skills/{fde-discover → audit}/references/audit.md +0 -0
- /package/skills/{fde-readout → board-memo}/references/board-memo.md +0 -0
- /package/skills/{fde-options → board-memo}/references/business-case.md +0 -0
- /package/skills/{fde-build → build}/references/build.md +0 -0
- /package/skills/{fde-build → build}/references/debug.md +0 -0
- /package/skills/{fde-build → build}/references/eval-pack.md +0 -0
- /package/skills/{fde-build → build}/references/integrate.md +0 -0
- /package/skills/{fde-build → build}/references/qa.md +0 -0
- /package/skills/{fde-build → build}/references/review.md +0 -0
- /package/skills/{fde-build → build}/references/ship.md +0 -0
- /package/skills/{fde-build → build}/references/verification.md +0 -0
- /package/skills/{fde-poc → business-case}/references/business-case.md +0 -0
- /package/skills/{fde-debug → debug}/references/build.md +0 -0
- /package/skills/{fde-debug → debug}/references/debug.md +0 -0
- /package/skills/{fde-debug → debug}/references/eval-pack.md +0 -0
- /package/skills/{fde-debug → debug}/references/integrate.md +0 -0
- /package/skills/{fde-debug → debug}/references/qa.md +0 -0
- /package/skills/{fde-debug → debug}/references/review.md +0 -0
- /package/skills/{fde-debug → debug}/references/ship.md +0 -0
- /package/skills/{fde-debug → debug}/references/verification.md +0 -0
- /package/skills/{fde-poc → discover}/references/audit.md +0 -0
- /package/skills/{fde-evaluate → evaluate}/references/build.md +0 -0
- /package/skills/{fde-evaluate → evaluate}/references/debug.md +0 -0
- /package/skills/{fde-evaluate → evaluate}/references/eval-pack.md +0 -0
- /package/skills/{fde-evaluate → evaluate}/references/integrate.md +0 -0
- /package/skills/{fde-evaluate → evaluate}/references/qa.md +0 -0
- /package/skills/{fde-evaluate → evaluate}/references/review.md +0 -0
- /package/skills/{fde-evaluate → evaluate}/references/ship.md +0 -0
- /package/skills/{fde-evaluate → evaluate}/references/verification.md +0 -0
- /package/skills/{fde-feedback → feedback}/references/encode-pattern.md +0 -0
- /package/skills/{fde-handoff → handoff}/references/close.md +0 -0
- /package/skills/{fde-handoff → handoff}/references/encode-pattern.md +0 -0
- /package/skills/{fde-integrate → integrate}/references/build.md +0 -0
- /package/skills/{fde-integrate → integrate}/references/debug.md +0 -0
- /package/skills/{fde-integrate → integrate}/references/eval-pack.md +0 -0
- /package/skills/{fde-integrate → integrate}/references/integrate.md +0 -0
- /package/skills/{fde-integrate → integrate}/references/qa.md +0 -0
- /package/skills/{fde-integrate → integrate}/references/review.md +0 -0
- /package/skills/{fde-integrate → integrate}/references/ship.md +0 -0
- /package/skills/{fde-integrate → integrate}/references/verification.md +0 -0
- /package/skills/{fde-readout → options}/references/business-case.md +0 -0
- /package/skills/{fde-options → options}/references/test-assumptions.md +0 -0
- /package/skills/{fde-options → options}/references/three-options.md +0 -0
- /package/skills/{fde-poc → poc}/references/build.md +0 -0
- /package/skills/{fde-poc → poc}/references/debug.md +0 -0
- /package/skills/{fde-poc → poc}/references/eval-pack.md +0 -0
- /package/skills/{fde-poc → poc}/references/integrate.md +0 -0
- /package/skills/{fde-poc → poc}/references/poc.md +0 -0
- /package/skills/{fde-poc → poc}/references/qa.md +0 -0
- /package/skills/{fde-poc → poc}/references/review.md +0 -0
- /package/skills/{fde-poc → poc}/references/ship.md +0 -0
- /package/skills/{fde-poc → poc}/references/test-assumptions.md +0 -0
- /package/skills/{fde-poc → poc}/references/three-options.md +0 -0
- /package/skills/{fde-poc → poc}/references/verification.md +0 -0
- /package/skills/{fde-qa → qa}/references/build.md +0 -0
- /package/skills/{fde-qa → qa}/references/debug.md +0 -0
- /package/skills/{fde-qa → qa}/references/eval-pack.md +0 -0
- /package/skills/{fde-qa → qa}/references/integrate.md +0 -0
- /package/skills/{fde-qa → qa}/references/qa.md +0 -0
- /package/skills/{fde-qa → qa}/references/review.md +0 -0
- /package/skills/{fde-qa → qa}/references/ship.md +0 -0
- /package/skills/{fde-qa → qa}/references/verification.md +0 -0
- /package/skills/{fde-readout → readout}/references/readout.md +0 -0
- /package/skills/{fde-review → review}/references/build.md +0 -0
- /package/skills/{fde-review → review}/references/debug.md +0 -0
- /package/skills/{fde-review → review}/references/eval-pack.md +0 -0
- /package/skills/{fde-review → review}/references/integrate.md +0 -0
- /package/skills/{fde-review → review}/references/qa.md +0 -0
- /package/skills/{fde-review → review}/references/review.md +0 -0
- /package/skills/{fde-review → review}/references/ship.md +0 -0
- /package/skills/{fde-review → review}/references/verification.md +0 -0
- /package/skills/{fde-scope → scope}/references/hold-scope.md +0 -0
- /package/skills/{fde-ship → ship}/references/build.md +0 -0
- /package/skills/{fde-ship → ship}/references/debug.md +0 -0
- /package/skills/{fde-ship → ship}/references/eval-pack.md +0 -0
- /package/skills/{fde-ship → ship}/references/integrate.md +0 -0
- /package/skills/{fde-ship → ship}/references/qa.md +0 -0
- /package/skills/{fde-ship → ship}/references/review.md +0 -0
- /package/skills/{fde-ship → ship}/references/ship.md +0 -0
- /package/skills/{fde-ship → ship}/references/verification.md +0 -0
package/bin/generate-skills.js
CHANGED
|
@@ -31,8 +31,16 @@ function referencesFor(method, referenceRoot = source) {
|
|
|
31
31
|
}
|
|
32
32
|
return [...found].sort()
|
|
33
33
|
}
|
|
34
|
+
const inputGuidance = {
|
|
35
|
+
context: 'Work directly from the supplied permitted context. Standalone work does not require an engagement folder or initialization. Record filenames in the method are optional persistence destinations when no engagement is bound.',
|
|
36
|
+
records: 'This task operates on existing engagement records. Use the local CLI and permitted sanitized packets; do not invent a portfolio or initialize records merely to complete the task. Report missing records or access as a limitation.',
|
|
37
|
+
source: 'Source configuration and capability checks do not require an engagement record. Use available host tools and source documentation. Any later record staging or application follows the ingest method and its binding and confirmation requirements.',
|
|
38
|
+
'record-write': 'Use permitted supplied material or available source tools to prepare a sourced proposal without requiring an engagement record. CLI staging and reconciliation use a bound engagement; applying updates requires the bound record and confirmation. Do not claim an unbound draft has been saved to engagement memory.',
|
|
39
|
+
}
|
|
34
40
|
function entrypoint(item) {
|
|
35
|
-
|
|
41
|
+
const mode = item.inputMode || 'context'
|
|
42
|
+
if (!Object.hasOwn(inputGuidance, mode)) throw new Error(`Invalid input mode: ${mode}`)
|
|
43
|
+
return `---\nname: ${item.name}\ndescription: ${item.description}\n---\n\n# ${item.name}\n\n<!-- Generated by bin/generate-skills.js; edit the canonical references and catalog. -->\n\n## Purpose\n\n${item.description}\n\nRead [the task context contract](references/task-context.md), then [the method](references/${item.method}.md). Load further references only when the task needs them. Everything linked is included in this skill; no other skill pack is required.\n\n## Principles\n\n- ${inputGuidance[mode]}\n- If called by @fde, reuse its current sanitized packet and scope. Do not restart setup, discovery or questions already answered.\n- The task context contract controls persistence and authority in both modes. Preserve unknowns and distinguish implementation, verification, deployment and acceptance.\n- Use the customer's repository instructions and available tools. Report a missing capability or unrun check honestly; do not claim that installing a skill provisions infrastructure.\n`
|
|
36
44
|
}
|
|
37
45
|
function expectedFiles(item, referenceRoot = source) {
|
|
38
46
|
const files = new Map([['SKILL.md', entrypoint(item)]])
|
|
@@ -63,12 +71,12 @@ function generate(check = false, options = {}) {
|
|
|
63
71
|
const items = options.catalog || catalog
|
|
64
72
|
const wanted = new Map()
|
|
65
73
|
for (const item of items) {
|
|
66
|
-
if (!/^
|
|
74
|
+
if (!/^[a-z][a-z-]*$/.test(item.name) || item.name === 'fde' || item.name.startsWith('fde-') || wanted.has(item.name)) throw new Error(`Invalid generated skill name: ${item.name}`)
|
|
67
75
|
wanted.set(item.name, expectedFiles(item, referenceRoot))
|
|
68
76
|
}
|
|
69
77
|
const rootStat = stat(skillRoot)
|
|
70
78
|
if (rootStat && (!rootStat.isDirectory() || rootStat.isSymbolicLink())) throw new Error(`Unsafe skills root: ${skillRoot}`)
|
|
71
|
-
const names = new Set([...wanted.keys(), ...(rootStat ? fs.readdirSync(skillRoot).filter(n => /^
|
|
79
|
+
const names = new Set([...wanted.keys(), ...(rootStat ? fs.readdirSync(skillRoot).filter(n => n !== 'fde' && /^[a-z][a-z-]*$/.test(n)) : [])])
|
|
72
80
|
const errors = []
|
|
73
81
|
const plans = []
|
|
74
82
|
for (const name of names) {
|
package/bin/install.js
CHANGED
|
@@ -10,6 +10,13 @@ const HOOKS_SRC = path.join(__dirname, '..', 'hooks')
|
|
|
10
10
|
const CLAUDE_MD_SRC = path.join(__dirname, '..', 'CLAUDE.md.template')
|
|
11
11
|
const FDE_TEMPLATES_SRC = path.join(__dirname, '..', 'templates', '.fde')
|
|
12
12
|
const ADAPTERS_SRC = path.join(__dirname, '..', 'adapters')
|
|
13
|
+
const TASK_NAMES = new Set(require('./skill-catalog').map(item => item.name))
|
|
14
|
+
// Only these published task packages changed names. New catalog entries must
|
|
15
|
+
// not acquire historical migration authority over unrelated prefixed skills.
|
|
16
|
+
const RENAMED_SKILLS = new Set([
|
|
17
|
+
'discover', 'scope', 'options', 'poc', 'build', 'integrate', 'debug',
|
|
18
|
+
'review', 'evaluate', 'qa', 'ship', 'readout', 'handoff', 'feedback',
|
|
19
|
+
].map(name => `fde-${name}`))
|
|
13
20
|
const LIB_SRC = path.join(__dirname, 'lib')
|
|
14
21
|
|
|
15
22
|
const GLOBAL_SKILLS_DIR = path.join(os.homedir(), '.claude', 'skills')
|
|
@@ -115,7 +122,7 @@ function removeLegacySkills(opts = {}) {
|
|
|
115
122
|
const skipped = []
|
|
116
123
|
const links = []
|
|
117
124
|
for (const dir of LEGACY_SKILL_DIRS) {
|
|
118
|
-
if (fs.existsSync(path.join(SKILLS_SRC, dir, 'SKILL.md'))) continue
|
|
125
|
+
if (RENAMED_SKILLS.has(dir) || fs.existsSync(path.join(SKILLS_SRC, dir, 'SKILL.md'))) continue
|
|
119
126
|
const p = path.join(GLOBAL_SKILLS_DIR, dir)
|
|
120
127
|
if (isLink(p)) { links.push(dir); continue }
|
|
121
128
|
if (!fs.existsSync(path.join(p, 'SKILL.md'))) continue
|
|
@@ -129,6 +136,29 @@ function removeLegacySkills(opts = {}) {
|
|
|
129
136
|
return { removed, skipped, links }
|
|
130
137
|
}
|
|
131
138
|
|
|
139
|
+
// Archive the complete previous package only after its replacement is installed.
|
|
140
|
+
// Keep edits and additions outside the discovery directory, without guessing which
|
|
141
|
+
// individual files are personal. Unmarked third-party installs require manual cleanup.
|
|
142
|
+
function archiveRenamedSkill(name) {
|
|
143
|
+
const oldName = `fde-${name}`
|
|
144
|
+
if (!RENAMED_SKILLS.has(oldName)) return
|
|
145
|
+
const old = path.join(GLOBAL_SKILLS_DIR, oldName)
|
|
146
|
+
checkPath(old)
|
|
147
|
+
if (!fs.existsSync(old)) return
|
|
148
|
+
if (!isManaged(old)) {
|
|
149
|
+
installIncomplete = true
|
|
150
|
+
console.log(` keep ~/.claude/skills/${oldName} (ownership unknown; move it outside skills manually after reviewing ${name})`)
|
|
151
|
+
return
|
|
152
|
+
}
|
|
153
|
+
checkTree(old, old)
|
|
154
|
+
const archiveRoot = path.join(os.homedir(), '.claude', 'fdeops', 'skill-backups')
|
|
155
|
+
mkdir(archiveRoot)
|
|
156
|
+
const archive = fs.mkdtempSync(path.join(archiveRoot, `${oldName}-`))
|
|
157
|
+
try { fs.renameSync(old, path.join(archive, oldName)) }
|
|
158
|
+
catch (error) { fs.rmdirSync(archive); throw error }
|
|
159
|
+
console.log(` archive ~/.claude/skills/${oldName} → ${path.join(archive, oldName)} (all previous content preserved)`)
|
|
160
|
+
}
|
|
161
|
+
|
|
132
162
|
// Copy each skill in, but never over a directory fdeops did not create.
|
|
133
163
|
function installSkillDirs(opts = {}) {
|
|
134
164
|
const skipped = []
|
|
@@ -138,7 +168,8 @@ function installSkillDirs(opts = {}) {
|
|
|
138
168
|
for (const entry of fs.readdirSync(SKILLS_SRC, { withFileTypes: true })) {
|
|
139
169
|
const src = path.join(SKILLS_SRC, entry.name)
|
|
140
170
|
const dest = path.join(GLOBAL_SKILLS_DIR, entry.name)
|
|
141
|
-
|
|
171
|
+
// Repository-level documentation is not an installable skill.
|
|
172
|
+
if (!entry.isDirectory()) continue
|
|
142
173
|
if (isLink(dest)) { links.push(entry.name); continue }
|
|
143
174
|
try {
|
|
144
175
|
checkTree(src, dest)
|
|
@@ -146,8 +177,10 @@ function installSkillDirs(opts = {}) {
|
|
|
146
177
|
if (fs.existsSync(dest) && !isManaged(dest) && !opts.force) {
|
|
147
178
|
// Installs predating the marker are still ours: adopt a same-named dir
|
|
148
179
|
// whose SKILL.md is recognizably fdeops', so upgrades keep working.
|
|
149
|
-
|
|
180
|
+
// Newly generic task names require an explicit marker, never a fingerprint.
|
|
181
|
+
if (TASK_NAMES.has(entry.name) || !wasInstalledByUs(dest)) {
|
|
150
182
|
skipped.push(entry.name)
|
|
183
|
+
if (TASK_NAMES.has(entry.name)) installIncomplete = true
|
|
151
184
|
continue
|
|
152
185
|
}
|
|
153
186
|
console.log(` adopt ~/.claude/skills/${entry.name} (earlier fdeops install)`)
|
|
@@ -156,6 +189,7 @@ function installSkillDirs(opts = {}) {
|
|
|
156
189
|
// say it in human terms, place the rest, and exit non-zero at the end.
|
|
157
190
|
copyDir(src, dest)
|
|
158
191
|
markManaged(dest)
|
|
192
|
+
archiveRenamedSkill(entry.name)
|
|
159
193
|
} catch (e) {
|
|
160
194
|
failed.push({ name: entry.name, code: e.code || 'error', path: destPathFor(e.path, src, dest) })
|
|
161
195
|
}
|
package/bin/skill-catalog.js
CHANGED
|
@@ -1,17 +1,284 @@
|
|
|
1
|
-
//
|
|
1
|
+
// One public task catalog. Methods remain authored once in skills/fde/references/.
|
|
2
|
+
// inputMode distinguishes supplied-context tasks from operations that use engagement records.
|
|
2
3
|
module.exports = [
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
4
|
+
{
|
|
5
|
+
"name": "brief",
|
|
6
|
+
"method": "land",
|
|
7
|
+
"group": "Start",
|
|
8
|
+
"result": "A grounded brief with success criteria and open questions.",
|
|
9
|
+
"description": "Clarify a new customer brief, desired outcome, constraints and evidence gaps. Use for kickoff or a first meeting; do not repeat discovery already supplied.",
|
|
10
|
+
"inputMode": "context"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "audit",
|
|
14
|
+
"method": "audit",
|
|
15
|
+
"group": "Start",
|
|
16
|
+
"result": "An audit of inherited claims and takeover risks.",
|
|
17
|
+
"description": "Audit an inherited engagement or implementation against its evidence. Use when taking over work or joining mid-project; distinguish verified facts from inherited claims.",
|
|
18
|
+
"inputMode": "context"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "who-decides",
|
|
22
|
+
"method": "who-decides",
|
|
23
|
+
"group": "Start",
|
|
24
|
+
"result": "A stakeholder map with decision rights and unknowns.",
|
|
25
|
+
"description": "Map stakeholders, decision rights, influence and blockers from supplied evidence. Use when ownership is unclear or the stakeholder landscape changes.",
|
|
26
|
+
"inputMode": "context"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "earn-trust",
|
|
30
|
+
"method": "earn-trust",
|
|
31
|
+
"group": "Start",
|
|
32
|
+
"result": "A plan for access, credibility and permitted AI use.",
|
|
33
|
+
"description": "Plan how to earn customer trust and appropriate access. Use when credibility, permissions or AI policy constrain the engagement.",
|
|
34
|
+
"inputMode": "context"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "discover",
|
|
38
|
+
"method": "discover",
|
|
39
|
+
"description": "Trace a customer workflow and identify the problem, baseline and evidence gaps. Use for discovery or an unclear customer brief, before choosing a solution.",
|
|
40
|
+
"group": "Discover",
|
|
41
|
+
"result": "A workflow diagnosis with baseline and evidence gaps.",
|
|
42
|
+
"inputMode": "context"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "test-assumptions",
|
|
46
|
+
"method": "test-assumptions",
|
|
47
|
+
"group": "Discover",
|
|
48
|
+
"result": "A ranked set of assumptions and ways to test them.",
|
|
49
|
+
"description": "Challenge a proposed solution by identifying and testing consequential assumptions. Use when the brief feels too certain or discovery reveals contradictions.",
|
|
50
|
+
"inputMode": "context"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "score-use-cases",
|
|
54
|
+
"method": "score-use-cases",
|
|
55
|
+
"group": "Discover",
|
|
56
|
+
"result": "A ranked use-case shortlist with evidence and trade-offs.",
|
|
57
|
+
"description": "Compare competing customer use cases by value, feasibility and evidence. Use when several problems compete for delivery capacity.",
|
|
58
|
+
"inputMode": "context"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"name": "poc",
|
|
62
|
+
"method": "poc",
|
|
63
|
+
"description": "Run a bounded customer proof of concept to test a consequential uncertainty. Use for a spike or pilot with a question and decision deadline, not a full rollout.",
|
|
64
|
+
"group": "Discover",
|
|
65
|
+
"result": "A bounded experiment with evidence and a decision.",
|
|
66
|
+
"inputMode": "context"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "scope",
|
|
70
|
+
"method": "hold-scope",
|
|
71
|
+
"description": "Assess a new customer request against agreed scope, trade-offs and ownership. Use when an engagement expands or a custom feature needs a commitment decision.",
|
|
72
|
+
"group": "Plan",
|
|
73
|
+
"result": "A scope decision with trade-offs and ownership.",
|
|
74
|
+
"inputMode": "context"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "options",
|
|
78
|
+
"method": "three-options",
|
|
79
|
+
"description": "Compare feasible approaches to a customer problem and recommend a path with costs, constraints and evidence. Use for an architecture or delivery decision, not implementation.",
|
|
80
|
+
"group": "Plan",
|
|
81
|
+
"result": "Compared approaches and an evidence-backed recommendation.",
|
|
82
|
+
"inputMode": "context"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "plan",
|
|
86
|
+
"method": "plan",
|
|
87
|
+
"group": "Plan",
|
|
88
|
+
"result": "A sequenced delivery plan with owners and acceptance checks.",
|
|
89
|
+
"description": "Sequence an understood outcome into verifiable delivery slices with dependencies, ownership and acceptance checks. Use for delivery planning, estimation or migration strategy.",
|
|
90
|
+
"inputMode": "context"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "business-case",
|
|
94
|
+
"method": "business-case",
|
|
95
|
+
"group": "Plan",
|
|
96
|
+
"result": "An evidence-backed investment case with explicit assumptions.",
|
|
97
|
+
"description": "Develop a business case for an initiative using costs, benefits, risks and evidence. Use when a sponsor needs budget or timeline justification.",
|
|
98
|
+
"inputMode": "context"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"name": "prioritize",
|
|
102
|
+
"method": "pick-three",
|
|
103
|
+
"group": "Plan",
|
|
104
|
+
"result": "Three immediate priorities and explicit deferrals.",
|
|
105
|
+
"description": "Choose up to three immediate priorities from competing initiatives. Use when everything is urgent and the customer needs a defensible order with explicit deferrals.",
|
|
106
|
+
"inputMode": "context"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"name": "red-team",
|
|
110
|
+
"method": "red-team",
|
|
111
|
+
"group": "Plan",
|
|
112
|
+
"result": "A critique of weak claims, failure modes and corrective actions.",
|
|
113
|
+
"description": "Stress-test a plan, brief or delivery claim against evidence and plausible failure modes. Use when the user asks for a red team or preparation for a consequential decision.",
|
|
114
|
+
"inputMode": "context"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"name": "build",
|
|
118
|
+
"method": "build",
|
|
119
|
+
"description": "Implement a scoped customer-facing software change in the existing repository and verify its behavior. Use for delivery work with an understood outcome, not incident response.",
|
|
120
|
+
"group": "Build and verify",
|
|
121
|
+
"result": "An implemented change with verification evidence.",
|
|
122
|
+
"inputMode": "context"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"name": "integrate",
|
|
126
|
+
"method": "integrate",
|
|
127
|
+
"description": "Build or change a customer-system integration with explicit data mapping, permissions, retries and reconciliation. Use for connectors, imports, write-back and upstream APIs.",
|
|
128
|
+
"group": "Build and verify",
|
|
129
|
+
"result": "An integration with tested mapping and failure handling.",
|
|
130
|
+
"inputMode": "context"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"name": "debug",
|
|
134
|
+
"method": "debug",
|
|
135
|
+
"description": "Investigate and repair a reproducible failure in a customer integration or application. Use for diagnosis and regression prevention; follow incident authority for live mitigation.",
|
|
136
|
+
"group": "Build and verify",
|
|
137
|
+
"result": "A diagnosed failure, repair and regression evidence.",
|
|
138
|
+
"inputMode": "context"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"name": "review",
|
|
142
|
+
"method": "review",
|
|
143
|
+
"description": "Review a proposed customer code change against its intended outcome and operational risks. Use for a diff or PR review; report evidence and actionable findings.",
|
|
144
|
+
"group": "Build and verify",
|
|
145
|
+
"result": "Actionable findings tied to the intended outcome.",
|
|
146
|
+
"inputMode": "context"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"name": "evaluate",
|
|
150
|
+
"method": "eval-pack",
|
|
151
|
+
"description": "Evaluate an AI workflow against representative cases and its permitted actions. Use for model, retrieval or agent evaluation; tests do not grant release authority.",
|
|
152
|
+
"group": "Build and verify",
|
|
153
|
+
"result": "Evaluation results, failure analysis and release evidence.",
|
|
154
|
+
"inputMode": "context"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"name": "qa",
|
|
158
|
+
"method": "qa",
|
|
159
|
+
"description": "Exercise the delivered customer journey using real runtime or browser evidence. Use for functional acceptance testing after implementation, including failure paths.",
|
|
160
|
+
"group": "Build and verify",
|
|
161
|
+
"result": "Customer-journey evidence and acceptance gaps.",
|
|
162
|
+
"inputMode": "context"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"name": "what-breaks",
|
|
166
|
+
"method": "what-breaks",
|
|
167
|
+
"group": "Build and verify",
|
|
168
|
+
"result": "A blast-radius assessment and mitigation plan.",
|
|
169
|
+
"description": "Assess the impact of a proposed change on dependencies and shared infrastructure. Use before touching unfamiliar or consequential systems.",
|
|
170
|
+
"inputMode": "context"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"name": "rollback",
|
|
174
|
+
"method": "rollback",
|
|
175
|
+
"group": "Build and verify",
|
|
176
|
+
"result": "A rollback drill with recovery evidence and remaining gaps.",
|
|
177
|
+
"description": "Prepare and rehearse a recovery path for an intended release. Use when rollback is assumed, untested or previously failed; follow the environment authority for any drill.",
|
|
178
|
+
"inputMode": "context"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"name": "ship",
|
|
182
|
+
"method": "ship",
|
|
183
|
+
"description": "Prepare or execute an authorized controlled release with verified checks, recovery and an operating owner. Use when a customer increment is ready for deployment.",
|
|
184
|
+
"group": "Build and verify",
|
|
185
|
+
"result": "A controlled release result with recovery and ownership.",
|
|
186
|
+
"inputMode": "context"
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"name": "readout",
|
|
190
|
+
"method": "readout",
|
|
191
|
+
"description": "Prepare a sponsor update separating promised outcomes, measured results and customer acceptance. Use for progress readouts or defending a delivery claim.",
|
|
192
|
+
"group": "Report",
|
|
193
|
+
"result": "A sponsor update separating promises, results and acceptance.",
|
|
194
|
+
"inputMode": "context"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"name": "demo-prep",
|
|
198
|
+
"method": "demo-prep",
|
|
199
|
+
"group": "Report",
|
|
200
|
+
"result": "A demo narrative, rehearsal plan and failure fallback.",
|
|
201
|
+
"description": "Prepare a customer demo or executive walkthrough around an evidenced outcome. Use before show-and-tell to rehearse the journey and prepare a fallback.",
|
|
202
|
+
"inputMode": "context"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"name": "debrief",
|
|
206
|
+
"method": "debrief",
|
|
207
|
+
"group": "Report",
|
|
208
|
+
"result": "A sourced meeting summary with decisions and next actions.",
|
|
209
|
+
"description": "Turn meeting notes or a transcript into sourced decisions, changes and next actions. Use after a customer conversation; review consequential record updates before saving.",
|
|
210
|
+
"inputMode": "context"
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"name": "board-memo",
|
|
214
|
+
"method": "board-memo",
|
|
215
|
+
"group": "Report",
|
|
216
|
+
"result": "An executive memo separating evidence, risk and decisions.",
|
|
217
|
+
"description": "Draft a board or executive summary of an engagement using outcomes, risks and investment decisions. Use when the sponsor needs to brief senior leadership.",
|
|
218
|
+
"inputMode": "context"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"name": "rescue",
|
|
222
|
+
"method": "rescue",
|
|
223
|
+
"group": "Operate",
|
|
224
|
+
"result": "A recovery plan and evidence of authorized mitigation.",
|
|
225
|
+
"description": "Triage an outage, loss of stakeholder trust or a failing engagement direction. Use for urgent recovery; distinguish diagnosis from authorized production mitigation.",
|
|
226
|
+
"inputMode": "context"
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"name": "dashboard",
|
|
230
|
+
"method": "dashboard",
|
|
231
|
+
"group": "Operate",
|
|
232
|
+
"result": "A portfolio view of engagement status and attention needed.",
|
|
233
|
+
"description": "Review the portfolio across existing engagement records. Use for status across customers; requires accessible permitted records and does not create missing client histories.",
|
|
234
|
+
"inputMode": "records"
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"name": "switch-clients",
|
|
238
|
+
"method": "switch-clients",
|
|
239
|
+
"group": "Operate",
|
|
240
|
+
"result": "A refreshed client binding and cross-client triage.",
|
|
241
|
+
"description": "Switch between existing customer engagements and triage competing needs. Use when context switching causes confusion; requires engagement records and preserves one client per write.",
|
|
242
|
+
"inputMode": "records"
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"name": "runbook",
|
|
246
|
+
"method": "runbook",
|
|
247
|
+
"group": "Operate",
|
|
248
|
+
"result": "An operating runbook with recovery steps and ownership.",
|
|
249
|
+
"description": "Write an operating runbook from the delivered system and verified procedures. Use when the customer team or a successor needs to operate without the original engineer.",
|
|
250
|
+
"inputMode": "context"
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"name": "handoff",
|
|
254
|
+
"method": "close",
|
|
255
|
+
"description": "Transfer operation of a customer deployment with ownership, evidence and a tested support path. Use for handoff or an engineer rotation, not merely code delivery.",
|
|
256
|
+
"group": "Operate",
|
|
257
|
+
"result": "An operating handoff with ownership and a support path.",
|
|
258
|
+
"inputMode": "context"
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"name": "feedback",
|
|
262
|
+
"method": "encode-pattern",
|
|
263
|
+
"description": "Assess a field lesson for reuse or product feedback without exposing customer context. Use for recurring deployment lessons; distinguish a hypothesis from a validated pattern.",
|
|
264
|
+
"group": "Operate",
|
|
265
|
+
"result": "A reusable field lesson with evidence and privacy boundaries.",
|
|
266
|
+
"inputMode": "context"
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"name": "connect",
|
|
270
|
+
"method": "connect",
|
|
271
|
+
"group": "Operate",
|
|
272
|
+
"result": "Source setup guidance and an honest capability check.",
|
|
273
|
+
"description": "Configure or diagnose access to a requested source using available host tools. Use for source MCP setup; source configuration needs no engagement record and credentials stay with the host.",
|
|
274
|
+
"inputMode": "source"
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"name": "ingest",
|
|
278
|
+
"method": "ingest",
|
|
279
|
+
"group": "Operate",
|
|
280
|
+
"result": "Sourced proposed updates, with confirmed record application when bound.",
|
|
281
|
+
"description": "Fetch requested source material and prepare sourced engagement updates. Use to catch up from external notes or messages; applying updates requires a bound record and confirmation.",
|
|
282
|
+
"inputMode": "record-write"
|
|
283
|
+
}
|
|
284
|
+
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fdeops",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.1.0",
|
|
4
4
|
"description": "Forward deployed engineering skills for AI coding agents. Use focused task skills or @fde for discovery, implementation, verification and handoff, with local engagement records.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"fdeops": "bin/install.js",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"test": "node --test test/*.test.js",
|
|
12
12
|
"test:skill-routing": "node evals/skill-routing/check.js && node evals/skill-routing/live-smoke.js",
|
|
13
13
|
"prepublishOnly": "node bin/check.js && npm test",
|
|
14
|
-
"generate:skills": "node bin/generate-skills.js"
|
|
14
|
+
"generate:skills": "node bin/generate-skills.js && node bin/catalog-doc.js"
|
|
15
15
|
},
|
|
16
16
|
"files": [
|
|
17
17
|
"bin/",
|
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "fdeops",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "5.1.0",
|
|
5
5
|
"description": "Forward deployed engineering skills for AI coding agents. Use focused task skills or @fde for discovery, implementation, verification and handoff, with local engagement records.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Subash Natarajan",
|
package/skills/README.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# FDEOps skills
|
|
2
|
+
|
|
3
|
+
Use any task folder directly, or use `fde` to coordinate a customer project. Each folder's `SKILL.md` explains when to use it and which inputs it needs.
|
|
4
|
+
|
|
5
|
+
The [complete catalog](https://github.com/suboss87/FDEOps/blob/Main/docs/skills-reference.md) groups every installable skill by the work it supports. Start with the [README](../README.md) for installation and examples.
|
|
6
|
+
|
|
7
|
+
For contributors: instructions are authored once under `fde/references/`. Task folders are generated from those instructions and `bin/skill-catalog.js`; run `npm run generate:skills` after changes. Keep private customer records outside this repository.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"generator": "bin/generate-skills.js",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"files": {
|
|
5
|
+
"SKILL.md": "aa120dd0b6c0781300d56f916f1721525de7fbe65608ff7a9a0239a2a5e20e88",
|
|
6
|
+
"references/audit.md": "ed32ea78cbccb100742dd838e8cf4cd4b6f33ad44b3de7424fc624670d571dbc",
|
|
7
|
+
"references/discover.md": "f65aa11a539b4dbbed70cfaa94ec2a35595aa9a2d0282790510b933ac9c721ce",
|
|
8
|
+
"references/task-context.md": "73eea2d7f164fac3226599e5be26ae4e79dcf69e0d24428dd12d623861410490"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audit
|
|
3
|
+
description: Audit an inherited engagement or implementation against its evidence. Use when taking over work or joining mid-project; distinguish verified facts from inherited claims.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# audit
|
|
7
|
+
|
|
8
|
+
<!-- Generated by bin/generate-skills.js; edit the canonical references and catalog. -->
|
|
9
|
+
|
|
10
|
+
## Purpose
|
|
11
|
+
|
|
12
|
+
Audit an inherited engagement or implementation against its evidence. Use when taking over work or joining mid-project; distinguish verified facts from inherited claims.
|
|
13
|
+
|
|
14
|
+
Read [the task context contract](references/task-context.md), then [the method](references/audit.md). Load further references only when the task needs them. Everything linked is included in this skill; no other skill pack is required.
|
|
15
|
+
|
|
16
|
+
## Principles
|
|
17
|
+
|
|
18
|
+
- Work directly from the supplied permitted context. Standalone work does not require an engagement folder or initialization. Record filenames in the method are optional persistence destinations when no engagement is bound.
|
|
19
|
+
- If called by @fde, reuse its current sanitized packet and scope. Do not restart setup, discovery or questions already answered.
|
|
20
|
+
- The task context contract controls persistence and authority in both modes. Preserve unknowns and distinguish implementation, verification, deployment and acceptance.
|
|
21
|
+
- Use the customer's repository instructions and available tools. Report a missing capability or unrun check honestly; do not claim that installing a skill provisions infrastructure.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# discover - Find the problem behind the request
|
|
2
|
+
|
|
3
|
+
**Enter when:** the customer brief is unclear, the proposed solution may miss the real problem, or a change has exposed an unmapped part of the work.
|
|
4
|
+
|
|
5
|
+
Apply [task context and evidence](task-context.md) first. Supplied notes are enough to begin. In an existing engagement, use permitted summaries of `context.md`, `brief.md`, `reality.md` and relevant `terrain.md` sections; extend existing findings instead of restarting.
|
|
6
|
+
|
|
7
|
+
## Choose the depth the task needs
|
|
8
|
+
|
|
9
|
+
- **Notes or meeting preparation:** return the current steps, observations, hypotheses and a few questions that would change the next decision. No repository scan, workshop or customer-record setup is required.
|
|
10
|
+
- **A specific delivery problem:** follow the affected people, systems and data far enough to explain the break and identify what evidence is missing.
|
|
11
|
+
- **A wider engagement:** map dependencies and decision owners across the involved teams. Examine each candidate problem before choosing where to invest; do not make a full enterprise inventory a prerequisite for one useful finding.
|
|
12
|
+
|
|
13
|
+
State what you are investigating and which decision it informs. Reuse the user's stated goal. Ask only when a missing answer changes the next action; otherwise proceed with a clearly labelled provisional interpretation.
|
|
14
|
+
|
|
15
|
+
## Frame the decision
|
|
16
|
+
|
|
17
|
+
Write a short frame from the evidence available:
|
|
18
|
+
|
|
19
|
+
| Part | What to establish |
|
|
20
|
+
|---|---|
|
|
21
|
+
| Situation | How people complete this task today |
|
|
22
|
+
| Complication | The observed delay, failure, cost or constraint |
|
|
23
|
+
| Question | The decision that further evidence should help someone make |
|
|
24
|
+
| Possible outcomes | Confirm the brief, change its scope, investigate further or pause |
|
|
25
|
+
|
|
26
|
+
Keep the question specific and neutral. “What causes requests to wait before assignment?” leaves room for different explanations. “How should we automate assignment?” assumes the solution before establishing the cause.
|
|
27
|
+
|
|
28
|
+
Name the decision owner when known. An unknown owner or unmeasured baseline is a finding, not a reason to keep questioning indefinitely. Return a provisional frame and identify who or what could verify it. Do not present a new interpretation as agreed scope.
|
|
29
|
+
|
|
30
|
+
## Trace the work
|
|
31
|
+
|
|
32
|
+
Follow an ordinary case from arrival to completion, then relevant exceptions. Use the customer's terms for the request, system and people involved.
|
|
33
|
+
|
|
34
|
+
For each step, establish:
|
|
35
|
+
|
|
36
|
+
- Who performs it and where the input comes from.
|
|
37
|
+
- What they do, check or decide, and which system they update.
|
|
38
|
+
- Time spent working versus time spent waiting.
|
|
39
|
+
- What happens when information is missing or the normal path fails.
|
|
40
|
+
- Who notices the failure, how they recover, and which record they trust.
|
|
41
|
+
|
|
42
|
+
Distinguish measured timings from estimates. A team lead's recollection is useful evidence about their experience; it is not a measured baseline. Do not infer that the slowest visible step causes the whole delay without following its dependencies.
|
|
43
|
+
|
|
44
|
+
Use concrete questions when the supplied material leaves a gap: “Show me the last request that waited a day. What had to happen before someone could take it?” Ask about spreadsheets, manual transfers or other workarounds when there is evidence of them, without assuming they exist.
|
|
45
|
+
|
|
46
|
+
When a workaround looks surprising, use the targeted history check in [audit](audit.md#before-changing-an-unfamiliar-workaround). History supplies clues, not proof that an old requirement still applies.
|
|
47
|
+
|
|
48
|
+
## Inspect systems when relevant and permitted
|
|
49
|
+
|
|
50
|
+
If the question depends on application behavior and code access is authorized, use `fde scan` and targeted file reads. If the CLI is unavailable, use the repository's existing search, Git and test tools. Do not load the whole repository or unrelated customer data.
|
|
51
|
+
|
|
52
|
+
Follow the actual path: entry point → validation → processing → storage or downstream action. Inspect the code, configuration and tests that can explain the observed discrepancy.
|
|
53
|
+
|
|
54
|
+
Check existing capability before proposing new work. A disabled feature, frequent edits or a missing nearby test is a lead to investigate, not proof of a root cause. Record the evidence behind any technical risk. When there is no repository access, state that implementation behavior remains unchecked and finish the work possible from the notes.
|
|
55
|
+
|
|
56
|
+
## Check the data and dependencies the proposed work needs
|
|
57
|
+
|
|
58
|
+
For each relevant source, establish where it lives, how fresh it is, who controls access, which fields the task needs, and what happens when it is unavailable. Inspect a permitted sample appropriate to the question; report its size and limitations rather than treating a small sample as representative by default.
|
|
59
|
+
|
|
60
|
+
| Source or connection | Needed for | Freshness and quality evidence | Access owner | Failure or constraint | Next check |
|
|
61
|
+
|---|---|---|---|---|---|
|
|
62
|
+
| Fill only relevant sources | | | Unknown if unconfirmed | | |
|
|
63
|
+
|
|
64
|
+
Check mappings between systems, supported APIs, permissions and retry behavior where they affect feasibility. A promised export or integration is not yet an available dependency. Record its responsible owner, verification date and required evidence when known; propose missing commitments for confirmation.
|
|
65
|
+
|
|
66
|
+
For AI work, identify which steps can use deterministic logic, which need model judgment, and which require a human decision. Keep that allocation provisional until the affected owners agree. Establish who would operate the resulting change and what access or training they would need.
|
|
67
|
+
|
|
68
|
+
## Use a workshop only when it resolves a real disagreement
|
|
69
|
+
|
|
70
|
+
A short meeting with the relevant decision makers may help when teams describe different problems or constraints. Bring the observed cases and the decision to be made. Ask participants to state their constraints before discussing options.
|
|
71
|
+
|
|
72
|
+
Summarize areas of agreement and disagreement. A vote or an absence of objections does not establish authority or acceptance. Ask the responsible owner to confirm the decision and record any unresolved objection, next action and date. Draft the summary promptly, then follow the record-confirmation rules before saving it.
|
|
73
|
+
|
|
74
|
+
## Return a useful discovery result
|
|
75
|
+
|
|
76
|
+
Use the smallest output that answers the user's request:
|
|
77
|
+
|
|
78
|
+
1. The current task and the decision under investigation.
|
|
79
|
+
2. What the evidence establishes, with its source.
|
|
80
|
+
3. The working explanation and plausible alternatives.
|
|
81
|
+
4. Relevant exceptions, dependencies or technical risks actually observed.
|
|
82
|
+
5. Missing evidence and the next check that would change the decision.
|
|
83
|
+
|
|
84
|
+
Do not fill a quota of risks, exceptions or questions. If no system was inspected, do not invent code findings. If several interpretations have failed, reassess the evidence and investigation method rather than blaming the person who wrote the brief.
|
|
85
|
+
|
|
86
|
+
For a bound engagement, propose updates to the existing records after the discovery result is reviewed:
|
|
87
|
+
|
|
88
|
+
- `reality.md`: preserve `Working theory`, `Evidence` and `Differs from brief how`; add the decision frame and validation status.
|
|
89
|
+
- `terrain.md`: relevant steps, system behavior, data dependencies and unknowns. Preserve the `## Operating map (exception-led)` section and its columns when recording observed breaks.
|
|
90
|
+
- `assumptions.md`: new or changed assumptions, verification owners and checkpoints.
|
|
91
|
+
|
|
92
|
+
An operating-map row uses: `Exception / break | Who notices first | What they do today | System of record then | Blast | Evidence`. Preserve the existing schema. If no break has been observed, report that gap; do not fabricate a row to satisfy a readiness check.
|
|
93
|
+
|
|
94
|
+
For standalone work, return the same findings in the conversation or requested document. No `.fde/` write or initialization is needed.
|
|
95
|
+
|
|
96
|
+
## Worked example
|
|
97
|
+
|
|
98
|
+
This example is fictional and uses only supplied meeting notes.
|
|
99
|
+
|
|
100
|
+
The brief asks for an assistant to draft responses. The supplied notes say drafting takes about four minutes, while requests sometimes wait a day for assignment. The timings come from a team lead; no measured baseline is available.
|
|
101
|
+
|
|
102
|
+
**Working theory:** assignment delay may matter more than drafting time. **Evidence:** the lead's estimates in the supplied notes, still unverified. **Differs from brief how:** the requested assistant addresses drafting, while the reported delay concerns assignment. **Question:** what causes the assignment delay, and which change would reduce it? **Next check:** trace a sample of recent requests using arrival and assignment timestamps, then ask the people handling delayed cases what prevented assignment.
|
|
103
|
+
|
|
104
|
+
The discovery result does not reject the assistant or declare an ownership problem solved. It gives the FDE a focused way to find out what to build, change or investigate next. Return this as a short draft for notes-only work; in a bound engagement, propose it for `reality.md` with validation still pending.
|
|
105
|
+
|
|
106
|
+
## Principles
|
|
107
|
+
|
|
108
|
+
- Investigate the work before choosing a solution.
|
|
109
|
+
- Keep observations, estimates and hypotheses distinct.
|
|
110
|
+
- Match discovery effort to the decision at hand.
|
|
111
|
+
- Unknown ownership and missing evidence remain explicit.
|
|
112
|
+
- Confirmation comes from the responsible person, never from silence.
|