@inkeep/open-knowledge 0.46.0-beta.7 → 0.46.0-beta.8
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/dist/THIRD_PARTY_NOTICES.md +10 -0
- package/dist/{acp-harness-probe-BladNRtA.mjs → acp-harness-probe-4DjqrOhu.mjs} +2 -2
- package/dist/assets/skills/discovery/SKILL.md +1 -2
- package/dist/assets/skills/packs/codebase-wiki/SKILL.md +6 -7
- package/dist/assets/skills/packs/codebase-wiki/references/generate-and-refresh.md +160 -0
- package/dist/assets/skills/packs/entity-vault/SKILL.md +2 -3
- package/dist/assets/skills/packs/knowledge-base/SKILL.md +26 -9
- package/dist/assets/skills/packs/knowledge-base/consolidate/SKILL.md +160 -0
- package/dist/assets/skills/packs/knowledge-base/research/SKILL.md +375 -0
- package/dist/assets/skills/packs/okf/SKILL.md +2 -3
- package/dist/assets/skills/packs/plain-notes/SKILL.md +4 -3
- package/dist/assets/skills/packs/software-lifecycle/SKILL.md +14 -3
- package/dist/assets/skills/packs/software-lifecycle/frame-a-proposal/SKILL.md +222 -0
- package/dist/assets/skills/packs/software-lifecycle/record-a-decision/SKILL.md +188 -0
- package/dist/assets/skills/packs/software-lifecycle/review-a-design/SKILL.md +137 -0
- package/dist/assets/skills/packs/software-lifecycle/write-a-postmortem/SKILL.md +202 -0
- package/dist/assets/skills/packs/software-lifecycle/write-a-spec/SKILL.md +298 -0
- package/dist/assets/skills/packs/worldbuilding/SKILL.md +2 -3
- package/dist/assets/skills/packs/writing-pipeline/SKILL.md +5 -3
- package/dist/assets/skills/project/SKILL.md +29 -30
- package/dist/assets/skills/project/references/anti-patterns.md +1 -1
- package/dist/assets/skills/project/references/corpus-qa.md +1 -1
- package/dist/assets/skills/project/references/folder-model.md +1 -1
- package/dist/assets/skills/project/references/ingest-and-sources.md +230 -13
- package/dist/assets/skills/project/references/onboard-existing-repo.md +319 -0
- package/dist/assets/skills/project/references/preview.md +1 -1
- package/dist/assets/skills/project/references/setup.md +6 -0
- package/dist/assets/skills/project/references/starter-packs.md +41 -0
- package/dist/assets/skills/write-skill/SKILL.md +69 -28
- package/dist/assets/skills/write-skill/references/pressure-testing.md +4 -3
- package/dist/cli.mjs +62 -62
- package/dist/constants-GWFx-UC8.mjs +2 -0
- package/dist/{git-handle-CK_JXuyw.mjs → git-handle-CUCj-M_k.mjs} +2 -2
- package/dist/git-handle-c0ljFZis.mjs +1 -0
- package/dist/index.mjs +1 -1
- package/dist/{init-CxYfITcc.mjs → init-DWCsIT2Y.mjs} +37 -37
- package/dist/init-ZV2BMIkj.mjs +1 -0
- package/dist/{launch-json-removal-CLKYnwd0.mjs → launch-json-removal-BCxhJz-M.mjs} +2 -2
- package/dist/{loader-Bpd9I1fg.mjs → loader-84N4YMxM.mjs} +2 -2
- package/dist/loader-gOaiaXCo.mjs +1 -0
- package/dist/md-manager-usiCjUg4.mjs +2 -0
- package/dist/{open-browser-BHXl6F9O.mjs → open-browser-D-fJ9iwf.mjs} +2 -2
- package/dist/parse-worker.mjs +1 -1
- package/dist/{preview-D9DiqfyY.mjs → preview-Ce0jIM-0.mjs} +2 -2
- package/dist/preview-TJlA1vTS.mjs +1 -0
- package/dist/public/assets/ActivityModeContent-DwfZoDZE.js +1 -0
- package/dist/public/assets/{AgentDiffPane-6bk9bV9U.js → AgentDiffPane-BwPzooAs.js} +2 -2
- package/dist/public/assets/{AgentThreadClientBinder-u3ZVSSHE.js → AgentThreadClientBinder-Lk-U9Zg5.js} +1 -1
- package/dist/public/assets/AppMenubar-7eBxIB37.js +1 -0
- package/dist/public/assets/{BugReportHistory-D_60pb7r.js → BugReportHistory-CaAYnGNR.js} +1 -1
- package/dist/public/assets/{BugReportHistoryDialog-BzJsPoev.js → BugReportHistoryDialog-DFfft492.js} +1 -1
- package/dist/public/assets/ChangedOutsideBadge-Colj6RSy.js +1 -0
- package/dist/public/assets/CodeMirrorPropInput-BPdsBH1q.js +3 -0
- package/dist/public/assets/{ConfigSharingInfoTooltip-BMJ7SIjf.js → ConfigSharingInfoTooltip-QTCODx7g.js} +1 -1
- package/dist/public/assets/{ConsentDialogBody-DWXqUhzJ.js → ConsentDialogBody-U4UzjnaQ.js} +1 -1
- package/dist/public/assets/CopyButton-O0Y9mXoH.js +1 -0
- package/dist/public/assets/DiffView-kKTjtgKq.js +3 -0
- package/dist/public/assets/DocumentContext-e2BbWZTU.js +38 -0
- package/dist/public/assets/EditorModeToggle-DLKntrL5.js +2 -0
- package/dist/public/assets/EnableSyncConfirmDialog-B7V1Wevc.js +1 -0
- package/dist/public/assets/FeedbackForm-YYOLAdPR.js +1 -0
- package/dist/public/assets/{GraphPanel-DZMLD8ni.js → GraphPanel-D3gnL5o6.js} +2 -2
- package/dist/public/assets/ImportSkillDialog-BNwWAA09.js +1 -0
- package/dist/public/assets/{LintConfigEditor-k9WOKYkq.js → LintConfigEditor-BUt6XicS.js} +1 -1
- package/dist/public/assets/ManagedArtifactProperties-3CrCQfFo.js +2 -0
- package/dist/public/assets/ManagedArtifactProperties-DK6O07ZX.js +1 -0
- package/dist/public/assets/McpConsentDialogBody-CTl5E-Pz.js +1 -0
- package/dist/public/assets/{MermaidDocEditor-CGsfhioE.js → MermaidDocEditor-rdCH3a-W.js} +1 -1
- package/dist/public/assets/{RegisteredAgentIcon-CyQDojW_.js → RegisteredAgentIcon-CHh3fima.js} +1 -1
- package/dist/public/assets/{ReportBugDialogBody-CdEV6nCR.js → ReportBugDialogBody-DfS6oBiL.js} +1 -1
- package/dist/public/assets/SchemaConfigEditor-DaRdC9By.js +1 -0
- package/dist/public/assets/SettingsDialogBody-JKJ7DbBe.js +7 -0
- package/dist/public/assets/{ShareBranchSwitchDialog-jGb4KF7T.js → ShareBranchSwitchDialog-BT-R1a5Z.js} +1 -1
- package/dist/public/assets/ShareReceiveDialog-D7WQ4KbX.js +1 -0
- package/dist/public/assets/ShareReceiveMissDialog-AS-ub3Fc.js +1 -0
- package/dist/public/assets/SkillEditBanner-DPe0it-V.js +1 -0
- package/dist/public/assets/SkillModeBanner-CsKHM-QY.js +1 -0
- package/dist/public/assets/SkillOriginInline-VUn5IDZk.js +1 -0
- package/dist/public/assets/SkillToolbarControls-CzJ4nZzA.js +1 -0
- package/dist/public/assets/SourceEditor-C-cUCtJw.js +1 -0
- package/dist/public/assets/{TerminalPanel-BHN2VN4r.js → TerminalPanel-yzvzgUXS.js} +3 -3
- package/dist/public/assets/TerminalSessionsHost-dj1xA_0P.js +2 -0
- package/dist/public/assets/{TerminalWindowApp-CI-7rld6.js → TerminalWindowApp-B6EhrqIb.js} +1 -1
- package/dist/public/assets/ThreadView-aANZPCSh.js +6 -0
- package/dist/public/assets/TimelineDiffPane-u9qtPOhN.js +2 -0
- package/dist/public/assets/{abnfDiagram-VRR7QNED-Cyah47m9.js → abnfDiagram-VRR7QNED-CYyOqigz.js} +1 -1
- package/dist/public/assets/agent-diff-store-DKxdS6mK.js +1 -0
- package/dist/public/assets/agent-visibility-Dz2lrJHw.js +1 -0
- package/dist/public/assets/{arc-B3aheyNj.js → arc-DpnwTjlg.js} +1 -1
- package/dist/public/assets/architecture-TIHT7OUA-Bl7-zFAE.js +1 -0
- package/dist/public/assets/{architectureDiagram-ZJ3FMSHR-lZYHIfAt.js → architectureDiagram-ZJ3FMSHR-BArScuNA.js} +1 -1
- package/dist/public/assets/arrow-up-right-BZsQghvQ.js +1 -0
- package/dist/public/assets/auth-state-cache-C9Qx3bjQ.js +11 -0
- package/dist/public/assets/badge-DB5BJfSU.js +1 -0
- package/dist/public/assets/{blockDiagram-677ZJIJ3-mULu-3uH.js → blockDiagram-677ZJIJ3-BKdJnykw.js} +1 -1
- package/dist/public/assets/{braces-DwnwFx_V.js → braces-CqiL3TOP.js} +1 -1
- package/dist/public/assets/button-oSXzJYWO.js +1 -0
- package/dist/public/assets/{c4Diagram-LMCZKHZV-DN4YpCzk.js → c4Diagram-LMCZKHZV-BGzHBzYq.js} +1 -1
- package/dist/public/assets/{calendar-DqGTQwGe.js → calendar-C2lP75MI.js} +1 -1
- package/dist/public/assets/{case-sensitive-nl0tWMnZ.js → case-sensitive-DcowXaLf.js} +1 -1
- package/dist/public/assets/channel-Bf_IZmsH.js +1 -0
- package/dist/public/assets/check-DA7_vRdO.js +1 -0
- package/dist/public/assets/checkbox-DYPwCq3O.js +1 -0
- package/dist/public/assets/{chevron-down-Bx9f3tW-.js → chevron-down-BJumc1E_.js} +1 -1
- package/dist/public/assets/chevron-left-D8z-buF6.js +1 -0
- package/dist/public/assets/chevron-right-CgsPV9lV.js +1 -0
- package/dist/public/assets/chunk-2Q5K7J3B-CBNXZghD.js +1 -0
- package/dist/public/assets/{chunk-32BRIVSS-DqkgLIEw.js → chunk-32BRIVSS-DWFi-mYl.js} +1 -1
- package/dist/public/assets/{chunk-52WLFC77-9s8UsQXp.js → chunk-52WLFC77-C3ewIu0v.js} +1 -1
- package/dist/public/assets/{chunk-5FCAYU7R-CkSFjjQr.js → chunk-5FCAYU7R-DH0H_TSt.js} +1 -1
- package/dist/public/assets/{chunk-5HE753X5-C1Ig4mMr.js → chunk-5HE753X5-COZLeOUQ.js} +1 -1
- package/dist/public/assets/{chunk-5JV3BV7I-CIggZV0d.js → chunk-5JV3BV7I-BtSn9e5l.js} +1 -1
- package/dist/public/assets/{chunk-5TONJI2A-BklATmUd.js → chunk-5TONJI2A-CyVAUHQY.js} +1 -1
- package/dist/public/assets/{chunk-5VM5RSS4-g5HeYq-z.js → chunk-5VM5RSS4-DkfDxTnu.js} +1 -1
- package/dist/public/assets/{chunk-7BUUIJ7U-Dw__VSpN.js → chunk-7BUUIJ7U-Bwj5weSU.js} +1 -1
- package/dist/public/assets/{chunk-BIQX33UG-CRLx_yn0.js → chunk-BIQX33UG-WShnA3hi.js} +1 -1
- package/dist/public/assets/{chunk-BO2N2NFS-BptiXfus.js → chunk-BO2N2NFS-0fL-jnUT.js} +4 -4
- package/dist/public/assets/{chunk-C7G6YPKG-CmP7ozUj.js → chunk-C7G6YPKG-JOVwaeql.js} +1 -1
- package/dist/public/assets/{chunk-CQNSW5MT-BZUHEMrz.js → chunk-CQNSW5MT-DmFd2LFl.js} +1 -1
- package/dist/public/assets/{chunk-CYSBUYHQ-BRTRwmYZ.js → chunk-CYSBUYHQ-BOCWcr_T.js} +1 -1
- package/dist/public/assets/{chunk-EMLP6XTP-DHUO1B6Q.js → chunk-EMLP6XTP-_039-Ubh.js} +1 -1
- package/dist/public/assets/{chunk-EX3LRPZG-aq_XJzX2.js → chunk-EX3LRPZG-CMgFCagr.js} +1 -1
- package/dist/public/assets/{chunk-FWX5IMBZ-rnR9hrS_.js → chunk-FWX5IMBZ-C4vKCoUv.js} +2 -2
- package/dist/public/assets/{chunk-HOUHSVGY-D0096-9K.js → chunk-HOUHSVGY-CZX004Ef.js} +1 -1
- package/dist/public/assets/{chunk-ICXQ74PX-BUnmDgqa.js → chunk-ICXQ74PX-B_iuJAXS.js} +1 -1
- package/dist/public/assets/{chunk-JG7HCLWE-BwRUs0j6.js → chunk-JG7HCLWE-CtDpq51e.js} +1 -1
- package/dist/public/assets/{chunk-JWPE2WC7-BOwE-mq8.js → chunk-JWPE2WC7-pDBBV-ex.js} +1 -1
- package/dist/public/assets/{chunk-MOJQB5TN-CYyw3U64.js → chunk-MOJQB5TN-BOLftHeO.js} +1 -1
- package/dist/public/assets/{chunk-MOZMSUNE-_aAOLW1j.js → chunk-MOZMSUNE-B90rFhRO.js} +1 -1
- package/dist/public/assets/{chunk-OGEWGWER-DLH_3q-Z.js → chunk-OGEWGWER-dIUHPavN.js} +1 -1
- package/dist/public/assets/{chunk-OSBZ3O6U-BOkYzK-N.js → chunk-OSBZ3O6U-C8f7zxUa.js} +1 -1
- package/dist/public/assets/{chunk-PUDLZKDR-Co9OjZVi.js → chunk-PUDLZKDR-QPYzmUFw.js} +1 -1
- package/dist/public/assets/{chunk-Q4XR5HBZ-CjNiHUWo.js → chunk-Q4XR5HBZ--1adMSrR.js} +1 -1
- package/dist/public/assets/{chunk-QBLGF6JB-Cf-f1lin.js → chunk-QBLGF6JB-q87mQ87z.js} +1 -1
- package/dist/public/assets/{chunk-R7FJI6CG-C_nyMdyL.js → chunk-R7FJI6CG-B5NnR0wG.js} +1 -1
- package/dist/public/assets/{chunk-RYQCIY6F-DXXN4Rzo.js → chunk-RYQCIY6F-BnIBPlEn.js} +1 -1
- package/dist/public/assets/{chunk-U6XO7XAA-Hw5M1kkd.js → chunk-U6XO7XAA-DuxWv8i1.js} +1 -1
- package/dist/public/assets/{chunk-V7JOEXUC-CLdet7qK.js → chunk-V7JOEXUC-zQePb8W4.js} +1 -1
- package/dist/public/assets/chunk-VAUOI2AC-K9aKY8La.js +1 -0
- package/dist/public/assets/{chunk-VR4S4FIN-CnZ3Jw81.js → chunk-VR4S4FIN-DOfDyz67.js} +1 -1
- package/dist/public/assets/{chunk-WYO6CB5R-C-c-Ja6D.js → chunk-WYO6CB5R-DAcO6KqN.js} +2 -2
- package/dist/public/assets/chunk-XXDRQBXY-CRN6FsNM.js +1 -0
- package/dist/public/assets/{chunk-YOTPTUD7-CBowI675.js → chunk-YOTPTUD7-DSjCnGGQ.js} +1 -1
- package/dist/public/assets/{chunk-ZGVPDNZ5-DfBSa8vW.js → chunk-ZGVPDNZ5-CnXHsnX3.js} +1 -1
- package/dist/public/assets/{chunk-ZIRB5QZD-Cas2Em51.js → chunk-ZIRB5QZD-rA251rHW.js} +1 -1
- package/dist/public/assets/classDiagram-OUVF2IWQ-B8NyhReL.js +1 -0
- package/dist/public/assets/classDiagram-v2-EOCWNBFH-To5zrK6k.js +1 -0
- package/dist/public/assets/client-version-DmJhhHKP.js +1 -0
- package/dist/public/assets/collapsible-BTn3nxAn.js +1 -0
- package/dist/public/assets/{comment-chips-BYH7v5tl.js → comment-chips-i9o0Cefh.js} +2 -2
- package/dist/public/assets/{config-provider-B9kQH9zn.js → config-provider-CYJIA2qw.js} +2 -2
- package/dist/public/assets/{cose-bilkent-JH36ORCC-CzZaHQ2l.js → cose-bilkent-JH36ORCC-BO3tFb1k.js} +1 -1
- package/dist/public/assets/createLucideIcon-BiRV80uZ.js +1 -0
- package/dist/public/assets/cynefin-VYW2F7L2-DjK3ZZKp.js +1 -0
- package/dist/public/assets/{cynefinDiagram-TSTJHNR4-7PYslCmH.js → cynefinDiagram-TSTJHNR4-kMgUnu_c.js} +1 -1
- package/dist/public/assets/{dagre-BeM31D08.js → dagre-DmGue-PX.js} +1 -1
- package/dist/public/assets/{dagre-VKFMJZFB-DsY-o9S9.js → dagre-VKFMJZFB-CgYSDfeg.js} +1 -1
- package/dist/public/assets/{diagram-FQU43EPY-Cc40Oq-m.js → diagram-FQU43EPY-XRWiX7Im.js} +1 -1
- package/dist/public/assets/{diagram-G47NLZAW-DdbiGkJk.js → diagram-G47NLZAW-BzqAYczi.js} +1 -1
- package/dist/public/assets/{diagram-NH7WQ7WH-BoEA_7qN.js → diagram-NH7WQ7WH-CAOpGCwL.js} +1 -1
- package/dist/public/assets/{diagram-OA4YK3LP-ChsGI8c4.js → diagram-OA4YK3LP-CsYFi60N.js} +1 -1
- package/dist/public/assets/{diagram-WEI45ONY-znZ94tAq.js → diagram-WEI45ONY-BPyyv8e3.js} +1 -1
- package/dist/public/assets/dialog-CkjkuWLF.js +5 -0
- package/dist/public/assets/dist-1J1E9P12.js +1 -0
- package/dist/public/assets/{dist-D7mv9smG.js → dist-6Q9yuoli.js} +1 -1
- package/dist/public/assets/dist-BCIZY0Wq.js +1 -0
- package/dist/public/assets/{dist-Dcu3hl7e.js → dist-BK-fqCFD.js} +1 -1
- package/dist/public/assets/{dist-DEamjSXE.js → dist-BM4ov2mK.js} +1 -1
- package/dist/public/assets/dist-BVNHmhkE.js +1 -0
- package/dist/public/assets/{dist-B25wDFyk.js → dist-Bdhn2jv42.js} +1 -1
- package/dist/public/assets/{dist-P9LB04An.js → dist-BkSGIgDv.js} +1 -1
- package/dist/public/assets/dist-C22Eiu6U.js +1 -0
- package/dist/public/assets/{dist-CxGvJvCN.js → dist-C2ZNHEgX.js} +1 -1
- package/dist/public/assets/dist-CEBfbNax.js +1 -0
- package/dist/public/assets/{dist-Dolq1sN0.js → dist-CKHaw45-.js} +1 -1
- package/dist/public/assets/{dist-DlSSwTCj.js → dist-CTPwMRld.js} +1 -1
- package/dist/public/assets/{dist-DmIoqGC0.js → dist-D2AiGKcA.js} +1 -1
- package/dist/public/assets/dist-D57Bktz_.js +1 -0
- package/dist/public/assets/{dist-CsRIthsw2.js → dist-DA8rIjtg.js} +1 -1
- package/dist/public/assets/dist-DcPsSRVd.js +1 -0
- package/dist/public/assets/{dist-BMMI5Kdg.js → dist-Dqtgp0QD2.js} +1 -1
- package/dist/public/assets/dist-Dyi4atb6.js +1 -0
- package/dist/public/assets/{dist-DdFyq-YY.js → dist-FPlC48Ke.js} +1 -1
- package/dist/public/assets/{dist-C7VIqwIG.js → dist-MQd-Irtl.js} +1 -1
- package/dist/public/assets/{dist-C4Kl8QaT.js → dist-_8wb0R99.js} +1 -1
- package/dist/public/assets/{dist-DJbbCXtB.js → dist-fOA99pqU2.js} +184 -182
- package/dist/public/assets/doc-paths-C6A87aH3.js +1 -0
- package/dist/public/assets/documents-events-Dr9N-4vu.js +1 -0
- package/dist/public/assets/download-D3RTVXwv.js +1 -0
- package/dist/public/assets/dropdown-menu-D2umi56L.js +1 -0
- package/dist/public/assets/{ebnfDiagram-CCIWWBDH-DX6whEUG.js → ebnfDiagram-CCIWWBDH-CUTAjine.js} +1 -1
- package/dist/public/assets/{erDiagram-Q63AITRT-CgloxApp.js → erDiagram-Q63AITRT-BSu96D8g.js} +1 -1
- package/dist/public/assets/es2015-Du0OjwY5.js +41 -0
- package/dist/public/assets/{esm-QF0-_nlB.js → esm-DbmiTy2g.js} +1 -1
- package/dist/public/assets/eventmodeling-45OFAUF4-C3gCuhXd.js +1 -0
- package/dist/public/assets/{eye-CASw1HTi.js → eye-yERBaQWj.js} +1 -1
- package/dist/public/assets/field-i4kPdg1V.js +1 -0
- package/dist/public/assets/file-tree-adapter-CvmXjY-P.js +1 -0
- package/dist/public/assets/file-tree-utils-DL3JhHtX.js +1 -0
- package/dist/public/assets/flowDiagram-23GEKE2U-V8thnmzy.js +1 -0
- package/dist/public/assets/folder-8ceGqZIO.js +1 -0
- package/dist/public/assets/folder-config-api-DdtJAaIR.js +1 -0
- package/dist/public/assets/{folder-open-wLd69QUc.js → folder-open-CvyyCBOn.js} +1 -1
- package/dist/public/assets/follow-file-BpD8YozT.js +1 -0
- package/dist/public/assets/form-lIFpKMVU.js +1 -0
- package/dist/public/assets/{ganttDiagram-NO4QXBWP-BZQXYXPf.js → ganttDiagram-NO4QXBWP-Crrr-q7s.js} +1 -1
- package/dist/public/assets/{git-branch-CMJAiYLz.js → git-branch-oPfvsh1I.js} +1 -1
- package/dist/public/assets/gitGraph-TEB2WS4Q-BERn_Vnm.js +1 -0
- package/dist/public/assets/{gitGraphDiagram-IHSO6WYX-DnT15zfc.js → gitGraphDiagram-IHSO6WYX-BdMHODo-.js} +1 -1
- package/dist/public/assets/{globals-LdH7xryz.js → globals-B5uVOYYT.js} +2 -2
- package/dist/public/assets/globals-C6R3KMxA.css +1 -0
- package/dist/public/assets/{graphlib-CIYGRnfF.js → graphlib-DIVfLvlR.js} +1 -1
- package/dist/public/assets/{hash-DNKDqZ18.js → hash-DP25l_li.js} +1 -1
- package/dist/public/assets/{highlighted-body-OFNGDK62-DN5QVB2g.js → highlighted-body-OFNGDK62-Cue0vPGT.js} +1 -1
- package/dist/public/assets/index-DoyHoCFU.js +2092 -0
- package/dist/public/assets/{info-yKMseklR.js → info-Bza7Xa6D.js} +1 -1
- package/dist/public/assets/info-DKCQHKI2-xuBgM0S3.js +1 -0
- package/dist/public/assets/{infoDiagram-FWYZ7A6U-CPJF9vn1.js → infoDiagram-FWYZ7A6U-_RNxdwPC.js} +1 -1
- package/dist/public/assets/input-C4n4n5Hc.js +1 -0
- package/dist/public/assets/input-group-C_H5NgPX.js +1 -0
- package/dist/public/assets/{ishikawaDiagram-FXEZZL3T-CPmyb7Oh.js → ishikawaDiagram-FXEZZL3T-BbXzN7UF.js} +1 -1
- package/dist/public/assets/{journeyDiagram-5HDEW3XC-DHsl5S9z.js → journeyDiagram-5HDEW3XC-BqwkEnJh.js} +1 -1
- package/dist/public/assets/{kanban-definition-HUTT4EX6-BS2xX-qh.js → kanban-definition-HUTT4EX6-CX-ROP0U.js} +1 -1
- package/dist/public/assets/{label-DyipnO5I.js → label-Ds0LTB-Z.js} +1 -1
- package/dist/public/assets/{line-PfwSO0Y4.js → line-D0lohJ6a.js} +1 -1
- package/dist/public/assets/{linear-DY7zcaob.js → linear-By98wvuz.js} +1 -1
- package/dist/public/assets/lint-config-client-Cc5n1dKz.js +1 -0
- package/dist/public/assets/loader-circle-Cn2Xr4cN.js +1 -0
- package/dist/public/assets/{map-B5g_BAkn.js → map-XagOZNs9.js} +1 -1
- package/dist/public/assets/markdownlint-rule-browser-C5r1T2gD.js +1 -0
- package/dist/public/assets/mermaid-GHXKKRXX-CFTslKYT.js +1 -0
- package/dist/public/assets/{mermaid-parser.core-DtiAO5KW.js → mermaid-parser.core-DtOR1aVt.js} +2 -2
- package/dist/public/assets/{mermaid.core-2-fa7F6R.js → mermaid.core-DFRkYHGF.js} +3 -3
- package/dist/public/assets/{mindmap-definition-LN4V7U3C-CTVrQgzc.js → mindmap-definition-LN4V7U3C-BPq8CY-V.js} +1 -1
- package/dist/public/assets/minus-CBRjUXY7.js +1 -0
- package/dist/public/assets/{miss-dialog-store-Bx4JLuKB.js → miss-dialog-store-DBqQ_Nyn.js} +1 -1
- package/dist/public/assets/navigation-targets-CgViVl5N.js +1 -0
- package/dist/public/assets/{now-bAD2ZsK-.js → now-BJ6wHiq6.js} +1 -1
- package/dist/public/assets/open-managed-artifact-tab-B9P9gMUF.js +1 -0
- package/dist/public/assets/{ordinal-Dj8tTCMd.js → ordinal-BhGTF2Fp.js} +1 -1
- package/dist/public/assets/packet-7NZHBO7P-DhQWKabl.js +1 -0
- package/dist/public/assets/panel-FwLLPu5s.js +1 -0
- package/dist/public/assets/{panel-right-open-CWgBRlZa.js → panel-right-open-ChixO1pm.js} +1 -1
- package/dist/public/assets/{paperclip-FiPqbd6f.js → paperclip-CFZOhV8C.js} +1 -1
- package/dist/public/assets/{pegDiagram-2B236MQR-DVy6JL4F.js → pegDiagram-2B236MQR-Bs6HaUdW.js} +1 -1
- package/dist/public/assets/pending-receive-nav-store-lElziPqC.js +1 -0
- package/dist/public/assets/pie-RZYD4A2V-DaewLp2Y.js +1 -0
- package/dist/public/assets/{pieDiagram-ENE6RG2P-Kxbx45IP.js → pieDiagram-ENE6RG2P-BBo6EMS4.js} +1 -1
- package/dist/public/assets/{project-paths-DdZAF_-I.js → project-paths-Cgrv2qcw.js} +1 -1
- package/dist/public/assets/prop-types-Bzfc0oqg.js +1 -0
- package/dist/public/assets/{propagation-api-OHat7V1z.js → propagation-api-DCmicIMI.js} +1 -1
- package/dist/public/assets/{quadrantDiagram-ABIIQ3AL-BbCFEjhq.js → quadrantDiagram-ABIIQ3AL-qmZeOoSr.js} +1 -1
- package/dist/public/assets/radar-I7S5WNFK-DljmjJ2C.js +1 -0
- package/dist/public/assets/radio-group-DFFiLDEM.js +1 -0
- package/dist/public/assets/railroad-3IZDKUUU-6CgLOfBJ.js +1 -0
- package/dist/public/assets/railroad-abnf-AHOZXSZD-DQ60e1aW.js +1 -0
- package/dist/public/assets/railroad-ebnf-EBAXGLYW-Da8xQ_1N.js +1 -0
- package/dist/public/assets/railroad-peg-LSFZ7HO6-CDOeiUF5.js +1 -0
- package/dist/public/assets/{railroadDiagram-RFXS5EU6-6SEpaCgo.js → railroadDiagram-RFXS5EU6-DE_EvwtV.js} +1 -1
- package/dist/public/assets/{receive-store-C8NL_Ow-.js → receive-store-Bz-bzj4g.js} +1 -1
- package/dist/public/assets/{refresh-cw-DClG_qgN.js → refresh-cw-D3t5sdqM.js} +1 -1
- package/dist/public/assets/{requirementDiagram-TGXJPOKE-brbJ6VUS.js → requirementDiagram-TGXJPOKE-BZ-rKt8B.js} +1 -1
- package/dist/public/assets/{sankeyDiagram-HTMAVEWB-DT0MK3ep.js → sankeyDiagram-HTMAVEWB-B9AZEJIc.js} +1 -1
- package/dist/public/assets/{schema-fields-view-intent-CDu72Aty.js → schema-fields-view-intent-SQVE5W3s.js} +1 -1
- package/dist/public/assets/select-DyVZCohx.js +1 -0
- package/dist/public/assets/{selection-context-BNYOSYyM.js → selection-context-DdcFoUdp.js} +1 -1
- package/dist/public/assets/{separator-DExEeoYE.js → separator-4_yBRx-q.js} +1 -1
- package/dist/public/assets/{sequenceDiagram-DBY2YBRQ-BPJt9blB.js → sequenceDiagram-DBY2YBRQ-DR0l3jeO.js} +1 -1
- package/dist/public/assets/{sizeCapture-X5ZJPWSS-1l7G4SwD.js → sizeCapture-X5ZJPWSS-CK3vwB3X.js} +1 -1
- package/dist/public/assets/skeleton-BlTc8h6X.js +1 -0
- package/dist/public/assets/skill-actions-DCU7_Sac.js +2 -0
- package/dist/public/assets/skill-scope-CYrWegR8.js +1 -0
- package/dist/public/assets/skills-api-CC0Fy08A.js +1 -0
- package/dist/public/assets/square-pen-wqme9vlv.js +1 -0
- package/dist/public/assets/{src-U1RHfo7d.js → src-BULLuFw_.js} +1 -1
- package/dist/public/assets/{src-CaBa9Z1L.js → src-DsJU4LsJ.js} +1 -1
- package/dist/public/assets/{stateDiagram-2N3HPSRC-QGlUFt6h.js → stateDiagram-2N3HPSRC-DEWfQHsO.js} +1 -1
- package/dist/public/assets/stateDiagram-v2-6OUMAXLB-aJyvpelO.js +1 -0
- package/dist/public/assets/{swimlanes-5IMT3BWC-BHsr6MBF.js → swimlanes-5IMT3BWC-B6x4Ld9j.js} +2 -2
- package/dist/public/assets/swimlanesDiagram-G3AALYLV-NoFAxBaw.js +8 -0
- package/dist/public/assets/switch-CsstPO-E.js +1 -0
- package/dist/public/assets/tabs-C8ykgpIi.js +1 -0
- package/dist/public/assets/tag-pill-input-7XN11_mj.js +1 -0
- package/dist/public/assets/target-navigation-intent-D2OBNu7k.js +1 -0
- package/dist/public/assets/{telemetry-impl-DV07MMfz.js → telemetry-impl-D4kQ8pzt.js} +2 -2
- package/dist/public/assets/telemetry-startup-B15S0fJ7.js +1 -0
- package/dist/public/assets/terminal-input-events-B8xUcID4.js +1 -0
- package/dist/public/assets/terminal-launch-events-nCAKTwef.js +1 -0
- package/dist/public/assets/{terminal-telemetry-CvNM4wYv.js → terminal-telemetry-vp1G0ekC.js} +1 -1
- package/dist/public/assets/textarea-DKb-eo87.js +1 -0
- package/dist/public/assets/{thread-client-CSOJeVWW.js → thread-client-KM4rZX_M.js} +1 -1
- package/dist/public/assets/{timeline-definition-FHXFAJF6-DitS4FqW.js → timeline-definition-FHXFAJF6-DB7l9JZO.js} +1 -1
- package/dist/public/assets/timeline-diff-store-C89mH-2r.js +1 -0
- package/dist/public/assets/{toggle-group-CjXmmTGy.js → toggle-group-DMfnQ5Pd.js} +1 -1
- package/dist/public/assets/tooltip-DkZ6fphS.js +1 -0
- package/dist/public/assets/{trash-2-DE3a7L75.js → trash-2-5vqPZUBk.js} +1 -1
- package/dist/public/assets/treeView-QDETBFTQ-Ds4YBLMo.js +1 -0
- package/dist/public/assets/treemap-6X3UGDF4-D2ccHx16.js +1 -0
- package/dist/public/assets/{triangle-alert-Bcc1P5yx.js → triangle-alert-BwCftF1V.js} +1 -1
- package/dist/public/assets/typing-burst-detector-DlPntV7a.js +8 -0
- package/dist/public/assets/undo-2-BRIW1mxN.js +1 -0
- package/dist/public/assets/uninstall-m1tFru3-.js +1 -0
- package/dist/public/assets/use-activity-panel--7zr9R-m.js +1 -0
- package/dist/public/assets/use-apply-config-color-theme-CFiJF3-G.js +2 -0
- package/dist/public/assets/use-collab-url-CVCbUQ9-.js +1 -0
- package/dist/public/assets/{use-live-xterm-theme-B2MdP4nP.js → use-live-xterm-theme-CAutS4BK.js} +1 -1
- package/dist/public/assets/use-open-skill-CxYgcPyr.js +1 -0
- package/dist/public/assets/use-settings-route-b4_ubAQl.js +1 -0
- package/dist/public/assets/use-skill-directory-DacYw073.js +1 -0
- package/dist/public/assets/use-skills-CQ-I1uBW.js +1 -0
- package/dist/public/assets/use-terminal-enabled-Czv-AS7W.js +1 -0
- package/dist/public/assets/use-timeline-entry-diff--zp5POjE.js +6 -0
- package/dist/public/assets/use-workspace-DoTTAGcg.js +1 -0
- package/dist/public/assets/{vennDiagram-L72KCM5P-D7jabRjK.js → vennDiagram-L72KCM5P-D6bPpaIm.js} +1 -1
- package/dist/public/assets/wardley-OPB4EBWU-JuWm1scq.js +1 -0
- package/dist/public/assets/{wardleyDiagram-EHGQE667-C3olh_ef.js → wardleyDiagram-EHGQE667-9U25ZM8P.js} +1 -1
- package/dist/public/assets/{wrench-4e3jxe5l.js → wrench-CqOvU1qQ.js} +1 -1
- package/dist/public/assets/x-C6kVbc_i.js +1 -0
- package/dist/public/assets/{xychartDiagram-FW5EYKEG-WqIWQJdh.js → xychartDiagram-FW5EYKEG-WSgFIUEO.js} +1 -1
- package/dist/public/index.html +148 -138
- package/dist/public/uninstall.html +26 -25
- package/dist/{repair-launch-json-B4Mixg6q.mjs → repair-launch-json-DKnGHC3s.mjs} +2 -2
- package/dist/{repair-mcp-configs-BY5NQYB4.mjs → repair-mcp-configs-BNqk430t.mjs} +2 -2
- package/dist/repair-skills-COiT9pxq.mjs +1 -0
- package/dist/repair-skills-HLaZ-M-Y.mjs +4 -0
- package/dist/server-lock-DTx_HmnT.mjs +1 -0
- package/dist/{server-lock-D7crxuP7.mjs → server-lock-N4bxkmqA.mjs} +2 -2
- package/dist/{src-BSwzQ3jI.mjs → src-B9fZz8CV.mjs} +6 -6
- package/dist/{src-DmtkLnli.mjs → src-BAuCUhtO.mjs} +121 -120
- package/dist/src-BldBF2Y_.mjs +1 -0
- package/dist/src-CBxmkYgG.mjs +2030 -0
- package/dist/{start-ohc8chlc.mjs → start-CGRdHb1G.mjs} +3 -3
- package/dist/start-uD8bt0wq.mjs +1 -0
- package/dist/{write-project-skill-BzhJIXSv.mjs → write-project-skill-DZsw6Rkw.mjs} +4 -4
- package/package.json +4 -4
- package/dist/assets/skills/project/references/workflow-guides.md +0 -30
- package/dist/constants-v-GqxIIS.mjs +0 -2
- package/dist/git-handle-DyS9-xsk.mjs +0 -1
- package/dist/init-C5SNm1km.mjs +0 -1
- package/dist/loader-VrQIuQYj.mjs +0 -1
- package/dist/md-manager-BWTSpVXC.mjs +0 -2
- package/dist/preview-3XOV9PP-.mjs +0 -1
- package/dist/public/assets/ActivityModeContent-BquAhT5x.js +0 -1
- package/dist/public/assets/AppMenubar-DHWqgWXl.js +0 -1
- package/dist/public/assets/CodeMirrorPropInput-DOcEkWLX.js +0 -3
- package/dist/public/assets/CopyButton-1Q6Wnnjb.js +0 -1
- package/dist/public/assets/DocumentContext-uE-Jpe8-.js +0 -38
- package/dist/public/assets/EditorModeToggle-DBmNyzRU.js +0 -2
- package/dist/public/assets/EnableSyncConfirmDialog-Dufpw3Xm.js +0 -1
- package/dist/public/assets/FeedbackForm-DuHvlb9Z.js +0 -1
- package/dist/public/assets/ManagedArtifactProperties-xXR4EKXf.js +0 -1
- package/dist/public/assets/McpConsentDialogBody-CHmK7aXE.js +0 -1
- package/dist/public/assets/PropertyPanel-C0kyK4Hh.js +0 -2
- package/dist/public/assets/SchemaConfigEditor-BFx4ZhVm.js +0 -1
- package/dist/public/assets/SettingsDialogBody-Chz13SZG.js +0 -7
- package/dist/public/assets/ShareReceiveDialog-C7_nVZOF.js +0 -1
- package/dist/public/assets/ShareReceiveMissDialog-Dv1nzqQa.js +0 -1
- package/dist/public/assets/SkillEditorActions-2WrfNbQp.js +0 -1
- package/dist/public/assets/SourceEditor-CmpVF187.js +0 -1
- package/dist/public/assets/TerminalSessionsHost-BcY906Hf.js +0 -2
- package/dist/public/assets/ThreadView-BGvk_C1z.js +0 -6
- package/dist/public/assets/TimelineDiffPane-C5gRZMQN.js +0 -2
- package/dist/public/assets/agent-diff-store-BvRAZqCN.js +0 -1
- package/dist/public/assets/agent-visibility-DJ6Bc0aU.js +0 -1
- package/dist/public/assets/architecture-TIHT7OUA-BfFQVb2N.js +0 -1
- package/dist/public/assets/arrow-up-right-obRIg3Sv.js +0 -1
- package/dist/public/assets/auth-state-cache-CEu3ZBI_.js +0 -11
- package/dist/public/assets/badge-DXHoKHez.js +0 -1
- package/dist/public/assets/button-Gol9BgNB.js +0 -1
- package/dist/public/assets/channel-D04u7HkE.js +0 -1
- package/dist/public/assets/check-GqWaoTdV.js +0 -1
- package/dist/public/assets/checkbox-BkZH9Oy1.js +0 -1
- package/dist/public/assets/chevron-left-BQ6OM94c.js +0 -1
- package/dist/public/assets/chevron-right-C8oTR6gu.js +0 -1
- package/dist/public/assets/chunk-2Q5K7J3B-Cczs20mb.js +0 -1
- package/dist/public/assets/chunk-VAUOI2AC-D9H5NlkH.js +0 -1
- package/dist/public/assets/chunk-XXDRQBXY-BjAUTr8E.js +0 -1
- package/dist/public/assets/classDiagram-OUVF2IWQ-BCgYs9Pk.js +0 -1
- package/dist/public/assets/classDiagram-v2-EOCWNBFH-BpVLL4-U.js +0 -1
- package/dist/public/assets/client-version-MIkctMik.js +0 -1
- package/dist/public/assets/collapsible-B1mS1n9y.js +0 -1
- package/dist/public/assets/config-context-D3FvmHZm.js +0 -1
- package/dist/public/assets/copy-9EDFYcyR.js +0 -1
- package/dist/public/assets/createLucideIcon-DAkhoPjT.js +0 -1
- package/dist/public/assets/cynefin-VYW2F7L2-BVFEANjh.js +0 -1
- package/dist/public/assets/dialog-6-bc7qPg.js +0 -5
- package/dist/public/assets/dist-BJa2CfR3.js +0 -1
- package/dist/public/assets/dist-BNcdLYQI.js +0 -1
- package/dist/public/assets/dist-BjDuLI_j.js +0 -1
- package/dist/public/assets/dist-D6h-uzOv.js +0 -1
- package/dist/public/assets/dist-DAU1MdSo.js +0 -1
- package/dist/public/assets/dist-DPWWCZ4h.js +0 -1
- package/dist/public/assets/dist-nHZgBxFS.js +0 -1
- package/dist/public/assets/doc-hash-BbU2eA08.js +0 -1
- package/dist/public/assets/documents-events-C-mYs64z.js +0 -1
- package/dist/public/assets/dropdown-menu-xw8WTdb-.js +0 -1
- package/dist/public/assets/es2015-BNlmLq62.js +0 -41
- package/dist/public/assets/eventmodeling-45OFAUF4-usNuB_rF.js +0 -1
- package/dist/public/assets/field-BNyAQHKf.js +0 -1
- package/dist/public/assets/file-tree-adapter-c4ru9pmD.js +0 -1
- package/dist/public/assets/file-tree-utils-Lc0SvgnU.js +0 -1
- package/dist/public/assets/flowDiagram-23GEKE2U-CDs0Vlps.js +0 -1
- package/dist/public/assets/follow-file-BVJ6G9Hs.js +0 -1
- package/dist/public/assets/form-gDsa08Xi.js +0 -1
- package/dist/public/assets/gitGraph-TEB2WS4Q-DXc_YvuI.js +0 -1
- package/dist/public/assets/globals-C_YoXwVm.css +0 -1
- package/dist/public/assets/index-DPVeWJbL.js +0 -2014
- package/dist/public/assets/info-DKCQHKI2-C0DL9Ht0.js +0 -1
- package/dist/public/assets/input-D4OPkja2.js +0 -1
- package/dist/public/assets/lint-config-client-DJg7YDu3.js +0 -1
- package/dist/public/assets/loader-circle-Cg5SU7AZ.js +0 -1
- package/dist/public/assets/markdownlint-rule-browser-6yvn3dt6.js +0 -1
- package/dist/public/assets/mermaid-GHXKKRXX-C9klxgAS.js +0 -1
- package/dist/public/assets/minus-CI_HyT1V.js +0 -1
- package/dist/public/assets/navigation-targets-DwSgIIy0.js +0 -1
- package/dist/public/assets/open-managed-artifact-tab-Dpz9X1m_.js +0 -1
- package/dist/public/assets/packet-7NZHBO7P-BpFruX6n.js +0 -1
- package/dist/public/assets/panel-BbxjQP3-.js +0 -1
- package/dist/public/assets/pending-receive-nav-store-t5K6mYGs.js +0 -1
- package/dist/public/assets/pie-RZYD4A2V-lVpCCOkJ.js +0 -1
- package/dist/public/assets/prop-types-65NJPmd-.js +0 -1
- package/dist/public/assets/radar-I7S5WNFK-Bd-i9axl.js +0 -1
- package/dist/public/assets/radio-group-CGEdWasQ.js +0 -1
- package/dist/public/assets/railroad-3IZDKUUU-D6ewe_eA.js +0 -1
- package/dist/public/assets/railroad-abnf-AHOZXSZD-DKqyYXL-.js +0 -1
- package/dist/public/assets/railroad-ebnf-EBAXGLYW-CtMezBX2.js +0 -1
- package/dist/public/assets/railroad-peg-LSFZ7HO6-DJ-63J6n.js +0 -1
- package/dist/public/assets/skeleton-Mo1oLtEu.js +0 -1
- package/dist/public/assets/skill-actions-ByBHG3Gh.js +0 -1
- package/dist/public/assets/skills-api-DWPhWBud.js +0 -1
- package/dist/public/assets/sliders-horizontal-BNv-Koqw.js +0 -1
- package/dist/public/assets/square-pen-C1vIlMAW.js +0 -1
- package/dist/public/assets/stateDiagram-v2-6OUMAXLB-D_6D-nLI.js +0 -1
- package/dist/public/assets/swimlanesDiagram-G3AALYLV-cqXTLbrM.js +0 -8
- package/dist/public/assets/switch-DYic2V-1.js +0 -1
- package/dist/public/assets/tag-pill-input-BHj4spSb.js +0 -1
- package/dist/public/assets/target-navigation-intent-B5jnqgZ_.js +0 -1
- package/dist/public/assets/telemetry-startup-Cy1VVosp.js +0 -1
- package/dist/public/assets/terminal-input-events-C5UuEsAB.js +0 -1
- package/dist/public/assets/terminal-launch-events-CtZeptxC.js +0 -1
- package/dist/public/assets/textarea-bScbzsdX.js +0 -1
- package/dist/public/assets/timeline-diff-store-BwCud4Ug.js +0 -1
- package/dist/public/assets/tooltip-B4J7VHmA.js +0 -1
- package/dist/public/assets/treeView-QDETBFTQ-CuznZlQn.js +0 -1
- package/dist/public/assets/treemap-6X3UGDF4-DCd6umeO.js +0 -1
- package/dist/public/assets/typing-burst-detector-CZREoy8B.js +0 -8
- package/dist/public/assets/uninstall-Bw4vn3K8.js +0 -1
- package/dist/public/assets/use-activity-panel-DWxDopZd.js +0 -1
- package/dist/public/assets/use-apply-config-color-theme-DSCn9I0W.js +0 -2
- package/dist/public/assets/use-collab-url-CE02D4PJ.js +0 -1
- package/dist/public/assets/use-settings-route-BX1P2p9-.js +0 -1
- package/dist/public/assets/use-terminal-enabled-BlXFMDFQ.js +0 -1
- package/dist/public/assets/use-timeline-entry-diff-BI1BVnmy.js +0 -6
- package/dist/public/assets/use-workspace-DcPrrukl.js +0 -1
- package/dist/public/assets/wardley-OPB4EBWU-DH0Qf9r4.js +0 -1
- package/dist/public/assets/workspace-paths-CU85-ZRd.js +0 -1
- package/dist/public/assets/x-Du5jsNHa.js +0 -1
- package/dist/repair-skills-BHY_AeM4.mjs +0 -4
- package/dist/repair-skills-CUT1NbJx.mjs +0 -1
- package/dist/server-lock-CG809RrD.mjs +0 -1
- package/dist/src-D4iCDwsy.mjs +0 -1
- package/dist/src-T1lGYBC1.mjs +0 -3275
- package/dist/start-btkfqkGp.mjs +0 -1
- /package/dist/public/assets/{ActivityPanelDiffView-DYFlG61N.js → ActivityPanelDiffView-ZX0cv7Dl.js} +0 -0
- /package/dist/public/assets/{__vite-browser-external-z7jTWlYs.js → __vite-browser-external-DwydhYHF.js} +0 -0
- /package/dist/public/assets/{agent-presence-BdWbAeV-.js → agent-presence-BcWu61SE.js} +0 -0
- /package/dist/public/assets/{array-CC6md2n_.js → array-DpLqdF3L.js} +0 -0
- /package/dist/public/assets/{chunk-KEIR6QF5-BppCe61B.js → chunk-KEIR6QF5-Bf0oDx3Z.js} +0 -0
- /package/dist/public/assets/{chunk-Y2CYZVJY-CP7lNZai.js → chunk-Y2CYZVJY-PbmsUfAu.js} +0 -0
- /package/dist/public/assets/{clike-BAopx-wt.js → clike-BrXLgO2o.js} +0 -0
- /package/dist/public/assets/{clipboard-adapter-ZCy01ehf.js → clipboard-adapter-B3lKEXcw.js} +0 -0
- /package/dist/public/assets/{colors-QyrgP4ww.js → colors-B-WRw0bG.js} +0 -0
- /package/dist/public/assets/{copilot-BiqH8PgI.js → copilot-BkvifxDd.js} +0 -0
- /package/dist/public/assets/{cursor-BDHSyD-9.js → cursor-D-FuCbK1.js} +0 -0
- /package/dist/public/assets/{cytoscape.esm-Ci36Fm6r.js → cytoscape.esm-BkIkmBTc.js} +0 -0
- /package/dist/public/assets/{defaultLocale-ByXO85kN.js → defaultLocale-DoD61tXl.js} +0 -0
- /package/dist/public/assets/{desktop-bridge-types-DHaZbwZ0.js → desktop-bridge-types-5ScET3Cg.js} +0 -0
- /package/dist/public/assets/{diff-KHO8LkSI.js → diff-DTEjW6Ec.js} +0 -0
- /package/dist/public/assets/{dist-B8I5m7M1.js → dist-BVbCw0G-.js} +0 -0
- /package/dist/public/assets/{dist-Cljnhi3D.js → dist-CA7QPULb.js} +0 -0
- /package/dist/public/assets/{dist-DFt8VaPU.js → dist-CF921uP8.js} +0 -0
- /package/dist/public/assets/{dist-Bpk5HQQh.js → dist-D4eaXg-1.js} +0 -0
- /package/dist/public/assets/{dist-BCZq3DKc.js → dist-DuwTJb1j.js} +0 -0
- /package/dist/public/assets/{documents-fetch-Db-Ikele.js → documents-fetch-AfOPbdF_.js} +0 -0
- /package/dist/public/assets/{external-link-Ct0_ujyY.js → external-link-LAxhzgCI.js} +0 -0
- /package/dist/public/assets/{file-tree-rename-validation-DDA1ck2Y.js → file-tree-rename-validation-CkkVvtpx.js} +0 -0
- /package/dist/public/assets/{floating-ui.dom-DxCSXcm6.js → floating-ui.dom-DQ0F0qgY.js} +0 -0
- /package/dist/public/assets/{format-4tjAvLkN.js → format-Bj7zR862.js} +0 -0
- /package/dist/public/assets/{go-7c8IMl4m.js → go-D3-a1upg.js} +0 -0
- /package/dist/public/assets/{init-CL1Yxhhi.js → init-D0AX7DDe.js} +0 -0
- /package/dist/public/assets/{isObject-5PVyZ800.js → isObject-Bs1dF4ay.js} +0 -0
- /package/dist/public/assets/{katex-BlgnTlTx.js → katex-DGLcd7nU.js} +0 -0
- /package/dist/public/assets/{lib-Iu39CNZE.js → lib-RJCjKODX.js} +0 -0
- /package/dist/public/assets/{libesm-WVpTb_tB.js → libesm-D5Z2fjiR.js} +0 -0
- /package/dist/public/assets/{lint-plugin-meta-BoxMoaxR.js → lint-plugin-meta-DEfDN-Lf.js} +0 -0
- /package/dist/public/assets/{lru-string-cache-7Y9kMeow.js → lru-string-cache-CHVwK1CS.js} +0 -0
- /package/dist/public/assets/{lua-DnREcbBQ.js → lua-B71IklsF.js} +0 -0
- /package/dist/public/assets/{markdownit-YwcN3EvW.js → markdownit-BIJhOARi.js} +0 -0
- /package/dist/public/assets/{mcp-consent-store-CDAQY6Np.js → mcp-consent-store-B7QM8uoo.js} +0 -0
- /package/dist/public/assets/{min-DVq-2erP.js → min-nSRrTGDE.js} +0 -0
- /package/dist/public/assets/{overlay-layers-Dhz8IqAf.js → overlay-layers-cTOQ-1PW.js} +0 -0
- /package/dist/public/assets/{panzoom.es-D0o6IaL6.js → panzoom.es-D_Inq3Bn.js} +0 -0
- /package/dist/public/assets/{parse-api-error-BtEL2kxi.js → parse-api-error-CqQte8A1.js} +0 -0
- /package/dist/public/assets/{path-BGTOauh6.js → path-rUjnF-It.js} +0 -0
- /package/dist/public/assets/{pdf-DLVdEoR9.js → pdf-B6i840eQ.js} +0 -0
- /package/dist/public/assets/{pdf.worker-Cuhr1SjJ.js → pdf.worker-BVtQmJKT.js} +0 -0
- /package/dist/public/assets/{perl-D6YK7dbe.js → perl-B5Ul8OcV.js} +0 -0
- /package/dist/public/assets/{properties-BPzWpIa7.js → properties-CWbs0haa.js} +0 -0
- /package/dist/public/assets/{r-tzVlUzeq.js → r-DcrAlDW2.js} +0 -0
- /package/dist/public/assets/{rough.esm-kQd3CdGR.js → rough.esm-BfebUORF.js} +0 -0
- /package/dist/public/assets/{ruby-_eAC-08N.js → ruby-i1xYQ9jV.js} +0 -0
- /package/dist/public/assets/{share-metadata-rows-Ds3RIKZ4.js → share-metadata-rows-aPZCgxxk.js} +0 -0
- /package/dist/public/assets/{shell-CRkrz4LQ.js → shell-cUw_P8eQ.js} +0 -0
- /package/dist/public/assets/{sortable.esm-_jt9EfAF.js → sortable.esm-ByX1chKY.js} +0 -0
- /package/dist/public/assets/{sql-BtxU5QDI.js → sql-xiwUJ94E.js} +0 -0
- /package/dist/public/assets/{src-BJaEWo8x.js → src-DkpCd49O.js} +0 -0
- /package/dist/public/assets/{startup-marks-CyxDWRgR.js → startup-marks-BHZdrXwz.js} +0 -0
- /package/dist/public/assets/{stex-EWGki41Z.js → stex-rJmw0eOd.js} +0 -0
- /package/dist/public/assets/{swift-BmtuXdIg.js → swift-Cl1DeyT6.js} +0 -0
- /package/dist/public/assets/{thread-draft-staging-CKJIG41d.js → thread-draft-staging-t1CtDp8W.js} +0 -0
- /package/dist/public/assets/{toml-yD0H4nkp.js → toml-B2JpJCpy.js} +0 -0
- /package/dist/public/assets/{trace-api-DHyWZzIa.js → trace-api-C3cW9MnH.js} +0 -0
- /package/dist/public/assets/{use-installed-clis-8r2iSkgN.js → use-installed-clis-BR1AXhaE.js} +0 -0
- /package/dist/public/assets/{useLintConfigViewMode-CyzSEZ5z.js → useLintConfigViewMode-eMibVVkV.js} +0 -0
- /package/dist/public/assets/{w3c-keyname-DtWCia6R.js → w3c-keyname-DKgbz_c6.js} +0 -0
- /package/dist/public/assets/{worktree-store-B-NxI13K.js → worktree-store-Cn9IFis3.js} +0 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: open-knowledge-pack-software-lifecycle-frame-a-proposal
|
|
3
|
+
description: "Frame a new design proposal (RFC-shape) under proposals/ — problem before solution, named beneficiary and observable change, real alternatives, honest drawbacks, and a live open-questions backlog. Read when asked to frame a proposal, write an RFC, propose a design, pitch a change, draft a PRD-style design doc, or open a design proposal for review. Do NOT read to record a decision after it is accepted (use record-a-decision), to write an implementation spec (use write-a-spec), to write a postmortem (use write-a-postmortem), or to review or critique an existing design (use review-a-design)."
|
|
4
|
+
compatibility: "Claude Code, Claude Desktop, Claude Cowork, Claude.ai web. Requires OpenKnowledge MCP server. Installed project-local by `ok seed --pack software-lifecycle`."
|
|
5
|
+
metadata:
|
|
6
|
+
pack: "software-lifecycle"
|
|
7
|
+
author: "Inkeep"
|
|
8
|
+
repository: "https://github.com/inkeep/open-knowledge"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Frame a proposal — turn a problem into a reviewable RFC
|
|
12
|
+
|
|
13
|
+
The platform `open-knowledge` skill still governs every markdown operation here (reads via `exec`/`search`, writes via `write`/`edit`, links as plain relative markdown, never native Read/Edit/Grep/`cat` on in-scope files). This skill layers proposal-authoring craft on top: it decides *what a good proposal contains and in what order you earn each section*.
|
|
14
|
+
|
|
15
|
+
A proposal in `proposals/` is a design argument, not a decision and not a plan. It exists to force a **choice** among options and to give reviewers enough to disagree with. Filename is `0001-feature-name.md` — a zero-padded 4-digit sequence plus a kebab title. Status flows `draft → fcp → accepted/rejected` (fcp = final comment period). Acceptance graduates the proposal to a record in `decisions/` — that is a *separate*, human act and a *separate* skill.
|
|
16
|
+
|
|
17
|
+
The failure this skill exists to prevent: an agent jumping to `## Design` before anyone agrees what the problem is, padding `## Alternatives` with strawmen, and leaving `## Drawbacks` empty. Each step below has a gate that blocks that.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Mandatory execution order
|
|
22
|
+
|
|
23
|
+
**Hard gates — do NOT skip ahead.** If you are about to draft `## Design` and you have not passed the Step 1 framing gate, STOP — you skipped a gate. The whole point of a proposal is that the problem is agreed before the solution is written.
|
|
24
|
+
|
|
25
|
+
0. **Scan prior art** — what already exists on this subsystem, in `proposals/` and `decisions/`.
|
|
26
|
+
1. **Frame the problem — STOP gate.** Name beneficiary, observable change, forced decision. Get confirmation before any solution text.
|
|
27
|
+
2. **Allocate the sequence number and create from the `proposal` template.**
|
|
28
|
+
3. **Motivation** — problem, evidence, who is hurt today, cost of doing nothing, and explicit non-goals.
|
|
29
|
+
4. **Design** — the proposal at an altitude a reader can disagree with.
|
|
30
|
+
5. **Alternatives** — at least two real ones, each with why-not.
|
|
31
|
+
6. **Drawbacks** — the honest cost.
|
|
32
|
+
7. **Unresolved questions** — a live backlog, each with a resolver and resolving evidence.
|
|
33
|
+
8. **Link + validate.**
|
|
34
|
+
9. **Recap + what advancing to `fcp` would require.**
|
|
35
|
+
|
|
36
|
+
Create workflow tasks for steps 0–9 in your host's task system if it has one — they make a skipped gate visible mid-session.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Step 0: Scan prior art
|
|
41
|
+
|
|
42
|
+
Before framing anything, find out what the knowledge base already decided or proposed about this subsystem. A proposal that silently re-litigates an accepted decision is dead on arrival; a proposal that cites it and explains why the decision should be revisited is legitimate.
|
|
43
|
+
|
|
44
|
+
- `search({ query: "<subsystem or problem keywords>" })` — semantic, catches synonyms.
|
|
45
|
+
- `exec("ls -A proposals/")` and `exec("ls -A decisions/")` — see the sequence space and what has landed.
|
|
46
|
+
- `exec("grep -rln <keyword> proposals/ decisions/")` — pinpoint files that name the same subsystem.
|
|
47
|
+
- For the 1–3 most relevant hits, `exec("cat proposals/0003-x.md")` to read the full doc plus its backlinks.
|
|
48
|
+
|
|
49
|
+
Classify what you find, and carry it into the draft:
|
|
50
|
+
|
|
51
|
+
| Found | Do this |
|
|
52
|
+
|---|---|
|
|
53
|
+
| An **accepted decision** covers this area | The new proposal MUST cite it (a markdown link into `decisions/`) and, in Motivation, say what changed that reopens it. If nothing changed, tell the user this may not need a proposal at all. |
|
|
54
|
+
| A **draft/fcp proposal** overlaps | Offer to extend or supersede it rather than open a near-duplicate. Two overlapping proposals split the review. |
|
|
55
|
+
| **Nothing** | Proceed clean. |
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Step 1: Frame the problem — STOP gate
|
|
60
|
+
|
|
61
|
+
This is the gate that makes the difference between an RFC and a pile of solution text. **Do NOT draft `## Design`, and do NOT create the file, until the user confirms the framing.**
|
|
62
|
+
|
|
63
|
+
Produce and return exactly this, then STOP and wait:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
## Framing (confirm before I draft)
|
|
67
|
+
|
|
68
|
+
**Beneficiary:** who is worse off today and will be better off if this ships. A named role or user, not "the system" or "us".
|
|
69
|
+
|
|
70
|
+
**Observable change:** the concrete, checkable difference they will see. "X drops from N to M", "Y becomes possible", "Z stops happening". Not "improve", not "streamline".
|
|
71
|
+
|
|
72
|
+
**Forced decision:** the one question this proposal makes reviewers answer. If accepting it doesn't commit anyone to anything, it is a report, not a proposal.
|
|
73
|
+
|
|
74
|
+
**Rough shape:** one sentence on the direction — enough to know we're framing the right problem, not the design itself.
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Discipline:
|
|
78
|
+
|
|
79
|
+
- If you cannot name a beneficiary distinct from "the team," the problem isn't framed. Push back before drafting.
|
|
80
|
+
- "Observable change" is falsifiable or it isn't done. If you can't state how you'd check it, you're describing an activity, not an outcome.
|
|
81
|
+
- Vague trigger ("we should have a proposal for the cache")? Narrow it: for whom, forced by what decision, changing what they observe.
|
|
82
|
+
- In an explicitly headless/non-interactive run, state the framing AND proceed, but write the three fields verbatim into Motivation so a reviewer can reject the framing itself.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Step 2: Allocate the number and create from template
|
|
87
|
+
|
|
88
|
+
**List, don't guess, the sequence.** `exec("ls -A proposals/")`, take the highest existing `NNNN`, add one, zero-pad to four digits. Guessing collides the moment two proposals are drafted the same week.
|
|
89
|
+
|
|
90
|
+
Filename: `NNNN-kebab-title.md` (`0007-async-export-pipeline.md`). Create it from the template — this is the only way the `## Motivation → ## Design → ## Drawbacks → ## Alternatives → ## Unresolved questions` skeleton and the frontmatter arrive correctly:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
write({ document: { path: "proposals/0007-async-export-pipeline.md", template: "proposal" } })
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The template stamps this frontmatter — fill it, don't retype it by hand:
|
|
97
|
+
|
|
98
|
+
```yaml
|
|
99
|
+
type: proposal
|
|
100
|
+
description: "..." # one line: the forced decision, not the feature name
|
|
101
|
+
status: draft # stays draft until a human advances it — see Non-goals
|
|
102
|
+
authors: [<user>]
|
|
103
|
+
created: YYYY-MM-DD
|
|
104
|
+
tags: [proposal]
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Set `description` to the decision the proposal forces, in one line — it is what a reader sees in a listing.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Step 3: Motivation
|
|
112
|
+
|
|
113
|
+
Fill `## Motivation` by `edit`-ing the created doc. This section has to stand on its own: a reader who disagrees here will never read your Design, and that's correct.
|
|
114
|
+
|
|
115
|
+
- **The problem**, stated as the beneficiary experiences it — not as the absence of your solution. "Exports over 100MB time out and users lose the job" beats "we have no async export pipeline."
|
|
116
|
+
- **Evidence** it is real: a metric, a repeated report, a concrete incident. A proposal motivated only by "it would be nice" is under-motivated; say so to the user and go find one signal.
|
|
117
|
+
- **Who is hurt today**, named (the Step 1 beneficiary), and how often.
|
|
118
|
+
- **Cost of doing nothing** — the status-quo baseline every alternative, including "reject this," is measured against. If doing nothing is genuinely fine, the proposal may not need to exist.
|
|
119
|
+
- **Non-goals — explicitly.** List what this proposal deliberately does *not* address. Non-goals are how you keep a proposal reviewable; an unbounded proposal can't be accepted because no one can tell what they're agreeing to. Put them under a clear `### Non-goals` line inside Motivation.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Step 4: Design
|
|
124
|
+
|
|
125
|
+
Fill `## Design` with the actual proposal, pitched **at the altitude where a reader could disagree with it**. Too low (every function signature) and reviewers rubber-stamp a design they didn't evaluate; too high ("we'll make it faster") and there's nothing to accept. The target: a competent reader could read this section and say "no, I'd do it differently, because…"
|
|
126
|
+
|
|
127
|
+
- Describe the mechanism, the shape of the change, and the key interfaces or contracts it introduces or alters.
|
|
128
|
+
- Make the load-bearing choices explicit. If the design rests on one decision (a data model, a boundary, a sequencing), name it — that decision is usually what the whole proposal is really about.
|
|
129
|
+
- State how the Step 1 observable change is achieved. Tie the design back to the beneficiary.
|
|
130
|
+
- Link related specs, guides, and the decisions you're building on or revisiting, as plain relative markdown: `[the export boundary decision](./decisions/0004-export-boundary.md)`.
|
|
131
|
+
- Keep implementation minutiae out — that granularity is the spec's job (a sibling skill), not the proposal's.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Step 5: Alternatives
|
|
136
|
+
|
|
137
|
+
Fill `## Alternatives` with **at least two real options**, each carrying **why it was not chosen**. Include the honest ones you'd have picked on a different day, plus "do nothing" if it's live.
|
|
138
|
+
|
|
139
|
+
Structure each:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
### Alternative: <name>
|
|
143
|
+
What it is — one honest paragraph, argued at its best.
|
|
144
|
+
Why not — the specific tradeoff that lost, versus the proposed design.
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Discipline:
|
|
148
|
+
|
|
149
|
+
- **Strawmen are a red flag — say so.** An Alternatives section where every option is obviously worse means the author didn't consider real ones, and reviewers will (correctly) distrust the whole proposal. If you can't state an alternative's genuine appeal, you haven't understood it well enough to reject it.
|
|
150
|
+
- "Do nothing" is a first-class alternative. Its "why not" is the Step 3 cost-of-doing-nothing.
|
|
151
|
+
- The right number is usually two to four. One means you're not proposing, you're announcing.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Step 6: Drawbacks
|
|
156
|
+
|
|
157
|
+
Fill `## Drawbacks` with the honest cost of the proposed design — not the alternatives', its own.
|
|
158
|
+
|
|
159
|
+
- **A proposal with no drawbacks is under-examined, not perfect.** Every real design gives something up: complexity, a migration, a new failure mode, a maintenance burden, a closed door. Name them.
|
|
160
|
+
- Be specific about who pays and when — the cost may land on a different party than the beneficiary, and reviewers need to see that tradeoff.
|
|
161
|
+
- If you genuinely believe a drawback is acceptable, say why here rather than hiding it. A stated-and-accepted drawback is stronger than a silent one a reviewer discovers.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Step 7: Unresolved questions
|
|
166
|
+
|
|
167
|
+
Fill `## Unresolved questions` as a **live backlog**, not a disclaimer. Each entry keeps a real open question visible instead of burying it in confident prose.
|
|
168
|
+
|
|
169
|
+
For each question:
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
- **<question>** — What would resolve it: <the evidence, experiment, or measurement>. Who decides: <role or person>.
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
- Every question names **what evidence would resolve it** and **who decides**. A question with neither is just an anxiety; either sharpen it or drop it.
|
|
176
|
+
- Questions that block acceptance belong here explicitly — they are the agenda for the `fcp` period.
|
|
177
|
+
- It is correct for this section to be non-empty at `draft`. Hiding uncertainty to look finished is the failure mode; an honest open-questions list is what makes the proposal safe to review.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Step 8: Link + validate
|
|
182
|
+
|
|
183
|
+
Run before you tell the user it's ready:
|
|
184
|
+
|
|
185
|
+
- Every referenced decision, spec, or guide is a plain markdown relative link (`[text](./decisions/0004-x.md)`), never backticked, never an HTML anchor.
|
|
186
|
+
- Add backlinks from 1–2 closely related docs so the proposal is discoverable — the accepted decision it revisits, a related spec, the relevant guide. `links({ kind: "backlinks", ... })` to see what already points where.
|
|
187
|
+
- `links({ kind: "dead", sourceDocNames: ["proposals/0007-async-export-pipeline"] })` returns clean — fix or remove every dead link.
|
|
188
|
+
- Frontmatter complete: `type: proposal`, a one-line `description`, `status: draft`, `authors`, `created`, `tags: [proposal]`.
|
|
189
|
+
- All five H2 sections present and non-empty: `## Motivation`, `## Design`, `## Drawbacks`, `## Alternatives`, `## Unresolved questions`. An empty Drawbacks or a strawman Alternatives fails this check even though the section technically exists.
|
|
190
|
+
- `status` is still `draft`. You do not advance it — see Non-goals.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Step 9: Recap + path to fcp
|
|
195
|
+
|
|
196
|
+
Close with the user in conversation:
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
## Recap
|
|
200
|
+
|
|
201
|
+
- Framed: <beneficiary> gets <observable change>; forces the decision <…>.
|
|
202
|
+
- Proposal: proposals/NNNN-title.md (status: draft)
|
|
203
|
+
- Alternatives weighed: <n>, chosen over them because <one line>.
|
|
204
|
+
- Honest drawbacks: <the main one>.
|
|
205
|
+
- Open questions still live: <count> — the fcp agenda.
|
|
206
|
+
|
|
207
|
+
**To advance to `fcp`:** a human moves status draft → fcp and opens the final comment
|
|
208
|
+
period. Acceptance (→ accepted, then a record in decisions/) is a human decision, not
|
|
209
|
+
mine. If it's rejected, mark status: rejected and keep the doc — the reasoning is the value.
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
State plainly that advancing status and accepting the proposal are human acts. Your job ended at a well-framed, honestly-argued `draft`.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Non-goals
|
|
217
|
+
|
|
218
|
+
- **Don't record the decision.** Acceptance graduates a proposal to a record in `decisions/` — that's the sibling `record-a-decision` skill, run *after* a human accepts. This skill stops at `draft`.
|
|
219
|
+
- **Don't write the implementation spec.** Design altitude, not build detail. The spec is `write-a-spec`.
|
|
220
|
+
- **Don't mark a proposal `accepted` (or `fcp`) on your own authority.** Advancing status is a human act. Leave `status: draft`; offer the recap of what advancing would require.
|
|
221
|
+
- **Don't skip the Step 1 framing gate.** Solution text before an agreed problem is the exact failure this skill exists to prevent. If you've drafted Design without a confirmed beneficiary and forced decision, you skipped the gate — back up.
|
|
222
|
+
- **Don't pad Alternatives with strawmen or leave Drawbacks empty.** Both are tells that the proposal wasn't really examined. Reviewers read them as such.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: open-knowledge-pack-software-lifecycle-record-a-decision
|
|
3
|
+
description: "Records an architecture decision as a Nygard/MADR-shaped ADR under decisions/ — capturing the context that forced the choice, the options weighed, the decision itself, and its consequences in both directions, plus the supersedes chain that keeps a decision log honest. Read when asked to record an architecture decision, write an ADR, log the decision we made, document why we chose X over Y, capture this decision for the record, or supersede an old decision with a new one. Do NOT read to frame a proposal or explore an idea not yet decided (frame-a-proposal), to write a spec or implementation plan (write-a-spec), to write an incident postmortem (write-a-postmortem), or to judge whether a design is sound (review-a-design). This skill records a decision already made; it does not make one."
|
|
4
|
+
compatibility: "Claude Code, Claude Desktop, Claude Cowork, Claude.ai web. Requires OpenKnowledge MCP server. Installed project-local by `ok seed --pack software-lifecycle`."
|
|
5
|
+
metadata:
|
|
6
|
+
pack: "software-lifecycle"
|
|
7
|
+
author: "Inkeep"
|
|
8
|
+
repository: "https://github.com/inkeep/open-knowledge"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Record a decision — write an ADR under `decisions/`
|
|
12
|
+
|
|
13
|
+
The platform `open-knowledge` skill still governs every markdown operation here (grounding, linking, the rule that OK's MCP tools own in-scope markdown); this skill layers ADR craft on top.
|
|
14
|
+
|
|
15
|
+
An Architecture Decision Record is a small, dated, frozen document that captures **one** decision, the forces that made it necessary, and what the team now has to live with. The value compounds over years: a reader who joins in three years should understand not just what was decided but *why it was even a question*. ADRs are frozen once accepted — you never rewrite one to change your mind, you **supersede** it with a new record and leave the old one standing as history. That supersedes chain is what separates an honest decision log from a pile of stale opinions.
|
|
16
|
+
|
|
17
|
+
Filenames are `NNNN-title.md` (zero-padded 4-digit sequence + kebab title). Status vocabulary: `proposed` / `accepted` / `deprecated` / `superseded`. Template id `decision`, body sections exactly `## Context`, `## Decision`, `## Consequences` in that order.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Step 0 — Confirm a decision was actually MADE (HARD GATE)
|
|
22
|
+
|
|
23
|
+
**An ADR records a decision; it does not make one.** Before anything else, establish that a choice has been settled.
|
|
24
|
+
|
|
25
|
+
- If the user is still weighing options, comparing approaches, or asking "should we do X or Y?" — they do not have a decision yet. **Stop and route them to the `frame-a-proposal` skill.** A proposal is where options get explored and argued; an ADR is where the settled outcome gets recorded. Recording a decision the user has not made produces a fake record that misleads every future reader.
|
|
26
|
+
- If the user says "we decided X" but you cannot tell *what lost* or *why*, ask one question: "What were the alternatives, and what made you pick this one?" An ADR with no rejected options is a press release, not a record.
|
|
27
|
+
- If the thing in question is whether the design itself is sound — not the record of it — hand off to `review-a-design`. This skill assumes the decision is sound; it captures it.
|
|
28
|
+
|
|
29
|
+
Do not proceed past this gate until the user has confirmed a specific decision. State it back to them in one sentence and get a nod.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Step 1 — Scan for prior art (surface supersedes candidates BEFORE writing)
|
|
34
|
+
|
|
35
|
+
A new ADR that silently contradicts an accepted one is how a decision log rots. Before allocating a number, find what already exists.
|
|
36
|
+
|
|
37
|
+
1. `search({ query: "<subsystem or topic of the decision>" })` — semantic sweep for related decisions, proposals, and specs.
|
|
38
|
+
2. `exec("ls -A decisions/")` — see the existing sequence and titles.
|
|
39
|
+
3. `exec("grep -rln <subsystem-keyword> decisions/")` — find records touching the same subsystem, interface, or constraint.
|
|
40
|
+
4. For each promising hit, `exec("cat decisions/NNNN-x.md")` — read its Decision and Status.
|
|
41
|
+
|
|
42
|
+
Then classify and surface to the user **before writing**:
|
|
43
|
+
|
|
44
|
+
- **Contradicts an accepted record** → this new decision reverses or replaces it. Flag the path as a `supersedes:` candidate: "This looks like it supersedes [0007-use-rest-api](./decisions/0007-use-rest-api.md), which is currently `accepted`. Confirm and I'll wire the chain in Step 7." Do not silently write a contradicting record.
|
|
45
|
+
- **Extends without contradicting** → note the related record; you'll link it, not supersede it.
|
|
46
|
+
- **Genuinely new** → proceed.
|
|
47
|
+
|
|
48
|
+
If the decision graduated from an accepted proposal in `proposals/`, locate that proposal now (`exec("grep -rln <topic> proposals/")`) — you'll link it as the parent in Step 4.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Step 2 — Allocate the next number and create from the template
|
|
53
|
+
|
|
54
|
+
**Never guess the sequence number.** List the folder and take the next integer.
|
|
55
|
+
|
|
56
|
+
1. `exec("ls -A decisions/")` — read the highest existing `NNNN`.
|
|
57
|
+
2. Next number = highest + 1, zero-padded to 4 digits. First-ever decision is `0001`.
|
|
58
|
+
3. Pick a short kebab title naming the decision, not the topic: `0012-adopt-event-sourcing-for-orders`, not `0012-orders`.
|
|
59
|
+
4. Create it from the template:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
write({ document: { path: "decisions/0012-adopt-event-sourcing-for-orders.md", template: "decision" } })
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The template lays down the frontmatter scaffold and the three H2 sections. Fill the frontmatter now:
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
type: decision
|
|
69
|
+
description: "One line: the decision, active voice."
|
|
70
|
+
status: proposed # proposed until the deciders accept; then accepted
|
|
71
|
+
date: YYYY-MM-DD # today
|
|
72
|
+
deciders: [<user>] # who owns this decision
|
|
73
|
+
supersedes: [] # fill in Step 7 if this replaces an earlier record
|
|
74
|
+
tags: [decision]
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Leave `status: proposed` while drafting. It becomes `accepted` only when the deciders sign off (Step 8) — an ADR that ships `accepted` before anyone agreed is backdating.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Step 3 — Context: the forces at play (invest here)
|
|
82
|
+
|
|
83
|
+
`## Context` is the section that ages best. Write it so a reader three years from now understands why this was even a question — no access to the meeting, the thread, or your memory. Cover:
|
|
84
|
+
|
|
85
|
+
- **The state of the system** when the decision was forced — what exists, what's under strain.
|
|
86
|
+
- **What changed** to make a choice necessary now rather than never. A new requirement, a scaling limit hit, a deprecated dependency, a deadline.
|
|
87
|
+
- **The constraints** that bounded the options — team size, existing tech, latency budgets, compliance, a hard date.
|
|
88
|
+
- **The forces in tension** — the reason this is a *decision* and not an obvious call. If there were no competing pressures, there'd be nothing to record.
|
|
89
|
+
|
|
90
|
+
Write it neutrally and factually. Do not argue for the decision here — that's Step 4's job. Context describes the problem so completely that the Decision reads as one reasonable response to it. If a reader finishes Context and still can't see why a choice was needed, the section has failed; rewrite it.
|
|
91
|
+
|
|
92
|
+
Ground every factual claim about the system in something checkable — link the proposal, a spec, or a prior decision rather than asserting from memory.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Step 4 — Decision: active voice, one paragraph, unambiguous
|
|
97
|
+
|
|
98
|
+
`## Decision` states what will be done, in the active voice, present or future tense: **"We will ..."** One clear paragraph. A reader must finish it knowing exactly what was chosen with zero ambiguity.
|
|
99
|
+
|
|
100
|
+
Then, briefly:
|
|
101
|
+
|
|
102
|
+
- **Name the options that were weighed and why the others lost.** Two or three sentences per rejected option is enough — "We considered X but it couldn't meet the latency budget; Y was simpler but locked us to a single vendor." This is the heart of the record; a decision with no visible alternatives is unverifiable.
|
|
103
|
+
- **Link the parent proposal** if the decision graduated from one: "This decision accepts [0004-orders-rearchitecture-proposal](./proposals/0004-orders-rearchitecture-proposal.md)." Plain markdown relative link, never backticked, never an HTML anchor.
|
|
104
|
+
|
|
105
|
+
Do not fold implementation detail into the Decision — *how* it gets built belongs in a spec, not the ADR. The Decision says what and why, not the migration steps.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Step 5 — Consequences: both directions, honestly
|
|
110
|
+
|
|
111
|
+
`## Consequences` records what the team now lives with — **good AND bad**. A Consequences section with only upside is a marketing document, not an ADR. Cover, in whatever grouping fits:
|
|
112
|
+
|
|
113
|
+
- **What gets easier** — the wins that motivated the choice.
|
|
114
|
+
- **What gets harder** — the costs, the new complexity, the thing that's now more awkward.
|
|
115
|
+
- **What new obligation the team carries** — ongoing maintenance, a new skill to hire for, a dependency to track, an invariant someone must now uphold.
|
|
116
|
+
- **What this forecloses** — options you can no longer take cheaply, doors this closes.
|
|
117
|
+
- **Neutral consequences** — facts that are neither win nor loss but that a future reader needs.
|
|
118
|
+
|
|
119
|
+
Force yourself to write at least one genuine negative and one new obligation. If you can't find any, you haven't thought hard enough — every real decision costs something. The negatives are the most valuable part of the record; they're what a future team checks when the decision starts to hurt.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Step 6 — Soundness self-check (adversarial pass before committing)
|
|
124
|
+
|
|
125
|
+
Read the draft as a skeptic who disagrees with the decision. Answer each honestly and fix what fails:
|
|
126
|
+
|
|
127
|
+
- **One-way door or reversible?** Is the reversibility of this decision stated? A one-way door (hard or expensive to undo) must say so explicitly in Consequences — that's the single most important thing a future reader needs to know before they inherit it.
|
|
128
|
+
- **Does Context actually motivate the Decision?** Or does the Decision arrive from nowhere, with forces in Context that don't point at it? If the two sections don't connect, one of them is wrong.
|
|
129
|
+
- **Would a reader who disagrees find their objection addressed?** The strongest counter-argument should appear somewhere — in a rejected option or a named consequence. If the obvious objection is missing, add it.
|
|
130
|
+
- **Is any consequence being hidden because it's inconvenient?** The cost you'd rather not write down is exactly the one that belongs in the record.
|
|
131
|
+
|
|
132
|
+
If this pass reveals that the *design itself* is in question — not the quality of the record but whether the decision is right — stop and hand off to `review-a-design`. This skill records sound decisions; it is not the place to relitigate one.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Step 7 — Supersedes chain (both directions or it's broken)
|
|
137
|
+
|
|
138
|
+
If this record replaces an earlier one, the chain must be wired in **both** directions or the log lies from one side.
|
|
139
|
+
|
|
140
|
+
1. **Forward, on the new record:** add the old path to `supersedes:` frontmatter.
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
edit({ document: { path: "decisions/0012-adopt-event-sourcing-for-orders.md",
|
|
144
|
+
frontmatter: { supersedes: ["decisions/0007-use-rest-api.md"] } } })
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
2. **Backward, on the old record:** flip its status and add a forward link so a reader landing on the old decision is sent to the new one.
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
edit({ document: { path: "decisions/0007-use-rest-api.md",
|
|
151
|
+
frontmatter: { status: "superseded" } } })
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Then add a line near the top of the old record's Context (or a short `> Superseded by ...` note): `Superseded by [0012-adopt-event-sourcing-for-orders](./decisions/0012-adopt-event-sourcing-for-orders.md).`
|
|
155
|
+
|
|
156
|
+
**Never edit the old record's Context, Decision, or Consequences prose.** ADRs are frozen — the old decision was true when it was made and stays on the record as history. You add the status flip and the forward pointer; you do not rewrite what it said. Both edits land, or the chain is broken in one direction and the log becomes untrustworthy.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Step 8 — Link and validate
|
|
161
|
+
|
|
162
|
+
- **Backlinks in:** ensure the parent proposal links forward to this decision, and any spec that *implements* this decision links back to it. `links({ kind: "backlinks", docName: "decisions/0012-adopt-event-sourcing-for-orders" })` to see who points here; add the missing ones so the record is discoverable.
|
|
163
|
+
- **Dead links out:** `links({ kind: "dead", sourceDocNames: ["decisions/0012-adopt-event-sourcing-for-orders"] })` returns clean — zero dead links. Fix or remove every one; a broken link to a superseded record defeats the whole chain.
|
|
164
|
+
- **Frontmatter complete:** `type`, `description`, `status`, `date`, `deciders`, `supersedes`, `tags` all present and correct.
|
|
165
|
+
- **Status reflects reality:** if the deciders have accepted, flip `status: proposed` → `accepted`. If they haven't, leave it `proposed` and tell the user it's awaiting sign-off. Do not mark a decision `accepted` on the user's behalf.
|
|
166
|
+
- **Body shape:** exactly `## Context`, `## Decision`, `## Consequences`, in order. No extra top-level sections — depth that doesn't fit these three belongs in a linked spec.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Step 9 — Recap to the user
|
|
171
|
+
|
|
172
|
+
Close in conversation, three things:
|
|
173
|
+
|
|
174
|
+
1. **The decision in one sentence** — the "We will ..." line.
|
|
175
|
+
2. **Its biggest consequence** — the one cost or obligation the team most needs to remember, especially if it's a one-way door.
|
|
176
|
+
3. **Any record it superseded** — name the old ADR and confirm the chain is wired both ways.
|
|
177
|
+
|
|
178
|
+
Then note whether `status` is `accepted` (deciders signed off) or `proposed` (awaiting sign-off), so the user knows what, if anything, is still open.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Non-goals
|
|
183
|
+
|
|
184
|
+
- **Don't decide on the user's behalf.** If no decision has been made, route to `frame-a-proposal`. This skill records; it does not choose.
|
|
185
|
+
- **Don't rewrite an accepted record.** ADRs are frozen. To change a past decision, supersede it (Step 7) and leave the old one standing — never edit its Context/Decision/Consequences prose.
|
|
186
|
+
- **Don't fold implementation detail into an ADR.** The migration plan, the API shape, the rollout steps belong in a spec (`write-a-spec`). The ADR captures what and why, not how.
|
|
187
|
+
- **Don't record a decision that has no consequences section.** A record with only upside, or with no costs and no new obligations, isn't an ADR — it's marketing. Every real decision costs something; find it and write it down.
|
|
188
|
+
- **Don't judge the soundness of the design here.** If the question is whether the decision is *right* rather than whether it's well-recorded, that's `review-a-design`.
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: open-knowledge-pack-software-lifecycle-review-a-design
|
|
3
|
+
description: "Reviews whether a design is SOUND — solving the right problem, derived from its stated goals and constraints — and emits ranked, evidence-backed findings, not edits. Read when asked to 'review this design', 'is this design sound', 'pressure-test this proposal', 'do a design review', 'does this solve the right problem', 'poke holes in this spec', 'should we build this', or to critique a proposal / spec / ADR / architecture or product decision. Do NOT read when the user wants to AUTHOR one of these — routing a new proposal is frame-a-proposal, a spec is write-a-spec, a decision record is record-a-decision, a postmortem is write-a-postmortem. Do NOT read for code review of a diff, or to fact-check individual claims (that is a correctness pass, a different job)."
|
|
4
|
+
compatibility: "Claude Code, Claude Desktop, Claude Cowork, Claude.ai web. Requires OpenKnowledge MCP server. Installed project-local by `ok seed --pack software-lifecycle`."
|
|
5
|
+
metadata:
|
|
6
|
+
pack: "software-lifecycle"
|
|
7
|
+
author: "Inkeep"
|
|
8
|
+
repository: "https://github.com/inkeep/open-knowledge"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Review a design — is it sound, not just complete
|
|
12
|
+
|
|
13
|
+
The platform `open-knowledge` skill still governs every markdown operation here (reads via `exec`, writes via `write`/`edit`, links as plain relative markdown, MCP owns in-scope `.md`); this skill layers design-review craft on top of it.
|
|
14
|
+
|
|
15
|
+
**Three reviews are not the same review, and only one is this skill's job.**
|
|
16
|
+
|
|
17
|
+
- **Completeness review** asks: is every section filled in? (Are Drawbacks and Alternatives non-empty?)
|
|
18
|
+
- **Correctness review** asks: are the individual claims true? (Does the benchmark really say 40ms? Is that API deprecated?)
|
|
19
|
+
- **Soundness review** asks: *should this be built at all, and is this the design that follows from the stated goals and constraints?*
|
|
20
|
+
|
|
21
|
+
You are doing the third. A proposal can be complete and factually correct and still be the wrong design — solving a symptom, chosen before its goals, engaging only strawman alternatives. Completeness and correctness are cheap to check and someone else's pass. Say this to the user up front if there's any ambiguity about what kind of review they want, then do soundness.
|
|
22
|
+
|
|
23
|
+
You produce **findings, not edits.** The author decides what to change. Never rewrite the artifact under review unless explicitly asked.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Step 0: Identify the artifact and read it — and what it inherits
|
|
28
|
+
|
|
29
|
+
**HARD GATE: never review a design you have not read end to end, and never review it in isolation from the decisions it inherits.** A review of the first half is worse than no review — it spends the author's trust on partial understanding.
|
|
30
|
+
|
|
31
|
+
1. Identify the type. It is one of:
|
|
32
|
+
- a **proposal** (`proposals/NNNN-name.md` — Motivation / Design / Drawbacks / Alternatives / Unresolved questions),
|
|
33
|
+
- a **spec** (`specs/NNN-name/spec.md` — Goals / Non-goals / Design / Migration / Test plan, with a `parent_proposal:`),
|
|
34
|
+
- a **decision** (`decisions/NNNN-title.md` — Context / Decision / Consequences, with a `supersedes:` chain), or
|
|
35
|
+
- an **in-flight choice with no document yet** (the user is deciding in conversation). This is a valid target — see Step 1.
|
|
36
|
+
2. Read it whole: `exec("cat proposals/0003-feature.md")`.
|
|
37
|
+
3. Read what it depends on. A design is only as sound as the ground it stands on:
|
|
38
|
+
- the **parent proposal** a spec links via `parent_proposal:`, and any proposal a decision implements;
|
|
39
|
+
- the **decisions it assumes** — `exec("grep -rln <subsystem-keyword> decisions/")`, then `cat` the relevant ones. A design that contradicts an accepted ADR without noting it is a finding by itself.
|
|
40
|
+
- the **prior postmortems in the same subsystem** — `exec("ls -A postmortems/")` and `search({ query: "<subsystem> failure" })`. A postmortem names a failure mode; a design that reintroduces it is your highest-value catch.
|
|
41
|
+
- **sibling proposals/decisions** it supersedes or overlaps — follow the `supersedes:` chain both directions.
|
|
42
|
+
4. If the design references source code, read the code with the host's **native** tools (`Read`, `Grep`) — source is outside the knowledge base. In-scope markdown stays on `exec`/`search`.
|
|
43
|
+
|
|
44
|
+
Do not proceed until you can name the goal, the constraints, and the prior decisions this design sits on top of.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Step 1: Reconstruct the design's own argument — and show it back
|
|
49
|
+
|
|
50
|
+
Before you critique anything, state the design's argument in your own words: **the goal it serves, the constraints it accepts, and why this design follows from them.** Show it to the user before Step 2.
|
|
51
|
+
|
|
52
|
+
Why this gate exists:
|
|
53
|
+
|
|
54
|
+
- If you can reconstruct it cleanly, the author gets a free confirmation that the intended reader understood it — often the most useful thing a review returns.
|
|
55
|
+
- **If you cannot state the goal, the constraints, and why this design follows from them, the reviewable object does not exist yet — and that IS the finding.** Stop and report it: "I can't reconstruct why this design follows from its goals; here's where the chain breaks." Reviewing the surface of a design whose argument you can't state produces confident noise. Hand it back to the authoring skill to make the argument legible first.
|
|
56
|
+
|
|
57
|
+
For an in-flight choice with no document, this step is where you force the argument into words for the first time. Frequently the act of reconstruction resolves the question without a single lens.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Step 2: Run the soundness lenses
|
|
62
|
+
|
|
63
|
+
Pass the design through each lens below. A lens is a named question plus the failure it catches — run the ones that bite for this artifact, skip the ones that plainly don't, and add any that earn their place. Do not mechanically fill all nine; a review that says the same shallow thing nine times teaches nothing.
|
|
64
|
+
|
|
65
|
+
- **Problem lens** — *Is the stated problem the real problem, or a symptom of one upstream?* Whose problem is it, and what evidence says it hurts today (not hypothetically)? A design aimed at a symptom is unsound however elegant. Failure it catches: solving the wrong problem beautifully.
|
|
66
|
+
- **Goal-derivation lens** — *Does the design follow from the stated goals, or were the goals reverse-engineered to justify a design chosen first?* Read the goals, then read the design cold: could you have predicted this design from these goals? If the design has a feature no goal demands, either the goal is unstated or the feature is scope. Failure it catches: solution-first rationalization.
|
|
67
|
+
- **Alternatives lens** — *Are the alternatives real, or strawmen?* Take the strongest version of the rejected option — steelman it — and check whether the document engages with *that*, or with a weak caricature. An Alternatives section that dismisses each option in one dismissive sentence is a tell. Failure it catches: a foregone conclusion dressed as a comparison.
|
|
68
|
+
- **Constraint lens** — *Which constraints are hard, and which are inherited habit?* Hard: physics, compliance, a one-way door already walked through, a contract with a downstream team. Soft: "we've always done it this way", a limit of the current tool, a deadline that could move. A design that treats a soft constraint as hard is under-imagined and probably larger than it needs to be. Failure it catches: unnecessary complexity justified by a fake wall.
|
|
69
|
+
- **Cost lens** — *What does this design foreclose, and what does it hand the team every week for the next three years?* Name the ongoing obligation: the migration that can't be undone, the schema that now needs backfilling forever, the on-call surface. Blast radius is not just the launch; it's the maintenance tail. Failure it catches: a cheap-looking design with an expensive tail.
|
|
70
|
+
- **Reversibility lens** — *One-way door or two-way door?* A two-way door (easily reverted) should be walked through, not committee'd — if the design is cheap to undo, over-reviewing it wastes everyone's time and the finding is "just ship it and learn." A one-way door (data migration, public API, external contract) deserves the scrutiny the two-way door didn't. Failure it catches: mis-spent rigor — heavy process on reversible choices, light process on irreversible ones.
|
|
71
|
+
- **Failure lens** — *What has to be true for this to work, and what happens at each assumption's boundary?* List the load-bearing assumptions, then push each to its edge: what at 10x load, at zero network, at a hostile input, at the second concurrent writer? **Cross-check the prior postmortems from Step 0: does this design reintroduce a named past failure?** Failure it catches: a design sound in the happy path and broken at every boundary.
|
|
72
|
+
- **Simplicity lens** — *Is there a materially smaller design that satisfies the stated goals?* Name it concretely — "drop the queue and call synchronously; the goals never mention throughput" — not "simplify it," which is not a finding. YAGNI is a soundness argument, not a style note: speculative generality is unsound because it pays cost for a goal no one stated. Failure it catches: a design solving problems it doesn't have yet.
|
|
73
|
+
- **Scope lens** — *Are the non-goals temporal and justified, or is load-bearing scope being smuggled out the back?* A good non-goal says "not now, because X, and here's the seam that lets us add it later." A bad non-goal quietly excludes the hard half of the actual problem so the design looks tractable. Read every non-goal and ask whether the design still solves the real problem without it. Failure it catches: a tractable design for a shrunken problem.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Step 3: Write findings
|
|
78
|
+
|
|
79
|
+
Each finding has four parts, and a finding missing the second is an opinion — drop it:
|
|
80
|
+
|
|
81
|
+
1. **Claim** — one sentence. What is unsound.
|
|
82
|
+
2. **Evidence** — quote the passage or link it: `the Design section says "[quoted text]"` or `[the Migration plan](./specs/012-sync/spec.md)` assumes X. **A finding with no evidence pointer is an opinion; delete it.** This is the single discipline that separates a review the author acts on from one they resent.
|
|
83
|
+
3. **Severity** — one of:
|
|
84
|
+
- **blocking** — the design should not proceed as written; a load-bearing assumption is wrong, or it reintroduces a known failure, or it solves the wrong problem.
|
|
85
|
+
- **substantive** — the design can proceed, but this materially weakens it and deserves an answer before acceptance.
|
|
86
|
+
- **minor** — worth noting, safe to defer or wave off.
|
|
87
|
+
4. **Resolution** — a concrete alternative *or* the question that would settle it. "This is worse" is not actionable; "consider a two-way-door version that does X, which drops the migration" or "what happens when two agents write the same doc — does the design address that?" is.
|
|
88
|
+
|
|
89
|
+
**Rank by severity, not by reading order.** Lead with the blocking findings; the author reads the top of your review and stops when they've got the gist. Burying the one blocking finding under six minor ones wastes it.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Step 4: Calibrate — adversarially re-read your own findings
|
|
94
|
+
|
|
95
|
+
Before you deliver, turn the lenses on yourself. **Reviews that flag everything teach the author to ignore reviews** — the moment your review has one indefensible finding, the author discounts all of them.
|
|
96
|
+
|
|
97
|
+
- Re-read each finding as the author would and try to kill it. If you can't defend the evidence, cut it.
|
|
98
|
+
- State **confidence per finding** and **what would change your mind**: "blocking, high confidence — unless the load numbers in the parent proposal are wrong, in which case this drops to minor." A finding you can't attach a falsifier to is probably a preference, not a finding.
|
|
99
|
+
- Collapse duplicates. Three findings that are the same root cause are one finding with three symptoms.
|
|
100
|
+
- If after calibration you have zero blocking and zero substantive findings, say so plainly — "this is sound; here are two minor notes" is a complete and valuable review. Do not manufacture severity to look thorough.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Step 5: Deliver
|
|
105
|
+
|
|
106
|
+
**In conversation by default.** Most reviews are a message: the reconstructed argument (Step 1), the ranked findings (Step 3), the calibration notes (Step 4).
|
|
107
|
+
|
|
108
|
+
**Persist as a document ONLY when** the user asks, or the review is substantial enough to be cited later (a blocking review of a proposal heading to accept/reject). Then:
|
|
109
|
+
|
|
110
|
+
- Write it beside the artifact it reviews: `write({ document: { path: "proposals/0003-feature-review.md" } })`.
|
|
111
|
+
- Link it **from** the artifact's Unresolved questions (proposal) or Open questions (spec) section via `edit` — a plain markdown link `[design review](./0003-feature-review.md)`, never backticked, never an HTML anchor.
|
|
112
|
+
- Mark it **advisory** in its own frontmatter/opening line: this is input to the author, not a verdict. The author owns the artifact and decides what lands.
|
|
113
|
+
|
|
114
|
+
Never edit the design under review to "apply" a finding. You emit findings; the authoring skill applies them.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Step 6: Hand off
|
|
119
|
+
|
|
120
|
+
Route blocking and substantive findings back to whoever owns the fix:
|
|
121
|
+
|
|
122
|
+
- Findings on a **proposal** → **frame-a-proposal** (the argument, alternatives, or motivation needs rework).
|
|
123
|
+
- Findings on a **spec** → **write-a-spec** (goals, non-goals, migration, or test plan needs rework).
|
|
124
|
+
- A finding that has *resolved into a made choice* ("we discussed it; we're going with the synchronous version") → **record-a-decision**, so the choice and its rationale land in `decisions/` with a `supersedes:` link if it overturns a prior ADR.
|
|
125
|
+
- A finding that a **past failure is being reintroduced** → point the author at the specific `postmortems/YYYY-MM-DD-name.md` so the design engages with it explicitly.
|
|
126
|
+
|
|
127
|
+
Name the skill and the reason in your handoff so the author knows exactly where to go.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Non-goals
|
|
132
|
+
|
|
133
|
+
- **Not a completeness checklist.** "Section X is empty" is only a finding if the emptiness makes the design unsound (no Alternatives means no evidence the option space was explored — *that's* the finding, not the empty heading).
|
|
134
|
+
- **Not a fact-check.** Whether an individual claim is true is a correctness pass — a different job. You assume the claims and test whether the design that rests on them is sound. Flag a claim only when it's load-bearing AND you have specific reason to doubt it; otherwise route the fact-check separately.
|
|
135
|
+
- **Not a code review.** Reviewing a diff for bugs, style, or implementation quality is out of scope. This skill reviews the design, not its code.
|
|
136
|
+
- **Not a rewrite.** Never edit the artifact under review without being asked. You produce findings; the author changes the design.
|
|
137
|
+
- **Never the final verdict.** The review is advice to the author, who owns the decision. A review that reads as a ruling — "rejected" — overreaches; a review that reads as "here's what would make this stronger, and here's what I'd block on and why" is doing its job.
|