@prismer/runtime 2.0.7 → 2.2.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3631 -0
- package/README.md +34 -12
- package/apc/skills/FIELD-DICTIONARY.md +111 -0
- package/apc/skills/bug-reproduce/SKILL.md +150 -0
- package/apc/skills/bug-reproduce/skill.json +96 -0
- package/apc/skills/code-review/SKILL.md +198 -0
- package/apc/skills/code-review/skill.json +124 -0
- package/apc/skills/design-review/SKILL.md +122 -0
- package/apc/skills/design-review/skill.json +88 -0
- package/apc/skills/doc-sync/SKILL.md +168 -0
- package/apc/skills/doc-sync/skill.json +81 -0
- package/apc/skills/env-doctor/SKILL.md +194 -0
- package/apc/skills/env-doctor/skill.json +209 -0
- package/apc/skills/git-ops/SKILL.md +189 -0
- package/apc/skills/git-ops/skill.json +94 -0
- package/apc/skills/impact-trace/SKILL.md +168 -0
- package/apc/skills/impact-trace/skill.json +104 -0
- package/apc/skills/observability/SKILL.md +195 -0
- package/apc/skills/observability/skill.json +116 -0
- package/apc/skills/release-db-config-sync/SKILL.md +186 -0
- package/apc/skills/release-db-config-sync/skill.json +109 -0
- package/apc/skills/release-ota-promote/SKILL.md +195 -0
- package/apc/skills/release-ota-promote/skill.json +176 -0
- package/apc/skills/release-preflight/SKILL.md +174 -0
- package/apc/skills/release-preflight/skill.json +175 -0
- package/apc/skills/release-rollback/SKILL.md +214 -0
- package/apc/skills/release-rollback/skill.json +230 -0
- package/apc/skills/release-tag/SKILL.md +194 -0
- package/apc/skills/release-tag/skill.json +94 -0
- package/apc/skills/releasing-prod/SKILL.md +49 -0
- package/apc/skills/releasing-test/SKILL.md +135 -0
- package/apc/skills/sdk-release/SKILL.md +200 -0
- package/apc/skills/spec-intake/SKILL.md +169 -0
- package/apc/skills/spec-intake/skill.json +93 -0
- package/apc/skills/test-result-feedback/SKILL.md +239 -0
- package/apc/skills/test-result-feedback/skill.json +193 -0
- package/apc/skills/test-runner/SKILL.md +169 -0
- package/apc/skills/test-runner/skill.json +103 -0
- package/apc/skills/ui-align/SKILL.md +209 -0
- package/apc/skills/ui-align/skill.json +114 -0
- package/apc/skills/ui-canvas/SKILL.md +148 -0
- package/apc/skills/ui-canvas/skill.json +127 -0
- package/built-in-skills/agent-coordination/SKILL.md +257 -0
- package/built-in-skills/agent-meta/SKILL.md +53 -0
- package/built-in-skills/assets/SKILL.md +133 -0
- package/built-in-skills/browser-use/SKILL.md +93 -0
- package/built-in-skills/canvas-design/LICENSE.txt +202 -0
- package/built-in-skills/canvas-design/SKILL.md +157 -0
- package/built-in-skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/built-in-skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/built-in-skills/claim-agent-ownership/SKILL.md +255 -0
- package/built-in-skills/claude-api/LICENSE.txt +202 -0
- package/built-in-skills/claude-api/SKILL.md +325 -0
- package/built-in-skills/claude-api/csharp/claude-api.md +402 -0
- package/built-in-skills/claude-api/curl/examples.md +216 -0
- package/built-in-skills/claude-api/curl/managed-agents.md +336 -0
- package/built-in-skills/claude-api/go/claude-api.md +421 -0
- package/built-in-skills/claude-api/go/managed-agents/README.md +561 -0
- package/built-in-skills/claude-api/java/claude-api.md +432 -0
- package/built-in-skills/claude-api/java/managed-agents/README.md +442 -0
- package/built-in-skills/claude-api/php/claude-api.md +375 -0
- package/built-in-skills/claude-api/php/managed-agents/README.md +435 -0
- package/built-in-skills/claude-api/python/claude-api/README.md +420 -0
- package/built-in-skills/claude-api/python/claude-api/batches.md +185 -0
- package/built-in-skills/claude-api/python/claude-api/files-api.md +165 -0
- package/built-in-skills/claude-api/python/claude-api/streaming.md +162 -0
- package/built-in-skills/claude-api/python/claude-api/tool-use.md +590 -0
- package/built-in-skills/claude-api/python/managed-agents/README.md +332 -0
- package/built-in-skills/claude-api/ruby/claude-api.md +113 -0
- package/built-in-skills/claude-api/ruby/managed-agents/README.md +389 -0
- package/built-in-skills/claude-api/shared/agent-design.md +101 -0
- package/built-in-skills/claude-api/shared/error-codes.md +213 -0
- package/built-in-skills/claude-api/shared/live-sources.md +135 -0
- package/built-in-skills/claude-api/shared/managed-agents-api-reference.md +378 -0
- package/built-in-skills/claude-api/shared/managed-agents-client-patterns.md +209 -0
- package/built-in-skills/claude-api/shared/managed-agents-core.md +238 -0
- package/built-in-skills/claude-api/shared/managed-agents-environments.md +215 -0
- package/built-in-skills/claude-api/shared/managed-agents-events.md +195 -0
- package/built-in-skills/claude-api/shared/managed-agents-memory.md +197 -0
- package/built-in-skills/claude-api/shared/managed-agents-multiagent.md +99 -0
- package/built-in-skills/claude-api/shared/managed-agents-onboarding.md +114 -0
- package/built-in-skills/claude-api/shared/managed-agents-outcomes.md +106 -0
- package/built-in-skills/claude-api/shared/managed-agents-overview.md +68 -0
- package/built-in-skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +173 -0
- package/built-in-skills/claude-api/shared/managed-agents-tools.md +321 -0
- package/built-in-skills/claude-api/shared/managed-agents-webhooks.md +110 -0
- package/built-in-skills/claude-api/shared/model-migration.md +779 -0
- package/built-in-skills/claude-api/shared/models.md +121 -0
- package/built-in-skills/claude-api/shared/prompt-caching.md +171 -0
- package/built-in-skills/claude-api/shared/tool-use-concepts.md +327 -0
- package/built-in-skills/claude-api/typescript/claude-api/README.md +333 -0
- package/built-in-skills/claude-api/typescript/claude-api/batches.md +106 -0
- package/built-in-skills/claude-api/typescript/claude-api/files-api.md +98 -0
- package/built-in-skills/claude-api/typescript/claude-api/streaming.md +178 -0
- package/built-in-skills/claude-api/typescript/claude-api/tool-use.md +527 -0
- package/built-in-skills/claude-api/typescript/managed-agents/README.md +359 -0
- package/built-in-skills/codebase-design/DEEPENING.md +37 -0
- package/built-in-skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/built-in-skills/codebase-design/LICENSE +21 -0
- package/built-in-skills/codebase-design/SKILL.md +116 -0
- package/built-in-skills/conversation-compaction/SKILL.md +114 -0
- package/built-in-skills/council-creator/SKILL.md +426 -0
- package/built-in-skills/diagnosing-bugs/LICENSE +21 -0
- package/built-in-skills/diagnosing-bugs/SKILL.md +136 -0
- package/built-in-skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/built-in-skills/doc-coauthoring/SKILL.md +376 -0
- package/built-in-skills/document-generation/SKILL.md +105 -0
- package/built-in-skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/built-in-skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/built-in-skills/domain-modeling/LICENSE +21 -0
- package/built-in-skills/domain-modeling/SKILL.md +76 -0
- package/built-in-skills/frontend-design/LICENSE.txt +177 -0
- package/built-in-skills/frontend-design/SKILL.md +43 -0
- package/built-in-skills/human-approval/SKILL.md +129 -0
- package/built-in-skills/image-generate/SKILL.md +128 -0
- package/built-in-skills/image-generate/scripts/generate-and-deliver.mjs +289 -0
- package/built-in-skills/ingest/SKILL.md +73 -0
- package/built-in-skills/internal-comms/LICENSE.txt +202 -0
- package/built-in-skills/internal-comms/SKILL.md +33 -0
- package/built-in-skills/internal-comms/examples/3p-updates.md +47 -0
- package/built-in-skills/internal-comms/examples/company-newsletter.md +65 -0
- package/built-in-skills/internal-comms/examples/faq-answers.md +30 -0
- package/built-in-skills/internal-comms/examples/general-comms.md +16 -0
- package/built-in-skills/liteparse/SKILL.md +176 -0
- package/built-in-skills/mcp-builder/LICENSE.txt +202 -0
- package/built-in-skills/mcp-builder/SKILL.md +237 -0
- package/built-in-skills/mcp-builder/reference/evaluation.md +602 -0
- package/built-in-skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/built-in-skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/built-in-skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/built-in-skills/mcp-builder/scripts/connections.py +151 -0
- package/built-in-skills/mcp-builder/scripts/evaluation.py +373 -0
- package/built-in-skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/built-in-skills/mcp-builder/scripts/requirements.txt +2 -0
- package/built-in-skills/memory/SKILL.md +471 -0
- package/built-in-skills/memory-dream/SKILL.md +339 -0
- package/built-in-skills/office-artifacts/SKILL.md +211 -0
- package/built-in-skills/okr/SKILL.md +154 -0
- package/built-in-skills/persona/SKILL.md +81 -0
- package/built-in-skills/persona-generator/SKILL.md +296 -0
- package/built-in-skills/pkf-svg/SKILL.md +253 -0
- package/built-in-skills/pkf-writing/SKILL.md +236 -0
- package/built-in-skills/prismer-im-collab/SKILL.md +168 -0
- package/built-in-skills/proactivity/SKILL.md +84 -0
- package/built-in-skills/remotion/SKILL.md +431 -0
- package/built-in-skills/role-builder/SKILL.md +203 -0
- package/built-in-skills/role-builder/scripts/author-role.mjs +334 -0
- package/built-in-skills/role-builder/scripts/ingest-role.mjs +223 -0
- package/built-in-skills/role-builder/scripts/instantiate-and-run.mjs +290 -0
- package/built-in-skills/role-builder/scripts/operation-harness.mjs +267 -0
- package/built-in-skills/skill-authoring/SKILL.md +134 -0
- package/built-in-skills/skill-authoring/skill.json +74 -0
- package/built-in-skills/skill-builder/SKILL.md +171 -0
- package/built-in-skills/skill-builder/scripts/ingest.mjs +265 -0
- package/built-in-skills/skill-creator/LICENSE.txt +202 -0
- package/built-in-skills/skill-creator/SKILL.md +227 -0
- package/built-in-skills/skill-creator/agents/analyzer.md +274 -0
- package/built-in-skills/skill-creator/agents/comparator.md +202 -0
- package/built-in-skills/skill-creator/agents/grader.md +223 -0
- package/built-in-skills/skill-creator/assets/eval_review.html +146 -0
- package/built-in-skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/built-in-skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/built-in-skills/skill-creator/references/external-library-import.md +110 -0
- package/built-in-skills/skill-creator/references/schemas.md +430 -0
- package/built-in-skills/skill-creator/scripts/__init__.py +0 -0
- package/built-in-skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/built-in-skills/skill-creator/scripts/generate_report.py +326 -0
- package/built-in-skills/skill-creator/scripts/import-library.mjs +475 -0
- package/built-in-skills/skill-creator/scripts/improve_description.py +247 -0
- package/built-in-skills/skill-creator/scripts/package_skill.py +136 -0
- package/built-in-skills/skill-creator/scripts/quick_validate.py +103 -0
- package/built-in-skills/skill-creator/scripts/run_eval.py +310 -0
- package/built-in-skills/skill-creator/scripts/run_loop.py +328 -0
- package/built-in-skills/skill-creator/scripts/utils.py +47 -0
- package/built-in-skills/slack-gif-creator/LICENSE.txt +202 -0
- package/built-in-skills/slack-gif-creator/SKILL.md +291 -0
- package/built-in-skills/slack-gif-creator/core/easing.py +234 -0
- package/built-in-skills/slack-gif-creator/core/frame_composer.py +176 -0
- package/built-in-skills/slack-gif-creator/core/gif_builder.py +269 -0
- package/built-in-skills/slack-gif-creator/core/validators.py +136 -0
- package/built-in-skills/slack-gif-creator/requirements.txt +4 -0
- package/built-in-skills/tasks/SKILL.md +413 -0
- package/built-in-skills/tdd/LICENSE +21 -0
- package/built-in-skills/tdd/SKILL.md +110 -0
- package/built-in-skills/tdd/mocking.md +59 -0
- package/built-in-skills/tdd/refactoring.md +10 -0
- package/built-in-skills/tdd/tests.md +61 -0
- package/built-in-skills/team/SKILL.md +77 -0
- package/built-in-skills/web-artifacts-builder/LICENSE.txt +202 -0
- package/built-in-skills/web-artifacts-builder/SKILL.md +105 -0
- package/built-in-skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/built-in-skills/web-artifacts-builder/scripts/init-artifact.sh +334 -0
- package/built-in-skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/built-in-skills/webapp-testing/LICENSE.txt +202 -0
- package/built-in-skills/webapp-testing/SKILL.md +97 -0
- package/built-in-skills/webapp-testing/examples/console_logging.py +35 -0
- package/built-in-skills/webapp-testing/examples/element_discovery.py +40 -0
- package/built-in-skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/built-in-skills/webapp-testing/scripts/with_server.py +106 -0
- package/built-in-skills/wechat-pay/SKILL.md +59 -0
- package/dist/cli.cjs +72577 -16101
- package/dist/cli.js +72752 -16232
- package/dist/index.cjs +72632 -16024
- package/dist/index.d.cts +4956 -640
- package/dist/index.d.ts +4956 -640
- package/dist/index.js +72564 -15963
- package/package.json +39 -6
- package/plugins/memory/prismer/__init__.py +1211 -0
- package/plugins/memory/prismer/plugin.yaml +8 -0
- package/plugins/memory/prismer/tool-schemas.generated.json +249 -0
- package/plugins/tools/prismer-recall/__init__.py +282 -0
- package/plugins/tools/prismer-recall/plugin.yaml +15 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: okr
|
|
3
|
+
scope: persistence
|
|
4
|
+
description: Draft and track a strategic OKR charter — turn a human's plain-language goal into ONE Objective + 2-5 measurable Key Results, link existing tasks, and route the commit to a human sponsor. Use whenever the user wants to set a strategic goal / OKR / objective, "立个 OKR", or "把 X 推到 GA". Executes via the `cloud okr` CLI.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# OKR
|
|
8
|
+
|
|
9
|
+
Use this skill to **draft an OKR charter** from a human's goal: one Objective, 2-5 Key Results, each with a baseline→target and a *real* evidence source, plus links to the tasks that move them. Every operation goes through the `cloud okr` CLI — never tell the user an objective was created / committed / scored unless the command actually returned an id and state.
|
|
10
|
+
|
|
11
|
+
You **draft and propose**. The human **commits**. That split is the whole point of this skill (see ⛔ hard rules).
|
|
12
|
+
|
|
13
|
+
## When to use
|
|
14
|
+
|
|
15
|
+
- The user wants to **set a strategic goal**: "let's set an OKR for Q3", "立个 OKR", "make reliability our objective this cycle", "把搜索推到 GA".
|
|
16
|
+
- A long-running objective should become a tracked **Objective + Key Results**, not a loose `kind=goal` card. (When the user says "make this a goal", draft an objective charter here, not a plain task.)
|
|
17
|
+
- You need to **link** existing tactical tasks to the Key Result they serve.
|
|
18
|
+
- The user wants to **see OKR health** — the objective tree with KR progress.
|
|
19
|
+
|
|
20
|
+
If the request is a single tactical deliverable ("review this PR", "write the report"), that's the `tasks` skill, not this one. Strategic outcome → here; tactical card under an existing objective → `tasks` with the KR link.
|
|
21
|
+
|
|
22
|
+
## Charter drafting methodology
|
|
23
|
+
|
|
24
|
+
From a human's plain-language goal, draft **ONE Objective + 2-5 Key Results**. Before drafting, ask for whatever is missing:
|
|
25
|
+
|
|
26
|
+
- **Outcome** — what observable end-state defines success? (the Objective title)
|
|
27
|
+
- **Deadline / cycle** — which cycle does this belong to? (`--cycle 2026-Q3`)
|
|
28
|
+
- **Owner** — which agent/human drives it? (`--owner <imUserId>`)
|
|
29
|
+
- **Sponsor** — which **human/admin** stands behind it? (`--sponsor <human imUserId>`) — **required for a committed objective.**
|
|
30
|
+
- **Per KR**: a baseline → target, and a **measurable source**. Today's KNOWN sources are ONLY:
|
|
31
|
+
- **task acceptance** — a `task`/`milestone` KR whose progress is the count of linked tasks that pass acceptance.
|
|
32
|
+
- **IMMetricEvent metric binding** — a `metric` KR bound to an existing metric stream (`--metric-namespace --metric-name --metric-agg`).
|
|
33
|
+
- **human-confirm** — a `qualitative` KR a human scores explicitly with a value + evidence.
|
|
34
|
+
|
|
35
|
+
Then:
|
|
36
|
+
|
|
37
|
+
1. **Draft the objective** (agent proposes — it is NOT yet committed):
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
cloud okr objective create \
|
|
41
|
+
--workspace "$PRISMER_WORKSPACE_ID" \
|
|
42
|
+
--title "Search is GA-ready" \
|
|
43
|
+
--type committed \
|
|
44
|
+
--narrative "Definition of done: search ships to all users with p95 < 300ms and zero P0s." \
|
|
45
|
+
--cycle 2026-Q3 \
|
|
46
|
+
--owner <imUserId> \
|
|
47
|
+
--sponsor <human imUserId>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
2. **Propose each KR** with baseline/target/unit/direction/weight + an evidence policy:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# metric-backed KR (bound to a real IMMetricEvent stream)
|
|
54
|
+
cloud okr kr add <objectiveId> \
|
|
55
|
+
--title "p95 search latency under 300ms" \
|
|
56
|
+
--type metric --baseline 480 --target 300 --unit ms --direction decrease --weight 2 \
|
|
57
|
+
--metric-namespace search.latency --metric-name p95 --metric-agg last \
|
|
58
|
+
--evidence "IMMetricEvent search.latency:p95, last value per cycle"
|
|
59
|
+
|
|
60
|
+
# task-backed KR (progress = linked tasks that pass acceptance)
|
|
61
|
+
cloud okr kr add <objectiveId> \
|
|
62
|
+
--title "Ship 4 launch-blocker fixes" \
|
|
63
|
+
--type task --baseline 0 --target 4 --direction increase \
|
|
64
|
+
--evidence "count of linked tasks with passing acceptance"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
3. **Link existing tasks** to the KR they serve (don't create unscoped strategic tasks):
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
cloud okr link <objectiveId> <keyResultId> <taskId>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
4. **STOP and hand the commit to the human sponsor.** Print the objective id + KR ids and say: *"Charter drafted. @<sponsor> (human) — review and `cloud okr objective commit <id>` when you approve."* Do **not** commit it yourself.
|
|
74
|
+
|
|
75
|
+
## ⛔ Hard rules
|
|
76
|
+
|
|
77
|
+
These are enforced server-side; violating them returns a `403` you cannot work around.
|
|
78
|
+
|
|
79
|
+
1. **NEVER commit an objective yourself.** `cloud okr objective commit` requires a **human sponsor**; an agent caller gets `AGENT_CANNOT_COMMIT`. Your job ends at *draft + propose*. Surface the objective and ask the human sponsor to commit.
|
|
80
|
+
2. **A `committed`-type objective REQUIRES a human/admin sponsor** (`--sponsor <human imUserId>`). Without one, commit returns `SPONSOR_MUST_BE_HUMAN`. An `aspirational` objective may skip the sponsor.
|
|
81
|
+
3. **NEVER score a `qualitative` KR without an explicit, human-confirmed value + evidence.** Use `cloud okr kr recompute <krId> --value <n> --evidence <ref>` and only with a value the human actually gave you. Metric/task KRs recompute from their real source automatically — don't hand-feed numbers there.
|
|
82
|
+
4. **Bind KRs ONLY to today's sources** — task acceptance, IMMetricEvent metric binding, or human-confirm. Do **NOT** invent token/spend/credit targets, CRM pipelines, or analytics metrics — those data sources do not exist (FROZEN). A KR whose evidence you can't name is not a KR; ask the human how it will be measured.
|
|
83
|
+
5. **Do NOT create unscoped strategic tasks.** Tactical work for an objective is an existing task **linked to a KR** via `cloud okr link`. If strategic work has no task yet, draft the objective/KR first, then create the task (via the `tasks` skill) and link it.
|
|
84
|
+
|
|
85
|
+
## Lifecycle back-half
|
|
86
|
+
|
|
87
|
+
After an objective is committed it runs through `committed → graded → archived`:
|
|
88
|
+
|
|
89
|
+
- **Check-ins** — you (an agent) MAY draft a check-in. It snapshots the score + each KR's current/status. `cloud okr objective checkin <objectiveId> [--note "<t>"] [--confidence 0.6] [--decision continue|rescope|add-resource|pause|cancel]`.
|
|
90
|
+
- **Grade and archive are HUMAN decisions.** `cloud okr objective grade <id>` and `cloud okr objective archive <id>` return `AGENT_CANNOT_GRADE` (403) for an agent caller — surface the objective and ask the human to grade. Grade freezes the score (it stops moving even if a KR's evidence changes). An archived objective is read-only.
|
|
91
|
+
|
|
92
|
+
Check-in `--decision`, `--confidence`, and the reward/resource shapes carry **no token/credit meaning** — there is no compensation here.
|
|
93
|
+
|
|
94
|
+
## FROZEN / out of scope
|
|
95
|
+
|
|
96
|
+
This skill draws ONE Objective + its KRs and links tasks. It does **NOT** propose, create, or mutate any of the following — they are explicitly out of scope for release203 and have no endpoints here:
|
|
97
|
+
|
|
98
|
+
- **Guardrails** — no guardrail proposals or activations.
|
|
99
|
+
- **Resource / budget allocation** — no credit/budget/resource grants.
|
|
100
|
+
- **Scenario packs** — none.
|
|
101
|
+
- **Proactive / recurring check-ins** — you record a check-in only when asked; there is no auto-scheduler.
|
|
102
|
+
- **Compensation** — no reward/bonus economics (the grade carries no payout).
|
|
103
|
+
|
|
104
|
+
If the user asks for any of these, say it's not part of the OKR charter flow yet rather than improvising one.
|
|
105
|
+
|
|
106
|
+
## CLI Reference
|
|
107
|
+
|
|
108
|
+
### Objectives
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# Draft (agent proposes — NOT committed)
|
|
112
|
+
cloud okr objective create --workspace <id> --title "<outcome>" \
|
|
113
|
+
[--type committed|aspirational] [--narrative "<DoD>"] [--cycle 2026-Q3] \
|
|
114
|
+
[--owner <imUserId>] [--sponsor <human imUserId>] [--parent <objectiveId>] [--confidence 0.7]
|
|
115
|
+
|
|
116
|
+
cloud okr objective list --workspace <id> [--state <state>]
|
|
117
|
+
cloud okr objective get <objectiveId>
|
|
118
|
+
|
|
119
|
+
# HUMAN/SPONSOR ONLY — an agent caller gets AGENT_CANNOT_COMMIT
|
|
120
|
+
cloud okr objective commit <objectiveId>
|
|
121
|
+
cloud okr objective close <objectiveId> [--score 0.8]
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Key Results
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
cloud okr kr add <objectiveId> --title "<measurable result>" \
|
|
128
|
+
[--type metric|task|milestone|qualitative] \
|
|
129
|
+
[--baseline <n>] [--target <n>] [--unit <u>] \
|
|
130
|
+
[--direction increase|decrease|maintain|binary] [--weight <n>] \
|
|
131
|
+
[--metric-namespace <ns> --metric-name <name> --metric-agg avg|sum|last|count] \
|
|
132
|
+
[--evidence "<policy>"] [--source assigned|agent-proposed]
|
|
133
|
+
|
|
134
|
+
# Qualitative KR scoring — human-confirmed value + evidence ONLY
|
|
135
|
+
cloud okr kr recompute <keyResultId> [--value <n>] [--evidence <ref>]
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
> `--source` defaults to `agent-proposed` (you, the agent, are drafting). Pass `--source assigned` only when the human explicitly assigned the KR.
|
|
139
|
+
> `--metric-namespace` and `--metric-name` must be given together to bind a metric source.
|
|
140
|
+
|
|
141
|
+
### Linking + reading
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
cloud okr link <objectiveId> <keyResultId> <taskId> # scope a task to a KR
|
|
145
|
+
cloud okr insights --workspace <id> # the OKR tree + KR progress (never fabricated)
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Output reporting
|
|
149
|
+
|
|
150
|
+
After any state-changing command, **echo back** the id and the **state the service returned** (not the state you expected). Example:
|
|
151
|
+
|
|
152
|
+
> Drafted objective `cmobj...` (state `draft`) with 3 KRs. @<sponsor> — `cloud okr objective commit cmobj...` to commit.
|
|
153
|
+
|
|
154
|
+
If a command exits non-zero, surface the error code verbatim — especially `AGENT_CANNOT_COMMIT` / `SPONSOR_MUST_BE_HUMAN`, which mean a human must act. **Never fabricate an objective/KR id or a KR value** — if you didn't run the command or it failed, say so.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: persona
|
|
3
|
+
scope: common
|
|
4
|
+
description: >
|
|
5
|
+
The discussion-only playbook for a Persona — a council participant
|
|
6
|
+
instantiated as a real agent from the `persona` role template (SS-02). Use
|
|
7
|
+
this when you have been convened into an expert roundtable as a distilled
|
|
8
|
+
public-record perspective. It defines HOW to participate: speak in-voice,
|
|
9
|
+
reason, and cite public materials — and declares the hard capability boundary
|
|
10
|
+
(no task.create / no skill.install / no spend / no publish). The boundary is
|
|
11
|
+
ENFORCED by the role's toolsetScope + mcpAllowlist + service authz, not by
|
|
12
|
+
this text; this skill is the behavioral norm that matches the gate.
|
|
13
|
+
license: MIT
|
|
14
|
+
compatibility:
|
|
15
|
+
- prismer-sdk
|
|
16
|
+
- hermes
|
|
17
|
+
metadata:
|
|
18
|
+
category: council
|
|
19
|
+
personaPolicy: public_distillation
|
|
20
|
+
disclaimerRequired: true
|
|
21
|
+
allowedUse: [analysis, debate, ideation]
|
|
22
|
+
forbiddenUse:
|
|
23
|
+
- impersonation
|
|
24
|
+
- private_claim
|
|
25
|
+
- task_create
|
|
26
|
+
- skill_install
|
|
27
|
+
- spend
|
|
28
|
+
- publish
|
|
29
|
+
capabilityBoundary:
|
|
30
|
+
intent: discussion-only
|
|
31
|
+
allowed: [speak, reason, cite_materials, recall_memory]
|
|
32
|
+
denied:
|
|
33
|
+
- capability: task.create
|
|
34
|
+
enforcedBy: [toolsetScope.deny(kanban,delegation,terminal,code_execution), mcpAllowlist.omit(prismer.task.*)]
|
|
35
|
+
- capability: skill.install
|
|
36
|
+
enforcedBy: [toolsetScope.deny(skills,terminal,code_execution), mcpAllowlist.omit(prismer.skill.install)]
|
|
37
|
+
- capability: spend
|
|
38
|
+
enforcedBy: [toolsetScope.deny(terminal,code_execution), skill_not_granted(wechat-pay), service_authz(payment_mandate)]
|
|
39
|
+
- capability: publish
|
|
40
|
+
enforcedBy: [mcpAllowlist.omit(prismer.evolve.publish,prismer.community.post), service_authz(owner_approval_gate)]
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
# Persona — discussion-only council participant
|
|
44
|
+
|
|
45
|
+
You have been convened into an expert roundtable as a **Persona**: a lens distilled
|
|
46
|
+
from the **public record** of a real, publicly-verifiable person. You are a real
|
|
47
|
+
agent with your own identity and session — but your capability surface is
|
|
48
|
+
deliberately **narrowed to discussion**.
|
|
49
|
+
|
|
50
|
+
## What you do
|
|
51
|
+
|
|
52
|
+
1. **Speak in-voice.** Hold one consistent vantage and voice across turns. You occupy
|
|
53
|
+
a distinct stakeholder position — surface what you can see that others cannot.
|
|
54
|
+
2. **Reason.** Weigh trade-offs, disagree substantively, name risks the room is missing.
|
|
55
|
+
3. **Cite materials.** Ground claims in the Council Brief and public record. Use
|
|
56
|
+
`memory_recall` / asset reads to pull evidence. When you cannot ground a point,
|
|
57
|
+
**say so** (honest degradation) — never fabricate a quote or a private fact.
|
|
58
|
+
|
|
59
|
+
## What you must NOT do (hard boundary)
|
|
60
|
+
|
|
61
|
+
You participate by **speaking, reasoning, and citing** — nothing else. The following
|
|
62
|
+
are **removed from you at the config layer** (they are not available tools, not a
|
|
63
|
+
matter of you choosing to abstain):
|
|
64
|
+
|
|
65
|
+
| Capability | Why it's off | Enforced by |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| **Create / dispatch tasks** | You are a voice, not an executor | role `toolsetScope` deny `kanban`/`delegation`/`terminal`/`code_execution` + MCP allowlist omits `prismer.task.*` |
|
|
68
|
+
| **Install / manage skills** | You don't reshape the workspace | `toolsetScope` deny `skills`/`terminal` + MCP allowlist omits `prismer.skill.install` |
|
|
69
|
+
| **Spend / collect money** | No fiscal authority | `terminal`/`code_execution` denied (no `cloud pay` CLI), `wechat-pay` skill not granted, and the payment service requires a mandate |
|
|
70
|
+
| **Publish** (catalog / community / marketplace) | No outward-facing authority | MCP allowlist omits `prismer.evolve.publish` / `prismer.community.post`, and publishing already requires **owner approval** at the service layer |
|
|
71
|
+
|
|
72
|
+
If a discussion outcome genuinely needs a task, a purchase, or a publication:
|
|
73
|
+
**name that need in your reply and hand it to the workspace orchestrator**
|
|
74
|
+
(the Team Manager / council facilitator). Do not attempt it — the attempt would fail at the
|
|
75
|
+
capability gate anyway; naming it cleanly is the correct move.
|
|
76
|
+
|
|
77
|
+
## Disclaimer (compliance floor)
|
|
78
|
+
|
|
79
|
+
You are a **distilled public-record perspective, not the real person**. Keep that
|
|
80
|
+
framing visible. Never assert private facts, never impersonate, never let the room
|
|
81
|
+
treat your words as the person's private, authoritative statement.
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: persona-generator
|
|
3
|
+
scope: common
|
|
4
|
+
description: >
|
|
5
|
+
Given a Council Brief, produce persona-ROLE instance definitions: real,
|
|
6
|
+
publicly-verifiable people who occupy distinct stakeholder positions on the
|
|
7
|
+
issue — each a persona-flavored role template (lens / voice / SOUL + the
|
|
8
|
+
persona-skill capability boundary + icon + an ASCII usernameSlug), handed to
|
|
9
|
+
convene (council-creator) to be instantiated as a REAL agent. (Search
|
|
10
|
+
grounding of each person is done by the cloud /councils/plan handler, not by
|
|
11
|
+
this skill.) Use when the workspace orchestrator needs to convene an expert
|
|
12
|
+
roundtable ("帮我找几个人聊聊这个 idea"). Personas are LENSES distilled from
|
|
13
|
+
public records, not the real people — never assert private facts, never
|
|
14
|
+
impersonate. This skill produces the persona-role DEFINITIONS (who speaks); it
|
|
15
|
+
does NOT create the group and does NOT drive the discussion — that is
|
|
16
|
+
council-creator.
|
|
17
|
+
license: MIT
|
|
18
|
+
compatibility:
|
|
19
|
+
- prismer-sdk
|
|
20
|
+
- hermes
|
|
21
|
+
metadata:
|
|
22
|
+
category: council
|
|
23
|
+
personaPolicy: public_distillation
|
|
24
|
+
disclaimerRequired: true
|
|
25
|
+
allowedUse: [analysis, debate, ideation]
|
|
26
|
+
forbiddenUse:
|
|
27
|
+
- impersonation
|
|
28
|
+
- private_claim
|
|
29
|
+
- legal_advice_without_disclaimer
|
|
30
|
+
- medical_advice_without_disclaimer
|
|
31
|
+
- financial_advice_without_disclaimer
|
|
32
|
+
eval:
|
|
33
|
+
level: generator # eval the GENERATOR against a Brief — never a single persona
|
|
34
|
+
assertions:
|
|
35
|
+
- positions-distinct # N personas occupy N distinct stakeholder positions (no two share one)
|
|
36
|
+
- insider-view-present # ≥1 persona sits where outsiders cannot see
|
|
37
|
+
- no-fabricated-people # every displayName is a real, publicly verifiable person
|
|
38
|
+
- risk-coverage-3plus # cast covers ≥3 risk dimensions (capital/tech/market/org/compliance)
|
|
39
|
+
- grounding-substring # every quote is a substring of a real search snippet (code-checked)
|
|
40
|
+
- brief-boundary # no persona asserts company facts beyond the Brief
|
|
41
|
+
- honest-degradation # ungroundable → role_label; fabricated quotes are a hard fail
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
# Persona Generator
|
|
45
|
+
|
|
46
|
+
**Who speaks.** Given a Council Brief (assembled by the orchestrator from the
|
|
47
|
+
Team Manager's materials + memory), produce `cast: PersonaDef[]` — 3–5 people occupying
|
|
48
|
+
**distinct stakeholder positions**, each contributing the one thing only their
|
|
49
|
+
position lets them see. This is a **capability skill**: the orchestrator calls
|
|
50
|
+
it to produce data — a set of **persona-role instance definitions**. Each cast
|
|
51
|
+
member is a persona-flavored **role template def** (lens / voice / SOUL + the
|
|
52
|
+
persona-skill capability boundary + icon + an ASCII `usernameSlug`) that convene
|
|
53
|
+
will instantiate as a **real agent** (`createAgentForWorkspace` + `applyToAgent`,
|
|
54
|
+
M2). It is **not** a virtual `im_users` mask — persona = role instance.
|
|
55
|
+
|
|
56
|
+
| Do | Do NOT |
|
|
57
|
+
| --- | --- |
|
|
58
|
+
| Enumerate stakeholder positions for the issue | Create the council group (council-creator) |
|
|
59
|
+
| Pick one **real person** per position | Drive or moderate the discussion (council-creator) |
|
|
60
|
+
| Produce `seesWhatOthersDont` per person | Write memory (settle phase, via `memory` skill) |
|
|
61
|
+
| Emit voice (per-turn instructions) per person | Parse / extract materials (orchestrator tool-skills) |
|
|
62
|
+
| Hand the cast to cloud `/councils/plan` for grounding | Run search verification / supply quotes yourself (cloud does it) |
|
|
63
|
+
| Read `droppedCast[]` and substitute for dropped people | Invent people, quotes, or citations — ever |
|
|
64
|
+
|
|
65
|
+
## Meta-goal (iron rule — supersedes any "debate" framing)
|
|
66
|
+
|
|
67
|
+
**A discussion is a plurality of viewpoints, not a positive-vs-negative game.**
|
|
68
|
+
Convene people of different identities, professions and stakes; each speaks
|
|
69
|
+
from their own position. If disagreement emerges it is the *natural result* of
|
|
70
|
+
plural perspectives — it is never something you construct. Do **not** hunt for
|
|
71
|
+
"an opposing side"; a target function of "construct opposition" structurally
|
|
72
|
+
excludes the two most valuable classes of people: **insiders** (dismissed as
|
|
73
|
+
same-camp) and **people who reject the axis entirely** (nowhere to stand on
|
|
74
|
+
it). The UI language is "讨论组" (discussion group), never "吵一架".
|
|
75
|
+
|
|
76
|
+
## Core procedure
|
|
77
|
+
|
|
78
|
+
### Step 0 — List stakeholder positions first (not "axes of disagreement")
|
|
79
|
+
|
|
80
|
+
Before picking anyone, enumerate the positions whose duty / expertise / stake
|
|
81
|
+
touches this issue:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
运营执行者 / 出资人 / 监管者 / 同行实践者 / 下游客户 / 一线员工 / 被影响的第三方 …
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Step 1 — One REAL person per position
|
|
88
|
+
|
|
89
|
+
- Pick the person whose **real public track record** naturally puts them in
|
|
90
|
+
that position. If no fitting famous person exists for a position (e.g. "this
|
|
91
|
+
company's own CTO"), pick a real person who once held the *equivalent*
|
|
92
|
+
position elsewhere (e.g. another rocket company's former CTO).
|
|
93
|
+
- **Never invent a name.** Prefer swapping to a position where a real person
|
|
94
|
+
exists.
|
|
95
|
+
- Do **not** require them to disagree with each other. They may all agree and
|
|
96
|
+
still each fill in a piece the Team Manager cannot see.
|
|
97
|
+
- **Forbidden:** inserting an artificial "opposing side" to manufacture
|
|
98
|
+
conflict.
|
|
99
|
+
|
|
100
|
+
For every person you MUST state `seesWhatOthersDont` — not "which side they
|
|
101
|
+
are on", but "standing here, they can see X that nobody else at the table
|
|
102
|
+
can". This field is the core output of the skill.
|
|
103
|
+
|
|
104
|
+
### Step 2 — Attach the persona (who arrives at the table)
|
|
105
|
+
|
|
106
|
+
- Enough verifiable public record and a good fit → **real name**
|
|
107
|
+
(`displayName: "Elon Musk"`, `subtitle: "SpaceX CEO"`). Compliance is
|
|
108
|
+
carried by the **disclaimer**, never by renaming — "Elon-style Strategy
|
|
109
|
+
Lens" style abstractions are forbidden (nobody wants to chat with a
|
|
110
|
+
concept). Internal terms (`persona`, `lens`) never surface in UI copy.
|
|
111
|
+
- Otherwise → a role label ("一位持保守立场的航天投资人") — still a person,
|
|
112
|
+
not a concept.
|
|
113
|
+
- `usernameSlug` (**load-bearing — this is the persona-agent's @-handle**):
|
|
114
|
+
ascii `[a-zA-Z0-9_-]`, 3–20 chars, lowercase slug of the person (e.g.
|
|
115
|
+
`elon-musk`). It must NOT start with the reserved `prismer-` segment. Final
|
|
116
|
+
uniqueness (`<slug>-<conv8>` + dedupe suffix) is enforced by the cloud at
|
|
117
|
+
convene time — you only produce the candidate slug. **Why it MUST be ASCII:**
|
|
118
|
+
once instantiated (M2), the persona-agent is addressed in the group **only**
|
|
119
|
+
by `@<usernameSlug>`. The mention router (`agent-dispatcher.ts` `MENTION_RE`)
|
|
120
|
+
is strict ASCII — a bare `@中文displayName` matches nothing and is silently
|
|
121
|
+
dropped, so a non-ASCII slug would leave the persona **unreachable** (0
|
|
122
|
+
dispatches, the exact 0/5 failure). The Chinese `displayName` is display-only;
|
|
123
|
+
it never routes.
|
|
124
|
+
|
|
125
|
+
### Step 2.5 — Search grounding is done by the CLOUD, not by you
|
|
126
|
+
|
|
127
|
+
You **only produce candidates** — position + real person + `seesWhatOthersDont`
|
|
128
|
+
+ candidate `usernameSlug`. **Do NOT run search verification yourself and do NOT
|
|
129
|
+
supply any `realCredential` / `whySelected` quotes.** Grounding is performed by
|
|
130
|
+
the cloud `/api/im/councils/plan` handler after you hand over the cast.
|
|
131
|
+
|
|
132
|
+
- **Why cloud, not you (architectural, 04 §2.5):** the anti-fabrication defense
|
|
133
|
+
requires a **verbatim substring of a real search snippet**, checked in code
|
|
134
|
+
against full-text search (`/api/search`). The daemon `web_search` tool you can
|
|
135
|
+
reach routes through `/api/context/load`→`/api/compress`, so it returns
|
|
136
|
+
**LLM-rewritten prose, not the original text** — you physically cannot obtain
|
|
137
|
+
the verbatim snippet the substring check needs. Any quote you write from
|
|
138
|
+
memory would be a fabrication that the cloud check exists to reject.
|
|
139
|
+
- **What the cloud does with your cast:** for each candidate it searches
|
|
140
|
+
`"<displayName> <topic terms>"` and requires the person's name + a topic term
|
|
141
|
+
to co-occur **inside the same sentence** ("some results exist" / "snippet
|
|
142
|
+
contains the keyword" passes off-topic celebrities — 04 §2.5 实测:
|
|
143
|
+
李开复+商业航天 returned 5 named-but-off-topic hits). Grounded → the persona is
|
|
144
|
+
kept with `groundingSource='searched'` and verbatim quote evidence. **0
|
|
145
|
+
co-occurrence → the person is dropped from the cast** and returned in the plan
|
|
146
|
+
response's `droppedCast[]` — read it and substitute someone else for that
|
|
147
|
+
position (do NOT patch up the quote).
|
|
148
|
+
- **You still MUST NOT invent people.** Pick a real, publicly verifiable person
|
|
149
|
+
for each position (swap positions rather than inventing a name) — but leave the
|
|
150
|
+
evidence to the cloud. Your job ends at "who plausibly sits here"; the cloud
|
|
151
|
+
decides "is this person actually on-topic".
|
|
152
|
+
- **`groundingTerms` (optional but recommended for mixed-language topics):** you
|
|
153
|
+
MAY attach a short `groundingTerms: string[]` per candidate — the topic keywords
|
|
154
|
+
in **the language this person's public record is in** (English for "Elon Musk",
|
|
155
|
+
中文 for a 中文人物). The cloud grounds against these instead of naively
|
|
156
|
+
tokenizing the question. Without them, a Chinese question ("2026年商业航天进展")
|
|
157
|
+
tokenizes to CJK bigrams that won't match an English-record person → that person
|
|
158
|
+
is wrongly dropped. So for an English-record person on a Chinese topic, supply
|
|
159
|
+
e.g. `["commercial spaceflight", "launch cost"]`.
|
|
160
|
+
- 🚫 **Never use self-critique as fact-checking.** Asked to "verify the
|
|
161
|
+
citations are real", an LLM does not admit it cannot find them — it invents
|
|
162
|
+
a *more specific* fake source ("引自2021年新浪财经专访"). Self-critique is
|
|
163
|
+
allowed only for *structural* checks (two people on one position? invented
|
|
164
|
+
names? missing insider view?), never for factual ones.
|
|
165
|
+
|
|
166
|
+
### Step 3 — Graceful degradation (three tiers, decided by the CLOUD)
|
|
167
|
+
|
|
168
|
+
> ⚠️ This tiering is applied by the cloud grounding step, not by you — it is
|
|
169
|
+
> shown here so you understand what happens to your candidates. You never set
|
|
170
|
+
> `groundingSource` yourself. In the current implementation a candidate that is
|
|
171
|
+
> not `searched` is returned in `droppedCast[]` for you to substitute.
|
|
172
|
+
|
|
173
|
+
The criterion is "**can it be found by search?**" — programmatically checkable
|
|
174
|
+
— never "does the model know enough?" (unverifiable; models claim they do).
|
|
175
|
+
|
|
176
|
+
| Condition | Strategy | `groundingSource` |
|
|
177
|
+
| --- | --- | --- |
|
|
178
|
+
| Name + topic co-occur in one sentence of a snippet | Use its verbatim substring as the quote | `searched` |
|
|
179
|
+
| Not searchable, but the user supplied materials | Ground the quote in the user's materials | `user_materials` |
|
|
180
|
+
| Neither | **Degrade to a role label** ("一位持保守立场的航天投资人"), quote = null | `role_label` |
|
|
181
|
+
|
|
182
|
+
`role_label` is the most honest tier and the lowest impersonation risk. The
|
|
183
|
+
generator MUST be able to fall to it and MUST NOT fabricate quotes to "stay
|
|
184
|
+
famous". (Legacy tiers `parametric` / `needs_materials` are retired — they
|
|
185
|
+
presumed unverifiable parametric knowledge.)
|
|
186
|
+
|
|
187
|
+
### Step 4 — Icon acquisition (cloud-executed; you only reference the result)
|
|
188
|
+
|
|
189
|
+
Icon fetching and cropping run as **pure code on the cloud** (Serper image
|
|
190
|
+
search → Content-Type + magic-bytes double gate → aspect-ratio cull only
|
|
191
|
+
(0.6 ≤ ar ≤ 1.7, never re-rank by squareness — Google's own ranking encodes
|
|
192
|
+
"this is the standard portrait") → **top-edge square crop**, no face-detect).
|
|
193
|
+
Your responsibility is only to carry the resulting `iconAssetRef` (an
|
|
194
|
+
`im_assets` id) into the PersonaDef, or `null` when nothing usable was found —
|
|
195
|
+
the frontend degrades to a monogram. Never inline image bytes or hotlink URLs.
|
|
196
|
+
|
|
197
|
+
### Step 5 — Voice
|
|
198
|
+
|
|
199
|
+
`voice` = the persona-role's speaking instructions (markdown): the position,
|
|
200
|
+
speaking style, and disclaimer discipline. Because persona is now a **role
|
|
201
|
+
instance** (not a mask), `voice` — together with lens and a SOUL 特例档 — is what
|
|
202
|
+
convene bakes into the persona-agent's role template at instantiation, so the
|
|
203
|
+
agent speaks in-character from its **own** session (no one plays five roles).
|
|
204
|
+
Write voice as durable, self-contained instructions the standalone agent can
|
|
205
|
+
carry across turns, not one-off remarks. At convene time the cloud persists it
|
|
206
|
+
onto the persona-agent so later `@<usernameSlug>` follow-ups reuse it.
|
|
207
|
+
|
|
208
|
+
## Output shape (wire contract — aligns with `POST /api/im/councils/plan` cast)
|
|
209
|
+
|
|
210
|
+
```jsonc
|
|
211
|
+
{
|
|
212
|
+
"cast": [
|
|
213
|
+
{
|
|
214
|
+
"id": "elon-musk", // slug — also the personaId in council metadata
|
|
215
|
+
"displayName": "Elon Musk", // REAL name; compliance rides the disclaimer
|
|
216
|
+
"subtitle": "SpaceX 创始人兼 CEO", // who this person IS — from primary sources only
|
|
217
|
+
"usernameSlug": "elon-musk", // ascii @-handle 3-20, no 'prismer-'; cloud dedupes — the ONLY way to reach this persona
|
|
218
|
+
"iconAssetRef": null, // im_assets id from the cloud icon service, or null
|
|
219
|
+
"position": "同行实践者(已量产的商业航天创始人)",
|
|
220
|
+
"seesWhatOthersDont": "复用一子级的真实成本曲线与产线爬坡节奏",
|
|
221
|
+
// ⚠️ Do NOT supply realCredential / groundingSource — the cloud fills these
|
|
222
|
+
// from live search after grounding (step 2.5). Omit them from your output.
|
|
223
|
+
"voice": "Speak as a first-principles propulsion founder. Terse. Numbers first. 你是公开资料蒸馏的视角,非本人;Brief 未提供的公司事实一律说「Brief 未提供」。",
|
|
224
|
+
"disclaimer": "公开资料蒸馏视角,非本人"
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
No `stance` field (the meta-goal is plural viewpoints, not sides). No `lens`
|
|
231
|
+
field (a stance is the runtime product of `facts × issue`, not a stored
|
|
232
|
+
attribute). Input: `{ brief, requestedPersonas?, n? }` (default n = 3–5).
|
|
233
|
+
|
|
234
|
+
## Iron principle: persona = lens, Brief = facts (负控 N8)
|
|
235
|
+
|
|
236
|
+
A persona **never carries company facts of its own**. Everything about the
|
|
237
|
+
company comes from the Council Brief the orchestrator assembled. If a persona
|
|
238
|
+
is asked to assert a company fact the Brief does not provide, it must say
|
|
239
|
+
"Brief 未提供" or mark `needsVerification` — never improvise. This is the
|
|
240
|
+
architectural cure for "stylized bubbles making things up", not a disclaimer.
|
|
241
|
+
Bake this discipline into every `voice` you emit.
|
|
242
|
+
|
|
243
|
+
At settle, `council-creator` turns this discipline into a **wire contract**: the
|
|
244
|
+
report's `claims[]` each carry `sourceRefs[]` (the real material a fact stands
|
|
245
|
+
on) + `needsVerification`, and unanswerable facts land in `gaps[]`. So your
|
|
246
|
+
`voice` must instruct the persona to speak in **grounded, attributable claims**
|
|
247
|
+
— tie each factual statement to the Brief fact it uses, and say "缺数据" (→
|
|
248
|
+
`needsVerification=true`, `sourceRefs=[]`) rather than inventing a number, so
|
|
249
|
+
council-creator can emit an honest structured report downstream.
|
|
250
|
+
|
|
251
|
+
## Generator-level eval
|
|
252
|
+
|
|
253
|
+
Eval judges the **generator** (input: a Brief; assertions over the cast as a
|
|
254
|
+
set), never a single persona. Code-enforceable oracles are the two grounding
|
|
255
|
+
checks (substring + same-sentence co-occurrence); the set-level assertions
|
|
256
|
+
below are eval judgements (semantic classification):
|
|
257
|
+
|
|
258
|
+
| Assertion | Criterion |
|
|
259
|
+
| --- | --- |
|
|
260
|
+
| Positions distinct | N personas occupy N different stakeholder positions; no two share one |
|
|
261
|
+
| Insider view present | ≥1 person sits where outsiders cannot see (operator / front-line / former insider) |
|
|
262
|
+
| No fabricated people | every `displayName` is real and publicly verifiable (`realCredential` non-empty) |
|
|
263
|
+
| Risk coverage | cast covers ≥3 of: capital / tech / market / org / compliance |
|
|
264
|
+
| Grounding real | every quote is a snippet substring + same-sentence co-occurrence (code check) |
|
|
265
|
+
| Brief boundary | no persona asserts company facts beyond the Brief |
|
|
266
|
+
| Honest degradation | unsearchable → `role_label`, never a fabricated quote |
|
|
267
|
+
|
|
268
|
+
## Promote escape hatch
|
|
269
|
+
|
|
270
|
+
An exceptionally good cast can be saved as a **`persona-pack` skill** (static
|
|
271
|
+
snapshot, `metadata.category: council`, `personaPolicy: public_distillation`,
|
|
272
|
+
`disclaimerRequired: true`) and published to the marketplace for fork / rate /
|
|
273
|
+
compose. This is a third, non-default path — the default is always fresh
|
|
274
|
+
generation against the current Brief.
|
|
275
|
+
|
|
276
|
+
## Configuration
|
|
277
|
+
|
|
278
|
+
**N/A.** This skill declares no `config:` block. Grounding credentials
|
|
279
|
+
(search API keys) live cloud-side as Nacos global config consumed by the
|
|
280
|
+
`/api/im/councils/plan` handler and `/api/search` — they are never
|
|
281
|
+
agent-bound, so there is nothing for the skill-config binding system to carry
|
|
282
|
+
(product204/09 boundary ruling, CONFLICT-7).
|
|
283
|
+
|
|
284
|
+
## Anti-patterns
|
|
285
|
+
|
|
286
|
+
- ❌ Inventing a person because a position "needs" someone famous (the
|
|
287
|
+
documented failure: `Will Smith` as Relativity's CEO — the real CEO is Tim
|
|
288
|
+
Ellis). Swap positions instead.
|
|
289
|
+
- ❌ Filling the cast with five competitor CEOs (letting competitors judge
|
|
290
|
+
your valuation) — that is the retired adversarial framing.
|
|
291
|
+
- ❌ Writing quotes from memory, or "verifying" them by self-critique.
|
|
292
|
+
- ❌ Renaming a real person into a concept ("工程激进视角") to dodge
|
|
293
|
+
compliance — the disclaimer carries compliance.
|
|
294
|
+
- ❌ Emitting `stance` / picking a side for anyone.
|
|
295
|
+
- ❌ Creating the group, posting messages, or driving rounds — hand the cast
|
|
296
|
+
to council-creator.
|