@a-company/paradigm 5.38.0 → 6.0.4
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-OATWIRHP.js → accept-orchestration-TIXUQQGR.js} +1 -1
- package/dist/add-UOR4INIV.js +8 -0
- package/dist/agent-MB3H5EZA.js +33 -0
- package/dist/{agent-loader-RIVI6QPP.js → agent-loader-VGBPL3TH.js} +1 -1
- package/dist/{agent-loader-RJRVO5GQ.js → agent-loader-W3RQJVW7.js} +1 -1
- package/dist/{agents-suggest-HYTFMQD3.js → agents-suggest-IKY6VD2R.js} +1 -1
- package/dist/{ambient-WTLYUAQM.js → ambient-AI42BOM5.js} +12 -12
- package/dist/{ambient-76YMUA5Q.js → ambient-FNNFB4AP.js} +1 -1
- package/dist/{assess-UFPYEJKP.js → assess-63WXHWJV.js} +1 -1
- package/dist/authority-FA3HLEOA.js +2 -0
- package/dist/{calibration-OLJYB5HN.js → calibration-BDHGYJOK.js} +1 -1
- package/dist/chunk-23T6UG73.js +605 -0
- package/dist/{chunk-4L7665QV.js → chunk-2AU5L333.js} +1 -1
- package/dist/{chunk-BOYQAMGC.js → chunk-4N56FRNE.js} +1 -1
- package/dist/{chunk-5QOCKWK5.js → chunk-4PSD5R7N.js} +2 -2
- package/dist/{chunk-MQIG6SMF.js → chunk-6QXBXZF6.js} +1 -1
- package/dist/{chunk-ORDKEGII.js → chunk-AMLD7IYC.js} +1 -1
- package/dist/{chunk-3DZK54RU.js → chunk-DBEWOKD6.js} +32 -7
- package/dist/{chunk-AGFPVSX5.js → chunk-F6E3HW45.js} +1 -1
- package/dist/{chunk-X3U3IGYT.js → chunk-GD4F2HC6.js} +2 -2
- package/dist/chunk-GRZQIKST.js +2 -0
- package/dist/{chunk-HOBHJPTL.js → chunk-IOVHF4SR.js} +1 -1
- package/dist/{chunk-RLCH7DXQ.js → chunk-K7X3Z3GL.js} +1 -1
- package/dist/{chunk-74SGKSRQ.js → chunk-KAFQA7HV.js} +2 -2
- package/dist/{chunk-NEJ4ZLCY.js → chunk-LAYBUKMB.js} +1 -1
- package/dist/{chunk-4VKSEOXZ.js → chunk-LPBCQM5Y.js} +3 -3
- package/dist/chunk-Q527BPUF.js +2 -0
- package/dist/{chunk-AO7ZSRME.js → chunk-TQOT2LBO.js} +2 -2
- 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-WXF5VFB4.js +111 -0
- package/dist/chunk-XQLO5URP.js +11 -0
- package/dist/{chunk-DOCDDDTD.js → chunk-YNDPSWOE.js} +5 -5
- package/dist/chunk-Z5QW6USC.js +2 -0
- package/dist/{compliance-D7GD6ZYC.js → compliance-J3VOV445.js} +1 -1
- package/dist/config-schema-FLHRVZMI.js +2 -0
- package/dist/{context-audit-XRPT3OU2.js → context-audit-JVCA6GSV.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-YGHBIJY5.js → diff-75MABOSL.js} +1 -1
- package/dist/{dist-KGRCLBJP-2QAPFYNF.js → dist-GQ42YS5N-4HIJZVBB.js} +10 -10
- package/dist/{docs-USDAF26F.js → docs-TSAAS4W3.js} +1 -1
- package/dist/doctor-L5XZENCF.js +2 -0
- package/dist/{edit-GUU3HBVW.js → edit-P3MDAZLU.js} +1 -1
- package/dist/{flow-FVZR3YJ4.js → flow-BGXOVE2V.js} +1 -1
- package/dist/{hooks-TFMMMB2H.js → hooks-KUEE5KMM.js} +1 -1
- package/dist/index.js +6 -6
- package/dist/init-M44SO65G.js +2 -0
- package/dist/{init-XYB62Q3X.js → init-V4KSEKPK.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 +4 -4
- package/dist/metrics-UESGUHTA.js +2 -0
- package/dist/{migrate-Z5UQN57G.js → migrate-ZPNYDNM4.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/migration-notices-BHLEYC4T.js +4 -0
- package/dist/{nomination-engine-EALA5MGI.js → nomination-engine-NCLTGMAK.js} +1 -1
- package/dist/{notebook-loader-PXNRBBXD.js → notebook-loader-3J2OFMS3.js} +1 -1
- package/dist/{orchestrate-M5PBZBJQ.js → orchestrate-K4KBTBYK.js} +1 -1
- package/dist/{platform-server-DNAMH4YI.js → platform-server-ANOALDPL.js} +1 -1
- package/dist/{portal-check-ZMLVBIGW.js → portal-check-DV2VSJ5E.js} +1 -1
- package/dist/portal-compliance-JONQ4SOP.js +2 -0
- package/dist/{probe-3FTG6LYO.js → probe-5HAXULAD.js} +1 -1
- package/dist/{providers-AWA7WLLM.js → providers-TBPOE4DI.js} +1 -1
- package/dist/quiz-WYIZJG5K.js +10 -0
- package/dist/{record-YXPB34MY.js → record-N3VNYYKJ.js} +1 -1
- package/dist/registry-OUTA3DXW.js +20 -0
- package/dist/reindex-IZCD2JGD.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/{sentinel-HYAZ3CO5.js → sentinel-EFPEX246.js} +1 -1
- package/dist/{sentinel-bridge-VR357PKL.js → sentinel-bridge-UR2MKARY.js} +1 -1
- package/dist/{serve-U47GULB6.js → serve-3FMUWW5K.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-HHNY6J4I.js +2 -0
- package/dist/{session-work-log-ZP45TREI.js → session-work-log-MEJ33TYD.js} +1 -1
- package/dist/{session-work-log-PAKXOFGL.js → session-work-log-ZVVJGO7X.js} +1 -1
- package/dist/{setup-FEWSYS3Y.js → setup-ZSEC72BS.js} +1 -1
- package/dist/shift-WGMZGWOC.js +60 -0
- package/dist/{show-PJ5LFLIL.js → show-JH7LJ5MT.js} +1 -1
- package/dist/show-WVHAL4VU.js +7 -0
- package/dist/{spawn-M5BAV252.js → spawn-KKDDR6UR.js} +1 -1
- package/dist/status-S7Z5FVIE.js +6 -0
- package/dist/{summary-PYTEIJ4U.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-PDK64JXI.js → team-2LGZQRP4.js} +1 -1
- package/dist/{timeline-K3ZFKJ3R.js → timeline-RK7O2SCM.js} +1 -1
- package/dist/tools-4RRFTU5H.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-451-agent-routing.md +117 -0
- package/dist/university-content/notes/N-para-451-archetypes-vs-instances.md +82 -0
- package/dist/university-content/notes/N-para-451-identity-layers.md +76 -0
- package/dist/university-content/notes/N-para-451-orchestration-modes.md +85 -0
- package/dist/university-content/notes/N-para-451-paradigm-shift.md +95 -0
- package/dist/university-content/notes/N-para-451-partners-primitive.md +107 -0
- package/dist/university-content/notes/N-para-451-roster-management.md +132 -0
- package/dist/university-content/notes/N-para-451-roster-reference.md +106 -0
- package/dist/university-content/notes/N-para-451-the-team-pattern.md +87 -0
- package/dist/university-content/notes/N-para-451-tiers.md +81 -0
- package/dist/university-content/notes/N-para-451-welcome.md +55 -0
- package/dist/university-content/notes/N-para-451-what-is-an-agent.md +73 -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-451.yaml +69 -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-451-foundations.yaml +154 -0
- package/dist/university-content/quizzes/Q-para-451-when-to-invoke.yaml +182 -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-XUQZTF3H.js +9 -0
- package/dist/{watch-YCODNIET.js → watch-25GJHQYT.js} +1 -1
- 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 +2 -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/dist/add-P76GEMGF.js +0 -8
- package/dist/agent-X6I2YWOB.js +0 -33
- package/dist/chunk-JQKKVAAN.js +0 -2
- package/dist/chunk-NQ47TA6C.js +0 -111
- package/dist/chunk-ODVKPZZ4.js +0 -2
- package/dist/chunk-Q2J542ST.js +0 -2
- package/dist/chunk-RBLK34IA.js +0 -11
- package/dist/chunk-RN4VE6P3.js +0 -521
- package/dist/chunk-WS2N27RX.js +0 -3
- package/dist/config-schema-GUQY2QN7.js +0 -2
- package/dist/decision-loader-2XPZE4EZ.js +0 -2
- package/dist/doctor-WMVULMQD.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-compliance-6YR27IQU.js +0 -2
- package/dist/quiz-FE5UGAY2.js +0 -10
- package/dist/registry-KOOKFUWD.js +0 -20
- package/dist/reindex-I6LPAKCC.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/shift-PC6C7NUX.js +0 -60
- package/dist/show-BOAVWZPZ.js +0 -7
- package/dist/status-A37ECYNJ.js +0 -6
- package/dist/sync-DLUBV5HQ.js +0 -2
- package/dist/tools-5ITPEPSV.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/platform-ui/dist/assets/LoreSection-oO5dCe6O.js +0 -1
- /package/dist/{chunk-BV5PRPLB.js → chunk-HXGYVS2N.js} +0 -0
- /package/templates/paradigm/specs/{scan.md → probe.md} +0 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-501-symphony-networking
|
|
3
|
+
title: 'Symphony Networking: Cross-Machine Relay'
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-501
|
|
11
|
+
- hub-and-spoke-topology-one
|
|
12
|
+
- websocket-relay-watches
|
|
13
|
+
- pairing-6-digit-code
|
|
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
|
+
## Beyond Single-Machine Messaging
|
|
24
|
+
|
|
25
|
+
Symphony Phase 0 (A-Mail) established file-based agent-to-agent messaging on a single machine — JSONL mailboxes at `~/.paradigm/score/`, polled via `/loop`. But what happens when two developers on the same WiFi, or at different locations, want their Claude instances to collaborate?
|
|
26
|
+
|
|
27
|
+
Symphony Phase 1 adds cross-machine networking via a WebSocket relay. The key design principle: **the local mailbox model is unchanged**. Networking is a transparent sync layer that watches local outboxes and delivers remote messages to local inboxes.
|
|
28
|
+
|
|
29
|
+
## Hub-and-Spoke Topology
|
|
30
|
+
|
|
31
|
+
One machine runs `paradigm symphony serve` (the **hub**), and others connect with `paradigm symphony join --remote` (the **spokes**). The hub relays messages between all connected machines.
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
Machine A (Hub) Machine B (Spoke)
|
|
35
|
+
┌─────────────────────┐ ┌─────────────────────┐
|
|
36
|
+
│ ~/.paradigm/score/ │ │ ~/.paradigm/score/ │
|
|
37
|
+
│ agents/projA/core │ │ agents/projB/core │
|
|
38
|
+
│ inbox.jsonl │◄────ws───►│ inbox.jsonl │
|
|
39
|
+
│ outbox.jsonl │ :3939 │ outbox.jsonl │
|
|
40
|
+
└─────────────────────┘ └─────────────────────┘
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The relay watches each local agent's outbox file (polling every 2 seconds via `fs.stat`). When new messages appear, they're pushed to all connected peers as WebSocket frames. Incoming messages from peers are written to the appropriate local inbox via `appendToInbox()`.
|
|
44
|
+
|
|
45
|
+
## Pairing & Authentication
|
|
46
|
+
|
|
47
|
+
Security is critical when connecting machines over a network. Symphony uses a pairing code + HMAC challenge-response protocol:
|
|
48
|
+
|
|
49
|
+
1. The hub generates a 32-byte random secret and derives a **6-digit pairing code**
|
|
50
|
+
2. The code is displayed on the hub's terminal
|
|
51
|
+
3. The spoke connects and receives a `hello` frame with a random challenge nonce
|
|
52
|
+
4. The user enters the code on the spoke terminal (or embeds it in the connection string)
|
|
53
|
+
5. The spoke computes `HMAC-SHA256(challenge, SHA256(code))` and sends an `auth` frame
|
|
54
|
+
6. The hub verifies the code and HMAC proof, then sends `auth_ok` with its agent list
|
|
55
|
+
|
|
56
|
+
Pairing codes rotate every 5 minutes. After 3 failed attempts from the same IP, a 60-second cooldown is enforced. Peer records are saved to `~/.paradigm/score/peers.json` (file mode 0600) for auto-reconnect.
|
|
57
|
+
|
|
58
|
+
## Two Connection Modes
|
|
59
|
+
|
|
60
|
+
### LAN Pairing (same WiFi)
|
|
61
|
+
|
|
62
|
+
```sh
|
|
63
|
+
# Machine A (hub)
|
|
64
|
+
paradigm symphony serve
|
|
65
|
+
# Shows: Pairing Code: 847 291
|
|
66
|
+
|
|
67
|
+
# Machine B (spoke)
|
|
68
|
+
paradigm symphony join --remote 192.168.1.42:3939
|
|
69
|
+
# Prompted for code
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Internet Direct Connect
|
|
73
|
+
|
|
74
|
+
```sh
|
|
75
|
+
# Machine A
|
|
76
|
+
paradigm symphony serve --public
|
|
77
|
+
# Shows connection string
|
|
78
|
+
|
|
79
|
+
# Machine B
|
|
80
|
+
paradigm symphony join --remote 73.162.44.103:3939#847291
|
|
81
|
+
# Code embedded — no prompt
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Internet mode requires port 3939 to be reachable (port forward, VPN, or SSH tunnel).
|
|
85
|
+
|
|
86
|
+
## Trust Management
|
|
87
|
+
|
|
88
|
+
Peers are managed via CLI commands:
|
|
89
|
+
|
|
90
|
+
- `paradigm symphony peers` — List trusted peers with agent counts and last-seen times
|
|
91
|
+
- `paradigm symphony peers revoke <id>` — Immediately disconnect and block reconnection
|
|
92
|
+
- `paradigm symphony peers forget --force` — Clear all peer trust records
|
|
93
|
+
|
|
94
|
+
Existing `trust.yaml` hard-deny patterns (`.env*`, `*.key`, `*.pem`) apply to remote file requests — the trust boundary extends across the network.
|
|
95
|
+
|
|
96
|
+
## Relay Internals
|
|
97
|
+
|
|
98
|
+
The `SymphonyRelay` class handles both server and client modes:
|
|
99
|
+
|
|
100
|
+
- **Outbox watcher**: Polls every 2s, compares outbox line counts against stored positions, forwards new messages
|
|
101
|
+
- **Deduplication**: Bounded `Set<string>` of message IDs (max 10,000) prevents duplicate delivery
|
|
102
|
+
- **Keepalive**: Ping/pong every 30s with 10s pong timeout. Dead connections are auto-terminated
|
|
103
|
+
- **Auto-reconnect**: Client mode uses exponential backoff (1s → 2s → 4s → ... → 30s max)
|
|
104
|
+
- **Rate limiting**: 3 failed auth attempts from the same IP triggers a 60s cooldown
|
|
105
|
+
|
|
106
|
+
## Remote Agent Visibility
|
|
107
|
+
|
|
108
|
+
Remote agents appear throughout the Symphony CLI and MCP tools:
|
|
109
|
+
|
|
110
|
+
- `paradigm symphony list` shows remote agents with a `(remote: peer-name)` tag
|
|
111
|
+
- `paradigm symphony status` includes peer count and remote agent totals
|
|
112
|
+
- `paradigm_symphony_status` MCP tool returns a `peers` array in its response
|
|
113
|
+
- Platform UI `GET /api/symphony/peers` endpoint returns connected peer data
|
|
114
|
+
|
|
115
|
+
Local MCP tools (`peek`, `poll`, `send`) work unchanged — they just read/write local files. The relay handles the network transport transparently.
|
|
116
|
+
|
|
117
|
+
## Backward Compatibility
|
|
118
|
+
|
|
119
|
+
If `paradigm symphony serve` is never run, Symphony operates exactly as Phase 0: local-only file-based messaging. Networking is purely additive — no existing workflows change.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-501-task-management
|
|
3
|
+
title: Task Management
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-501
|
|
11
|
+
- tasks-are-persistent
|
|
12
|
+
- auto-generated-ids-t-date-sequence
|
|
13
|
+
- three-priority-levels
|
|
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
|
+
## Why Tasks Exist
|
|
24
|
+
|
|
25
|
+
AI agent sessions are stateless. You can discuss a plan, identify five things that need doing, and then the session ends. The next session starts blank — those five items are gone. Sticky notes on a monitor do not help when your developer is a language model.
|
|
26
|
+
|
|
27
|
+
Paradigm's Task Management system provides a persistent scratch pad that survives context windows. Tasks are lightweight, date-partitioned YAML entries that capture what needs doing, how urgent it is, and what project knowledge relates to it. They are not a full project management system — they are the missing short-term memory between sessions.
|
|
28
|
+
|
|
29
|
+
The key difference from lore: lore records what happened (past tense). Tasks record what should happen (future tense). Together they form a complete timeline — memory of the past and intention for the future.
|
|
30
|
+
|
|
31
|
+
## Anatomy of a Task
|
|
32
|
+
|
|
33
|
+
Every task follows a consistent structure:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
id: T-2026-02-26-001
|
|
37
|
+
blurb: "Add rate limiting to the /api/payments endpoint"
|
|
38
|
+
priority: high
|
|
39
|
+
status: open
|
|
40
|
+
tags: [security, payments]
|
|
41
|
+
related_lore: [L-2026-02-25-003]
|
|
42
|
+
created: "2026-02-26T10:15:00Z"
|
|
43
|
+
updated: "2026-02-26T10:15:00Z"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The `id` field is auto-generated: `T-{date}-{sequence}`, following the same date-partitioned pattern as lore entries. The `blurb` is the only required field — a concise description of what needs to be done. Everything else is optional but useful.
|
|
47
|
+
|
|
48
|
+
Three priority levels exist: `high` (do this soon), `medium` (do this eventually), and `low` (nice to have). Tasks without an explicit priority default to `medium`.
|
|
49
|
+
|
|
50
|
+
Three statuses track lifecycle: `open` (needs doing), `done` (completed), and `shelved` (parked for later — not abandoned, just deferred).
|
|
51
|
+
|
|
52
|
+
## Storage: Date-Partitioned YAML
|
|
53
|
+
|
|
54
|
+
Tasks live in `.paradigm/tasks/entries/` organized by creation date:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
.paradigm/tasks/
|
|
58
|
+
entries/
|
|
59
|
+
2026-02-25/
|
|
60
|
+
T-2026-02-25-001.yaml
|
|
61
|
+
T-2026-02-25-002.yaml
|
|
62
|
+
2026-02-26/
|
|
63
|
+
T-2026-02-26-001.yaml
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Date partitioning keeps directories small. Each task is a standalone YAML file, making them easy to read, edit, and version-control. The date in the path matches the date in the task ID.
|
|
67
|
+
|
|
68
|
+
## The Five MCP Tools
|
|
69
|
+
|
|
70
|
+
**`paradigm_task_create`** — Create a new task. The `blurb` field is required — a short description of what needs to be done. Optional fields include `priority` (high/medium/low), `tags` (for categorization and filtering), and `related_lore` (linking to lore entries that provide context). The task is written to the correct date directory with an auto-incremented ID and starts with status `open`.
|
|
71
|
+
|
|
72
|
+
**`paradigm_task_list`** — List tasks with filters. Filter by `status` (open/done/shelved/all), `priority` (high/medium/low), or `tag`. Results are sorted by priority (high first) then by date (newest first). Without filters, it returns all open tasks.
|
|
73
|
+
|
|
74
|
+
**`paradigm_task_update`** — Update any field on an existing task by ID. You can change the blurb, priority, status, tags, or related_lore. Only specified fields are modified — everything else is preserved.
|
|
75
|
+
|
|
76
|
+
**`paradigm_task_done`** — Shorthand to mark a task as complete. Pass the task ID and the status changes to `done` with an updated timestamp. This is equivalent to `paradigm_task_update` with `status: done` but more ergonomic for the common case.
|
|
77
|
+
|
|
78
|
+
**`paradigm_task_shelve`** — Shorthand to shelve a task for later. Pass the task ID and the status changes to `shelved`. Shelved tasks are not deleted — they remain searchable and can be reopened by updating their status back to `open`.
|
|
79
|
+
|
|
80
|
+
## Session Recovery Integration
|
|
81
|
+
|
|
82
|
+
The top 5 open tasks are automatically surfaced during session recovery. When a new session starts and the agent calls any Paradigm MCP tool, the recovery data includes the highest-priority open tasks alongside the usual breadcrumbs and checkpoint data.
|
|
83
|
+
|
|
84
|
+
This means every session begins with awareness of outstanding work. The agent does not need to ask "what should I work on?" — the task list is already there, sorted by priority. This is the scratch-pad-that-survives pattern: write tasks in one session, see them in the next.
|
|
85
|
+
|
|
86
|
+
## When to Create Tasks
|
|
87
|
+
|
|
88
|
+
Create tasks when:
|
|
89
|
+
- You identify work that cannot be completed in the current session
|
|
90
|
+
- A code review surfaces follow-up items
|
|
91
|
+
- You discover a bug or improvement while working on something else
|
|
92
|
+
- The user mentions something that should be tracked but is not the current focus
|
|
93
|
+
- A handoff needs to communicate specific next steps
|
|
94
|
+
|
|
95
|
+
Do not use tasks for:
|
|
96
|
+
- Tracking completed work (that is what lore is for)
|
|
97
|
+
- Long-term roadmap items (use your project management tool)
|
|
98
|
+
- Architectural decisions (use lore entries with type `decision`)
|
|
99
|
+
|
|
100
|
+
Tasks are ephemeral intentions — they should be created quickly, completed or shelved promptly, and never allowed to accumulate into a backlog of hundreds. If your task list grows beyond 20-30 open items, it is time to triage: shelve the low-priority items and focus on what matters.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-601-agent-renaissance
|
|
3
|
+
title: Agent Manifest Renaissance
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-601
|
|
11
|
+
- six-new-dimensions
|
|
12
|
+
- intrinsic-learning-optional
|
|
13
|
+
- five-collaboration-stances
|
|
14
|
+
symbols: []
|
|
15
|
+
difficulty: beginner
|
|
16
|
+
estimatedMinutes: 5
|
|
17
|
+
prerequisites: []
|
|
18
|
+
category: paradigm-core
|
|
19
|
+
origin: imported
|
|
20
|
+
source: courses/para-601.json
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Six New Dimensions
|
|
24
|
+
|
|
25
|
+
Before v5.0, an agent profile (`AgentProfile`) had six core fields: `id`, `role`, `description`, `personality`, `expertise`, and `transferable` patterns. These covered identity and knowledge but said nothing about how agents observe, learn, contribute context, report work, collaborate, or decide when to speak up.
|
|
26
|
+
|
|
27
|
+
v5.0 adds six new dimensions to the agent manifest, transforming it from a static identity card into a living behavioral specification:
|
|
28
|
+
|
|
29
|
+
1. **Attention** (`AgentAttention`) — What this agent notices in the event stream
|
|
30
|
+
2. **Learning** (`AgentLearning`) — How this agent improves over time
|
|
31
|
+
3. **Context** (`AgentContext`) — What this agent contributes to shared context
|
|
32
|
+
4. **Reporting** (`AgentReporting`) — How this agent logs work and learnings
|
|
33
|
+
5. **Collaboration** (`AgentCollaboration`) — How this agent interacts with others
|
|
34
|
+
6. **Nomination** (`AgentNomination`) — When this agent speaks up in ambient mode
|
|
35
|
+
|
|
36
|
+
All six are optional on the `AgentProfile` interface for backward compatibility. Agents without these fields use sensible defaults or are treated as non-ambient (they do not participate in the observation-nomination loop).
|
|
37
|
+
|
|
38
|
+
## Attention (AgentAttention)
|
|
39
|
+
|
|
40
|
+
Covered in detail in the Attention & Scoring lesson. The attention dimension defines what the agent watches for: symbol patterns, file paths, semantic concepts, and signal types. The threshold determines sensitivity.
|
|
41
|
+
|
|
42
|
+
Default configs exist for five standard roles via `DEFAULT_ATTENTION`. For example, the security agent defaults to watching all gate symbols (`^*`), auth-related components and paths, security concepts, and gate/route signals with a low threshold of 0.4.
|
|
43
|
+
|
|
44
|
+
## Learning (AgentLearning)
|
|
45
|
+
|
|
46
|
+
The learning dimension has two layers:
|
|
47
|
+
|
|
48
|
+
**Intrinsic Learning** (`IntrinsicLearning`) — The agent's own drive to improve. This is optional for downloaded agents (they may or may not want to learn from user feedback). Four sub-sections:
|
|
49
|
+
|
|
50
|
+
- **feedback** — When to ask for assessment: after work, after recommendations, from which agents, from humans. A security agent might configure `from_agents: ['architect', 'reviewer']` to weight peer feedback.
|
|
51
|
+
- **adaptation** — How to adjust: `confidence_ema_alpha` (default 0.3) controls how quickly confidence scores move. `notebook_auto_promote` auto-promotes high-value journal entries. `pattern_extraction` extracts reusable patterns from learnings.
|
|
52
|
+
- **reflection** — When to self-reflect: on failure, on correction, on debate loss. Each trigger records a journal entry with the relevant trigger type.
|
|
53
|
+
- **calibration** — Accuracy targets: `target_accuracy` (default 0.85) is the goal. `overconfidence_alert` (default 0.15) triggers when estimated confidence exceeds actual accuracy by more than 15 points.
|
|
54
|
+
|
|
55
|
+
**Platform Learning** (`PlatformLearning`) — Mandated for all marketplace agents. `feedback_required: true` is always set. Collects `work_outcome`, `helpfulness`, and `would_use_again` metrics. Feedback flows upstream anonymized. Aggregation is configurable per-offering, per-session, or per-project.
|
|
56
|
+
|
|
57
|
+
## Context (AgentContext)
|
|
58
|
+
|
|
59
|
+
The context dimension defines what the agent contributes to the composed context and what it requires to be loaded.
|
|
60
|
+
|
|
61
|
+
**Contributions** — An array of `ContextContribution` items. Each specifies a `section` name (e.g., "Security Warnings"), inline `content` or a `content_ref` MCP resource URI, and a `priority` (high, medium, low). High-priority contributions are always included in composed context. Medium-priority contributions are included if token budget allows. Low-priority contributions are loaded on demand.
|
|
62
|
+
|
|
63
|
+
**Requirements** — An array of `ContextRequirement` items specifying files or sections the agent needs loaded before it can work effectively. A security agent might require `portal.yaml` and the "gates" section of CLAUDE.md.
|
|
64
|
+
|
|
65
|
+
## Reporting (AgentReporting)
|
|
66
|
+
|
|
67
|
+
The reporting dimension controls how the agent captures its work and learnings in the knowledge streams.
|
|
68
|
+
|
|
69
|
+
**Work Log Config** (`WorkLogConfig`):
|
|
70
|
+
- `auto_record` — Automatically create work log entries when work completes
|
|
71
|
+
- `structure` — Which structured fields to include: `task_ref`, `files_modified`, `symbols_touched`, `next_steps`, `blockers`
|
|
72
|
+
- `destination` — Always `'work-log'`
|
|
73
|
+
|
|
74
|
+
**Learning Journal Config** (`LearningJournalConfig`):
|
|
75
|
+
- `auto_record` — Automatically record learning moments
|
|
76
|
+
- `triggers` — Which events trigger journal entries: `correction_received`, `confidence_miss`, `pattern_discovered`
|
|
77
|
+
- `destination` — Always `'journal'` (agent-private)
|
|
78
|
+
|
|
79
|
+
## Collaboration (AgentCollaboration)
|
|
80
|
+
|
|
81
|
+
The collaboration dimension defines how the agent interacts with others in multi-agent contexts.
|
|
82
|
+
|
|
83
|
+
**Default Stance** (`CollaborationStance`) — One of five stances:
|
|
84
|
+
- `lead` — Drives decisions, sets direction (architect default)
|
|
85
|
+
- `advisory` — Offers guidance but does not drive (reviewer, security defaults)
|
|
86
|
+
- `supportive` — Follows direction, executes (builder default)
|
|
87
|
+
- `observer` — Watches but rarely acts
|
|
88
|
+
- `peer` — Equal footing with no hierarchy
|
|
89
|
+
|
|
90
|
+
**Per-Agent Relationships** — The `with` record allows overriding stance per agent. A builder might be `supportive` by default but `peer` with another builder.
|
|
91
|
+
|
|
92
|
+
**Debate Config** — Controls debate behavior: `will_challenge` (will push back), `evidence_required` (must cite specific code/patterns), `escalate_to_human` (ask human if debate does not resolve).
|
|
93
|
+
|
|
94
|
+
Default configs exist via `DEFAULT_COLLABORATION`. The architect defaults to `lead` stance with evidence-based challenging and human escalation. The builder defaults to `supportive` with `can_contradict: false` toward the architect.
|
|
95
|
+
|
|
96
|
+
## Nomination (AgentNomination)
|
|
97
|
+
|
|
98
|
+
The nomination dimension defines behavioral rules for self-nomination beyond the threshold check.
|
|
99
|
+
|
|
100
|
+
**speak_when** — Conditions for speaking up:
|
|
101
|
+
- `relevance_above` — Score threshold (default 0.6, mirrors attention threshold)
|
|
102
|
+
- `urgency` — Always speak for specific urgency types: `security_risk`, `breaking_change`, `gate_missing`, `test_failure`, `performance_risk`
|
|
103
|
+
- `asked_directly` — Always respond to direct questions (default: true)
|
|
104
|
+
|
|
105
|
+
**quiet_when** — Conditions for staying silent:
|
|
106
|
+
- `relevance_below` — Hard floor below which the agent never speaks
|
|
107
|
+
- `another_agent_handling` — Stay quiet if another agent is already addressing this
|
|
108
|
+
- `human_explicitly_excluded` — Respect human's explicit exclusion
|
|
109
|
+
|
|
110
|
+
**contribution_style** — How the agent communicates:
|
|
111
|
+
- `brief_first` — Start with a short summary, elaborate if asked
|
|
112
|
+
- `cite_sources` — Reference specific code and patterns
|
|
113
|
+
- `offer_action` — Offer concrete actions rather than just observations
|
|
114
|
+
|
|
115
|
+
## buildProfileEnrichment
|
|
116
|
+
|
|
117
|
+
The `buildProfileEnrichment` function composes all six dimensions into a prompt enrichment string for orchestration. It takes the agent profile, relevant symbols, optional notebook entries, and optional ambient context (recent decisions, journal insights, pending nominations).
|
|
118
|
+
|
|
119
|
+
The output is structured markdown with sections for: Agent Identity, Expertise on Relevant Symbols, Transferable Patterns, Relevant Notebook Entries, Attention patterns, Collaboration stance, Nomination preferences, Recent Team Decisions, Transferable Insights, and Pending Nominations.
|
|
120
|
+
|
|
121
|
+
This enrichment is injected into the agent's prompt during orchestration, giving it full awareness of its identity, capabilities, behavioral rules, and ambient context — all derived from the `.agent` file and the knowledge streams.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-601-attention-scoring
|
|
3
|
+
title: Attention & Scoring
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-601
|
|
11
|
+
- agentattention-has-four
|
|
12
|
+
- four-scoring-dimensions
|
|
13
|
+
- score-is-max-based
|
|
14
|
+
symbols: []
|
|
15
|
+
difficulty: beginner
|
|
16
|
+
estimatedMinutes: 5
|
|
17
|
+
prerequisites: []
|
|
18
|
+
category: paradigm-core
|
|
19
|
+
origin: imported
|
|
20
|
+
source: courses/para-601.json
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## AgentAttention Patterns
|
|
24
|
+
|
|
25
|
+
Every agent in the ambient system has an attention configuration — a set of patterns that define what the agent notices. Think of it as a personalized filter: events that match the agent's attention patterns are potentially relevant; events that do not match are noise.
|
|
26
|
+
|
|
27
|
+
The `AgentAttention` interface has five fields:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
interface AgentAttention {
|
|
31
|
+
symbols?: string[]; // Symbol patterns (e.g., ["^*", "#*-middleware"])
|
|
32
|
+
paths?: string[]; // File path patterns (e.g., ["auth/**", "middleware/**"])
|
|
33
|
+
concepts?: string[]; // Semantic triggers (e.g., ["JWT", "RBAC", "injection"])
|
|
34
|
+
signals?: AttentionSignal[]; // Event type triggers (e.g., [{ type: "gate-added" }])
|
|
35
|
+
threshold?: number; // Confidence threshold (default 0.6)
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Symbols** use glob patterns to match against the `symbols` array on events. A security agent watching `["^*", "#*-auth", "#*-middleware"]` will match any gate symbol and any component whose name ends in `-auth` or `-middleware`.
|
|
40
|
+
|
|
41
|
+
**Paths** use glob patterns to match against the `path` field on events. A builder watching `["src/**", "lib/**", "packages/**"]` matches any source file change.
|
|
42
|
+
|
|
43
|
+
**Concepts** are semantic keywords matched against the event's `context`, `keywords`, and `type` fields (all lowercased). A tester watching `["test", "coverage", "assertion"]` will match events mentioning those terms.
|
|
44
|
+
|
|
45
|
+
**Signals** match against the event's `type` field. A security agent with `signals: [{ type: 'gate-added' }, { type: 'route-created' }]` will match whenever a new gate or route appears in the stream.
|
|
46
|
+
|
|
47
|
+
## Four Scoring Dimensions
|
|
48
|
+
|
|
49
|
+
When an event enters the stream, each agent scores it against their attention patterns across four dimensions:
|
|
50
|
+
|
|
51
|
+
**symbolMatch (0.0-1.0):** For each pattern in the agent's `symbols` array, check if any symbol in the event matches (using glob). If any match is found, `symbolMatch = 1.0`. If no agent symbols are defined or no event symbols exist, `symbolMatch = 0.0`.
|
|
52
|
+
|
|
53
|
+
**pathMatch (0.0-1.0):** For each pattern in the agent's `paths` array, check if the event's `path` matches. If any match is found, `pathMatch = 1.0`. Binary: either a path matches or it does not.
|
|
54
|
+
|
|
55
|
+
**conceptMatch (0.0-1.0):** The event's `context`, `keywords`, and `type` are joined into a lowercased text. Each concept in the agent's `concepts` array is checked for inclusion. The score is `matched / total_concepts`. If the agent watches 5 concepts and 3 appear in the event text, `conceptMatch = 0.6`.
|
|
56
|
+
|
|
57
|
+
**signalMatch (0.0-1.0):** For each signal in the agent's `signals` array, check if the event's `type` matches. If any match, `signalMatch = 1.0`. Binary.
|
|
58
|
+
|
|
59
|
+
## Max-Based Score
|
|
60
|
+
|
|
61
|
+
The overall score is the **maximum** of the four dimensions:
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
const score = Math.max(symbolMatch, pathMatch, conceptMatch, signalMatch);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
This is a deliberate design choice. Using max (rather than average or weighted sum) means a single strong match is enough to trigger attention. A security agent does not need to match on all four dimensions — if the event mentions a gate symbol (`symbolMatch = 1.0`), that alone is sufficient even if the file path, concepts, and signals do not match.
|
|
68
|
+
|
|
69
|
+
The alternative (averaging) would dilute strong signals: a perfect symbol match (1.0) with no other matches would average to 0.25, likely falling below the threshold. Max scoring ensures that domain-specific expertise in any single dimension is respected.
|
|
70
|
+
|
|
71
|
+
## Threshold-Based Self-Nomination
|
|
72
|
+
|
|
73
|
+
After scoring, the agent checks its threshold:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
const threshold = attention.threshold ?? 0.6;
|
|
77
|
+
const shouldNominate = score >= threshold;
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
If the score meets or exceeds the threshold, the agent should self-nominate a contribution. If not, the agent stays quiet, and the `quietReason` field records why: `'below-threshold'`.
|
|
81
|
+
|
|
82
|
+
The default threshold is 0.6, but different agent roles have different defaults based on their domain:
|
|
83
|
+
|
|
84
|
+
| Role | Default Threshold | Rationale |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| architect | 0.5 | Broad awareness — should notice most structural changes |
|
|
87
|
+
| builder | 0.7 | Focused — only speaks when directly relevant to implementation |
|
|
88
|
+
| reviewer | 0.6 | Balanced — watches code quality and patterns |
|
|
89
|
+
| tester | 0.5 | Broad — testing intersects all areas |
|
|
90
|
+
| security | 0.4 | Most sensitive — should speak up early and often |
|
|
91
|
+
|
|
92
|
+
A lower threshold means the agent speaks up more often (more false positives, fewer missed issues). A higher threshold means the agent speaks up less often (fewer false positives, more missed issues). Security uses 0.4 because the cost of missing a security issue far outweighs the cost of a false alarm.
|
|
93
|
+
|
|
94
|
+
## scoreEventForAgent
|
|
95
|
+
|
|
96
|
+
The `scoreEventForAgent` function ties everything together:
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
function scoreEventForAgent(
|
|
100
|
+
event: StreamEvent,
|
|
101
|
+
agentId: string,
|
|
102
|
+
attention: AgentAttention
|
|
103
|
+
): AttentionScore
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
It returns an `AttentionScore` with five fields:
|
|
107
|
+
- `agentId` — Which agent evaluated this event
|
|
108
|
+
- `score` — Overall relevance (0.0-1.0)
|
|
109
|
+
- `breakdown` — The four dimension scores (`symbolMatch`, `pathMatch`, `conceptMatch`, `signalMatch`)
|
|
110
|
+
- `shouldNominate` — Whether the score exceeds the agent's threshold
|
|
111
|
+
- `quietReason` — Why the agent stayed quiet (if it did)
|
|
112
|
+
|
|
113
|
+
The breakdown is valuable for debugging attention patterns. If an agent is not speaking up when expected, the breakdown shows which dimension scored low. If `symbolMatch = 0.0` but the event clearly involves the agent's domain, the agent's symbol patterns may need expanding.
|
|
114
|
+
|
|
115
|
+
## DEFAULT_ATTENTION for Standard Roles
|
|
116
|
+
|
|
117
|
+
Paradigm provides default attention configurations for five standard roles:
|
|
118
|
+
|
|
119
|
+
**Architect** — Watches all flows (`$*`) and components (`#*`), concepts like `architecture`, `design`, `pattern`, `refactor`. Threshold 0.5.
|
|
120
|
+
|
|
121
|
+
**Builder** — Watches source paths (`src/**`, `lib/**`, `packages/**`). Threshold 0.7.
|
|
122
|
+
|
|
123
|
+
**Reviewer** — Watches concepts like `code quality`, `bug`, `smell`, `convention`. Threshold 0.6.
|
|
124
|
+
|
|
125
|
+
**Tester** — Watches test paths (`**/*.test.*`, `**/*.spec.*`), concepts like `test`, `coverage`, `assertion`, and `error-encountered` signals. Threshold 0.5.
|
|
126
|
+
|
|
127
|
+
**Security** — Watches gate symbols (`^*`), auth components (`#*-auth`, `#*-middleware`), auth paths (`auth/**`, `middleware/**`, `guards/**`), concepts like `permission`, `JWT`, `session`, `RBAC`, `XSS`, `injection`, and signals `gate-added` and `route-created`. Threshold 0.4.
|
|
128
|
+
|
|
129
|
+
These defaults are overridable in the agent's `.agent` file via the `attention` field. A security agent working on a project with no web routes might raise its threshold to 0.6 and remove the path patterns.
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-601-context-composition
|
|
3
|
+
title: Context Composition
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-601
|
|
11
|
+
- slim-claudemd-150
|
|
12
|
+
- paradigmcontextcompose-assembles-base
|
|
13
|
+
- agent-contributions-use
|
|
14
|
+
symbols: []
|
|
15
|
+
difficulty: beginner
|
|
16
|
+
estimatedMinutes: 6
|
|
17
|
+
prerequisites: []
|
|
18
|
+
category: paradigm-core
|
|
19
|
+
origin: imported
|
|
20
|
+
source: courses/para-601.json
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## From Verbose to Slim
|
|
24
|
+
|
|
25
|
+
Paradigm's CLAUDE.md historically contained everything an agent might need: logging rules, portal conventions, MCP workflow guidance, flow patterns, orchestration instructions, workspace configuration, and more. At its peak, the file was ~856 lines — loaded in full at the start of every session, consuming thousands of tokens regardless of whether the task involved logging, security, or lore.
|
|
26
|
+
|
|
27
|
+
This approach has two problems. First, it wastes context window space. An agent working on test coverage does not need 200 lines of portal gate conventions. Second, it creates staleness — with all guidance in one file, updates to any topic require reading and understanding the entire file.
|
|
28
|
+
|
|
29
|
+
v5.0 restructured this into a two-layer architecture: a slim CLAUDE.md (~150 lines) for universal orientation, plus 12 on-demand guidance resources for topic-specific depth.
|
|
30
|
+
|
|
31
|
+
## The Slim CLAUDE.md
|
|
32
|
+
|
|
33
|
+
The reduced CLAUDE.md contains only what every session needs:
|
|
34
|
+
|
|
35
|
+
1. **Project Overview** — What this project is and which version of Paradigm it uses
|
|
36
|
+
2. **Symbol System** — The 5 symbols (#, $, ^, !, ~) and their meanings
|
|
37
|
+
3. **Conventions** — Naming, commit format, .purpose rules
|
|
38
|
+
4. **Agent Onboarding** — What to call first (`paradigm_status`), what to check
|
|
39
|
+
5. **Before Implementing** — Protocol search, ripple, gates check
|
|
40
|
+
6. **Automatic Enforcement** — What the stop hook blocks
|
|
41
|
+
7. **On-Demand Guidance** — Table of 12 guidance resources with their MCP URIs
|
|
42
|
+
|
|
43
|
+
This provides enough context for any agent to orient itself and know where to find deeper guidance, without spending tokens on content irrelevant to the current task.
|
|
44
|
+
|
|
45
|
+
## 12 Guidance Resources
|
|
46
|
+
|
|
47
|
+
Guidance resources are served via MCP at `paradigm://guidance/{topic}`. Each resource generates its content on demand — it is not a static file but a function that produces the latest guidance.
|
|
48
|
+
|
|
49
|
+
The 12 topics:
|
|
50
|
+
|
|
51
|
+
| Topic | What It Covers |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `logging` | Logger usage, symbol-to-method mapping by directory |
|
|
54
|
+
| `portal` | Portal protocol, gate patterns, route declarations |
|
|
55
|
+
| `mcp-workflow` | MCP tool orchestration, token budgets |
|
|
56
|
+
| `flows` | Flow-first development, $flow documentation |
|
|
57
|
+
| `orchestration` | Multi-agent orchestration, agent spawning |
|
|
58
|
+
| `workspaces` | Multi-project symbol awareness |
|
|
59
|
+
| `university` | Knowledge base, courses, PLSAT |
|
|
60
|
+
| `calibration` | Confidence calibration, overconfidence alerts |
|
|
61
|
+
| `checkpoints` | Session checkpoints, crash recovery |
|
|
62
|
+
| `navigation` | Task recipes, navigation patterns |
|
|
63
|
+
| `component-types` | Component hierarchy, type guidelines |
|
|
64
|
+
| `troubleshooting` | Common issues, diagnostic steps |
|
|
65
|
+
|
|
66
|
+
An agent working on portal.yaml calls `paradigm://guidance/portal` to get the full portal protocol. An agent setting up multi-project awareness calls `paradigm://guidance/workspaces`. This on-demand model means the agent pays the token cost only for the guidance it actually uses.
|
|
67
|
+
|
|
68
|
+
## Agent Contributions Section
|
|
69
|
+
|
|
70
|
+
Beyond the static guidance resources, composed context includes a dynamic **Agent Contributions** section built from active agents' `AgentContext.contributions`.
|
|
71
|
+
|
|
72
|
+
For example, if a security agent is active and its profile includes:
|
|
73
|
+
|
|
74
|
+
```yaml
|
|
75
|
+
context:
|
|
76
|
+
contributions:
|
|
77
|
+
- section: "Security Warnings"
|
|
78
|
+
content: "New routes added in this session require ^authenticated gate minimum."
|
|
79
|
+
priority: high
|
|
80
|
+
- section: "Portal Conventions"
|
|
81
|
+
content_ref: "paradigm://guidance/portal"
|
|
82
|
+
priority: medium
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
...the composed context will include a "Security Warnings" section (always, because `priority: high`) and may include the full portal guidance (if token budget allows, because `priority: medium`).
|
|
86
|
+
|
|
87
|
+
Contributions with `content_ref` instead of inline `content` are resolved lazily — the MCP resource is fetched only when the contribution is actually included in the composed context.
|
|
88
|
+
|
|
89
|
+
## paradigm_context_compose
|
|
90
|
+
|
|
91
|
+
The `paradigm_context_compose` tool assembles the full context for a session. It takes:
|
|
92
|
+
|
|
93
|
+
- The active agent(s) and their profiles
|
|
94
|
+
- The current task or focus area
|
|
95
|
+
- Token budget constraints
|
|
96
|
+
|
|
97
|
+
It produces a composed context string that includes:
|
|
98
|
+
|
|
99
|
+
1. **Base CLAUDE.md content** — Universal orientation
|
|
100
|
+
2. **Agent identity section** — From `buildProfileEnrichment`
|
|
101
|
+
3. **High-priority contributions** — From all active agents' context contributions
|
|
102
|
+
4. **Relevant guidance** — On-demand resources loaded based on the task
|
|
103
|
+
5. **Ambient context** — Recent team decisions, transferable journal insights, pending nominations
|
|
104
|
+
6. **Medium-priority contributions** — If token budget allows
|
|
105
|
+
|
|
106
|
+
Low-priority contributions and unused guidance resources are omitted from the initial context but remain available via MCP resource URIs if the agent needs them mid-session.
|
|
107
|
+
|
|
108
|
+
## The Full Loop: Journal to Context
|
|
109
|
+
|
|
110
|
+
Here is where everything connects. Consider this sequence:
|
|
111
|
+
|
|
112
|
+
1. **Session A**: Builder modifies `#payment-service`, makes a mistake with JWT token ordering, gets corrected by the human. The builder records a journal entry: `trigger: 'correction_received', insight: 'JWT refresh tokens must be validated before access tokens when both are present', transferable: true, pattern: { id: 'jwt-ordering', applies_when: 'validating multiple JWT types', correct_approach: 'Check refresh token first, then access token' }`.
|
|
113
|
+
|
|
114
|
+
2. **Between sessions**: The journal entry is stored at `~/.paradigm/agents/builder/journal/`. The pattern is extracted as a transferable pattern.
|
|
115
|
+
|
|
116
|
+
3. **Session B**: A different agent (or the same builder on a different project) starts work on an authentication module. `paradigm_context_compose` runs, loading the builder's profile. The `buildProfileEnrichment` function includes the transferable pattern and the journal insight in the "Transferable Insights" section of the composed context.
|
|
117
|
+
|
|
118
|
+
4. **Result**: The agent in Session B sees the JWT ordering insight before writing any code, preventing the same mistake.
|
|
119
|
+
|
|
120
|
+
This is the closed loop: DO (Session A work) -> RECORD (journal entry) -> ASSESS (attention scoring recognizes auth work in Session B) -> LEARN (pattern extracted) -> ADAPT (context composition includes the pattern) -> DO (Session B starts with the insight).
|
|
121
|
+
|
|
122
|
+
## emitAndProcess
|
|
123
|
+
|
|
124
|
+
The `emitAndProcess` function unifies event emission with nomination processing. When an event is emitted, it is simultaneously:
|
|
125
|
+
|
|
126
|
+
1. Written to the event stream (JSONL file + memory buffer)
|
|
127
|
+
2. Scored against all active agents' attention patterns
|
|
128
|
+
3. For any agent exceeding its threshold, a nomination opportunity is created
|
|
129
|
+
|
|
130
|
+
This single-call pattern ensures that no event is emitted without being evaluated for nominations. It prevents the race condition where an event is emitted but attention scoring happens too late to catch it.
|
|
131
|
+
|
|
132
|
+
The function returns both the emitted event and any nominations that were generated, giving the caller full visibility into what happened.
|
|
133
|
+
|
|
134
|
+
## Putting It All Together
|
|
135
|
+
|
|
136
|
+
Ambient coordination is not a single feature — it is a system of interconnected capabilities:
|
|
137
|
+
|
|
138
|
+
- **Knowledge streams** split lore into purpose-specific channels
|
|
139
|
+
- **Events** capture every meaningful action in a structured format
|
|
140
|
+
- **Attention** filters events to the right agents
|
|
141
|
+
- **Nominations** let agents contribute without being asked
|
|
142
|
+
- **Data sovereignty** ensures data stays where it belongs
|
|
143
|
+
- **Agent renaissance** gives agents the behavioral vocabulary to participate
|
|
144
|
+
- **Context composition** closes the loop by feeding learnings back into future sessions
|
|
145
|
+
|
|
146
|
+
Each piece is independently useful, but together they create a system that gets smarter with every session — not because any single component is intelligent, but because the loop never breaks.
|