@a-company/paradigm 5.37.11 → 6.0.2
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/{accept-orchestration-SBZVK3H4.js → accept-orchestration-QQISPINV.js} +1 -1
- package/dist/add-UOR4INIV.js +8 -0
- package/dist/{agent-loader-RIVI6QPP.js → agent-loader-2WJHD46U.js} +1 -1
- package/dist/{agent-loader-RJRVO5GQ.js → agent-loader-YKS2PQWO.js} +1 -1
- package/dist/{aggregate-W66DM3GA.js → aggregate-A5S5MTCC.js} +1 -1
- package/dist/{ambient-76YMUA5Q.js → ambient-BE3SQXNN.js} +1 -1
- package/dist/{ambient-WTLYUAQM.js → ambient-NVKQCW2A.js} +12 -12
- package/dist/{assess-UFPYEJKP.js → assess-63WXHWJV.js} +1 -1
- package/dist/{beacon-5QVYV5DF.js → beacon-QVUD3MGP.js} +1 -1
- package/dist/{calibration-OLJYB5HN.js → calibration-BDHGYJOK.js} +1 -1
- package/dist/{chunk-SI6SV76D.js → chunk-3DZK54RU.js} +72 -19
- package/dist/{chunk-CHVQNRRT.js → chunk-4PSD5R7N.js} +2 -2
- package/dist/chunk-6SKSV5B2.js +24 -0
- package/dist/{chunk-KFNHCQ4R.js → chunk-FEYOQMZ5.js} +1 -1
- package/dist/{chunk-NEJ4ZLCY.js → chunk-GAFKOFAV.js} +1 -1
- package/dist/chunk-GRZQIKST.js +2 -0
- package/dist/{chunk-RLCH7DXQ.js → chunk-K7X3Z3GL.js} +1 -1
- package/dist/chunk-LPBCQM5Y.js +6 -0
- package/dist/{chunk-T6IDXUUA.js → chunk-LWAIVOSF.js} +1 -1
- package/dist/{chunk-74SGKSRQ.js → chunk-M2HKWR25.js} +1 -1
- package/dist/{chunk-BOYQAMGC.js → chunk-M3PPXJU4.js} +1 -1
- package/dist/chunk-PHEX6LU4.js +111 -0
- package/dist/chunk-Q527BPUF.js +2 -0
- package/dist/chunk-R5ECMBIV.js +11 -0
- package/dist/{chunk-X3U3IGYT.js → chunk-TBWWFRL5.js} +1 -1
- package/dist/{chunk-MQIG6SMF.js → chunk-TNVWGPCE.js} +1 -1
- package/dist/{chunk-SUU6M4JH.js → chunk-TOYQ2QCB.js} +1 -1
- package/dist/chunk-TZDYIPVU.js +521 -0
- package/dist/{chunk-3XGNXXCT.js → chunk-UZ5H7K6Q.js} +1 -1
- package/dist/chunk-VIG5LSGZ.js +2 -0
- package/dist/chunk-VNIX5KBT.js +3 -0
- package/dist/{chunk-AGFPVSX5.js → chunk-VXIIVMTM.js} +1 -1
- package/dist/{chunk-ORDKEGII.js → chunk-WESTEMIM.js} +1 -1
- package/dist/{chunk-LBQBWIEX.js → chunk-Y4P4SGZV.js} +1 -1
- package/dist/{chunk-DOCDDDTD.js → chunk-YNDPSWOE.js} +5 -5
- package/dist/chunk-Z5QW6USC.js +2 -0
- package/dist/chunk-ZJQY5PPP.js +7 -0
- package/dist/{commands-LMUD5L6R.js → commands-ANRJNG2W.js} +1 -1
- package/dist/compliance-BNFWQPKM.js +6 -0
- package/dist/config-schema-FLHRVZMI.js +2 -0
- package/dist/{constellation-CG7C4WFE.js → constellation-NWLXYATA.js} +1 -1
- package/dist/{context-audit-XRPT3OU2.js → context-audit-JVCA6GSV.js} +1 -1
- package/dist/{cost-IDNVMAEV.js → cost-24UZSS2P.js} +1 -1
- package/dist/{cursorrules-U5O4G5T4.js → cursorrules-ZXPXPZ3P.js} +1 -1
- package/dist/decision-loader-HELL2AMX.js +2 -0
- package/dist/{delete-P5VULXR4.js → delete-2C6ALLYY.js} +1 -1
- package/dist/{diff-JVEYCXUC.js → diff-MF55KQZH.js} +1 -1
- package/dist/{dist-KGRCLBJP-2QAPFYNF.js → dist-GQ42YS5N-4HIJZVBB.js} +10 -10
- package/dist/dist-JZZJLVMR.js +2 -0
- package/dist/{dist-3ZCH25SG.js → dist-OG6MM4VY.js} +1 -1
- package/dist/dist-SE67SOXB.js +2 -0
- package/dist/{docs-USDAF26F.js → docs-O37YLLRN.js} +1 -1
- package/dist/doctor-IG5XM4C4.js +2 -0
- package/dist/{edit-GUU3HBVW.js → edit-P3MDAZLU.js} +1 -1
- package/dist/{flow-POQP27WA.js → flow-BGXOVE2V.js} +1 -1
- package/dist/{hooks-IG2GOAHP.js → hooks-TFMMMB2H.js} +1 -1
- package/dist/index.js +6 -6
- package/dist/init-M44SO65G.js +2 -0
- package/dist/init-V4KSEKPK.js +2 -0
- package/dist/{integrity-UYDOOJDP.js → integrity-ROO3G43N.js} +1 -1
- package/dist/{list-YKIQNKGB.js → list-2XIWUEMA.js} +1 -1
- package/dist/list-CFHINXIS.js +12 -0
- package/dist/lore-loader-D2ISOASW.js +2 -0
- package/dist/lore-loader-PXFKMKAN.js +2 -0
- package/dist/mcp.js +19 -11
- package/dist/metrics-UESGUHTA.js +2 -0
- package/dist/{migrate-IBDE7VK4.js → migrate-Z5UQN57G.js} +1 -1
- package/dist/migrate-assessments-YSITX7KM.js +4 -0
- package/dist/migrate-decisions-NPLQOEEH.js +6 -0
- package/dist/migrate-plsat-EM2ACIQ3.js +6 -0
- package/dist/{nomination-engine-EALA5MGI.js → nomination-engine-QPZJH6XO.js} +1 -1
- package/dist/{notebook-loader-PXNRBBXD.js → notebook-loader-3J2OFMS3.js} +1 -1
- package/dist/{orchestrate-RCAMBOIB.js → orchestrate-RID7HHHH.js} +1 -1
- package/dist/{platform-server-DNAMH4YI.js → platform-server-UD45NTGV.js} +1 -1
- package/dist/portal-check-DV2VSJ5E.js +8 -0
- package/dist/{portal-compliance-4MG5F2GI.js → portal-compliance-JONQ4SOP.js} +1 -1
- package/dist/{probe-B22G2JKF.js → probe-5HAXULAD.js} +1 -1
- package/dist/{providers-AWA7WLLM.js → providers-4PXMWA7V.js} +1 -1
- package/dist/quiz-WYIZJG5K.js +10 -0
- package/dist/{record-YXPB34MY.js → record-N3VNYYKJ.js} +1 -1
- package/dist/reindex-FWPD2VGM.js +2 -0
- package/dist/{retag-N5XF3KXP.js → retag-72R2OSZV.js} +1 -1
- package/dist/{review-77QI6VOC.js → review-2INNWLTW.js} +1 -1
- package/dist/{review-6UAH6V3R.js → review-VMSX2PKI.js} +1 -1
- package/dist/{ripple-ZGDITCGB.js → ripple-FNZI47SH.js} +1 -1
- package/dist/{sentinel-HYAZ3CO5.js → sentinel-EFPEX246.js} +1 -1
- package/dist/{sentinel-bridge-VR357PKL.js → sentinel-bridge-UR2MKARY.js} +1 -1
- package/dist/sentinel.js +1 -1
- package/dist/{serve-U47GULB6.js → serve-MO35XIZE.js} +1 -1
- package/dist/serve-OQYUO7CR.js +12 -0
- package/dist/{server-4YNUIK4W.js → server-4D77LCST.js} +1 -1
- package/dist/server-FGUL2FWQ.js +7 -0
- package/dist/session-tracker-KGORN6B5.js +2 -0
- package/dist/{session-work-log-PAKXOFGL.js → session-work-log-4IEVE4KK.js} +1 -1
- package/dist/{session-work-log-ZP45TREI.js → session-work-log-EE4UIZ33.js} +1 -1
- package/dist/{setup-3F5IK7MO.js → setup-ZSEC72BS.js} +2 -2
- package/dist/{shift-FDADESC4.js → shift-TVNY2CQF.js} +6 -6
- package/dist/{show-PJ5LFLIL.js → show-JH7LJ5MT.js} +1 -1
- package/dist/show-WVHAL4VU.js +7 -0
- package/dist/{snapshot-L2G56RPL.js → snapshot-3IYB67D4.js} +1 -1
- package/dist/{spawn-M5BAV252.js → spawn-UH5RENSE.js} +1 -1
- package/dist/{status-77M3SDIF.js → status-DB3KNLW3.js} +1 -1
- package/dist/status-S7Z5FVIE.js +6 -0
- package/dist/{summary-LXLHFRN7.js → summary-WLI3NF4G.js} +2 -2
- package/dist/{sweep-HU74OPVW.js → sweep-7TZFN5NS.js} +1 -1
- package/dist/sync-55U6QPIA.js +2 -0
- package/dist/{sync-llms-7CAI74QL.js → sync-llms-GF7DDQDI.js} +1 -1
- package/dist/team-MGT66HZQ.js +2 -0
- package/dist/{test-BQJMS4Y2.js → test-WLEPZQFC.js} +1 -1
- package/dist/{timeline-K3ZFKJ3R.js → timeline-RK7O2SCM.js} +1 -1
- package/dist/tools-QJHAVYI6.js +2 -0
- package/dist/university-content/notes/N-para-001-build-something.md +126 -0
- package/dist/university-content/notes/N-para-001-meet-the-team.md +85 -0
- package/dist/university-content/notes/N-para-001-shift-setup.md +74 -0
- package/dist/university-content/notes/N-para-101-component-types.md +99 -0
- package/dist/university-content/notes/N-para-101-first-steps.md +134 -0
- package/dist/university-content/notes/N-para-101-five-symbols.md +128 -0
- package/dist/university-content/notes/N-para-101-paradigm-logger.md +89 -0
- package/dist/university-content/notes/N-para-101-portal-yaml.md +112 -0
- package/dist/university-content/notes/N-para-101-project-structure.md +143 -0
- package/dist/university-content/notes/N-para-101-purpose-files.md +121 -0
- package/dist/university-content/notes/N-para-101-tags-and-classification.md +93 -0
- package/dist/university-content/notes/N-para-101-welcome.md +51 -0
- package/dist/university-content/notes/N-para-201-architecture-review.md +175 -0
- package/dist/university-content/notes/N-para-201-aspect-graph.md +79 -0
- package/dist/university-content/notes/N-para-201-aspects-and-anchors.md +112 -0
- package/dist/university-content/notes/N-para-201-component-patterns.md +138 -0
- package/dist/university-content/notes/N-para-201-cross-cutting-concerns.md +145 -0
- package/dist/university-content/notes/N-para-201-disciplines.md +187 -0
- package/dist/university-content/notes/N-para-201-flows-deep-dive.md +119 -0
- package/dist/university-content/notes/N-para-201-gates-deep-dive.md +165 -0
- package/dist/university-content/notes/N-para-201-portal-protocol.md +133 -0
- package/dist/university-content/notes/N-para-201-signal-patterns.md +159 -0
- package/dist/university-content/notes/N-para-201-symbol-naming.md +149 -0
- package/dist/university-content/notes/N-para-301-context-management.md +53 -0
- package/dist/university-content/notes/N-para-301-decisions.md +99 -0
- package/dist/university-content/notes/N-para-301-doctor-and-validation.md +70 -0
- package/dist/university-content/notes/N-para-301-enforcement-levels.md +102 -0
- package/dist/university-content/notes/N-para-301-fragility-tracking.md +50 -0
- package/dist/university-content/notes/N-para-301-history-system.md +42 -0
- package/dist/university-content/notes/N-para-301-navigation-system.md +55 -0
- package/dist/university-content/notes/N-para-301-operations-review.md +55 -0
- package/dist/university-content/notes/N-para-301-paradigm-shift.md +93 -0
- package/dist/university-content/notes/N-para-301-protocols.md +113 -0
- package/dist/university-content/notes/N-para-301-ripple-analysis.md +53 -0
- package/dist/university-content/notes/N-para-301-sentinel-observability.md +87 -0
- package/dist/university-content/notes/N-para-301-sync-and-maintenance.md +57 -0
- package/dist/university-content/notes/N-para-301-wisdom-system.md +89 -0
- package/dist/university-content/notes/N-para-401-agent-identity.md +99 -0
- package/dist/university-content/notes/N-para-401-agent-interop.md +87 -0
- package/dist/university-content/notes/N-para-401-agent-roles.md +107 -0
- package/dist/university-content/notes/N-para-401-commit-conventions.md +82 -0
- package/dist/university-content/notes/N-para-401-mastery-review.md +71 -0
- package/dist/university-content/notes/N-para-401-mcp-tools-overview.md +102 -0
- package/dist/university-content/notes/N-para-401-multi-agent-coordination.md +80 -0
- package/dist/university-content/notes/N-para-401-notebooks-permissions.md +66 -0
- package/dist/university-content/notes/N-para-401-orchestration-workflow.md +101 -0
- package/dist/university-content/notes/N-para-401-pm-governance.md +71 -0
- package/dist/university-content/notes/N-para-401-provider-cascade.md +75 -0
- package/dist/university-content/notes/N-para-401-quick-check.md +95 -0
- package/dist/university-content/notes/N-para-501-advanced-workflows.md +122 -0
- package/dist/university-content/notes/N-para-501-aspect-graph-advanced.md +195 -0
- package/dist/university-content/notes/N-para-501-aspect-graph-internals.md +97 -0
- package/dist/university-content/notes/N-para-501-assessment-loops.md +116 -0
- package/dist/university-content/notes/N-para-501-conductor-workspace.md +77 -0
- package/dist/university-content/notes/N-para-501-habits-practice.md +164 -0
- package/dist/university-content/notes/N-para-501-hook-enforcement.md +100 -0
- package/dist/university-content/notes/N-para-501-lore-system.md +155 -0
- package/dist/university-content/notes/N-para-501-platform-agent-ui.md +108 -0
- package/dist/university-content/notes/N-para-501-review-compliance.md +72 -0
- package/dist/university-content/notes/N-para-501-sentinel-deep-dive.md +173 -0
- package/dist/university-content/notes/N-para-501-session-intelligence.md +104 -0
- package/dist/university-content/notes/N-para-501-symphony-a-mail.md +120 -0
- package/dist/university-content/notes/N-para-501-symphony-networking.md +119 -0
- package/dist/university-content/notes/N-para-501-task-management.md +100 -0
- package/dist/university-content/notes/N-para-601-agent-renaissance.md +121 -0
- package/dist/university-content/notes/N-para-601-attention-scoring.md +129 -0
- package/dist/university-content/notes/N-para-601-context-composition.md +146 -0
- package/dist/university-content/notes/N-para-601-data-sovereignty.md +140 -0
- package/dist/university-content/notes/N-para-601-event-stream.md +126 -0
- package/dist/university-content/notes/N-para-601-knowledge-streams.md +144 -0
- package/dist/university-content/notes/N-para-601-learning-loop.md +68 -0
- package/dist/university-content/notes/N-para-601-maestro-team-collab.md +136 -0
- package/dist/university-content/notes/N-para-601-nominations-debates.md +115 -0
- package/dist/university-content/notes/N-para-701-agent-notebooks.md +131 -0
- package/dist/university-content/notes/N-para-701-agent-pods-nevrland.md +182 -0
- package/dist/university-content/notes/N-para-701-agent-profiles.md +197 -0
- package/dist/university-content/notes/N-para-701-agent-roster.md +82 -0
- package/dist/university-content/notes/N-para-701-agent-state.md +180 -0
- package/dist/university-content/notes/N-para-701-learning-feedback-loop.md +188 -0
- package/dist/university-content/notes/N-para-701-model-tier-resolution.md +204 -0
- package/dist/university-content/notes/N-para-701-orchestration-enforcement.md +169 -0
- package/dist/university-content/notes/N-para-701-per-project-rosters.md +198 -0
- package/dist/university-content/notes/N-para-701-symphony-visibility.md +142 -0
- package/dist/university-content/paths/LP-para-001.yaml +29 -0
- package/dist/university-content/paths/LP-para-101.yaml +59 -0
- package/dist/university-content/paths/LP-para-201.yaml +69 -0
- package/dist/university-content/paths/LP-para-301.yaml +84 -0
- package/dist/university-content/paths/LP-para-401.yaml +74 -0
- package/dist/university-content/paths/LP-para-501.yaml +89 -0
- package/dist/university-content/paths/LP-para-601.yaml +59 -0
- package/dist/university-content/paths/LP-para-701.yaml +64 -0
- package/dist/university-content/quizzes/Q-para-001-build-something.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-001-meet-the-team.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-001-shift-setup.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-101-component-types.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-101-first-steps.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-101-five-symbols.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-101-paradigm-logger.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-101-portal-yaml.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-101-project-structure.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-101-purpose-files.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-101-tags-and-classification.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-101-welcome.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-architecture-review.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-201-aspect-graph.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-201-aspects-and-anchors.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-component-patterns.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-cross-cutting-concerns.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-disciplines.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-201-flows-deep-dive.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-201-gates-deep-dive.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-201-portal-protocol.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-signal-patterns.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-symbol-naming.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-301-context-management.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-301-decisions.yaml +76 -0
- package/dist/university-content/quizzes/Q-para-301-doctor-and-validation.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-301-enforcement-levels.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-301-fragility-tracking.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-301-history-system.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-301-navigation-system.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-301-operations-review.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-301-paradigm-shift.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-301-protocols.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-301-ripple-analysis.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-301-sentinel-observability.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-301-sync-and-maintenance.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-301-wisdom-system.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-401-agent-identity.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-401-agent-interop.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-401-agent-roles.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-401-commit-conventions.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-401-mastery-review.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-401-mcp-tools-overview.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-401-multi-agent-coordination.yaml +76 -0
- package/dist/university-content/quizzes/Q-para-401-notebooks-permissions.yaml +61 -0
- package/dist/university-content/quizzes/Q-para-401-orchestration-workflow.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-401-pm-governance.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-401-provider-cascade.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-401-quick-check.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-501-advanced-workflows.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-aspect-graph-advanced.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-aspect-graph-internals.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-assessment-loops.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-501-conductor-workspace.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-501-habits-practice.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-501-hook-enforcement.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-lore-system.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-platform-agent-ui.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-review-compliance.yaml +61 -0
- package/dist/university-content/quizzes/Q-para-501-sentinel-deep-dive.yaml +86 -0
- package/dist/university-content/quizzes/Q-para-501-session-intelligence.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-symphony-a-mail.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-symphony-networking.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-task-management.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-601-agent-renaissance.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-601-attention-scoring.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-601-context-composition.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-601-data-sovereignty.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-601-event-stream.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-601-knowledge-streams.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-601-learning-loop.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-601-maestro-team-collab.yaml +86 -0
- package/dist/university-content/quizzes/Q-para-601-nominations-debates.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-agent-notebooks.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-agent-pods-nevrland.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-agent-profiles.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-agent-roster.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-agent-state.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-learning-feedback-loop.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-model-tier-resolution.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-orchestration-enforcement.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-per-project-rosters.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-symphony-visibility.yaml +66 -0
- package/dist/university-content/quizzes/Q-plsat-v2.yaml +904 -0
- package/dist/university-content/quizzes/Q-plsat-v3.yaml +2909 -0
- package/dist/university-content/reference.json +2 -2
- package/dist/university-ui/assets/{index-CecQrfSn.js → index-nNgzO1il.js} +2 -2
- package/dist/university-ui/assets/{index-CecQrfSn.js.map → index-nNgzO1il.js.map} +1 -1
- package/dist/university-ui/index.html +1 -1
- package/dist/{upgrade-GX56QE3C.js → upgrade-NKN63VTY.js} +2 -2
- package/dist/{validate-VZXTJHGO.js → validate-BB6LRWIY.js} +1 -1
- package/dist/validate-XUQZTF3H.js +9 -0
- package/dist/{watch-YCODNIET.js → watch-25GJHQYT.js} +1 -1
- package/dist/workspace-VMSPYIBV.js +2 -0
- package/lore-ui/dist/assets/{index-Bk-K0qgN.js → index-DKhNxgtW.js} +10 -10
- package/lore-ui/dist/index.html +1 -1
- package/package.json +3 -2
- package/platform-ui/dist/assets/{AmbientSection-BYjt75R1.js → AmbientSection-CwatqcBD.js} +1 -1
- package/platform-ui/dist/assets/{CanvasSection-rKvA_vZj.js → CanvasSection-dFAthehN.js} +1 -1
- package/platform-ui/dist/assets/{DocsSection-CI9K73M-.js → DocsSection-BZ2SFJBZ.js} +1 -1
- package/platform-ui/dist/assets/{GitSection-DSGj_c6S.js → GitSection-MNNYU1tO.js} +1 -1
- package/platform-ui/dist/assets/{GraphSection-CawN7pC5.js → GraphSection-COYjb4Pt.js} +1 -1
- package/platform-ui/dist/assets/LoreSection-B0hUbfsJ.js +1 -0
- package/platform-ui/dist/assets/{SentinelSection-DNgoYMH0.js → SentinelSection-BCxW1DCp.js} +1 -1
- package/platform-ui/dist/assets/{SymphonySection-C0zfcqv3.js → SymphonySection-BsucZRqy.js} +1 -1
- package/platform-ui/dist/assets/{TeamSection-Bzd3Dt9Q.js → TeamSection-C0QNTudW.js} +1 -1
- package/platform-ui/dist/assets/{UniversitySection-tBr62R0S.js → UniversitySection-DN1-g9pw.js} +1 -1
- package/platform-ui/dist/assets/{index-BaOmyn11.js → index-DwUT8pju.js} +2 -2
- package/platform-ui/dist/index.html +1 -1
- package/templates/paradigm/specs/symbols.md +4 -2
- package/dist/add-P76GEMGF.js +0 -8
- package/dist/chunk-3TR6LLXP.js +0 -111
- package/dist/chunk-G7XFK2GI.js +0 -11
- package/dist/chunk-J6KWGCHN.js +0 -24
- package/dist/chunk-JQKKVAAN.js +0 -2
- package/dist/chunk-ODVKPZZ4.js +0 -2
- package/dist/chunk-Q2J542ST.js +0 -2
- package/dist/chunk-QT2LKB3P.js +0 -7
- package/dist/chunk-SHD27BQX.js +0 -6
- package/dist/chunk-WS2N27RX.js +0 -3
- package/dist/chunk-YT52WLBF.js +0 -521
- package/dist/compliance-WJINB5DM.js +0 -6
- package/dist/config-schema-GUQY2QN7.js +0 -2
- package/dist/decision-loader-2XPZE4EZ.js +0 -2
- package/dist/dist-R3RWD35F.js +0 -2
- package/dist/dist-VXCZWVVJ.js +0 -2
- package/dist/doctor-QJ47XAUP.js +0 -2
- package/dist/init-HIBRSVUB.js +0 -2
- package/dist/list-5IUGP3ZB.js +0 -7
- package/dist/lore-loader-RVQI5GXL.js +0 -2
- package/dist/lore-loader-XY5MZRR2.js +0 -2
- package/dist/migrate-assessments-GEI5WMI2.js +0 -4
- package/dist/portal-check-Z3OCQEQR.js +0 -8
- package/dist/quiz-FE5UGAY2.js +0 -10
- package/dist/reindex-FO5VMZVQ.js +0 -2
- package/dist/serve-OY6XYL7F.js +0 -12
- package/dist/server-2MNROHF6.js +0 -7
- package/dist/session-tracker-MWJAJA6Z.js +0 -2
- package/dist/show-BOAVWZPZ.js +0 -7
- package/dist/status-A37ECYNJ.js +0 -6
- package/dist/sync-DLUBV5HQ.js +0 -2
- package/dist/team-NSP6PMPS.js +0 -2
- package/dist/tools-CERDNVCG.js +0 -2
- package/dist/university-content/courses/.purpose +0 -492
- package/dist/university-content/courses/para-001.json +0 -166
- package/dist/university-content/courses/para-101.json +0 -615
- package/dist/university-content/courses/para-201.json +0 -794
- package/dist/university-content/courses/para-301.json +0 -830
- package/dist/university-content/courses/para-401.json +0 -868
- package/dist/university-content/courses/para-501.json +0 -1166
- package/dist/university-content/courses/para-601.json +0 -719
- package/dist/university-content/courses/para-701.json +0 -807
- package/dist/university-content/plsat/.purpose +0 -162
- package/dist/university-content/plsat/v2.0.json +0 -760
- package/dist/university-content/plsat/v3.0.json +0 -3453
- package/dist/validate-C6SMKGYD.js +0 -9
- package/dist/workspace-MKSQN7B2.js +0 -2
- package/platform-ui/dist/assets/LoreSection-oO5dCe6O.js +0 -1
- /package/dist/{chunk-BV5PRPLB.js → chunk-IZSBGW6E.js} +0 -0
- /package/templates/paradigm/specs/{scan.md → probe.md} +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-501-hook-enforcement
|
|
3
|
+
title: Hook Enforcement & Automation
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-501
|
|
11
|
+
- stop-hook-blocks
|
|
12
|
+
- post-write-hook-tracks
|
|
13
|
+
- pre-commit-hook-auto-rebuilds
|
|
14
|
+
symbols: []
|
|
15
|
+
difficulty: beginner
|
|
16
|
+
estimatedMinutes: 4
|
|
17
|
+
prerequisites: []
|
|
18
|
+
category: paradigm-core
|
|
19
|
+
origin: imported
|
|
20
|
+
source: courses/para-501.json
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## The Compliance Gap
|
|
24
|
+
|
|
25
|
+
Paradigm's value depends on discipline. Purpose files must be updated when code changes. Portal.yaml must reflect route additions. Lore must be recorded for significant sessions. Aspect anchors must point to real code. Without enforcement, these requirements become suggestions that erode over time.
|
|
26
|
+
|
|
27
|
+
Hooks close this gap. They are automated checks that run at specific points in the development workflow, catching violations before they become technical debt. Paradigm uses three hooks, each with a distinct role and severity.
|
|
28
|
+
|
|
29
|
+
## The Stop Hook
|
|
30
|
+
|
|
31
|
+
The stop hook is the primary enforcer. It runs before an agent session completes and can **block** the session from finishing if compliance checks fail.
|
|
32
|
+
|
|
33
|
+
**Trigger**: Before agent session end (Claude Code: Stop hook, Cursor: pre-finish)
|
|
34
|
+
|
|
35
|
+
**Seven checks, in order:**
|
|
36
|
+
|
|
37
|
+
1. **Source files modified without .purpose updates** — If 2+ source files were modified but zero paradigm metadata files (.purpose, portal.yaml, etc.) were updated, the hook blocks. This catches the "implement and forget" pattern.
|
|
38
|
+
|
|
39
|
+
2. **Modified directories missing .purpose coverage** — The hook walks up the directory tree from each modified source file looking for a covering .purpose file. If no .purpose exists anywhere in the ancestor chain (including the project root), it blocks.
|
|
40
|
+
|
|
41
|
+
3. **Route patterns without portal.yaml** — The hook scans modified files for route declaration patterns (Express `.get()`, `.post()`, decorators like `@Get()`, Rust macros like `#[actix_web::get]`). If routes are detected and portal.yaml was neither present nor modified, it blocks.
|
|
42
|
+
|
|
43
|
+
4. **Stale aspect anchors** — The hook parses .purpose files for `anchors:` sections and validates that each referenced file still exists. If an anchor points to a deleted file, it blocks.
|
|
44
|
+
|
|
45
|
+
5. **Pending .purpose freshness** — The post-write hook tracks files edited without .purpose updates in `.paradigm/.pending-review`. The stop hook checks this list: if source files are pending and their covering .purpose was not also modified during the session, it blocks.
|
|
46
|
+
|
|
47
|
+
6. **Aspect coverage advisory** — If the project uses `~aspects`, the hook advises (non-blocking) to verify that anchor line numbers are still accurate after code changes.
|
|
48
|
+
|
|
49
|
+
7. **Lore entry for significant sessions** — If 3+ source files were modified and no lore entry was recorded in `.paradigm/lore/entries/`, the hook blocks.
|
|
50
|
+
|
|
51
|
+
**When blocked**, the hook outputs a clear list of violations with remediation steps. Fix the violations, then complete the session.
|
|
52
|
+
|
|
53
|
+
## The Post-Write Hook
|
|
54
|
+
|
|
55
|
+
The post-write hook runs after every file edit (Edit or Write tool calls). It is **advisory only** — it never blocks.
|
|
56
|
+
|
|
57
|
+
**Trigger**: After Edit or Write tool completes
|
|
58
|
+
|
|
59
|
+
**Actions:**
|
|
60
|
+
1. Extracts the edited file path
|
|
61
|
+
2. Skips non-source files (.purpose, portal.yaml, .md, .lock, .json, .yaml, .gitignore, .env files) and paradigm directories (.paradigm/, .claude/, .cursor/)
|
|
62
|
+
3. Appends source file paths to `.paradigm/.pending-review` (deduplicated)
|
|
63
|
+
4. Checks if a .purpose file covers the edited directory
|
|
64
|
+
5. If no .purpose exists: reminds "No .purpose file covers {dir}/ — Create one"
|
|
65
|
+
6. Every 3 source files edited: general reminder to update .purpose files
|
|
66
|
+
|
|
67
|
+
The `.pending-review` file is the bridge between the post-write hook and the stop hook. Post-write accumulates the list; stop hook validates against it.
|
|
68
|
+
|
|
69
|
+
## The Pre-Commit Hook
|
|
70
|
+
|
|
71
|
+
The pre-commit hook runs before `git commit` and handles index maintenance. It **never blocks**.
|
|
72
|
+
|
|
73
|
+
**Trigger**: Before Bash commands containing `git commit`
|
|
74
|
+
|
|
75
|
+
**Actions:**
|
|
76
|
+
1. Runs `paradigm index --quiet` to rebuild scan-index.json, navigator.yaml, and flow-index.json
|
|
77
|
+
2. Stages the rebuilt files so they are included in the commit
|
|
78
|
+
3. Exits 0 (always succeeds)
|
|
79
|
+
|
|
80
|
+
This ensures that every commit has a fresh symbol index. Without this hook, the index would drift from the actual codebase between manual `paradigm scan` runs.
|
|
81
|
+
|
|
82
|
+
## Hook Installation
|
|
83
|
+
|
|
84
|
+
Hooks are installed automatically by `paradigm shift` (full setup) or manually with `paradigm hooks install`. The installer detects the IDE (Claude Code or Cursor) and writes the appropriate hook format.
|
|
85
|
+
|
|
86
|
+
For Claude Code, hooks are configured in `.claude/settings.json` using the hooks API — stop hooks, PreToolUse matchers (for Bash commands matching `git commit`), and PostToolUse matchers (for Edit/Write tool calls).
|
|
87
|
+
|
|
88
|
+
## Remediation Workflow
|
|
89
|
+
|
|
90
|
+
When the stop hook blocks you:
|
|
91
|
+
|
|
92
|
+
1. **Read the violation list** — Each violation names the specific check that failed
|
|
93
|
+
2. **Update .purpose files** — For modified directories without coverage, create or update the nearest .purpose file
|
|
94
|
+
3. **Update portal.yaml** — If routes were added, add the route and gate definitions
|
|
95
|
+
4. **Fix stale anchors** — If aspect anchors point to deleted/moved files, update the anchor paths
|
|
96
|
+
5. **Record lore** — If 3+ files were modified, call `paradigm_lore_record` with the session summary
|
|
97
|
+
6. **Run `paradigm_reindex`** — Rebuild the index to reflect your updates
|
|
98
|
+
7. **Complete the session** — The stop hook runs again and should pass
|
|
99
|
+
|
|
100
|
+
The key insight is that the stop hook is not punitive — it is protective. Every check it enforces prevents a real problem: stale documentation, unprotected routes, orphaned anchors, or lost institutional knowledge.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-501-lore-system
|
|
3
|
+
title: The Lore System
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-18'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-501
|
|
11
|
+
- lore-entries-record
|
|
12
|
+
- seven-entry-types
|
|
13
|
+
- date-partitioned-yaml-storage
|
|
14
|
+
symbols: []
|
|
15
|
+
difficulty: beginner
|
|
16
|
+
estimatedMinutes: 5
|
|
17
|
+
prerequisites: []
|
|
18
|
+
category: paradigm-core
|
|
19
|
+
origin: imported
|
|
20
|
+
source: courses/para-501.json
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Why Projects Forget
|
|
24
|
+
|
|
25
|
+
Every software project accumulates institutional knowledge — why a migration was attempted then rolled back, which approach was chosen for caching and why, what the team learned when the billing system went down at 2 AM. Without a system for capturing this knowledge, it lives only in the heads of the people who were there. When they leave, context-switch, or simply forget, the project loses its memory.
|
|
26
|
+
|
|
27
|
+
Paradigm's Lore system is a structured project timeline. It records sessions, milestones, incidents, retros, reviews, and insights as date-partitioned YAML entries that both humans and AI agents can search, filter, and learn from.
|
|
28
|
+
|
|
29
|
+
> **v6.0 change:** the `decision` lore type was removed. Architectural decisions now have their own dedicated store — see "Decisions Have Their Own Store" below.
|
|
30
|
+
|
|
31
|
+
## Anatomy of a Lore Entry
|
|
32
|
+
|
|
33
|
+
Every lore entry follows a consistent structure:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
id: L-2026-02-21-ascend-143025-001
|
|
37
|
+
type: agent-session
|
|
38
|
+
timestamp: "2026-02-21T14:30:25Z"
|
|
39
|
+
duration_minutes: 45
|
|
40
|
+
author: ascend
|
|
41
|
+
agent:
|
|
42
|
+
provider: anthropic
|
|
43
|
+
model: claude-opus-4-6
|
|
44
|
+
title: "Add JWT authentication to user routes"
|
|
45
|
+
summary: "Implemented RS256 JWT auth middleware, added ^authenticated and ^project-admin gates to portal.yaml, created refresh token rotation."
|
|
46
|
+
symbols_touched: ["#auth-middleware", "^authenticated", "^project-admin"]
|
|
47
|
+
symbols_created: ["#refresh-token-handler"]
|
|
48
|
+
files_modified: ["src/middleware/auth.ts", "portal.yaml"]
|
|
49
|
+
files_created: ["src/handlers/refresh-token.ts"]
|
|
50
|
+
lines_added: 247
|
|
51
|
+
lines_removed: 12
|
|
52
|
+
commit: "a1b2c3d"
|
|
53
|
+
decisions:
|
|
54
|
+
- id: jwt-signing
|
|
55
|
+
decision: "Use RS256 over HS256"
|
|
56
|
+
rationale: "Allows public key verification without sharing the signing secret"
|
|
57
|
+
learnings:
|
|
58
|
+
- "Express v5 requires explicit async error wrapping for middleware"
|
|
59
|
+
verification:
|
|
60
|
+
status: pass
|
|
61
|
+
details: { "unit-tests": pass, "integration": pass }
|
|
62
|
+
tags: [security, auth]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The `id` field is auto-generated as `L-{date}-{author}-{hhmmss}-{seq}` — date partitions the storage, author and timestamp disambiguate within a day, and the sequence handles burst writes. Note that `author` is the human user (a string), and AI assistance is recorded separately in the optional `agent` object. The `decisions` field on an agent-session entry remains valid — it captures decisions made *during* a work session. Standalone architectural decisions go through `paradigm_decision_record` (see below).
|
|
66
|
+
|
|
67
|
+
## Entry Types
|
|
68
|
+
|
|
69
|
+
Lore recognizes seven entry types, each capturing a different kind of project event:
|
|
70
|
+
|
|
71
|
+
| Type | When to Use |
|
|
72
|
+
|---|---|
|
|
73
|
+
| `agent-session` | An AI agent completed a work session (most common) |
|
|
74
|
+
| `human-note` | A human records context, rationale, or tribal knowledge |
|
|
75
|
+
| `review` | A code review, PR review, or post-mortem |
|
|
76
|
+
| `incident` | A production incident or significant failure |
|
|
77
|
+
| `milestone` | A release, launch, migration completion, or major achievement |
|
|
78
|
+
| `retro` | A retrospective on a sprint, project, or incident response |
|
|
79
|
+
| `insight` | A learned pattern or observation worth preserving |
|
|
80
|
+
|
|
81
|
+
The type drives how the entry appears in timeline views and which filters surface it.
|
|
82
|
+
|
|
83
|
+
## Decisions Have Their Own Store
|
|
84
|
+
|
|
85
|
+
In v6.0 the `decision` lore type was removed. Decisions are first-class enough to deserve their own store, separate from the time-partitioned narrative of lore. Decisions live in `.paradigm/decisions/` as `TD-*` entries, recorded via `paradigm_decision_record`. When you record a decision, Paradigm auto-writes a companion lore `insight` entry pointing at it (with `references.decision_id`) — so the timeline still surfaces the moment the decision was made, while the canonical decision record stays addressable by topic rather than by date.
|
|
86
|
+
|
|
87
|
+
If you have a v1/v2 project with old `type: decision` lore entries, the storage layer migrates them to type `insight` on read and tags them `v6-migrated:from-decision` for forensic recovery. New entries with `type: 'decision'` are rejected at the storage layer with an error pointing you at the decision-record path. The rejection envelope (`code: 'lore_type_decision_removed'`, `successor_tool: 'paradigm_decision_record'`) is structured so calling agents can auto-retry without human intervention.
|
|
88
|
+
|
|
89
|
+
Search hierarchy:
|
|
90
|
+
- Use `paradigm_lore_search` for narrative ("what happened on 2026-02-21?").
|
|
91
|
+
- Use `paradigm_decision_search` for canonical choices ("what did we decide about caching?").
|
|
92
|
+
|
|
93
|
+
## Storage: Date-Partitioned YAML
|
|
94
|
+
|
|
95
|
+
Lore entries live in `.paradigm/lore/entries/` organized by date. Filenames mirror the entry id (`L-{date}-{author}-{hhmmss}-{seq}.yaml`), so you can identify the author and burst order from the filename alone:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
.paradigm/lore/
|
|
99
|
+
timeline.yaml # Index metadata
|
|
100
|
+
entries/
|
|
101
|
+
2026-02-19/
|
|
102
|
+
L-2026-02-19-ascend-091203-001.yaml
|
|
103
|
+
L-2026-02-19-matt-143812-001.yaml
|
|
104
|
+
2026-02-20/
|
|
105
|
+
L-2026-02-20-ascend-101545-001.yaml
|
|
106
|
+
2026-02-21/
|
|
107
|
+
L-2026-02-21-ascend-143025-001.yaml
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The `timeline.yaml` index tracks total entry count, last updated timestamp, and known authors. Date partitioning keeps directories small and makes time-range queries efficient — to find entries from last week, you only read 7 directories.
|
|
111
|
+
|
|
112
|
+
## CLI Tools
|
|
113
|
+
|
|
114
|
+
The CLI provides full lore management:
|
|
115
|
+
|
|
116
|
+
- `paradigm lore list` — List entries with filters (author, type, symbol, date range, tags)
|
|
117
|
+
- `paradigm lore show <id>` — Full detail view of a single entry
|
|
118
|
+
- `paradigm lore record` — Record a new entry with expanded fields (files-modified, files-created, commit, learnings, duration)
|
|
119
|
+
- `paradigm lore edit <id>` — Edit entry fields (title, summary, type, symbols, tags, learnings)
|
|
120
|
+
- `paradigm lore delete <id>` — Delete an entry (with --yes to skip confirmation)
|
|
121
|
+
- `paradigm lore timeline` — Timeline view grouped by date with hot symbols
|
|
122
|
+
- `paradigm lore review <id>` — Add review scores to an entry
|
|
123
|
+
- `paradigm lore` — Launch the web timeline UI
|
|
124
|
+
|
|
125
|
+
## MCP Tools
|
|
126
|
+
|
|
127
|
+
The Lore system exposes the following MCP tools:
|
|
128
|
+
|
|
129
|
+
**`paradigm_lore_record`** — Create a new entry. Requires `type`, `title`, `summary`, and `symbols_touched`. Optional fields include files, decisions, learnings, and verification status. The entry is written to the correct date directory with an auto-incremented ID. When `validateSymbols: true` is passed, the tool checks each symbol in `symbols_touched` against registered symbols in `.purpose` files, `flows.yaml`, and `portal.yaml`. Unregistered symbols produce advisory warnings (the entry is always recorded regardless). Calling with `type: 'decision'` returns a structured rejection envelope pointing at `paradigm_decision_record`.
|
|
130
|
+
|
|
131
|
+
**`paradigm_lore_search`** — Query entries with filters: by symbol, author, type, date range, tags, review status, and minimum completeness score. Returns matching entries sorted by recency.
|
|
132
|
+
|
|
133
|
+
**`paradigm_lore_timeline`** — Get a high-level view: recent entries, active authors, hot symbols (most-referenced in recent entries), and timeline metadata. Use this for orientation — it tells you what has been happening in the project.
|
|
134
|
+
|
|
135
|
+
**`paradigm_lore_get`** — Fetch a single entry by ID. Returns the full entry with all fields, including decisions, learnings, and review data.
|
|
136
|
+
|
|
137
|
+
**`paradigm_lore_update`** — Update an existing entry. Pass the entry ID and the fields to change (title, summary, type, symbols, tags, learnings). Only specified fields are modified.
|
|
138
|
+
|
|
139
|
+
**`paradigm_lore_delete`** — Delete an entry by ID. Requires `confirm: true` to prevent accidental deletion.
|
|
140
|
+
|
|
141
|
+
**`paradigm_lore_assess`** — Score an entry's quality and completeness (1-5 each), with optional notes. The assessment is stored alongside the entry and feeds the calibration and review filters.
|
|
142
|
+
|
|
143
|
+
**`paradigm_lore_calibration`** — Surface calibration drift: entries where the recorded confidence diverges from later-observed reality. Use this to find sessions where an agent over- or under-estimated its certainty.
|
|
144
|
+
|
|
145
|
+
## Lore Reviews
|
|
146
|
+
|
|
147
|
+
Entries can be reviewed by humans after the fact. A review adds a `completeness` score (1-5), a `quality` score (1-5), and optional notes. This creates a feedback loop: agents learn which sessions produced high-quality entries and can adjust their recording behavior. You can filter entries by `hasReview` and `minCompleteness` to surface only verified project history.
|
|
148
|
+
|
|
149
|
+
## When to Record
|
|
150
|
+
|
|
151
|
+
The general rule: **record lore when a session modifies 3 or more source files**. This threshold captures significant work sessions while ignoring trivial edits. The stop hook enforces this — if you modified 3+ files without recording a lore entry, it will block your session from completing.
|
|
152
|
+
|
|
153
|
+
Beyond the threshold, always record lore for: production incidents, milestone completions, retros, and any session where you learned something the next developer should know. For standalone architectural decisions, use `paradigm_decision_record` instead — the decision store handles them, and a companion lore `insight` is auto-written for timeline coverage.
|
|
154
|
+
|
|
155
|
+
> **Going deeper:** PARA 601 covers knowledge streams (work-log, journal, decisions) and how `paradigm_decision_record` writes to the decisions stream while emitting a companion lore `insight` for timeline coverage. PARA 301 covers the new dedicated decision store in detail (`N-para-301-decisions`).
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-501-platform-agent-ui
|
|
3
|
+
title: Platform & Agent-Driven UI
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-501
|
|
11
|
+
- paradigm-serve-unifies
|
|
12
|
+
- agent-driven-ui-5
|
|
13
|
+
- pipeline-mcp-
|
|
14
|
+
symbols: []
|
|
15
|
+
difficulty: beginner
|
|
16
|
+
estimatedMinutes: 3
|
|
17
|
+
prerequisites: []
|
|
18
|
+
category: paradigm-core
|
|
19
|
+
origin: imported
|
|
20
|
+
source: courses/para-501.json
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## The Unified Platform
|
|
24
|
+
|
|
25
|
+
`paradigm serve` launches the Paradigm Platform — a unified development management interface on port 3850 that absorbs every Paradigm tool (Lore, Graph, Sentinel, University, Symphony) into one browser tab.
|
|
26
|
+
|
|
27
|
+
The Platform is built on Express + WebSocket on the server, React 18 + Zustand on the client. Sections are lazy-loaded. A shared design system provides consistent theming and symbol colors.
|
|
28
|
+
|
|
29
|
+
### Architecture
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
localhost:3850 (Express + WebSocket)
|
|
33
|
+
├── /api/lore/* ← LoreRouter
|
|
34
|
+
├── /api/symbols/* ← SymbolsRouter
|
|
35
|
+
├── /api/graphs/* ← GraphsRouter
|
|
36
|
+
├── /api/platform/* ← PlatformRouter (health, sections, agent-command)
|
|
37
|
+
├── /ws ← WebSocket (agent commands + user activity)
|
|
38
|
+
└── / ← Platform UI SPA
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Agent-Driven UI
|
|
42
|
+
|
|
43
|
+
The breakthrough: **the AI agent can drive the browser in real-time.** Five MCP tools let the agent navigate, highlight, annotate, observe, and clear — turning the Platform from a passive viewer into a shared workspace.
|
|
44
|
+
|
|
45
|
+
### The Pipeline: MCP → HTTP → WebSocket → Browser
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
Agent (Claude Code) Platform Server Browser
|
|
49
|
+
│ │ │
|
|
50
|
+
│ paradigm_platform_* │ │
|
|
51
|
+
│ POST /api/platform/cmd │ │
|
|
52
|
+
│ ─────────────────────────►│ │
|
|
53
|
+
│ ◄── { ok: true } ──────│ │
|
|
54
|
+
│ │ ws: agent:* │
|
|
55
|
+
│ │──────────────────►│
|
|
56
|
+
│ │ │ UI updates
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Why HTTP not file-based: the <500ms latency requirement rules out file-watching. Why not direct WebSocket from MCP: MCP tools are stdio-based with no event loop for persistent WS connections.
|
|
60
|
+
|
|
61
|
+
### The Five Tools
|
|
62
|
+
|
|
63
|
+
| Tool | Purpose |
|
|
64
|
+
|------|---------|
|
|
65
|
+
| `paradigm_platform_navigate` | Switch sections, select symbols, open lore entries |
|
|
66
|
+
| `paradigm_platform_highlight` | Pulsing glow on symbols with color + label, auto-expires |
|
|
67
|
+
| `paradigm_platform_annotate` | Toasts (notifications), callouts (on graph nodes), badges |
|
|
68
|
+
| `paradigm_platform_observe` | Read user's current section, selected symbol, theme, mute state |
|
|
69
|
+
| `paradigm_platform_clear` | Remove all agent highlights and annotations |
|
|
70
|
+
|
|
71
|
+
### Conflict Resolution: User Always Wins
|
|
72
|
+
|
|
73
|
+
The agent must never hijack the user's attention:
|
|
74
|
+
|
|
75
|
+
- **User idle (>5s):** Agent navigation executes immediately
|
|
76
|
+
- **User active (<5s):** A prompt appears: "Agent wants to show you #X — [Go there] [Dismiss]"
|
|
77
|
+
- **User muted:** All agent effects are silently discarded; `observe` returns `{ muted: true }`
|
|
78
|
+
|
|
79
|
+
### Agent Presence
|
|
80
|
+
|
|
81
|
+
The `#AgentPresenceManager` tracks connected agents by their Symphony identity (`{project}/{role}`). Each agent gets a deterministic color from its ID hash. Presence dots appear in the Platform header with a mute toggle.
|
|
82
|
+
|
|
83
|
+
Stale agents are auto-pruned after 2 minutes of inactivity.
|
|
84
|
+
|
|
85
|
+
### User State Tracking
|
|
86
|
+
|
|
87
|
+
The `#UserStateTracker` accumulates user activity — what section they're viewing, what symbol is selected, theme preference. This state is served to `paradigm_platform_observe` so the agent can reason about what the user is looking at.
|
|
88
|
+
|
|
89
|
+
Browser clients report activity via WebSocket messages: `user:navigate`, `user:select`, `user:theme`, `user:mute`.
|
|
90
|
+
|
|
91
|
+
### Visual Treatment
|
|
92
|
+
|
|
93
|
+
| Element | Human | Agent |
|
|
94
|
+
|---------|-------|-------|
|
|
95
|
+
| Selection ring | Solid 2px blue | Dashed 2px agent-color |
|
|
96
|
+
| Highlight | N/A | Pulsing glow animation |
|
|
97
|
+
| Toast | N/A | Left border + robot icon |
|
|
98
|
+
| Navigation | Instant | 300ms ease + toast notification |
|
|
99
|
+
|
|
100
|
+
### Browser Architecture
|
|
101
|
+
|
|
102
|
+
The agent UI layer sits alongside existing stores:
|
|
103
|
+
|
|
104
|
+
- `agentStore.ts` — Zustand store managing presence, highlights, annotations, toasts, mute, pending navigation
|
|
105
|
+
- `useAgentEffects` — Hook connecting WebSocket `agent:*` messages to store actions, with auto-reconnect
|
|
106
|
+
- `useActivityReporter` — Hook reporting section/theme changes back to server
|
|
107
|
+
- `AgentToast` — Severity-colored toast component
|
|
108
|
+
- `AgentCallout` — Floating callout overlay + navigation conflict prompt
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-501-review-compliance
|
|
3
|
+
title: Automated Review Pipeline & Compliance Checking
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-501
|
|
11
|
+
symbols: []
|
|
12
|
+
difficulty: beginner
|
|
13
|
+
estimatedMinutes: 2
|
|
14
|
+
prerequisites: []
|
|
15
|
+
category: paradigm-core
|
|
16
|
+
origin: imported
|
|
17
|
+
source: courses/para-501.json
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## paradigm review
|
|
21
|
+
|
|
22
|
+
The automated review pipeline uses a two-stage protocol:
|
|
23
|
+
|
|
24
|
+
### Stage 1: Spec Compliance (always runs)
|
|
25
|
+
|
|
26
|
+
- **Purpose coverage**: All touched symbols registered in .purpose files
|
|
27
|
+
- **Portal gate compliance**: Routes declared in portal.yaml with gates
|
|
28
|
+
- **Aspect anchors**: Anchor files still exist, no drift
|
|
29
|
+
- **Broken references**: Parent symbols exist
|
|
30
|
+
- **Route coverage**: New routes have portal.yaml entries
|
|
31
|
+
|
|
32
|
+
### Stage 2: Code Quality (--deep only)
|
|
33
|
+
|
|
34
|
+
- **Security**: eval() detection, hardcoded secrets
|
|
35
|
+
- **Convention**: console.log usage (use Paradigm logger)
|
|
36
|
+
- **Test coverage**: Gaps in test files
|
|
37
|
+
|
|
38
|
+
### ReviewFinding Format
|
|
39
|
+
|
|
40
|
+
Each finding has:
|
|
41
|
+
- **type**: blocking (must fix), improvement (should fix), note (informational)
|
|
42
|
+
- **category**: purpose-coverage, portal-compliance, aspect-anchors, security, convention
|
|
43
|
+
- **message**: Human-readable description
|
|
44
|
+
- **suggestion**: How to fix it
|
|
45
|
+
|
|
46
|
+
### Usage
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
paradigm review # Staged changes
|
|
50
|
+
paradigm review --pr 123 # PR via gh CLI
|
|
51
|
+
paradigm review --ci # Exit 1 on blocking
|
|
52
|
+
paradigm review --deep # Include code quality
|
|
53
|
+
paradigm review --json # JSON output
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Dynamic Tool Loading
|
|
57
|
+
|
|
58
|
+
Tools are organized in three tiers:
|
|
59
|
+
- **Core** (~15 tools): Always loaded (search, ripple, status, navigate, etc.)
|
|
60
|
+
- **Feature**: Auto-detected from filesystem (lore → .paradigm/lore/, etc.)
|
|
61
|
+
- **Advanced**: On-demand via `paradigm_tool_activate`
|
|
62
|
+
|
|
63
|
+
## Response Format
|
|
64
|
+
|
|
65
|
+
`response_format: 'concise'` on high-traffic tools strips secondary data:
|
|
66
|
+
- paradigm_search: returns only { symbol, type }
|
|
67
|
+
- paradigm_ripple: returns only { symbol, impact, summary }
|
|
68
|
+
- paradigm_status: returns only { project, counts, total }
|
|
69
|
+
|
|
70
|
+
## compliance-checker.ts
|
|
71
|
+
|
|
72
|
+
Shared logic extracted from pm.ts postflight. Both `paradigm_pm_postflight` and `paradigm review` use the same compliance checks.
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-501-sentinel-deep-dive
|
|
3
|
+
title: Sentinel Deep Dive
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-501
|
|
11
|
+
- symbolic-incident-records
|
|
12
|
+
- flow-position-tracking
|
|
13
|
+
- automatic-incident-grouping
|
|
14
|
+
symbols: []
|
|
15
|
+
difficulty: beginner
|
|
16
|
+
estimatedMinutes: 6
|
|
17
|
+
prerequisites: []
|
|
18
|
+
category: paradigm-core
|
|
19
|
+
origin: imported
|
|
20
|
+
source: courses/para-501.json
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Beyond Stack Traces
|
|
24
|
+
|
|
25
|
+
Traditional error tracking gives you a stack trace and a count. Paradigm Sentinel gives you *symbolic context* — which component failed, where in a flow it failed, what gate was being evaluated, and which known pattern matches the failure. This transforms incident response from "read the stack trace and hope" to "match against institutional knowledge and follow a resolution strategy."
|
|
26
|
+
|
|
27
|
+
## Symbolic Incident Records
|
|
28
|
+
|
|
29
|
+
When Sentinel records an incident, it captures both technical and symbolic context:
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
id: INC-042
|
|
33
|
+
timestamp: "2026-02-21T02:15:00Z"
|
|
34
|
+
status: open
|
|
35
|
+
error:
|
|
36
|
+
message: "Cannot read property 'id' of null"
|
|
37
|
+
stack: "at PaymentProcessor.processRefund (payment-processor.ts:142)"
|
|
38
|
+
type: TypeError
|
|
39
|
+
symbols:
|
|
40
|
+
component: "#payment-processor"
|
|
41
|
+
flow: "$refund-flow"
|
|
42
|
+
gate: "^authenticated"
|
|
43
|
+
flowPosition:
|
|
44
|
+
flowId: "$refund-flow"
|
|
45
|
+
expected: ["^authenticated", "^refund-eligible", "#process-refund", "!refund-completed"]
|
|
46
|
+
actual: ["^authenticated", "^refund-eligible", "#process-refund"]
|
|
47
|
+
missing: ["!refund-completed"]
|
|
48
|
+
failedAt: "#process-refund"
|
|
49
|
+
environment: production
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The `flowPosition` field is critical — it tells you exactly where in the defined flow the failure occurred. The refund flow expected 4 steps; only 3 completed. The failure happened at `#process-refund`, and the `!refund-completed` signal never fired. This immediately narrows the investigation to the refund processing logic.
|
|
53
|
+
|
|
54
|
+
## Incident Grouping
|
|
55
|
+
|
|
56
|
+
Sentinel automatically groups related incidents using symbolic similarity. When two incidents share the same component, flow, and error pattern, they form a group. The grouping algorithm uses a similarity threshold of 0.6 — incidents must share at least 60% of their symbolic context to cluster.
|
|
57
|
+
|
|
58
|
+
An `IncidentGroup` tracks the common symbols, error patterns, occurrence count, first/last seen timestamps, and which environments are affected. If a group matches a known failure pattern, Sentinel attaches it as a `suggestedPattern`.
|
|
59
|
+
|
|
60
|
+
## Failure Patterns
|
|
61
|
+
|
|
62
|
+
Patterns are the institutional knowledge of your error handling. Each pattern defines matching criteria and a resolution strategy:
|
|
63
|
+
|
|
64
|
+
```yaml
|
|
65
|
+
id: payment-null-ref-001
|
|
66
|
+
name: "Null reference in payment processing"
|
|
67
|
+
pattern:
|
|
68
|
+
symbols:
|
|
69
|
+
component: "#payment-processor"
|
|
70
|
+
errorType: [TypeError]
|
|
71
|
+
errorContains: ["Cannot read property", "null"]
|
|
72
|
+
resolution:
|
|
73
|
+
description: "Add null check before accessing refund object properties"
|
|
74
|
+
strategy: fix-code
|
|
75
|
+
priority: high
|
|
76
|
+
symbolsToModify: ["#payment-processor"]
|
|
77
|
+
filesLikelyInvolved: ["src/services/payment-processor.ts"]
|
|
78
|
+
confidence:
|
|
79
|
+
score: 85
|
|
80
|
+
timesMatched: 12
|
|
81
|
+
timesResolved: 10
|
|
82
|
+
timesRecurred: 2
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Six resolution strategies exist: `retry` (transient failure), `fallback` (use alternative path), `fix-data` (data issue), `fix-code` (bug), `ignore` (known harmless), and `escalate` (needs human decision). Pattern priority ranges from `low` through `medium` and `high` to `critical`.
|
|
86
|
+
|
|
87
|
+
Patterns come from four sources: `manual` (team-created), `suggested` (Sentinel auto-generated from groups), `imported` (from another project), and `community` (shared patterns). Paradigm ships 26 seed patterns covering common failures like incomplete flows, gate bypasses, state race conditions, and unhandled signals.
|
|
88
|
+
|
|
89
|
+
## The Triage Workflow
|
|
90
|
+
|
|
91
|
+
Sentinel follows a defined lifecycle for incidents:
|
|
92
|
+
|
|
93
|
+
1. **Record** — `paradigm_sentinel_record` creates the incident with error details, symbolic context, and optional flow position. The incident starts as `open`.
|
|
94
|
+
|
|
95
|
+
2. **Triage** — `paradigm_sentinel_triage` lists incidents filtered by status, symbol, environment, or error text. The matcher automatically suggests patterns that fit each incident.
|
|
96
|
+
|
|
97
|
+
3. **Investigate** — `paradigm_sentinel_show` with `includeTimeline: true` shows the full flow timeline — every gate passed, signal emitted, and state change leading up to the failure. With `includeSimilar: true`, it surfaces related incidents that may share a root cause.
|
|
98
|
+
|
|
99
|
+
4. **Resolve** — `paradigm_sentinel_resolve` closes the incident with a resolution: which pattern applied (if any), the fix commit hash, PR URL, and notes. Resolved incidents feed back into pattern confidence scores.
|
|
100
|
+
|
|
101
|
+
5. **Pattern** — `paradigm_sentinel_add_pattern` creates new patterns from resolved incidents. When you fix a novel failure, capture the fix as a pattern so the next occurrence resolves faster.
|
|
102
|
+
|
|
103
|
+
The sequence is: **record → triage → show → resolve → add pattern**. This cycle builds institutional knowledge with every incident.
|
|
104
|
+
|
|
105
|
+
## Stats and Health Metrics
|
|
106
|
+
|
|
107
|
+
`paradigm_sentinel_stats` provides operational intelligence for a given time period: total incidents, open vs resolved counts, incidents by environment and day, pattern effectiveness (which patterns resolve most incidents vs which recur), symbol hotspots (components with the highest incident rates), and resolution metrics (average time to resolve, pattern vs manual resolution rates).
|
|
108
|
+
|
|
109
|
+
The `symbolHealth` view shows per-symbol incident history — use it to identify which components need hardening or refactoring.
|
|
110
|
+
|
|
111
|
+
## Logger Transports
|
|
112
|
+
|
|
113
|
+
Sentinel integrates with the Paradigm logger through a transport layer. The `LogTransport` interface defines a simple contract: a transport receives structured log entries and delivers them somewhere — a file, a remote API, a database, or Sentinel's ingestion endpoint.
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
interface LogTransport {
|
|
117
|
+
name: string;
|
|
118
|
+
send(entry: LogEntry): void | Promise<void>;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
The logger supports multiple transports simultaneously via `addTransport(transport)` and `removeTransport(name)`. By default, logs go to the console. Adding a `SentinelTransport` sends them to Sentinel's server as well, without changing any of your existing logging calls.
|
|
123
|
+
|
|
124
|
+
## The SentinelTransport Bridge
|
|
125
|
+
|
|
126
|
+
Connecting the Paradigm logger to Sentinel is a one-liner:
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
import { enableSentinel } from '@a-company/sentinel';
|
|
130
|
+
|
|
131
|
+
enableSentinel({ endpoint: 'http://localhost:3001' });
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
This call creates a `SentinelTransport` instance and registers it with the logger via `addTransport`. From that point forward, every `log.component(...)`, `log.gate(...)`, and `log.signal(...)` call is forwarded to Sentinel as a structured log entry. Error-level logs are automatically promoted to incident candidates.
|
|
135
|
+
|
|
136
|
+
The beauty of this design is zero code changes to your application. Your existing logger calls remain unchanged — the transport layer silently bridges them to Sentinel's observability pipeline.
|
|
137
|
+
|
|
138
|
+
## Metrics API
|
|
139
|
+
|
|
140
|
+
Sentinel's server exposes a metrics API for recording and querying application metrics:
|
|
141
|
+
|
|
142
|
+
**POST /api/metrics** — Record a metric data point. Supports three metric types:
|
|
143
|
+
- `counter` — Monotonically increasing values (e.g., request count, error count)
|
|
144
|
+
- `gauge` — Point-in-time values that can go up or down (e.g., active connections, queue depth)
|
|
145
|
+
- `histogram` — Distribution of values over time (e.g., response latency, payload size)
|
|
146
|
+
|
|
147
|
+
```json
|
|
148
|
+
{
|
|
149
|
+
"name": "api.requests.total",
|
|
150
|
+
"type": "counter",
|
|
151
|
+
"value": 1,
|
|
152
|
+
"labels": { "method": "POST", "route": "/api/payments" },
|
|
153
|
+
"timestamp": "2026-02-21T14:30:00Z"
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**GET /api/metrics** — Query metrics with optional filters by name, type, labels, and time range. Returns aggregated data suitable for dashboards and alerting.
|
|
158
|
+
|
|
159
|
+
## Traces API
|
|
160
|
+
|
|
161
|
+
Sentinel supports distributed tracing through span trees:
|
|
162
|
+
|
|
163
|
+
**POST /api/traces** — Record a trace span. Each span has a `traceId`, `spanId`, optional `parentSpanId`, `operationName`, `startTime`, `endTime`, and `tags`. Spans with the same `traceId` form a tree — the root span has no parent, and child spans reference their parent via `parentSpanId`.
|
|
164
|
+
|
|
165
|
+
**GET /api/traces** — Query traces by operation name, service, time range, or minimum duration. Returns full span trees with timing breakdowns.
|
|
166
|
+
|
|
167
|
+
## Service Registry
|
|
168
|
+
|
|
169
|
+
Sentinel maintains a live registry of services reporting data:
|
|
170
|
+
|
|
171
|
+
**POST /api/services** — Register or update a service. Each service entry includes name, version, environment, health status, and last-seen timestamp.
|
|
172
|
+
|
|
173
|
+
**GET /api/services** — List all registered services with their current health status and metadata. This provides a real-time view of what is running and where.
|