@pbhamri/quartermaster-mcp 0.3.1 → 0.4.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 CHANGED
@@ -65,7 +65,7 @@ In the target repo:
65
65
  - `.quartermaster/profile.json` — full ADO/Kusto/IcM/directives/KPIs snapshot
66
66
  - `.quartermaster/command-center-seed.json` — KPIs + quick-links for dashboards
67
67
  - `.github/prompts/npf.prompt.md` — NPF self-score
68
- - `.github/prompts/cxe.prompt.md` — Hayete CXE pillar audit
68
+ - `.github/prompts/cxe.prompt.md` — EVP Security CXE pillar audit
69
69
 
70
70
  All file writes are idempotent. Existing files are **never overwritten** — they're reported as `skip (exists)`.
71
71
 
package/bin/server.js CHANGED
@@ -138,7 +138,7 @@ Seeded by quartermaster-mcp · profile **${profile.displayName}**.
138
138
  - Score every artefact against the **TRANSFORMATIVE** PM behaviors (AI-driven innovation, outcome-centric, shared leverage, decision velocity).
139
139
  - Close every response with a 2-line Transformative prompt-sharpening tip.
140
140
 
141
- ## CXE pillars (Hayete, 2026-05-29)
141
+ ## CXE pillars (EVP Security, FY26)
142
142
  1. CXE = core priority
143
143
  2. Customers get value fast (TTV)
144
144
  3. Operate with confidence
@@ -197,7 +197,7 @@ Run \`/cxe\` to audit any PRD/work-item against the 4 pillars. Run \`/npf\` for
197
197
  if (a.target.endsWith("AGENTS.md")) {
198
198
  writeText(a.target, `# AGENTS.md — ${path.basename(repoPath)}\n\n> Seeded by quartermaster-mcp on ${new Date().toISOString().slice(0,10)}.\n> Profile: **${profile.displayName}** (${profile.id})\n\nSee \`.quartermaster/profile.json\` for ADO/Kusto/IcM/directives/KPIs.\n`);
199
199
  } else {
200
- writeText(a.target, `# Copilot Instructions — ${path.basename(repoPath)}\n\nSeeded by quartermaster-mcp · profile **${profile.displayName}**.\n\nCXE pillars (Hayete): CXE-first · Value fast · Confidence · Support when it matters.\nRun /cxe and /npf prompts.\n`);
200
+ writeText(a.target, `# Copilot Instructions — ${path.basename(repoPath)}\n\nSeeded by quartermaster-mcp · profile **${profile.displayName}**.\n\nCXE pillars (EVP Security): CXE-first · Value fast · Confidence · Support when it matters.\nRun /cxe and /npf prompts.\n`);
201
201
  }
202
202
  }
203
203
  }
@@ -300,6 +300,163 @@ function emitPr({ repoPath, profileId, branch = null, title = null, body = null,
300
300
  }
301
301
 
302
302
 
303
+ // ---- Onboarding surface (since v0.4.0) ----
304
+ // First-time peer experience: welcome, personalize, skills tour. Designed
305
+ // after real customer feedback (a peer PM installed v0.3.1 and got 12
306
+ // tools with no guide, no personalization). All three tools return
307
+ // markdown the AI client renders inline; no auto-fill, no credentials
308
+ // inherited from the package author.
309
+
310
+ const QM_HOME = path.join(os.homedir(), ".quartermaster");
311
+ const QM_CONNECT_DB = process.env.QM_CONNECT_DB || path.join(QM_HOME, "connect-db.json");
312
+
313
+ function qmWelcome() {
314
+ const hasConnectDb = fs.existsSync(QM_CONNECT_DB);
315
+ const profiles = listProfiles();
316
+ return {
317
+ server: "quartermaster-mcp",
318
+ version: PKG.version,
319
+ welcome: "Welcome to Quartermaster MCP — a PM paved-path bundle for Microsoft PMs.",
320
+ what_this_is: "12 MCP tools that scaffold a PM operating model: Purview product profiles, /npf and /cxe prompts, NPF assessment, BATON-style frameworks, and read-only access to your repo content.",
321
+ next_three_steps: hasConnectDb ? [
322
+ `1. Run \`qm_personalize\` to refresh your Connect tracker if needed (current: ${QM_CONNECT_DB}).`,
323
+ "2. Run `qm_skills_for_pm` to see the daily-use catalog for product roadmap + strategy.",
324
+ "3. Run `qm_seed_repo` to scaffold a target repo with the Quartermaster kit.",
325
+ ] : [
326
+ "1. Run `qm_personalize` — answers 5 questions, writes YOUR connect-db (uses ~/.quartermaster/connect-db.json by default; override via QM_CONNECT_DB env var). The package author's data is never used.",
327
+ `2. Run \`qm_apply_profile\` with one of the ${profiles.length} profiles: ${profiles.map(p => p.id).join(", ")}.`,
328
+ "3. Run `qm_skills_for_pm` to see the daily-use catalog for product roadmap + strategy.",
329
+ ],
330
+ privacy_note: "Quartermaster ships templates only. Your Connect data, GitHub/Kusto/ADO credentials, and personal NPF history live on YOUR machine and are never committed to the package. The author's environment is not leaked to your install.",
331
+ troubleshooting: {
332
+ "Tools not visible after install": "Restart your MCP client (Copilot CLI: /restart; Claude Desktop: Cmd-Q + relaunch).",
333
+ "qm_personalize asks me questions but I want to skip": "Answer 'skip' to any question; you can re-run later. The template is also at <package>/resources/connect-db.template.json — copy and edit by hand.",
334
+ "I want to see what files this server can read": "Call repo_overview — it returns the repo_root and exclusion list.",
335
+ },
336
+ docs: "https://www.npmjs.com/package/@pbhamri/quartermaster-mcp",
337
+ };
338
+ }
339
+
340
+ function qmPersonalize(args = {}) {
341
+ // Two modes: (1) returns a Q&A flow for the AI client to walk through;
342
+ // (2) if the client passes answers, generates the connect-db file from
343
+ // the template at resources/connect-db.template.json. NEVER inherits
344
+ // the package author's data.
345
+ const tplPath = path.join(RES, "connect-db.template.json");
346
+ if (!fs.existsSync(tplPath)) {
347
+ return { error: "Template not found", expected: tplPath };
348
+ }
349
+ const template = readJson(tplPath);
350
+
351
+ // Mode 1: no answers yet — return the question flow.
352
+ if (!args.answers) {
353
+ return {
354
+ mode: "interview",
355
+ target_path: QM_CONNECT_DB,
356
+ target_exists: fs.existsSync(QM_CONNECT_DB),
357
+ override_with_env: "Set QM_CONNECT_DB env var to use a different path.",
358
+ questions: [
359
+ { id: "owner_role", q: "What's your role + product? (e.g. 'PM, Microsoft Intune Endpoint Management')", required: true },
360
+ { id: "level", q: "What's your IC level? (L62 / L63 / L64 / L65 / L67) — drives /npf calibration", required: true },
361
+ { id: "fy_period", q: "Current FY period? (e.g. 'FY26 H1')", required: true },
362
+ { id: "goal_titles", q: "Your top 3-5 Connect goal titles (one per line). I'll scaffold them as drafts you can fill in baselines + targets later.", required: true },
363
+ { id: "active_directive", q: "Top active directive from your manager / GPM (one line, free-form)", required: false },
364
+ ],
365
+ instructions_for_ai_client: "Ask the user the questions above one at a time. When all answers collected, call qm_personalize again with answers={...} keyed by question id. The user — not the AI — answers each question.",
366
+ will_write_to: QM_CONNECT_DB,
367
+ will_overwrite: fs.existsSync(QM_CONNECT_DB) ? "YES — backup recommended before proceeding" : "NO — new file",
368
+ };
369
+ }
370
+
371
+ // Mode 2: answers provided — write the personalized connect-db.
372
+ const a = args.answers;
373
+ const personalized = {
374
+ ...template,
375
+ meta: {
376
+ owner_role: a.owner_role || template.meta.owner_role,
377
+ level: a.level || template.meta.level,
378
+ fy_period: a.fy_period || template.meta.fy_period,
379
+ last_updated: new Date().toISOString().split("T")[0],
380
+ },
381
+ goals: (a.goal_titles ? a.goal_titles.split("\n") : [])
382
+ .map((t, i) => ({ id: i + 1, title: t.trim(), status: "draft", smart: false, baseline: null, target: null, due: null }))
383
+ .filter(g => g.title),
384
+ directives: a.active_directive ? [{ id: "d1", title: a.active_directive, status: "active" }] : [],
385
+ };
386
+ // Backup existing if present
387
+ if (fs.existsSync(QM_CONNECT_DB)) {
388
+ const backup = QM_CONNECT_DB.replace(/\.json$/, `.backup-${Date.now()}.json`);
389
+ fs.copyFileSync(QM_CONNECT_DB, backup);
390
+ personalized._backup_of_previous = backup;
391
+ }
392
+ fs.mkdirSync(path.dirname(QM_CONNECT_DB), { recursive: true });
393
+ fs.writeFileSync(QM_CONNECT_DB, JSON.stringify(personalized, null, 2));
394
+ emit("qm.personalize", { level: a.level, goal_count: personalized.goals.length });
395
+ return {
396
+ mode: "written",
397
+ path: QM_CONNECT_DB,
398
+ summary: `Wrote ${personalized.goals.length} draft goals + ${personalized.directives.length} directive at level ${personalized.meta.level}.`,
399
+ next_step: "Run /npf in your Copilot CLI / Chat to get your first NPF assessment calibrated to " + (personalized.meta.level || "your level") + ".",
400
+ };
401
+ }
402
+
403
+ function qmSkillsForPm() {
404
+ // Curated catalog: 12 MCP tools mapped to PM daily-use cases.
405
+ // Optimised for product roadmap + strategy work.
406
+ return {
407
+ title: "Quartermaster — daily PM skills for roadmap + strategy",
408
+ intro: "12 tools, organised by PM workflow. Each tool name in backticks is callable as `<tool_name>` from your MCP client.",
409
+ workflows: [
410
+ {
411
+ scenario: "Monday — Weekly self-assessment + planning",
412
+ tools: [
413
+ { name: "/npf (prompt)", use: "30-second NPF score + biggest gap + next-move recommendation. Calibrated to your IC level." },
414
+ { name: "qm_telemetry", use: "Read paved-path adoption events from the last 7 days; see whose installs landed." },
415
+ { name: "repo_recent_sessions", use: "Read your cross-model session log to recall what shipped last week without re-explaining." },
416
+ ],
417
+ },
418
+ {
419
+ scenario: "Tuesday-Thursday — PRD authoring + roadmap shaping",
420
+ tools: [
421
+ { name: "qm_seed_repo", use: "Scaffold a new repo with the IGRM-style PRD format, /cxe + /npf prompts, command-center seed. Idempotent." },
422
+ { name: "qm_apply_profile", use: "Lock in your product profile (DLM / Insider Risk / eDiscovery / Records / Compliance / Billing) so every PRD inherits your KPIs + directives." },
423
+ { name: "qm_audit_repo", use: "Score any repo /6 against PM-readiness (AGENTS.md, copilot-instructions, profile, /npf, /cxe, verify.ps1). Fast peer review." },
424
+ { name: "/cxe (prompt)", use: "Audit a PRD or work item against the 4 CXE pillars (Priority / TTV / Confidence / Support)." },
425
+ ],
426
+ },
427
+ {
428
+ scenario: "Friday — Strategy + leadership prep",
429
+ tools: [
430
+ { name: "repo_overview / repo_list_dir / repo_read_file / repo_search", use: "Pull artefacts into context for an exec readout without copy-pasting. Read-only, secrets denied at server." },
431
+ { name: "qm_emit_pr", use: "Seed a repo with a profile AND open a labeled PR via gh CLI — closes the loop on cross-team commitments in one call." },
432
+ ],
433
+ },
434
+ {
435
+ scenario: "Onboarding + sharing with peer PMs",
436
+ tools: [
437
+ { name: "qm_welcome", use: "First-run guide. Surface this to any new peer." },
438
+ { name: "qm_personalize", use: "Walk a peer through 5 questions, write THEIR connect-db. Their data, their machine, never the package author's." },
439
+ { name: "qm_install_prompts", use: "Drop /npf + /cxe into a peer's ~/.github/prompts so the prompts work in Copilot Chat (IDE) too." },
440
+ { name: "qm_skills_for_pm", use: "This catalog. Run any time you forget what's available." },
441
+ ],
442
+ },
443
+ ],
444
+ daily_loop: [
445
+ "1. Mon 09:00 — `/npf` for the week's score + gap.",
446
+ "2. Tue-Thu — `qm_seed_repo` / `qm_apply_profile` / `/cxe` while authoring PRDs.",
447
+ "3. Fri PM — `repo_search` + `repo_read_file` to assemble Friday's exec readout.",
448
+ "4. Monthly — `qm_telemetry` to check who's actually adopting your paved paths (Reach signal for next /npf).",
449
+ ],
450
+ not_in_scope: [
451
+ "Real-time customer feedback ingestion — pair with WorkIQ MCP for that.",
452
+ "ADO work-item bulk operations — pair with Azure DevOps MCP.",
453
+ "Kusto KPI pulls — pair with the Kusto MCP server.",
454
+ "All three above have profile templates in resources/mcp-servers/ — paste into your MCP config, fill the {{PLACEHOLDERS}} with your own org/project/cluster.",
455
+ ],
456
+ };
457
+ }
458
+
459
+
303
460
  // ---- Repo-read surface (since v0.3.0) ----
304
461
  // Lets a peer's MCP client read files in the repo where the server runs.
305
462
  // Default REPO_ROOT = cwd at launch (overridable via QM_REPO_ROOT env).
@@ -433,6 +590,13 @@ const TOOLS = [
433
590
  title: { type:"string" }, body: { type:"string" },
434
591
  base: { type:"string", default:"main" }, draft: { type:"boolean", default:false }
435
592
  } } },
593
+ // ---- v0.4.0 onboarding surface ----
594
+ { name: "qm_welcome", description: "First-run welcome + 3-step onboarding guide. Surface this to any new peer who installed quartermaster-mcp. No args.",
595
+ inputSchema: { type: "object", properties: {} } },
596
+ { name: "qm_personalize", description: "Interactive setup. Returns a Q&A flow (mode='interview') for the AI client to walk the user through, OR if answers provided, writes a personalized connect-db at ~/.quartermaster/connect-db.json (override with QM_CONNECT_DB env var). Never inherits the package author's data.",
597
+ inputSchema: { type: "object", properties: { answers: { type: "object", description: "Key-value of question ids to user answers. Returned by interview mode." } } } },
598
+ { name: "qm_skills_for_pm", description: "Curated catalog of the Quartermaster tools mapped to PM daily-use workflows (Monday self-assess, midweek PRDs + roadmap, Friday strategy prep, onboarding + sharing).",
599
+ inputSchema: { type: "object", properties: {} } },
436
600
  // ---- v0.3.0 read-only repo surface ----
437
601
  { name: "repo_overview", description: "Returns server metadata: repo_root, framework_count (if a competitive-intel-agent/frameworks dir exists), exclusion rules. No args.",
438
602
  inputSchema: { type: "object", properties: {} } },
@@ -460,6 +624,9 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
460
624
  case "qm_apply_profile": result = await timed("qm.apply_profile", { profileId: args.profileId }, async () => applyProfile(args)); break;
461
625
  case "qm_telemetry": result = readTelemetry(args); break;
462
626
  case "qm_emit_pr": result = await timed("qm.emit_pr", { profileId: args.profileId }, async () => emitPr(args)); break;
627
+ case "qm_welcome": result = qmWelcome(); break;
628
+ case "qm_personalize": result = qmPersonalize(args); break;
629
+ case "qm_skills_for_pm": result = qmSkillsForPm(); break;
463
630
  case "repo_overview": result = repoOverview(); break;
464
631
  case "repo_list_dir": result = repoListDir(args); break;
465
632
  case "repo_read_file": result = repoReadFile(args); break;
@@ -490,3 +657,4 @@ server.setRequestHandler(ReadResourceRequestSchema, async (req) => {
490
657
 
491
658
  await server.connect(new StdioServerTransport());
492
659
  process.stderr.write(`quartermaster-mcp v${PKG.version} ready (stdio)\n`);
660
+
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pbhamri/quartermaster-mcp",
3
- "version": "0.3.1",
4
- "description": "MCP server that seeds any repo with the Quartermaster PM kit AND exposes a read-only repo surface (repo_overview, repo_list_dir, repo_read_file, repo_search, repo_recent_sessions). One-command share with any MS PM peer: npx -y @pbhamri/quartermaster-mcp",
3
+ "version": "0.4.1",
4
+ "description": "MCP server that seeds any repo with the Quartermaster PM kit + provides read-only repo access + first-run onboarding (qm_welcome, qm_personalize, qm_skills_for_pm). Personalised per peer; never inherits the package author's Connect/credentials/personal data. One-command share with any MS PM peer: npx -y @pbhamri/quartermaster-mcp",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "quartermaster-mcp": "bin/server.js"
@@ -0,0 +1,54 @@
1
+ {
2
+ "_template_for": "Quartermaster MCP — Connect goal tracker template",
3
+ "_instructions": "Replace TODO placeholders with your own goals/KPIs. Never commit your filled copy back to a public repo.",
4
+ "schemaVersion": 1,
5
+ "meta": {
6
+ "owner_role": "TODO: e.g. PM, Microsoft Purview DLM",
7
+ "level": "TODO: e.g. L62 / L63 / L64 / L65",
8
+ "fy_period": "TODO: e.g. FY26 H1",
9
+ "last_updated": "TODO: ISO date"
10
+ },
11
+ "goals": [
12
+ { "id": 1, "title": "TODO: Customer outcome you own E2E", "status": "draft", "smart": false, "baseline": null, "target": null, "due": null },
13
+ { "id": 2, "title": "TODO: Adoption / funnel KPI", "status": "draft", "smart": false, "baseline": null, "target": null, "due": null },
14
+ { "id": 3, "title": "TODO: AI-leverage / paved-path goal", "status": "draft", "smart": false, "baseline": null, "target": null, "due": null },
15
+ { "id": 4, "title": "TODO: Cross-functional collaboration / mentor goal", "status": "draft", "smart": false, "baseline": null, "target": null, "due": null },
16
+ { "id": 5, "title": "TODO: Personal growth / level-up goal", "status": "draft", "smart": false, "baseline": null, "target": null, "due": null }
17
+ ],
18
+ "kpis": {
19
+ "_examples": "Replace these with KPIs from your team's OKR doc. Each KPI has baseline + target + cadence.",
20
+ "kpi_1": { "name": "TODO", "baseline": null, "target": null, "cadence": "weekly" }
21
+ },
22
+ "directives": [
23
+ { "id": "d1", "title": "TODO: Active directive from your manager / GPM", "status": "active" }
24
+ ],
25
+ "todos": [],
26
+ "cxePillars": {
27
+ "_anchor": "EVP Security CXE pillars (FY26)",
28
+ "priority": { "evidence": [], "lagging_metric": null },
29
+ "ttv": { "evidence": [], "lagging_metric": null },
30
+ "confidence": { "evidence": [], "lagging_metric": null },
31
+ "support": { "evidence": [], "lagging_metric": null }
32
+ },
33
+ "npfHistory": [],
34
+ "cadenceSchedule": {
35
+ "weekly_self_assess": "Mon 09:00 local",
36
+ "monthly_exec_readout": "Last Friday of month",
37
+ "quarterly_connect_review": "Mid-quarter + close-quarter"
38
+ },
39
+ "mcpHealth": {
40
+ "_purpose": "Track which MCP surfaces you have configured. Quartermaster fills this when you accept the qm_install_mcp prompts.",
41
+ "ado": { "configured": false },
42
+ "kusto": { "configured": false },
43
+ "workiq": { "configured": false },
44
+ "playwright": { "configured": false }
45
+ },
46
+ "quickLinks": {
47
+ "_examples": "Replace with your team's actual links",
48
+ "team_okr_doc": "TODO",
49
+ "release_calendar": "TODO",
50
+ "exec_review_deck": "TODO"
51
+ },
52
+ "notes": [],
53
+ "recentReports": []
54
+ }
@@ -1,7 +1,7 @@
1
1
  ---
2
- description: One-word trigger — audit any PRD, work-item, or shipped surface against Hayete's 4 CXE pillars (CXE-first / Value-fast / Confidence / Support-when-it-matters).
2
+ description: One-word trigger — audit any PRD, work-item, or shipped surface against EVP Security CXE pillars (CXE-first / Value-fast / Confidence / Support-when-it-matters).
3
3
  ---
4
- # /cxe — Hayete CXE pillar audit
4
+ # /cxe — EVP Security CXE pillar audit
5
5
 
6
6
  When the user types `/cxe` (alone, or `/cxe <id-or-path>`), run a 4-pillar audit.
7
7
 
@@ -10,7 +10,7 @@ When the user types `/cxe` (alone, or `/cxe <id-or-path>`), run a 4-pillar audit
10
10
  - If `<id>`: audit that PRD id.
11
11
  - If `<path>`: audit the file at that path (PRD .md / .docx / .html or ADO work-item .json export).
12
12
 
13
- ## Pillars (verbatim from Hayete, 2026-05-29)
13
+ ## Pillars (verbatim from EVP Security, FY26)
14
14
 
15
15
  | # | Pillar | The lens |
16
16
  |---|---|---|
@@ -48,9 +48,10 @@ Biggest gap: <one sentence>
48
48
  Next move: <one specific edit + owner + by-when>
49
49
  ```
50
50
 
51
- Then close with the standard 3-block (Transformative tip / Hayete AMA / NPF Reach Expansion) — the **Hayete AMA line must now reference whichever pillar the audit found weakest**, so the rubric drives the close, not generic alignment.
51
+ Then close with the standard 3-block (Transformative tip / EVP Security AMA / NPF Reach Expansion) — the **EVP Security AMA line must now reference whichever pillar the audit found weakest**, so the rubric drives the close, not generic alignment.
52
52
 
53
53
  ## Notes
54
54
  - This is candid, not flattering. A 3/8 is a real signal that the artefact needs a CXE rewrite, not a re-edit.
55
55
  - TTV (P2) cannot be scored 2 without a *measured* baseline number — "TTV is fast" doesn't count.
56
56
  - Support (P4) must be **in-product**. A docs link is P4=1, not P4=2.
57
+
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: One-word trigger — assess current NPF (Net Productivity Factor) performance from connect-db.json + recent CI reports, score against L3 Transformative band, and recommend the single highest-leverage next move.
2
+ description: One-word trigger — assess current NPF (Net Productivity Factor) performance, calibrated to your IC level (default L64 — Senior PM IC4). Reads connect-db.json + recent CI reports, scores against L3 Transformative band AND the band-specific expectation table, and recommends the single highest-leverage next move.
3
3
  ---
4
4
  # /npf — Net Productivity Factor assessment
5
5
 
@@ -7,39 +7,47 @@ When the user types `/npf` (or just "npf"), run this assessment.
7
7
 
8
8
  ## Steps
9
9
 
10
- 1. Read `C:\Users\pbhamri\Documents\Connect\db\connect-db.json` extract `npfHistory[]`, `kpis`, `goals`, `directives`, `todos`.
11
- 2. Compute:
10
+ 1. **Locate connect-db.** Order of preference:
11
+ - Env var `QM_CONNECT_DB` if set, OR
12
+ - `~/.quartermaster/connect-db.json` (default for new installs), OR
13
+ - `~/Documents/Connect/db/connect-db.json` (legacy location).
14
+
15
+ If none exist: tell the user to run `qm_personalize` (Quartermaster MCP tool) to scaffold one, then re-run /npf.
16
+
17
+ 2. From connect-db, extract `npfHistory[]`, `kpis`, `goals`, `directives`, `todos`.
18
+ 3. Compute:
12
19
  - **Current NPF**: latest `npfHistory[].index` + band
13
20
  - **Week-over-week delta**: latest − snapshot from 7 days ago
14
21
  - **Trend**: rising / flat / falling
15
- - **L3 band proof**: count of evidence in last 7 days (skills shipped, §7 rules, frameworks added, paved-path artefacts, ADO/PR telemetry-tagged work)
16
- 3. Score against the four TRANSFORMATIVE behaviors (each 0–25, total /100):
17
- - **Leverage** — shared assets built (skills, agents, paved paths, templates)
18
- - **Reach** — peers / workloads who can reuse this week's output
22
+ - **L3 band proof**: count of evidence in last 7 days (skills shipped, paved-path artefacts, npm packages published, ADO/PR telemetry-tagged work)
23
+ 4. Score against the four TRANSFORMATIVE behaviors **AND apply the IC-band calibration table** (default L64: NPF 65-80, mentor footprint 1-3 peers, all 4 CXE pillars with lagging metric, telemetry-confirmed reach not just outreach):
24
+ - **Leverage** — shared assets (skills, agents, paved paths, npm packages)
25
+ - **Reach** — peers / workloads with telemetry-confirmed adoption (use paved-path-events.jsonl as ground truth)
19
26
  - **Cycle-time collapse** — weeks→days or days→minutes proof
20
27
  - **Outcome focus** — customer/business metric movement vs activity counts
21
- 4. Identify the **single biggest NPF leak** (KPI stuck at 0 / blocker on a directive / overdue todo / no real NPF capture).
22
- 5. Recommend **one move** that would lift NPF by ≥5 points before the next refresh.
28
+ 5. Identify the **single biggest NPF leak** and recommend **one move** that would lift NPF by ≥5 points before the next refresh.
23
29
 
24
30
  ## Output format
25
31
 
26
32
  ```
27
- NPF: <score>/100 · <band> · <trend arrow> <delta> wk/wk
33
+ NPF (calibrated to L<band>): <score>/100 · <band-name> · <trend arrow> <delta> wk/wk
28
34
 
29
- Behavior Score Evidence
30
- Leverage xx/25 <1-line proof>
31
- Reach xx/25 <1-line proof>
32
- Cycle-time xx/25 <1-line proof>
33
- Outcome focus xx/25 <1-line proof>
35
+ Dimension IC-band read Mechanical Evidence
36
+ Leverage A/B/C/D xx/100 <1-line proof>
37
+ Reach A/B/C/D xx/100 <1-line proof>
38
+ Cycle-time A/B/C/D xx/100 <1-line proof>
39
+ Outcome focus A/B/C/D xx/100 <1-line proof>
34
40
 
35
- Biggest leak: <one sentence>
36
- Next move (≥+5): <one specific action with owner + by-when>
41
+ Calibration verdict: <A-/B/B-/C+/C/D> (<one sentence summary>)
42
+ Biggest gap to bar: <one sentence>
43
+ Next move (≥+5 NPF): <one specific action with owner + by-when>
37
44
  ```
38
45
 
39
- Then close with the standard 3-block (Transformative tip / Hayete AMA / NPF Reach Expansion).
46
+ Then close with the standard 3-block (Transformative tip · AMA Alignment · NPF Reach Expansion).
40
47
 
41
- ## Notes
48
+ ## Rules
42
49
 
43
- - The carried-forward NPF (note contains "auto-carried") is a placeholder, not a real score — call it out and *overwrite* it as part of this assessment by editing `connect-db.json` directly with your real computed score.
44
- - Never score above 80 without at least one shipped artefact a *peer PM has actually consumed* (proof of reach, not just availability).
50
+ - The carried-forward NPF (note contains "auto-carried") is a placeholder, not a real score — call it out and **overwrite** it with the real computed score.
51
+ - Never score above the band-ceiling on Reach or Mentor footprint without telemetry-confirmed peer adoption (≥1 entry in `~/.copilot/metrics/paved-path-events.jsonl` from a non-self machine). Outreach ≠ adoption.
52
+ - Refer to people by role/designation, never by name.
45
53
  - This is a self-assessment for the user's growth — be candid, not flattering.