paput-mcp 4.2.21 → 4.2.22

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.
Files changed (53) hide show
  1. package/README.md +6 -7
  2. package/dist/cli/rules/paput-knowledge-capture.md +1 -1
  3. package/dist/handlers/add-knowledge-candidates/tool.js +1 -1
  4. package/dist/handlers/add-knowledge-candidates/tool.js.map +1 -1
  5. package/dist/handlers/create-memos/tool.js +1 -1
  6. package/dist/handlers/create-memos/tool.js.map +1 -1
  7. package/dist/handlers/get-dashboard-analysis-context/handler.js +1 -1
  8. package/dist/handlers/get-skill-sheet/handler.js +20 -23
  9. package/dist/handlers/get-skill-sheet/handler.js.map +1 -1
  10. package/dist/handlers/get-skill-sheet-project-episodes-context/handler.js +128 -0
  11. package/dist/handlers/get-skill-sheet-project-episodes-context/handler.js.map +1 -0
  12. package/dist/handlers/get-skill-sheet-project-episodes-context/index.js +2 -0
  13. package/dist/handlers/get-skill-sheet-project-episodes-context/index.js.map +1 -0
  14. package/dist/handlers/get-skill-sheet-project-episodes-context/tool.js +19 -0
  15. package/dist/handlers/get-skill-sheet-project-episodes-context/tool.js.map +1 -0
  16. package/dist/handlers/index.js +2 -4
  17. package/dist/handlers/index.js.map +1 -1
  18. package/dist/handlers/save-pending-candidate/tool.js +1 -1
  19. package/dist/handlers/save-pending-candidate/tool.js.map +1 -1
  20. package/dist/handlers/search-memo/tool.js +2 -2
  21. package/dist/handlers/search-memo/tool.js.map +1 -1
  22. package/dist/handlers/update-memo/tool.js +1 -1
  23. package/dist/handlers/update-memo/tool.js.map +1 -1
  24. package/dist/handlers/update-pending-candidate/tool.js +1 -1
  25. package/dist/handlers/update-pending-candidate/tool.js.map +1 -1
  26. package/dist/handlers/update-skill-sheet-project-episodes/handler.js +99 -0
  27. package/dist/handlers/update-skill-sheet-project-episodes/handler.js.map +1 -0
  28. package/dist/handlers/update-skill-sheet-project-episodes/index.js +2 -0
  29. package/dist/handlers/update-skill-sheet-project-episodes/index.js.map +1 -0
  30. package/dist/handlers/update-skill-sheet-project-episodes/tool.js +58 -0
  31. package/dist/handlers/update-skill-sheet-project-episodes/tool.js.map +1 -0
  32. package/dist/handlers/upsert-skill-sheet-project/handler.js +6 -0
  33. package/dist/handlers/upsert-skill-sheet-project/handler.js.map +1 -1
  34. package/dist/handlers/upsert-skill-sheet-project/tool.js +9 -0
  35. package/dist/handlers/upsert-skill-sheet-project/tool.js.map +1 -1
  36. package/dist/plugin/skills/capture/SKILL.md +6 -6
  37. package/dist/plugin/skills/dashboard-analysis/SKILL.md +1 -1
  38. package/dist/plugin/skills/harvest/SKILL.md +5 -5
  39. package/dist/plugin/skills/principle-synthesizer/SKILL.md +7 -7
  40. package/dist/plugin/skills/project-episodes/SKILL.md +60 -0
  41. package/dist/plugin/skills/self-pr-draft/SKILL.md +37 -0
  42. package/dist/schemas/tool-input.js +42 -67
  43. package/dist/schemas/tool-input.js.map +1 -1
  44. package/dist/services/api/skill-sheet.js +3 -9
  45. package/dist/services/api/skill-sheet.js.map +1 -1
  46. package/dist/tool.js +3 -5
  47. package/dist/tool.js.map +1 -1
  48. package/docs/reviewer-guide.md +1 -1
  49. package/docs/tools.md +15 -21
  50. package/docs/usage-examples.md +28 -9
  51. package/package.json +1 -1
  52. package/dist/plugin/skills/project-summary/SKILL.md +0 -43
  53. package/dist/plugin/skills/public-profile-summary/SKILL.md +0 -73
@@ -0,0 +1,58 @@
1
+ import { handler } from './handler.js';
2
+ export const updateSkillSheetProjectEpisodesTool = {
3
+ definition: {
4
+ name: 'paput_update_skill_sheet_project_episodes',
5
+ description: 'Full-replace the AI-generated design-and-judgment episodes for a PaPut skill sheet project. Use only after the user explicitly approves the episode draft.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ project_id: {
10
+ type: 'number',
11
+ description: 'Project ID',
12
+ },
13
+ episodes: {
14
+ type: 'array',
15
+ description: 'Episodes to save. Pass an empty array to clear all project episodes. Maximum 5 episodes.',
16
+ maxItems: 5,
17
+ items: {
18
+ type: 'object',
19
+ properties: {
20
+ claim: {
21
+ type: 'string',
22
+ maxLength: 200,
23
+ description: 'Required one-line claim for the episode, grounded in public linked memos.',
24
+ },
25
+ situation: {
26
+ type: 'string',
27
+ maxLength: 1000,
28
+ description: 'Optional situation context, 1-2 sentences.',
29
+ },
30
+ decision: {
31
+ type: 'string',
32
+ maxLength: 1000,
33
+ description: 'Optional decision description, 1-2 sentences.',
34
+ },
35
+ reason: {
36
+ type: 'string',
37
+ maxLength: 1000,
38
+ description: 'Optional reason, 1-2 sentences.',
39
+ },
40
+ supporting_memo_ids: {
41
+ type: 'array',
42
+ minItems: 1,
43
+ description: 'Public memo IDs returned by the project episodes context tool that support this episode.',
44
+ items: {
45
+ type: 'number',
46
+ },
47
+ },
48
+ },
49
+ required: ['claim', 'supporting_memo_ids'],
50
+ },
51
+ },
52
+ },
53
+ required: ['project_id', 'episodes'],
54
+ },
55
+ },
56
+ handler,
57
+ };
58
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/update-skill-sheet-project-episodes/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,MAAM,mCAAmC,GAAgB;IAC9D,UAAU,EAAE;QACV,IAAI,EAAE,2CAA2C;QACjD,WAAW,EACT,4JAA4J;QAC9J,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,YAAY;iBAC1B;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,OAAO;oBACb,WAAW,EACT,0FAA0F;oBAC5F,QAAQ,EAAE,CAAC;oBACX,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,SAAS,EAAE,GAAG;gCACd,WAAW,EACT,2EAA2E;6BAC9E;4BACD,SAAS,EAAE;gCACT,IAAI,EAAE,QAAQ;gCACd,SAAS,EAAE,IAAI;gCACf,WAAW,EAAE,4CAA4C;6BAC1D;4BACD,QAAQ,EAAE;gCACR,IAAI,EAAE,QAAQ;gCACd,SAAS,EAAE,IAAI;gCACf,WAAW,EAAE,+CAA+C;6BAC7D;4BACD,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,SAAS,EAAE,IAAI;gCACf,WAAW,EAAE,iCAAiC;6BAC/C;4BACD,mBAAmB,EAAE;gCACnB,IAAI,EAAE,OAAO;gCACb,QAAQ,EAAE,CAAC;gCACX,WAAW,EACT,0FAA0F;gCAC5F,KAAK,EAAE;oCACL,IAAI,EAAE,QAAQ;iCACf;6BACF;yBACF;wBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC;qBAC3C;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC;SACrC;KACF;IACD,OAAO;CACR,CAAC"}
@@ -88,6 +88,12 @@ function parseProjectParams(params) {
88
88
  if (typeof params.mcp_alias === 'string') {
89
89
  project.mcp_alias = params.mcp_alias;
90
90
  }
91
+ if (Array.isArray(params.achievements)) {
92
+ if (!params.achievements.every((item) => typeof item === 'string')) {
93
+ return undefined;
94
+ }
95
+ project.achievements = params.achievements;
96
+ }
91
97
  return project;
92
98
  }
93
99
  function isTechnology(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/upsert-skill-sheet-project/handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/upsert-skill-sheet-project/handler.ts"],"names":[],"mappings":"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"}
@@ -85,6 +85,15 @@ export const upsertSkillSheetProjectTool = {
85
85
  required: ['id', 'title'],
86
86
  },
87
87
  },
88
+ achievements: {
89
+ type: 'array',
90
+ description: 'Achievement bullets owned by the user. Omit to keep existing values; pass an empty array to clear them. Maximum 10 items, 100 characters each.',
91
+ maxItems: 10,
92
+ items: {
93
+ type: 'string',
94
+ maxLength: 100,
95
+ },
96
+ },
88
97
  },
89
98
  required: [
90
99
  'type',
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/upsert-skill-sheet-project/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,MAAM,2BAA2B,GAAgB;IACtD,UAAU,EAAE;QACV,IAAI,EAAE,kCAAkC;QACxC,WAAW,EACT,sJAAsJ;QACxJ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,EAAE,EAAE;oBACF,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,yDAAyD;iBAC5D;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sCAAsC;iBACpD;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,eAAe;iBAC7B;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,gGAAgG;iBACnG;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8BAA8B;iBAC5C;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qBAAqB;iBACnC;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,MAAM;iBACpB;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uBAAuB;iBACrC;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,mBAAmB;oBAChC,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,0CAA0C;6BACxD;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,iBAAiB;6BAC/B;yBACF;wBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;qBACnB;iBACF;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,OAAO;oBACb,WAAW,EACT,wHAAwH;oBAC1H,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;qBACf;iBACF;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,eAAe;oBAC5B,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,SAAS;6BACvB;4BACD,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,YAAY;6BAC1B;yBACF;wBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;qBAC1B;iBACF;aACF;YACD,QAAQ,EAAE;gBACR,MAAM;gBACN,OAAO;gBACP,cAAc;gBACd,aAAa;gBACb,MAAM;gBACN,OAAO;gBACP,cAAc;gBACd,WAAW;gBACX,OAAO;aACR;SACF;KACF;IACD,OAAO;CACR,CAAC"}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/upsert-skill-sheet-project/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,MAAM,2BAA2B,GAAgB;IACtD,UAAU,EAAE;QACV,IAAI,EAAE,kCAAkC;QACxC,WAAW,EACT,sJAAsJ;QACxJ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,EAAE,EAAE;oBACF,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,yDAAyD;iBAC5D;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sCAAsC;iBACpD;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,eAAe;iBAC7B;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,gGAAgG;iBACnG;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8BAA8B;iBAC5C;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qBAAqB;iBACnC;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,MAAM;iBACpB;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uBAAuB;iBACrC;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,mBAAmB;oBAChC,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,0CAA0C;6BACxD;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,iBAAiB;6BAC/B;yBACF;wBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;qBACnB;iBACF;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,OAAO;oBACb,WAAW,EACT,wHAAwH;oBAC1H,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;qBACf;iBACF;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,eAAe;oBAC5B,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,SAAS;6BACvB;4BACD,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,YAAY;6BAC1B;yBACF;wBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;qBAC1B;iBACF;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,OAAO;oBACb,WAAW,EACT,gJAAgJ;oBAClJ,QAAQ,EAAE,EAAE;oBACZ,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,SAAS,EAAE,GAAG;qBACf;iBACF;aACF;YACD,QAAQ,EAAE;gBACR,MAAM;gBACN,OAAO;gBACP,cAAc;gBACd,aAAa;gBACb,MAAM;gBACN,OAAO;gBACP,cAAc;gBACd,WAAW;gBACX,OAAO;aACR;SACF;KACF;IACD,OAAO;CACR,CAAC"}
@@ -41,7 +41,7 @@ Extract reusable knowledge candidates from the current conversation or a user-sp
41
41
 
42
42
  ## Memo Type
43
43
 
44
- Classify each candidate with one or more memo types via `memo_type_keys`. A memo can have several. This axis is what lets PaPut surface judgment and practices in the public AI summary, so classify deliberately.
44
+ Classify each candidate with one or more memo types via `memo_type_keys`. A memo can have several. This axis is what lets PaPut surface judgment and practices in project episodes, self PR drafting, and analysis, so classify deliberately.
45
45
 
46
46
  Typing is a reading step, not a writing step. Classify only after the body is final, and only from what the body already says. Never add headings, criteria sections, or choice wording to the body to justify a type — if a type fits only after such an edit, the type does not fit.
47
47
 
@@ -53,10 +53,10 @@ Typing is a reading step, not a writing step. Classify only after the body is fi
53
53
  Guidance:
54
54
 
55
55
  - Capture candidates are reusable decision criteria, procedures, or principles, so prefer `decision` / `operation` / `principle` when they fit; use `knowledge` for commodity technical know-how.
56
- - `decision` / `operation` / `principle` are the primary material for the public AI summary; `knowledge` usually is not.
56
+ - `decision` / `operation` / `principle` are the primary material for durable judgment and working-practice summaries; `knowledge` usually is not.
57
57
  - Tagging review — do not under-label. The default failure mode is dropping a judgment memo into `knowledge` and missing `decision` / `operation` / `principle`; this is a main reason the `principle` axis stays thin. Consider the durable three FIRST and use `knowledge` only when none genuinely fit. Quick catches: a stated reason for choosing or avoiding an option → `decision`; an operating practice (how you measure, review, run, or verify) → `operation`; a generalized stance one level above a single decision → `principle`. Before finalizing `memo_type_keys`, re-read the candidate once and ask "is there a judgment here that I labeled as mere knowledge?". Do not over-correct either: `principle` needs an explicitly generalized stance, not a one-off opinion — keep it honest against the Quality Bar.
58
58
  - Do not over-label `decision` — it requires a judgment that actually happened, recorded in the body: an option taken, an alternative rejected, or a tradeoff resolved. A criteria-style heading, or a list of options with no record of what was chosen, does not make a memo a `decision`; plain library, API, or service behavior stays `knowledge` even when written as guidance.
59
- - AI-collaboration practices and stances belong here, not in the reject pile: how you structure a task or spec for an AI, your review discipline for AI-generated changes, where you verify versus trust AI output, when you delegate versus do it yourself. Capture the reusable practice as `operation` or the stated stance as `principle` — generalized so it would hold with a different AI tool, on a different project, for someone else to learn. This is the scarcest, most durable axis; do not drop it as workflow chatter.
59
+ - AI-collaboration practices and postures belong here, not in the reject pile: how you structure a task or spec for an AI, your review discipline for AI-generated changes, where you verify versus trust AI output, when you delegate versus do it yourself. Capture the reusable practice as `operation` or the stated stance as `principle` — generalized so it would hold with a different AI tool, on a different project, for someone else to learn. This is the scarcest, most durable axis; do not drop it as workflow chatter.
60
60
  - Leaving a candidate unclassified (no type) is allowed, but classifying it improves analysis and the public profile. Do not force a type when none fits.
61
61
 
62
62
  ## Eliciting scarce operating practices (eval / observability)
@@ -75,7 +75,7 @@ Generalize one level above the project: drop service, metric, and dashboard name
75
75
 
76
76
  ## Eliciting prompt-derived judgment
77
77
 
78
- The user's own prompts in the current conversation are first-party evidence of judgment. Corrections, constraints, repeated instructions, and choices among AI-presented options often reveal reusable operating practices or stances before they appear in the final artifact. When the conversation includes this signal, do not treat it as disposable task wording: actively draw out the reusable judgment and capture it as `operation`, `principle`, or `decision` as appropriate.
78
+ The user's own prompts in the current conversation are first-party evidence of judgment. Corrections, constraints, repeated instructions, and choices among AI-presented options often reveal reusable operating practices or postures before they appear in the final artifact. When the conversation includes this signal, do not treat it as disposable task wording: actively draw out the reusable judgment and capture it as `operation`, `principle`, or `decision` as appropriate.
79
79
 
80
80
  Draw out only what fits the conversation — do not interrogate:
81
81
 
@@ -84,7 +84,7 @@ Draw out only what fits the conversation — do not interrogate:
84
84
  - Is the user repeating nearly the same boilerplate instruction? If it is project-specific, route it to a project document as a `procedure` through Check 1; if it is cross-project, capture the practice as `operation` in pending through Check 2.
85
85
  - Did the AI present options, and did the user choose, reject, or combine them with a reason? That reason is `decision` material.
86
86
 
87
- Generalize one level above the prompt: keep the judgment criterion, operating practice, stance, or repeatable procedure; drop local paths, project names, customer details, and exact task facts. Short verbatim phrasing from the user may be preserved for authenticity, but pending candidates must not include sensitive or project-specific content. A one-off "fix this" or "run tests" instruction is a work log, not knowledge, unless it exposes a reusable judgment criterion, operating practice, or procedure. Project-specific repeated instructions belong in project documents (`procedure`, Check 1); cross-project practices and stances belong in pending candidates (Check 2).
87
+ Generalize one level above the prompt: keep the judgment criterion, operating practice, stance, or repeatable procedure; drop local paths, project names, customer details, and exact task facts. Short verbatim phrasing from the user may be preserved for authenticity, but pending candidates must not include sensitive or project-specific content. A one-off "fix this" or "run tests" instruction is a work log, not knowledge, unless it exposes a reusable judgment criterion, operating practice, or procedure. Project-specific repeated instructions belong in project documents (`procedure`, Check 1); cross-project practices and postures belong in pending candidates (Check 2).
88
88
 
89
89
  ## Quality Bar
90
90
 
@@ -104,7 +104,7 @@ Prefer generalized but concrete writing:
104
104
  Do not add these to pending:
105
105
 
106
106
  - Project-specific specifications, screen names, button names, business workflows, operational rules, or local context.
107
- - One-off tool mechanics or configuration: editor / OS / CLI settings, keybindings, which button was clicked, model- or version-specific quirks, project-specific CI wiring, or anecdotes about a single session (for example, "the AI got confused here"). These are commodity even when they mention AI tools — capture the reusable practice or stance instead, not the mechanics. Reusable AI-collaboration practices and stances ARE worth capturing (see the AI-collaboration note under Memo Type); do not discard them as workflow chatter.
107
+ - One-off tool mechanics or configuration: editor / OS / CLI settings, keybindings, which button was clicked, model- or version-specific quirks, project-specific CI wiring, or anecdotes about a single session (for example, "the AI got confused here"). These are commodity even when they mention AI tools — capture the reusable practice or stance instead, not the mechanics. Reusable AI-collaboration practices and postures ARE worth capturing (see the AI-collaboration note under Memo Type); do not discard them as workflow chatter.
108
108
  - Content that third parties cannot understand from the title and body alone.
109
109
  - Rejected designs, anecdotes, work logs, impressions, or decision histories without reusable guidance.
110
110
  - Content semantically close to existing memos or pending candidates.
@@ -6,7 +6,7 @@ description: Use this to analyze the user's PaPut dashboard, goals, skill sheet,
6
6
 
7
7
  Analyze the user's PaPut dashboard and goals. Use this skill when the user asks about dashboard analysis, goals, progress, strengths, weak areas, next learning topics, or career-history phrasing.
8
8
 
9
- Read the user through the JUDGMENT axis, not raw volume. The durable, hard-to-commoditize part of what they accumulate is their judgment and practice — captured as `memo_type`: `decision` (judgment criteria), `operation` (operating practices), `principle` (stated stances). `knowledge` is commodity. `structuredContent.dashboard_summary.memo_type_counts` holds the per-type accumulation; assess the user by how thick those three durable axes are, with categories as a secondary lens for the domains they work in.
9
+ Read the user through the JUDGMENT axis, not raw volume. The durable, hard-to-commoditize part of what they accumulate is their judgment and practice — captured as `memo_type`: `decision` (judgment criteria), `operation` (operating practices), `principle` (stated principles). `knowledge` is commodity. `structuredContent.dashboard_summary.memo_type_counts` holds the per-type accumulation; assess the user by how thick those three durable axes are, with categories as a secondary lens for the domains they work in.
10
10
 
11
11
  The judgment axis is the LENS, not a replacement for goal analysis. The dashboard's core job is "where am I against my goals", so keep goals first-class: read each active goal THROUGH the axis — which judgment/practice/principle axis that goal requires, and whether that axis is currently thick or thin. Do not drop the goal overview in favor of axis-only talk.
12
12
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Use this to harvest reusable knowledge from past local Claude/Codex sessions when the AI client can read local files. Safe to run repeatedly — it skips already-processed sessions and only reviews new ones — so use it both for first-time onboarding and for periodic catch-up. Pay special attention to AI-collaboration practices and stances (operation / principle), the scarce, durable axis.
2
+ description: Use this to harvest reusable knowledge from past local Claude/Codex sessions when the AI client can read local files. Safe to run repeatedly — it skips already-processed sessions and only reviews new ones — so use it both for first-time onboarding and for periodic catch-up. Pay special attention to AI-collaboration practices and postures (operation / principle), the scarce, durable axis.
3
3
  ---
4
4
 
5
5
  # PaPut Harvest
@@ -44,7 +44,7 @@ periodic catch-up. There is no separate "init" step.
44
44
  Draft each body first, structured to fit the content itself — do not shape
45
45
  it around memo types. Then set `memo_type_keys` from the finalized body
46
46
  (see Memo Type below); classify AI-collaboration practices as `operation`
47
- and stances as `principle`.
47
+ and postures as `principle`.
48
48
  9. If the session was reviewed but no candidates should be added, call
49
49
  `paput_mark_processed_session` with `source`, `session_id`, and
50
50
  `source_session_updated_at`.
@@ -83,7 +83,7 @@ Structure each candidate body to fit its content. Do not impose a judgment-memo
83
83
 
84
84
  ### Capture the AI-collaboration axis
85
85
 
86
- Reusable AI-collaboration practices and stances are first-class material here —
86
+ Reusable AI-collaboration practices and postures are first-class material here —
87
87
  they are the scarcest, most durable axis and are easy to discard by mistake.
88
88
  Capture them as `operation` (practice) or `principle` (stance). Examples:
89
89
 
@@ -148,7 +148,7 @@ but pending candidates must not include sensitive or project-specific content. A
148
148
  one-off "fix this" or "run tests" instruction is a work log — exclude it unless
149
149
  the prompt reveals a reusable judgment criterion, operating practice, or
150
150
  procedure. Route project-specific repeated instructions to project documents
151
- (`procedure`, Check 1); route cross-project practices and stances to pending
151
+ (`procedure`, Check 1); route cross-project practices and postures to pending
152
152
  candidates (Check 2).
153
153
 
154
154
  ### Do not add these to pending
@@ -169,7 +169,7 @@ Classify each candidate with one or more memo types via `memo_type_keys`:
169
169
 
170
170
  - `decision`: reusable judgment criteria independent of any project.
171
171
  - `operation`: operating practices — observability, eval, testing, review, and how you direct and verify AI collaboration.
172
- - `principle`: a stance you have explicitly stated, generalized above individual decisions, including stances on how to work with AI.
172
+ - `principle`: a stance you have explicitly stated, generalized above individual decisions, including postures on how to work with AI.
173
173
  - `knowledge`: commodity technical know-how, usage, or implementation knowledge.
174
174
 
175
175
  `decision` / `operation` / `principle` are the primary material for the public
@@ -1,23 +1,23 @@
1
1
  ---
2
- description: Use this to synthesize cross-cutting principle candidates from the user's accumulated public decision/operation memos (and private design docs) and add them to pending. It surfaces the stances that run through many decisions — the thinnest, most AI-durable memo type — which the per-conversation paput-capture cannot reach. It only proposes to pending; it never saves to PaPut.
2
+ description: Use this to synthesize cross-cutting principle candidates from the user's accumulated public decision/operation memos (and private design docs) and add them to pending. It surfaces the postures that run through many decisions — the thinnest, most AI-durable memo type — which the per-conversation paput-capture cannot reach. It only proposes to pending; it never saves to PaPut.
3
3
  ---
4
4
 
5
5
  # PaPut Principle Synthesizer
6
6
 
7
- Synthesize `principle` candidates by reading the user's accumulated `decision` / `operation` memos (and, as substrate, their private `design_doc` project documents) as a whole, finding the stances that run through many of them, and proposing each as a `principle` pending candidate.
7
+ Synthesize `principle` candidates by reading the user's accumulated `decision` / `operation` memos (and, as substrate, their private `design_doc` project documents) as a whole, finding the postures that run through many of them, and proposing each as a `principle` pending candidate.
8
8
 
9
- A `principle` is a stance explicitly generalized one level above individual decisions — what the person optimizes for and what they reject across cases. It rarely falls out of a single conversation, so `paput-capture` (which works per session) structurally under-produces it. This skill fills that gap by working across the whole accumulated corpus. It is the persistence counterpart of the public-profile ◆ stances: it turns the cross-cutting synthesis into reusable `principle` material.
9
+ A `principle` is a stance explicitly generalized one level above individual decisions — what the person optimizes for and what they reject across cases. It rarely falls out of a single conversation, so `paput-capture` (which works per session) structurally under-produces it. This skill fills that gap by working across the whole accumulated corpus and turns the cross-cutting synthesis into reusable `principle` material.
10
10
 
11
11
  Use this when the user wants to thicken their `principle` memos, distill recurring decisions into stated principles, or refresh principle candidates from accumulated knowledge.
12
12
 
13
13
  ## Workflow
14
14
 
15
15
  1. Gather the material:
16
- - Call `paput_get_public_profile_context`. Use `public_summary_memos` the complete index (id, title, memo_types, updated_at; no bodies) of ALL the user's PUBLIC `decision` / `operation` / `principle` memos. The `decision` / `operation` entries are the synthesis material; the existing `principle` entries are the de-dup baseline.
16
+ - Use `paput_search_memo` with `is_public: true` and `memo_type: decision`, then repeat with `memo_type: operation` and `memo_type: principle`. Page through results as needed. The `decision` / `operation` entries are the synthesis material; existing `principle` entries are the de-dup baseline.
17
17
  - As substrate, call `paput_get_project_context` and read the `design_doc` documents in the index with `paput_get_project_document(id)`. Design docs hold decisions with reasons and rejected alternatives — strong principle material — but they are private and project-specific.
18
18
  2. Read the bodies of the memos you plan to cluster with `paput_get_memo` (index first, fetch on demand — do not bulk-fetch everything).
19
19
  3. Cluster across documents by theme. Look for a stance that runs through SEVERAL decisions/operations (and design-doc decisions), not a single memo restated.
20
- - First, sweep the WHOLE index and enumerate EVERY distinct cross-cutting theme the corpus supports — do not stop at the few most obvious (e.g. security / concurrency) clusters. Aim to cover the corpus. Commonly-missed but high-value axes include: operating practices (observability, eval, testing validity), AI / automation collaboration stances (treating model output as a soft signal, where to delegate generation), retrieval / routing separation, reversibility and incremental change, error-handling and failure semantics. Scan for these explicitly so the scarce axes are not dropped.
20
+ - First, sweep the WHOLE index and enumerate EVERY distinct cross-cutting theme the corpus supports — do not stop at the few most obvious (e.g. security / concurrency) clusters. Aim to cover the corpus. Commonly-missed but high-value axes include: operating practices (observability, eval, testing validity), AI / automation collaboration postures (treating model output as a soft signal, where to delegate generation), retrieval / routing separation, reversibility and incremental change, error-handling and failure semantics. Scan for these explicitly so the scarce axes are not dropped.
21
21
  - Make the clusters DISJOINT: assign each source memo to the ONE principle it best anchors, not to several. If two themes overlap heavily or keep pulling the same memos, treat them as ONE cluster, or draw a sharp line so each cluster owns a distinct slice.
22
22
  4. Synthesize each qualifying cluster into one `principle` candidate:
23
23
  - One cluster → one coherent stance with a SINGLE throughline (one "optimize X over Y"). Every sub-point in the body must be a facet of that one posture. If you find yourself writing "and also…" about a different concern, that is a second principle — split it out or drop the weaker thread. Do not bundle two or three loosely-related ideas under an umbrella title.
@@ -29,7 +29,7 @@ Use this when the user wants to thicken their `principle` memos, distill recurri
29
29
  - Merging is only for OVERLAPPING themes. It must NOT shrink the number of distinct themes you cover. "Fewer per theme" (no duplicates within a theme) is not "fewer themes" — never drop a genuine distinct cross-cutting stance just to keep the count small. Then re-check against the enumeration in step 3: if a distinct theme you found is not represented by any candidate, add it.
30
30
  6. De-dup against existing memos before adding:
31
31
  - For each candidate, call `paput_find_similar_memos` (it searches all of the user's memos, public and private). Treat a top score of ~0.85 or higher against an existing memo as a near-duplicate and skip it.
32
- - Also compare against the existing `principle` entries in `public_summary_memos`, and check `paput_list_pending_candidates` so you do not duplicate a pending candidate.
32
+ - Also compare against the existing public `principle` entries returned by `paput_search_memo`, and check `paput_list_pending_candidates` so you do not duplicate a pending candidate.
33
33
  7. Add only the non-duplicate, mutually-distinct, generalized, project-independent candidates with `paput_add_knowledge_candidates` (memo_type_keys=['principle']). Add to pending only.
34
34
  8. Report each added candidate: title, categories, memo type, candidate id, and the source memos it was synthesized from.
35
35
  9. Do NOT save to PaPut. Saving a pending candidate is handled by `paput-save`, only when the user explicitly approves it.
@@ -39,7 +39,7 @@ Use this when the user wants to thicken their `principle` memos, distill recurri
39
39
  - A `principle` must run through at least two or three decisions/operations. A single decision reworded is NOT a principle — drop it (or leave it as the decision memo it already is).
40
40
  - One principle = one throughline. The title must name ONE posture, not an umbrella over several. If the body covers two or three loosely-related concerns, it is a grab-bag — split it into separate principles or drop the weakest thread. Test: can you state it as a single "optimize X, reject Y"? If you need "and also…" about an unrelated concern, it is two principles.
41
41
  - Make principles mutually distinct. Do NOT emit two candidates that share most of their source memos or whose statements overlap. When that happens, merge them, or assign each shared memo to the single principle it best anchors and keep the two scopes disjoint. A source memo should anchor one principle, not back two.
42
- - Cover the corpus. Surface EVERY distinct cross-cutting stance the material supports, not just the first few strong clusters. The disjointness and merge rules reduce duplicates WITHIN a theme; they must not reduce the number of themes. Watch for the scarce, high-value axes that are easy to skip once the security / concurrency clusters are formed — AI / automation collaboration stances, operating practices (observability, eval, testing), and reversibility / incremental change. If the corpus clearly supports such a stance and no candidate covers it, that is under-coverage — add it.
42
+ - Cover the corpus. Surface EVERY distinct cross-cutting stance the material supports, not just the first few strong clusters. The disjointness and merge rules reduce duplicates WITHIN a theme; they must not reduce the number of themes. Watch for the scarce, high-value axes that are easy to skip once the security / concurrency clusters are formed — AI / automation collaboration postures, operating practices (observability, eval, testing), and reversibility / incremental change. If the corpus clearly supports such a stance and no candidate covers it, that is under-coverage — add it.
43
43
  - Example — grab-bag (avoid): "Advance changes reversibly and in minimal scope, don't rush first-classing until a consumer actually exists, and don't distort the official recommendation for the sake of an immature dependency" bundles three concerns. Split: (1) reversible/incremental change, (2) defer first-classing until a consumer exists. Drop the unrelated "don't distort the official recommendation" to its own memo.
44
44
  - Example — overlap (avoid): one principle about "separating retrieval routes by purpose" and another about "AI judgments as soft signals" both leaning on the same memos. Keep route-separation in the first and move all AI-judgment material to the second so neither bleeds.
45
45
  - Generalize. Remove project-specific specifications, screen names, code, identifiers, and secrets. The body must be reusable in another project from its title and text alone.
@@ -0,0 +1,60 @@
1
+ ---
2
+ description: Use this to draft and optionally save design-and-judgment episodes for a PaPut skill sheet project from the project's public linked memos. Trigger when the user asks to generate, refresh, or save project episodes, project judgment episodes, or the "design and judgment" section for a skill sheet project.
3
+ ---
4
+
5
+ # PaPut Project Episodes
6
+
7
+ Draft project episodes for the skill sheet project detail page. Episodes explain what the user chose, what they rejected, and why, backed by public linked memos.
8
+
9
+ ## Workflow
10
+
11
+ 1. Identify the target project ID.
12
+ - If the user gives a project ID, use it.
13
+ - If the user gives a project name, call `paput_get_skill_sheet` and choose the matching project.
14
+ - If the user does not specify a project, call `paput_get_skill_sheet`, show concise project candidates, and ask the user to choose one.
15
+ - Ask a concise clarification only when no project is specified or the match is ambiguous.
16
+ 2. Call `paput_get_skill_sheet_project_episodes_context` with `project_id`.
17
+ 3. Read `structuredContent.public_memos` and cluster the public linked memos by decision or operating-practice theme.
18
+ 4. Draft 2-3 episodes when the material supports them. Generate fewer, or none, when the public memos are thin.
19
+ 5. Present the draft in the user's language and tone. Explain that each episode will become the project's "design and judgment" section.
20
+ 6. Do not save unless the user explicitly asks to save, update, or apply the episodes.
21
+ 7. If the user asks to save, call `paput_update_skill_sheet_project_episodes` with the approved `project_id` and `episodes`.
22
+ 8. Report any `dropped_ids` from the save response. If a saved episode has no resolved public supporting memos, tell the user it may be hidden on the public profile.
23
+ 9. Verify the saved result with `paput_get_skill_sheet`.
24
+
25
+ ## Episode Shape
26
+
27
+ Each episode has:
28
+
29
+ - `claim`: one visible lead line. Use recruiter/interviewer-level vocabulary and preserve the meaningful contrast when the source supports it: what was chosen over what was rejected.
30
+ - `situation`: 1-2 sentences describing the context.
31
+ - `decision`: 1-2 sentences describing the choice.
32
+ - `reason`: 1-2 sentences explaining why that choice was made.
33
+ - `supporting_memo_ids`: one or more public linked memo IDs returned by the context tool.
34
+
35
+ ## Material Rules
36
+
37
+ - Use only `structuredContent.public_memos` from `paput_get_skill_sheet_project_episodes_context` as episode evidence.
38
+ - Private linked memos are returned only as `private_memo_count`. Do not infer claims from private memo bodies.
39
+ - Prefer `decision` and `operation` memos. Use `knowledge` memos only as background.
40
+ - Do not use unrelated memos, goals, private dashboard analysis, or project documents as episode evidence.
41
+ - Do not invent memo IDs, technologies, responsibilities, impact, dates, or team scale.
42
+ - Do not treat memo count as proof of ability.
43
+ - If public linked memos do not support a claim, drop the claim.
44
+ - If the material is thin, say what is missing and suggest capturing or publishing better project-linked decision/operation memos.
45
+
46
+ ## Achievements Option
47
+
48
+ You may also propose `achievements` bullets when the user asks for them or when the project detail would clearly benefit from them.
49
+
50
+ - Achievements are user-owned source material, not generated evidence. Present them as a draft for the user to edit and approve.
51
+ - Use `paput_upsert_skill_sheet_project` to save achievements only after explicit approval.
52
+ - Omit `achievements` when calling `paput_upsert_skill_sheet_project` if the user wants to keep existing bullets. Pass `achievements: []` only when the user explicitly wants to clear them.
53
+
54
+ ## Rules
55
+
56
+ - Do not claim that paput-mcp generated the episodes. The MCP client AI performs the drafting.
57
+ - Do not save a draft automatically.
58
+ - Every saved episode must have at least one `supporting_memo_id`.
59
+ - The public API filters supporting memo IDs to the user's own public memos. Dropped IDs mean the evidence was not public, not owned, or unavailable.
60
+ - Keep the tone factual and suitable for a skill sheet or career history.
@@ -0,0 +1,37 @@
1
+ ---
2
+ description: Use this to draft a first-person self PR for the PaPut skill sheet from existing profile, skills, projects, project episodes, achievements, and public decision/operation/principle memos. It presents a draft first and saves only when the user explicitly asks.
3
+ ---
4
+
5
+ # PaPut Self PR Draft
6
+
7
+ Draft the `self_pr` section of the PaPut skill sheet. This skill is draft-first: it does not save unless the user explicitly asks to save, update, or apply the final text.
8
+
9
+ ## Workflow
10
+
11
+ 1. Call `paput_get_skill_sheet`.
12
+ 2. Review the basic profile, skills, projects, project `episodes`, project `achievements`, and current `self_pr`.
13
+ 3. Gather additional public memo evidence only when needed:
14
+ - Use `paput_search_memo` with `is_public: true` and `memo_type: decision`, `operation`, or `principle`.
15
+ - Fetch full bodies with `paput_get_memo` only for the memos you actually need.
16
+ 4. Draft a first-person self PR in the user's language.
17
+ 5. Present the draft and ask the user to edit or approve it.
18
+ 6. Do not save unless the user explicitly asks to save, update, or apply it.
19
+ 7. If the user asks to save, call `paput_update_skill_sheet_self_pr` with the approved text.
20
+ 8. Verify the saved result with `paput_get_skill_sheet`.
21
+
22
+ ## Drafting Guidance
23
+
24
+ - Target a recruiter or interviewer reading the skill sheet.
25
+ - In Japanese, aim for about 300-600 characters unless the user asks for a different length. Use a comparable short professional length in other languages.
26
+ - Write in first person when that fits the user's language and tone.
27
+ - Anchor the text in projects, episodes, achievements, and public decision/operation/principle memos.
28
+ - Emphasize judgment, trade-offs, and operating practices when the evidence supports them.
29
+ - Keep technologies and domains concrete, but do not turn the self PR into a stack inventory.
30
+
31
+ ## Rules
32
+
33
+ - Do not use private dashboard analysis, goals, or private memos unless the user explicitly provides them in the conversation.
34
+ - Do not invent outcomes, metrics, responsibilities, or years of experience.
35
+ - Do not present memo counts as proof of ability.
36
+ - Do not save automatically.
37
+ - If the material is thin, produce a conservative draft and say what evidence would improve it.
@@ -57,6 +57,37 @@ const skillSheetProjectSchema = z.object({
57
57
  .array(z.number())
58
58
  .describe('Development process IDs: 1 requirements, 2 basic design, 3 detailed design, 4 implementation, 5 testing, 6 maintenance'),
59
59
  memos: z.array(skillSheetMemoSchema).describe('Related memos'),
60
+ achievements: z
61
+ .array(z.string().max(100).describe('Achievement bullet, max 100 characters'))
62
+ .max(10)
63
+ .describe('Achievement bullets owned by the user. Omit to keep existing values; pass an empty array to clear them.')
64
+ .optional(),
65
+ });
66
+ const skillSheetProjectEpisodeSchema = z.object({
67
+ claim: z
68
+ .string()
69
+ .min(1)
70
+ .max(200)
71
+ .describe('Required one-line claim for the episode, grounded in public linked memos'),
72
+ situation: z
73
+ .string()
74
+ .max(1000)
75
+ .describe('Optional situation context, 1-2 sentences')
76
+ .optional(),
77
+ decision: z
78
+ .string()
79
+ .max(1000)
80
+ .describe('Optional decision description, 1-2 sentences')
81
+ .optional(),
82
+ reason: z
83
+ .string()
84
+ .max(1000)
85
+ .describe('Optional reason, 1-2 sentences')
86
+ .optional(),
87
+ supporting_memo_ids: z
88
+ .array(z.number())
89
+ .min(1)
90
+ .describe('Public memo IDs returned by the project episodes context tool that support this episode'),
60
91
  });
61
92
  const knowledgeCandidateSchema = z.object({
62
93
  title: z.string(),
@@ -138,6 +169,10 @@ const toolInputSchemas = {
138
169
  paput_search_memo: z.object({
139
170
  word: z.string().describe('Search keyword').optional(),
140
171
  category_id: z.number().describe('Category ID').optional(),
172
+ memo_type: z
173
+ .enum(['knowledge', 'decision', 'operation', 'principle'])
174
+ .describe('Memo type filter')
175
+ .optional(),
141
176
  ids: z.array(z.number()).describe('Memo IDs').optional(),
142
177
  date: z.string().describe('Date in YYYY-MM-DD format').optional(),
143
178
  is_public: z.boolean().describe('Visibility filter').optional(),
@@ -231,68 +266,6 @@ const toolInputSchemas = {
231
266
  paput_update_skill_sheet_self_pr: z.object({
232
267
  self_pr: z.string().describe('Self PR text').optional(),
233
268
  }),
234
- paput_update_skill_sheet_public_profile: z.object({
235
- headline: z
236
- .string()
237
- .describe('One-line catchphrase summarizing the user')
238
- .optional(),
239
- profile_summary: z
240
- .string()
241
- .describe('Multi-line overall summary of the user')
242
- .optional(),
243
- strength_labels: z
244
- .array(z.object({
245
- label: z.string().describe('Strength label name'),
246
- description: z.string().describe('Strength description').optional(),
247
- category_names: z
248
- .array(z.string())
249
- .describe('Related category names')
250
- .optional(),
251
- project_ids: z
252
- .array(z.string())
253
- .describe('Related project IDs')
254
- .optional(),
255
- supporting_memo_ids: z
256
- .array(z.number())
257
- .describe('Public memo IDs that back this strength. Use only public decision/operation/principle memo IDs from the index; non-public or non-owned IDs are dropped server-side.')
258
- .optional(),
259
- }))
260
- .describe('Array of strength labels')
261
- .optional(),
262
- stances: z
263
- .array(z.object({
264
- type: z
265
- .enum(['decision', 'operation'])
266
- .describe('Which axis this stance belongs to'),
267
- statement: z
268
- .string()
269
- .describe('One-line stance synthesized from decision/operation memos, in plain non-expert vocabulary a non-technical recruiter grasps in one read (no domain jargon or English technical terms in the line — those belong in the drill-down memos). Keep the rejected alternative ("B, not A"): weave in what was chosen and what was rejected; dissolve principle into the wording.'),
270
- supporting_memo_ids: z
271
- .array(z.number())
272
- .describe('Public memo IDs backing this stance (the drill-down judgment cards). Use only public decision/operation/principle memo IDs from the index.')
273
- .optional(),
274
- }))
275
- .describe('Stances (judgment and operating practices) shown as the lead of the AI Summary tab. Lead with 3-4 stances total with one clear anchor stance, ordered by strength; keep each line in plain non-expert vocabulary with its rejected-alternative intact.')
276
- .optional(),
277
- project_highlights: z
278
- .array(z.object({
279
- project_id: z.string().describe('Related project ID'),
280
- title: z.string().describe('Project title'),
281
- summary: z
282
- .string()
283
- .describe('Short public-profile summary for the project'),
284
- strength_labels: z
285
- .array(z.string())
286
- .describe('Strength labels supported by the project')
287
- .optional(),
288
- achievement_bullets: z
289
- .array(z.string())
290
- .describe('Top achievement bullets for the project')
291
- .optional(),
292
- }))
293
- .describe('Short project highlights shown on the AI Summary tab')
294
- .optional(),
295
- }),
296
269
  paput_set_skill_sheet_skills: z.object({
297
270
  skills: z.array(skillSchema).describe('Skill list'),
298
271
  }),
@@ -300,12 +273,15 @@ const toolInputSchemas = {
300
273
  paput_delete_skill_sheet_project: z.object({
301
274
  project_id: z.number().describe('Project ID to delete'),
302
275
  }),
303
- paput_get_skill_sheet_project_summary_context: z.object({
276
+ paput_get_skill_sheet_project_episodes_context: z.object({
304
277
  project_id: z.number().describe('Project ID'),
305
278
  }),
306
- paput_update_skill_sheet_project_ai_summary: z.object({
279
+ paput_update_skill_sheet_project_episodes: z.object({
307
280
  project_id: z.number().describe('Project ID'),
308
- ai_summary: z.string().describe('AI-generated project summary to save'),
281
+ episodes: z
282
+ .array(skillSheetProjectEpisodeSchema)
283
+ .max(5)
284
+ .describe('Episodes to save. Pass an empty array to clear all project episodes.'),
309
285
  }),
310
286
  paput_list_goals: emptySchema,
311
287
  paput_create_goal: goalInputSchema,
@@ -337,7 +313,6 @@ const toolInputSchemas = {
337
313
  analyzed_at: z.string().describe('Analysis timestamp in ISO 8601 format'),
338
314
  }),
339
315
  paput_get_dashboard_analysis_context: emptySchema,
340
- paput_get_public_profile_context: emptySchema,
341
316
  paput_get_project_context: z.object({
342
317
  project: z
343
318
  .string()
@@ -455,7 +430,7 @@ const toolInputSchemas = {
455
430
  .optional(),
456
431
  memo_type_keys: z
457
432
  .array(z.enum(['knowledge', 'decision', 'operation', 'principle']))
458
- .describe('Memo type classification keys (a memo can have multiple). decision/operation/principle are the primary material for the public AI summary.')
433
+ .describe('Memo type classification keys (a memo can have multiple). decision/operation/principle are the primary material for durable judgment and working-practice summaries.')
459
434
  .optional(),
460
435
  confidence: z.number().describe('Confidence score').optional(),
461
436
  is_public: z