@a-company/paradigm 3.44.0 → 5.3.3
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-ZUWQUHSK.js → accept-orchestration-GX2YRWM4.js} +5 -5
- package/dist/{add-VSPZ6FM4.js → add-FZRKEGH4.js} +1 -1
- package/dist/agent-HYKC2LAK.js +387 -0
- package/dist/agent-loader-SJPJJS33.js +36 -0
- package/dist/{agents-suggest-65SER5IS.js → agents-suggest-DNSYJ6IA.js} +1 -1
- package/dist/{aggregate-SV3VGEIL.js → aggregate-H57K7PNV.js} +1 -1
- package/dist/{assess-UHBDYIK7.js → assess-4WVXZLZQ.js} +2 -2
- package/dist/{auto-24ICVUH4.js → auto-QFS5NHQU.js} +1 -1
- package/dist/{beacon-3SJV4DAP.js → beacon-KXZXYQHX.js} +1 -1
- package/dist/{calibration-WWHK73WU.js → calibration-V46G7JTY.js} +2 -2
- package/dist/{check-OLI6AUS6.js → check-OWAIWV23.js} +1 -1
- package/dist/{chunk-RP6TZYGE.js → chunk-2IO7JAG2.js} +1 -1
- package/dist/chunk-2T6BTYBN.js +712 -0
- package/dist/{chunk-CDMAMDSG.js → chunk-5VKJBNJL.js} +13 -5
- package/dist/{chunk-KB4XJWE3.js → chunk-6N3JTACN.js} +98 -437
- package/dist/chunk-7N7GSU6K.js +34 -0
- package/dist/chunk-A2L4TSLZ.js +526 -0
- package/dist/{chunk-P7XSBJE3.js → chunk-ABVQGRF7.js} +1 -1
- package/dist/{chunk-HIKKOCXY.js → chunk-EI32ZBE6.js} +1 -1
- package/dist/{chunk-QIOCFXDQ.js → chunk-EKGMAM62.js} +1 -1
- package/dist/chunk-EZ3GOCYC.js +132 -0
- package/dist/chunk-GGMI6C2L.js +1075 -0
- package/dist/{chunk-DS5QY37M.js → chunk-GTR2TBIJ.js} +247 -15
- package/dist/{chunk-QDXI2DHR.js → chunk-J2JEQRT3.js} +1 -1
- package/dist/{chunk-AKIMFN6I.js → chunk-JASGXLK3.js} +2 -2
- package/dist/chunk-KVDYJLTC.js +121 -0
- package/dist/{chunk-J4E6K5MG.js → chunk-LSRABQIY.js} +25 -1
- package/dist/chunk-MCMOGQMU.js +145 -0
- package/dist/{chunk-ZXMDA7VB.js → chunk-PDX44BCA.js} +1 -6
- package/dist/{chunk-SOBTKFSP.js → chunk-S2HO5MLR.js} +5 -0
- package/dist/{chunk-2SKXFXIT.js → chunk-S3ORKP3V.js} +10 -15
- package/dist/{chunk-ZMQA6SCO.js → chunk-S6MZ2IEX.js} +628 -228
- package/dist/chunk-TAIJOFOE.js +124 -0
- package/dist/{chunk-FS3WTUHY.js → chunk-TXESEO7Y.js} +6 -6
- package/dist/{chunk-7COU5S2Z.js → chunk-VL67H5IC.js} +1 -1
- package/dist/{chunk-QWA26UNO.js → chunk-WQITYKHM.js} +7 -7
- package/dist/{chunk-MW5DMGBB.js → chunk-YMDLDELF.js} +114 -55
- package/dist/{claude-63ISJAZK.js → claude-FRRWJSTJ.js} +1 -1
- package/dist/{claude-cli-ABML5RHX.js → claude-cli-XJLK2X4L.js} +1 -1
- package/dist/{claude-code-JRLMRPTO.js → claude-code-HTBA4XRB.js} +1 -1
- package/dist/{claude-code-teams-CAJBEFIZ.js → claude-code-teams-T4SP24MD.js} +1 -1
- package/dist/{conductor-HLWYWUVH.js → conductor-PGPDVIVE.js} +1 -1
- package/dist/{config-schema-3YNIFJCJ.js → config-schema-EA4XALGG.js} +4 -2
- package/dist/{constellation-FAGT45TU.js → constellation-A26CCGQS.js} +1 -1
- package/dist/{context-audit-557EO6PK.js → context-audit-RLO3ETRP.js} +8 -5
- package/dist/{cost-XEBADYFT.js → cost-BGM32XJU.js} +1 -1
- package/dist/{cost-UD3WPEKZ.js → cost-VI46A4XL.js} +1 -1
- package/dist/{cursor-cli-QUOOF2N4.js → cursor-cli-JVEZGHWQ.js} +1 -1
- package/dist/{cursorrules-3TKZ4E4R.js → cursorrules-HLIKJJZT.js} +1 -1
- package/dist/decision-loader-WWCLIQPJ.js +20 -0
- package/dist/{delete-RRK4RL6Y.js → delete-KBRPQLPC.js} +2 -2
- package/dist/{diff-IP5CIARP.js → diff-RQLLNAFI.js} +5 -5
- package/dist/{discipline-5F5OVTXB.js → discipline-FA4OZXIS.js} +1 -1
- package/dist/{dist-UXWV4OKX.js → dist-34NA5RS5.js} +1 -1
- package/dist/{dist-5QE2BB2B-X6DYVSUL.js → dist-5QE2BB2B-5S3T6Y3T.js} +1 -1
- package/dist/{dist-CM3MVWWW.js → dist-77JDTVAY.js} +1 -0
- package/dist/{dist-POMVY6WP.js → dist-QK4SQAK7.js} +1 -1
- package/dist/{dist-3RVKEJRT.js → dist-TA6LSC2Q.js} +1 -1
- package/dist/docs-LVLRPBAW.js +155 -0
- package/dist/docs-PBZB7LYP.js +89 -0
- package/dist/{doctor-GKZJU7QG.js → doctor-ULBOHEIC.js} +3 -3
- package/dist/{drift-YGT4LJ7Q.js → drift-R5NRKFHI.js} +1 -1
- package/dist/{echo-A6HD5UP7.js → echo-O2LY7CC2.js} +1 -1
- package/dist/{edit-4CLNN5JG.js → edit-R2HNLMOG.js} +2 -2
- package/dist/event-25OJKDCE.js +31 -0
- package/dist/{export-T7CMMJIB.js → export-IWVL7XLF.js} +1 -1
- package/dist/{flow-UFMPVOEM.js → flow-CRRVV3O3.js} +2 -2
- package/dist/{global-HHUJSBG5.js → global-3NG5JXUB.js} +1 -1
- package/dist/graduate-USAWGBJM.js +160 -0
- package/dist/{graph-YYUXI3F7.js → graph-VHUMAAS6.js} +2 -2
- package/dist/{graph-server-ZPXRSGCW.js → graph-server-YL22VBBN.js} +1 -1
- package/dist/{habits-RG5SVKXP.js → habits-OL5NGPXO.js} +3 -3
- package/dist/{history-CETCSUCP.js → history-WOWC573W.js} +1 -1
- package/dist/{hooks-TCUHQMPF.js → hooks-HFWSCGPV.js} +2 -2
- package/dist/index.js +307 -184
- package/dist/{integrity-MK2OP5TA.js → integrity-IHO4FZTS.js} +1 -1
- package/dist/{integrity-checker-J7YXRTBT.js → integrity-checker-PSKJA5SB.js} +1 -0
- package/dist/journal-loader-5EYSBFFY.js +18 -0
- package/dist/{lint-HYWGS3JJ.js → lint-K6CJGGPH.js} +1 -1
- package/dist/{list-IUCYPGMK.js → list-4YK7QKFF.js} +1 -1
- package/dist/{list-BTLFHSRC.js → list-ENR7Q4CR.js} +2 -2
- package/dist/{lore-loader-VTEEZDX3.js → lore-loader-7NO6N6FT.js} +4 -1
- package/dist/{lore-server-NOOAHKJX.js → lore-server-UNJY5KC3.js} +1 -1
- package/dist/{manual-AFJ2J2V3.js → manual-G6FISID5.js} +1 -1
- package/dist/mcp.js +3954 -479
- package/dist/{migrate-FQVGQNXZ.js → migrate-LS45DNEV.js} +2 -2
- package/dist/{migrate-assessments-JP6Q5KME.js → migrate-assessments-RGH4O6IX.js} +2 -2
- package/dist/nomination-engine-Q4XSXFKT.js +40 -0
- package/dist/notebook-YWIYGEHV.js +155 -0
- package/dist/{orchestrate-A226N6FC.js → orchestrate-XZA33TJC.js} +5 -5
- package/dist/peers-DEOUIZM6.js +82 -0
- package/dist/persona-UHAHIVST.js +390 -0
- package/dist/{pipeline-3G2FRAKM.js → pipeline-L4HCSBGN.js} +1 -1
- package/dist/{platform-server-KHL6ZPPN.js → platform-server-PMD57BEG.js} +264 -18
- package/dist/{plugin-update-checker-HMRPGY5Z.js → plugin-update-checker-ELOEEQYS.js} +1 -0
- package/dist/{portal-check-FF5EKZE5.js → portal-check-NPYGII2D.js} +2 -2
- package/dist/{portal-compliance-VU4NIFEN.js → portal-compliance-J7DGAPFX.js} +2 -2
- package/dist/{probe-7JK7IDNI.js → probe-MHL5HQZ2.js} +3 -3
- package/dist/{promote-XO63XMAN.js → promote-F6ZYZZAL.js} +2 -2
- package/dist/{providers-YNFSL6HK.js → providers-GK7PB2OL.js} +2 -2
- package/dist/{quiz-I75NU2QQ.js → quiz-M66SC7F7.js} +1 -1
- package/dist/{record-46CLR4OG.js → record-RA4WR2BO.js} +2 -2
- package/dist/{reindex-WIJMCJ4A.js → reindex-HRA2AUS6.js} +3 -2
- package/dist/{remember-4EUZKIIB.js → remember-HBWJ655S.js} +1 -1
- package/dist/{retag-KC4JVRLE.js → retag-3OLCVDEQ.js} +2 -2
- package/dist/{review-Q7M4CRB5.js → review-27ATYTD2.js} +2 -2
- package/dist/review-57QMURZV.js +334 -0
- package/dist/{ripple-RI3LOT6R.js → ripple-JPBXP5I3.js} +1 -1
- package/dist/{sentinel-UOIGJWHH.js → sentinel-4XIG4STA.js} +2 -2
- package/dist/{sentinel-bridge-APDXYAZS.js → sentinel-bridge-MDUXTQRL.js} +2 -2
- package/dist/{serve-JVXSRSUB.js → serve-FLTFTM3P.js} +2 -2
- package/dist/{serve-22A4XOIG.js → serve-INL7SNBK.js} +2 -2
- package/dist/{serve-2YJ6D2Y6.js → serve-KBSE36PL.js} +4 -4
- package/dist/{server-JV6UFGWZ.js → server-54SKYFFY.js} +2 -2
- package/dist/{server-RDLQ3DK7.js → server-XUOIO7E6.js} +1 -1
- package/dist/{setup-YNZJQLW7.js → setup-EDS27WUR.js} +1 -1
- package/dist/{setup-M2ZKLKNN.js → setup-KO5AFC4K.js} +2 -2
- package/dist/{shift-LNMKFYLR.js → shift-VFG23DLA.js} +16 -16
- package/dist/{show-P7GYO43X.js → show-5PV5KFJE.js} +2 -2
- package/dist/{show-PKZMYKRN.js → show-NQKYX6WQ.js} +1 -1
- package/dist/{snapshot-Y3COXK4T.js → snapshot-BK4RBPCG.js} +1 -1
- package/dist/{spawn-SSXZX45U.js → spawn-AW6GDECS.js} +3 -3
- package/dist/{status-KLHALGW4.js → status-WGIAQODY.js} +1 -1
- package/dist/{summary-5NQNOD3F.js → summary-NIRABMF5.js} +2 -2
- package/dist/{sweep-EZU3GU6S.js → sweep-QMHNSIY5.js} +2 -2
- package/dist/{switch-WYUMVNA5.js → switch-6EJPZDIA.js} +1 -1
- package/dist/{symphony-EYRGGVNE.js → symphony-4OCY36AI.js} +350 -29
- package/dist/{symphony-QWOEKZMC.js → symphony-B75X2MME.js} +20 -2
- package/dist/symphony-peers-2ZQYLRNI.js +34 -0
- package/dist/symphony-peers-OL7F6M5S.js +121 -0
- package/dist/symphony-relay-UJYUXN65.js +710 -0
- package/dist/{sync-ZM4Q3R4U.js → sync-VEHUH4OA.js} +3 -3
- package/dist/{sync-llms-JIPP3XX4.js → sync-llms-YHCFIE6X.js} +2 -2
- package/dist/{task-loader-7M2FCBX6.js → task-loader-LDYWQSLM.js} +1 -0
- package/dist/{team-HGLJXWQG.js → team-7HG7XK5C.js} +6 -6
- package/dist/{test-WTR5Q33E.js → test-566CP5KC.js} +1 -1
- package/dist/{thread-3WM7KKID.js → thread-N754I4D5.js} +1 -1
- package/dist/{timeline-ANC7LVDL.js → timeline-M3CICQFE.js} +2 -2
- package/dist/{triage-IZ4MDYNB.js → triage-HHYGT3HY.js} +1 -1
- package/dist/{tutorial-GC6QL4US.js → tutorial-KD22SUNO.js} +1 -1
- package/dist/university-content/courses/.purpose +66 -0
- package/dist/university-content/courses/para-401.json +146 -0
- package/dist/university-content/courses/para-501.json +151 -0
- package/dist/university-content/courses/para-601.json +608 -0
- package/dist/university-content/plsat/.purpose +6 -0
- package/dist/university-content/plsat/v2.0.json +2 -2
- package/dist/university-content/plsat/v3.0.json +563 -3
- package/dist/university-content/reference.json +91 -0
- package/dist/{upgrade-ANX3LVSA.js → upgrade-H5PF32BW.js} +2 -2
- package/dist/{validate-GD5XWILV.js → validate-CNKEKO6A.js} +1 -1
- package/dist/{validate-ITC5D6QG.js → validate-MB5ULIHS.js} +1 -1
- package/dist/{validate-ZVPNN4FL.js → validate-QH3LADM6.js} +1 -1
- package/dist/{watch-X64UK7K4.js → watch-2TKP5PVL.js} +3 -3
- package/dist/{watch-ERBEJUJW.js → watch-ZF4ML6CD.js} +2 -2
- package/dist/{wisdom-L2WC7J62.js → wisdom-AATMGNFA.js} +1 -1
- package/dist/work-log-loader-5L45XNYZ.js +14 -0
- package/dist/{workspace-UIUTHZTD.js → workspace-6E6OSRNU.js} +4 -4
- package/package.json +1 -1
- package/platform-ui/dist/assets/DocsSection-ByAgPzWV.js +1 -0
- package/platform-ui/dist/assets/DocsSection-CjdO6R-u.css +1 -0
- package/platform-ui/dist/assets/{GitSection-BD3Ze06e.js → GitSection-BLovj9yT.js} +1 -1
- package/platform-ui/dist/assets/{GraphSection-SglITfSs.js → GraphSection-C5PCPUFl.js} +1 -1
- package/platform-ui/dist/assets/{LoreSection-bR5Km4Fd.js → LoreSection-BftejTla.js} +1 -1
- package/platform-ui/dist/assets/{SentinelSection-QSpAZArG.js → SentinelSection-CnYcasN7.js} +1 -1
- package/platform-ui/dist/assets/{SymphonySection-CobYJgvg.js → SymphonySection-BpmqCHeK.js} +1 -1
- package/platform-ui/dist/assets/{index-DbxeSMkV.js → index-G9JnWEs_.js} +10 -10
- package/platform-ui/dist/index.html +1 -1
- package/dist/dist-PSF5CP4I.js +0 -7294
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
syncCommand
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-2IO7JAG2.js";
|
|
5
|
+
import "./chunk-6N3JTACN.js";
|
|
6
6
|
import "./chunk-YO6DVTL7.js";
|
|
7
7
|
import "./chunk-4NCFWYGG.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-PDX44BCA.js";
|
|
9
9
|
export {
|
|
10
10
|
syncCommand
|
|
11
11
|
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
loadParadigmFiles
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-6N3JTACN.js";
|
|
5
5
|
import "./chunk-YO6DVTL7.js";
|
|
6
6
|
import {
|
|
7
7
|
log
|
|
8
8
|
} from "./chunk-4NCFWYGG.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-PDX44BCA.js";
|
|
10
10
|
|
|
11
11
|
// src/commands/sync-llms.ts
|
|
12
12
|
import * as fs from "fs";
|
|
@@ -8,19 +8,19 @@ import {
|
|
|
8
8
|
teamModelsCommand,
|
|
9
9
|
teamResetCommand,
|
|
10
10
|
teamStatusCommand
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-EI32ZBE6.js";
|
|
12
|
+
import "./chunk-WQITYKHM.js";
|
|
13
|
+
import "./chunk-LSRABQIY.js";
|
|
14
14
|
import "./chunk-PBHIFAL4.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-TXESEO7Y.js";
|
|
16
16
|
import "./chunk-6QC3YGB6.js";
|
|
17
17
|
import "./chunk-PMXRGPRQ.js";
|
|
18
|
-
import "./chunk-MW5DMGBB.js";
|
|
19
18
|
import "./chunk-5JGJACDU.js";
|
|
20
19
|
import "./chunk-ZGUAAVMA.js";
|
|
21
20
|
import "./chunk-EDOAWN7J.js";
|
|
22
21
|
import "./chunk-IRKUEJVW.js";
|
|
23
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-YMDLDELF.js";
|
|
23
|
+
import "./chunk-PDX44BCA.js";
|
|
24
24
|
export {
|
|
25
25
|
teamAcceptCommand,
|
|
26
26
|
teamCheckCommand,
|
|
@@ -244,6 +244,17 @@ components:
|
|
|
244
244
|
tags: [course-content, para-401]
|
|
245
245
|
references: ["#orchestration", "#mcp-tools", "#paradigm-sync"]
|
|
246
246
|
|
|
247
|
+
para-401-agent-identity:
|
|
248
|
+
description: "Agent Identity & Expertise — .agent files, personality, expertise auto-population, symbol-to-agent routing, orchestration enrichment"
|
|
249
|
+
file: para-401.json
|
|
250
|
+
tags: [course-content, para-401]
|
|
251
|
+
references: ["#agent-loader", "#agent-tools", "#orchestration"]
|
|
252
|
+
|
|
253
|
+
para-401-notebooks-permissions:
|
|
254
|
+
description: "University lesson: Agent Notebooks & Permission Scoping — notebooks, permissions, integrity hashing"
|
|
255
|
+
type: lesson
|
|
256
|
+
tags: [university, notebooks, agent-identity, permissions]
|
|
257
|
+
|
|
247
258
|
# PARA 501: Advanced Systems (10 lessons)
|
|
248
259
|
|
|
249
260
|
para-501-lore-system:
|
|
@@ -311,3 +322,58 @@ components:
|
|
|
311
322
|
file: para-501.json
|
|
312
323
|
tags: [course-content, para-501]
|
|
313
324
|
references: ["#PlatformServer", "#PlatformWebSocket", "#AgentPresenceManager", "#UserStateTracker", "#AgentCommandRoute", "#PlatformTools", "#AgentStore", "#AgentToast", "#AgentCallout"]
|
|
325
|
+
|
|
326
|
+
para-501-review-compliance:
|
|
327
|
+
description: "University lesson: Automated Review Pipeline — paradigm review, compliance-checker, dynamic tool loading, response format"
|
|
328
|
+
type: lesson
|
|
329
|
+
tags: [university, review, compliance, tool-loading]
|
|
330
|
+
|
|
331
|
+
# PARA 601: Ambient Coordination (8 lessons)
|
|
332
|
+
|
|
333
|
+
para-601-event-stream:
|
|
334
|
+
description: "Event Stream — append-only JSONL activity log, event types, automatic emission from MCP tools and hooks"
|
|
335
|
+
file: para-601.json
|
|
336
|
+
tags: [course-content, para-601]
|
|
337
|
+
references: ["#event-stream"]
|
|
338
|
+
|
|
339
|
+
para-601-attention-scoring:
|
|
340
|
+
description: "Attention Scoring — four-dimension relevance scoring (symbol, path, concept, signal), max-based scoring, configurable thresholds"
|
|
341
|
+
file: para-601.json
|
|
342
|
+
tags: [course-content, para-601]
|
|
343
|
+
references: ["#agent-loader", "#event-stream"]
|
|
344
|
+
|
|
345
|
+
para-601-nominations:
|
|
346
|
+
description: "Nominations — self-nominated agent contributions, brief/urgency/type/evidence, surfacing and engagement workflow"
|
|
347
|
+
file: para-601.json
|
|
348
|
+
tags: [course-content, para-601]
|
|
349
|
+
references: ["#nomination-engine", "#agent-loader"]
|
|
350
|
+
|
|
351
|
+
para-601-knowledge-streams:
|
|
352
|
+
description: "Knowledge Streams — Work Log, Learning Journal, Team Decisions; different audiences, lifecycles, and storage"
|
|
353
|
+
file: para-601.json
|
|
354
|
+
tags: [course-content, para-601]
|
|
355
|
+
references: ["#event-stream"]
|
|
356
|
+
|
|
357
|
+
para-601-trust-rings:
|
|
358
|
+
description: "Trust Rings — four concentric data sovereignty levels, project-locked default, enforcement boundaries"
|
|
359
|
+
file: para-601.json
|
|
360
|
+
tags: [course-content, para-601]
|
|
361
|
+
references: ["#data-policy"]
|
|
362
|
+
|
|
363
|
+
para-601-data-policy:
|
|
364
|
+
description: "Data Policy — YAML-configured rules, observation control, stream filtering, per-agent overrides, DEFAULT_DATA_POLICY"
|
|
365
|
+
file: para-601.json
|
|
366
|
+
tags: [course-content, para-601]
|
|
367
|
+
references: ["#data-policy"]
|
|
368
|
+
|
|
369
|
+
para-601-context-composition:
|
|
370
|
+
description: "Context Composition — paradigm_context_compose, profile enrichment, decisions, journal insights, nominations into session context"
|
|
371
|
+
file: para-601.json
|
|
372
|
+
tags: [course-content, para-601]
|
|
373
|
+
references: ["#agent-loader", "#nomination-engine"]
|
|
374
|
+
|
|
375
|
+
para-601-ambient-review:
|
|
376
|
+
description: "Ambient Review — comprehensive review of PARA 601 ambient coordination concepts"
|
|
377
|
+
file: para-601.json
|
|
378
|
+
tags: [course-content, para-601]
|
|
379
|
+
references: ["#event-stream", "#nomination-engine", "#data-policy", "#agent-loader"]
|
|
@@ -689,6 +689,152 @@
|
|
|
689
689
|
"explanation": "Token cost estimates enable agents to evaluate tool selection before calling. An agent deciding between paradigm_search (~150 tokens) and reading 5 files (~2500 tokens) can make an informed cost/benefit decision. The goal is efficiency, not restriction."
|
|
690
690
|
}
|
|
691
691
|
]
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
"id": "agent-identity",
|
|
695
|
+
"title": "Agent Identity & Expertise Profiles",
|
|
696
|
+
"content": "## Agent Identity & Expertise Profiles\n\nEvery Claude session starts blank. The project remembers — via lore, protocols, aspects — but the agent doesn't. An architect that has successfully designed auth systems 14 times has no memory of that expertise. The orchestrator cannot route tasks to the most qualified agent because qualification is not tracked.\n\nAgent identity files (`.agent`) solve this with persistent YAML profiles that track expertise, personality, and cross-project patterns. They **overlay** the existing `agents.yaml` system and are fully backward compatible — when no `.agent` files exist, everything works exactly as before.\n\n### Storage & Merge Priority\n\nProfiles live in two locations:\n\n- **Global** (`~/.paradigm/agents/architect.agent`) — travels across projects\n- **Project** (`.paradigm/agents/builder.agent`) — project-level overrides\n\nMerge priority: **project `.agent` > global `.agent` > `agents.yaml`**. This means a project can override a global agent's default model or focus areas without modifying the shared identity.\n\n### Profile Structure\n\nEach `.agent` file contains:\n\n- **`id`** — Agent identifier (e.g., \"architect\")\n- **`personality`** — Style (deliberate/rapid/exploratory/methodical), risk tolerance (conservative/balanced/aggressive), and verbosity (minimal/concise/detailed)\n- **`expertise`** — Per-symbol entries with confidence (0.0-1.0), session count, and last touch date\n- **`transferable`** — Cross-project patterns with success rates and linked protocols/lore\n- **`contexts`** — Per-project adaptations: focus areas, preferred model, session count\n\n### Expertise Auto-Population\n\nWhen lore is recorded with `paradigm_lore_record`, the relevant agent's expertise scores update automatically via exponential moving average:\n\n```\nFor each symbol in symbols_touched:\n if existing entry:\n sessions++\n confidence = 0.7 * old_confidence + 0.3 * lore_confidence\n else:\n create entry with confidence = lore_confidence (or 0.5 default)\n```\n\nAssessment verdicts from `paradigm_lore_assess` also feed into expertise. A verdict of `correct` nudges confidence up, `incorrect` nudges it down.\n\n### Querying Expertise\n\n`paradigm_agent_expertise` takes a symbol and returns agents ranked by confidence:\n\n```\nparadigm_agent_expertise({ symbol: \"#payment-service\" })\n// Returns: [{ agentId: \"architect\", confidence: 0.92, sessions: 14 }, ...]\n```\n\nThis enables **symbol-to-agent routing** — the orchestrator can prefer the agent most experienced with the symbols a task touches.\n\n### Orchestration Enrichment\n\nWhen `paradigm_orchestrate_inline` builds agent prompts, agents with `.agent` profiles receive a preamble:\n\n```markdown\n## Agent Identity: architect\n**Style:** deliberate | **Risk:** conservative | **Verbosity:** concise\n\n## Your Expertise on Relevant Symbols\n- #auth-middleware: confidence 0.92 (14 sessions)\n- $checkout-flow: confidence 0.88 (8 sessions)\n\n## Transferable Patterns\n- portal-gate-pattern: 95% success (learned in a-paradigm, applied in 2 projects)\n```\n\nThis goes BEFORE the role-specific prompt, giving the agent self-awareness about its strengths.\n\n### CLI Commands\n\n- `paradigm agent list` — Show all profiles with top expertise\n- `paradigm agent show <id>` — Full profile with expertise table\n- `paradigm agent create <id> --global` — Create new identity file\n- `paradigm agent sync <id>` — Bootstrap expertise from existing project lore\n\nAgent identities are a foundation for future capabilities: curated notebooks, model cascading, and knowledge graduation across projects.",
|
|
697
|
+
"keyConcepts": [
|
|
698
|
+
".agent files are persistent YAML profiles that overlay agents.yaml — backward compatible",
|
|
699
|
+
"Two storage scopes: global (~/.paradigm/agents/) and project (.paradigm/agents/), project wins on merge",
|
|
700
|
+
"Expertise auto-updates via exponential moving average (70/30) from lore recording",
|
|
701
|
+
"paradigm_agent_expertise enables symbol-to-agent routing for orchestration",
|
|
702
|
+
"Orchestration enrichment prepends personality and expertise context to agent prompts"
|
|
703
|
+
],
|
|
704
|
+
"quiz": [
|
|
705
|
+
{
|
|
706
|
+
"id": "q1",
|
|
707
|
+
"question": "You run `paradigm agent create architect --global`. Where is the file stored?",
|
|
708
|
+
"choices": {
|
|
709
|
+
"A": "In the project's .paradigm/agents/architect.agent",
|
|
710
|
+
"B": "In ~/.paradigm/agents/architect.agent",
|
|
711
|
+
"C": "In .paradigm/agents.yaml as a new entry",
|
|
712
|
+
"D": "In ~/.paradigm/score/agents/architect.agent",
|
|
713
|
+
"E": "In the project's .paradigm/config.yaml under agents section"
|
|
714
|
+
},
|
|
715
|
+
"correct": "B",
|
|
716
|
+
"explanation": "The --global flag stores the .agent file in ~/.paradigm/agents/, the global scope that travels across projects. Without --global, it would go in the project's .paradigm/agents/ directory."
|
|
717
|
+
},
|
|
718
|
+
{
|
|
719
|
+
"id": "q2",
|
|
720
|
+
"question": "Both ~/.paradigm/agents/builder.agent and .paradigm/agents/builder.agent exist with different defaultModel. Which one wins?",
|
|
721
|
+
"choices": {
|
|
722
|
+
"A": "The global one (~/.paradigm/agents/) always takes priority",
|
|
723
|
+
"B": "The one with the newer 'updated' timestamp wins",
|
|
724
|
+
"C": "Project-level .paradigm/agents/builder.agent takes priority",
|
|
725
|
+
"D": "agents.yaml overrides both .agent files",
|
|
726
|
+
"E": "An error is raised for the conflict"
|
|
727
|
+
},
|
|
728
|
+
"correct": "C",
|
|
729
|
+
"explanation": "Merge priority is: project .agent > global .agent > agents.yaml. Project-level overrides exist specifically so a project can customize model preferences or focus areas without changing the global identity."
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
"id": "q3",
|
|
733
|
+
"question": "An agent records lore with confidence: 0.8 touching #auth-middleware. The agent's existing expertise on that symbol is confidence: 0.9, sessions: 10. What's the new confidence?",
|
|
734
|
+
"choices": {
|
|
735
|
+
"A": "0.85 (simple average)",
|
|
736
|
+
"B": "0.87 (exponential moving average: 0.7 * 0.9 + 0.3 * 0.8)",
|
|
737
|
+
"C": "0.80 (new value replaces old)",
|
|
738
|
+
"D": "0.90 (existing value preserved)",
|
|
739
|
+
"E": "0.88 (weighted by session count)"
|
|
740
|
+
},
|
|
741
|
+
"correct": "B",
|
|
742
|
+
"explanation": "Expertise uses exponential moving average with alpha=0.3: new = 0.7 * old + 0.3 * new_observation. So 0.7 * 0.9 + 0.3 * 0.8 = 0.63 + 0.24 = 0.87. This balances stability (70% old) with responsiveness to new data (30% new)."
|
|
743
|
+
},
|
|
744
|
+
{
|
|
745
|
+
"id": "q4",
|
|
746
|
+
"question": "You want to find which agent is best qualified to modify #payment-service. Which MCP tool do you call?",
|
|
747
|
+
"choices": {
|
|
748
|
+
"A": "paradigm_agent_list and manually compare expertise arrays",
|
|
749
|
+
"B": "paradigm_agent_get with the symbol name",
|
|
750
|
+
"C": "paradigm_agent_expertise with symbol: \"#payment-service\"",
|
|
751
|
+
"D": "paradigm_search with query: \"payment-service agents\"",
|
|
752
|
+
"E": "paradigm_orchestrate_inline with the task description"
|
|
753
|
+
},
|
|
754
|
+
"correct": "C",
|
|
755
|
+
"explanation": "paradigm_agent_expertise takes a symbol and returns all agents with expertise on that symbol, ranked by confidence score. This is the purpose-built tool for symbol-to-agent routing, costing only ~100 tokens."
|
|
756
|
+
},
|
|
757
|
+
{
|
|
758
|
+
"id": "q5",
|
|
759
|
+
"question": "A project has agents.yaml with 5 agents but no .agent files. What happens during orchestration?",
|
|
760
|
+
"choices": {
|
|
761
|
+
"A": "An error: .agent files are required for orchestration",
|
|
762
|
+
"B": "agents.yaml is ignored and default agents are used",
|
|
763
|
+
"C": "Empty .agent files are auto-created for each agent",
|
|
764
|
+
"D": "Everything works exactly as before — .agent files are a pure overlay",
|
|
765
|
+
"E": "Orchestration runs but warns about missing profiles"
|
|
766
|
+
},
|
|
767
|
+
"correct": "D",
|
|
768
|
+
"explanation": ".agent files are a pure overlay. No files = no enrichment, same behavior as pre-3.47.0. The system is fully backward compatible — agents.yaml continues to work unchanged, and .agent profiles only add capabilities when present."
|
|
769
|
+
}
|
|
770
|
+
]
|
|
771
|
+
},
|
|
772
|
+
{
|
|
773
|
+
"id": "notebooks-permissions",
|
|
774
|
+
"title": "Agent Notebooks & Permission Scoping",
|
|
775
|
+
"content": "## Agent Notebooks\n\nAgent notebooks are curated snippet libraries distilled from lore entries. They provide reusable knowledge that agents can apply across sessions and projects.\n\n### NotebookEntry Format\n\nEach entry contains:\n- **context**: When to apply this snippet (retrieval key)\n- **snippet**: The reusable code/knowledge\n- **provenance**: Where it came from (lore, manual, transfer)\n- **concepts[]**: Concept tags for retrieval (e.g., [\"auth\", \"middleware\"])\n- **appliedCount**: How many times used in orchestration\n- **confidence**: 0.0-1.0 reliability score\n\n### Storage\n\n- Global: `~/.paradigm/notebooks/{agent-id}/` — travels across projects\n- Project: `.paradigm/notebooks/{agent-id}/` — project-specific\n\n### MCP Tools\n\n- `paradigm_notebook_search` — find entries by concept, tag, or keyword\n- `paradigm_notebook_add` — create a new curated entry\n- `paradigm_notebook_promote` — extract from lore entry with provenance linking\n\n### Orchestration Integration\n\n`buildProfileEnrichment()` appends a \"Relevant Notebook Entries\" section with context + snippet for matching entries. This enriches the orchestration prompt with reusable patterns.\n\n## Agent Permissions\n\nPermission scoping controls what agents can access:\n\n### Permission Fields\n\n- **paths.read/write**: Glob patterns for file access\n- **paths.deny**: Always-deny patterns (overrides read/write)\n- **tools.allow/deny**: Tool name patterns\n- **dangerous_actions**: Actions requiring explicit approval\n\n### Integrity Hashing\n\nSHA-256 hash of `{id, role, permissions}` stored as `integrityHash`. `verifyIntegrity()` detects tampering — agents must never modify their own config.\n\n### In Orchestration\n\nPermissions appear as constraints in orchestration prompts, informing agents of their boundaries.",
|
|
776
|
+
"quiz": [
|
|
777
|
+
{
|
|
778
|
+
"id": "Q-401-NP-001",
|
|
779
|
+
"question": "Where are global notebook entries stored for the architect agent?",
|
|
780
|
+
"options": [
|
|
781
|
+
"~/.paradigm/notebooks/architect/",
|
|
782
|
+
".paradigm/notebooks/architect/",
|
|
783
|
+
"~/.paradigm/agents/architect/notebooks/",
|
|
784
|
+
".paradigm/agents/architect.notebooks"
|
|
785
|
+
],
|
|
786
|
+
"correct": 0,
|
|
787
|
+
"explanation": "Global notebook entries are stored at ~/.paradigm/notebooks/{agent-id}/ and travel across projects."
|
|
788
|
+
},
|
|
789
|
+
{
|
|
790
|
+
"id": "Q-401-NP-002",
|
|
791
|
+
"question": "An agent has permissions.paths.deny: [\".paradigm/agents/*\"]. What happens if it tries to write to .paradigm/agents/builder.agent?",
|
|
792
|
+
"options": [
|
|
793
|
+
"The write succeeds if there's also a write pattern matching it",
|
|
794
|
+
"The write is flagged as denied — deny patterns always override allow patterns",
|
|
795
|
+
"The write succeeds but triggers an advisory",
|
|
796
|
+
"The agent profile is deleted"
|
|
797
|
+
],
|
|
798
|
+
"correct": 1,
|
|
799
|
+
"explanation": "Deny patterns always override allow patterns. checkPathPermission() checks deny first."
|
|
800
|
+
},
|
|
801
|
+
{
|
|
802
|
+
"id": "Q-401-NP-003",
|
|
803
|
+
"question": "You want to extract a reusable pattern from lore entry L-2026-03-10-001 into the architect's notebook. Which MCP tool?",
|
|
804
|
+
"options": [
|
|
805
|
+
"paradigm_notebook_add with loreEntryId parameter",
|
|
806
|
+
"paradigm_lore_promote with agentId parameter",
|
|
807
|
+
"paradigm_notebook_promote with agentId + loreEntryId",
|
|
808
|
+
"paradigm_agent_notebook with action: 'promote'"
|
|
809
|
+
],
|
|
810
|
+
"correct": 2,
|
|
811
|
+
"explanation": "paradigm_notebook_promote takes agentId + loreEntryId and creates a distilled notebook entry with provenance link."
|
|
812
|
+
},
|
|
813
|
+
{
|
|
814
|
+
"id": "Q-401-NP-004",
|
|
815
|
+
"question": "An architect agent has 3 notebook entries matching #auth-middleware. How does orchestration use them?",
|
|
816
|
+
"options": [
|
|
817
|
+
"They replace the agent's expertise section in the prompt",
|
|
818
|
+
"buildProfileEnrichment() appends a 'Relevant Notebook Entries' section with context + snippet",
|
|
819
|
+
"They are sent as separate tool calls before the main prompt",
|
|
820
|
+
"They override the agent's personality settings"
|
|
821
|
+
],
|
|
822
|
+
"correct": 1,
|
|
823
|
+
"explanation": "buildProfileEnrichment() appends notebook entries (up to 5) with context + truncated snippet to the orchestration prompt."
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
"id": "Q-401-NP-005",
|
|
827
|
+
"question": "A .agent file's integrityHash doesn't match the computed hash. What does this indicate?",
|
|
828
|
+
"options": [
|
|
829
|
+
"The file was created before v4.0 and needs migration",
|
|
830
|
+
"The file was modified without going through saveAgentProfile() — possible tampering",
|
|
831
|
+
"The agent's expertise has been updated since the hash was computed",
|
|
832
|
+
"The hash algorithm has changed between versions"
|
|
833
|
+
],
|
|
834
|
+
"correct": 1,
|
|
835
|
+
"explanation": "verifyIntegrity() returns false when the stored hash doesn't match. The hash covers id+role+permissions, so changes to those fields without saveAgentProfile() indicate tampering."
|
|
836
|
+
}
|
|
837
|
+
]
|
|
692
838
|
}
|
|
693
839
|
]
|
|
694
840
|
}
|
|
@@ -955,6 +955,157 @@
|
|
|
955
955
|
"explanation": "paradigm_platform_observe is the dedicated tool for reading UI state. It sends an 'observe' command to the Platform server, which returns the UserStateTracker's accumulated state: current section, selected symbol, theme, mute status, connected agents, and optionally active highlights/annotations. This is real-time data from the server, not a file read."
|
|
956
956
|
}
|
|
957
957
|
]
|
|
958
|
+
},
|
|
959
|
+
{
|
|
960
|
+
"id": "symphony-networking",
|
|
961
|
+
"title": "Symphony Networking: Cross-Machine Relay",
|
|
962
|
+
"content": "## Beyond Single-Machine Messaging\n\nSymphony 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?\n\nSymphony 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.\n\n## Hub-and-Spoke Topology\n\nOne 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.\n\n```\nMachine A (Hub) Machine B (Spoke)\n┌─────────────────────┐ ┌─────────────────────┐\n│ ~/.paradigm/score/ │ │ ~/.paradigm/score/ │\n│ agents/projA/core │ │ agents/projB/core │\n│ inbox.jsonl │◄────ws───►│ inbox.jsonl │\n│ outbox.jsonl │ :3939 │ outbox.jsonl │\n└─────────────────────┘ └─────────────────────┘\n```\n\nThe 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()`.\n\n## Pairing & Authentication\n\nSecurity is critical when connecting machines over a network. Symphony uses a pairing code + HMAC challenge-response protocol:\n\n1. The hub generates a 32-byte random secret and derives a **6-digit pairing code**\n2. The code is displayed on the hub's terminal\n3. The spoke connects and receives a `hello` frame with a random challenge nonce\n4. The user enters the code on the spoke terminal (or embeds it in the connection string)\n5. The spoke computes `HMAC-SHA256(challenge, SHA256(code))` and sends an `auth` frame\n6. The hub verifies the code and HMAC proof, then sends `auth_ok` with its agent list\n\nPairing 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.\n\n## Two Connection Modes\n\n### LAN Pairing (same WiFi)\n\n```sh\n# Machine A (hub)\nparadigm symphony serve\n# Shows: Pairing Code: 847 291\n\n# Machine B (spoke)\nparadigm symphony join --remote 192.168.1.42:3939\n# Prompted for code\n```\n\n### Internet Direct Connect\n\n```sh\n# Machine A\nparadigm symphony serve --public\n# Shows connection string\n\n# Machine B\nparadigm symphony join --remote 73.162.44.103:3939#847291\n# Code embedded — no prompt\n```\n\nInternet mode requires port 3939 to be reachable (port forward, VPN, or SSH tunnel).\n\n## Trust Management\n\nPeers are managed via CLI commands:\n\n- `paradigm symphony peers` — List trusted peers with agent counts and last-seen times\n- `paradigm symphony peers revoke <id>` — Immediately disconnect and block reconnection\n- `paradigm symphony peers forget --force` — Clear all peer trust records\n\nExisting `trust.yaml` hard-deny patterns (`.env*`, `*.key`, `*.pem`) apply to remote file requests — the trust boundary extends across the network.\n\n## Relay Internals\n\nThe `SymphonyRelay` class handles both server and client modes:\n\n- **Outbox watcher**: Polls every 2s, compares outbox line counts against stored positions, forwards new messages\n- **Deduplication**: Bounded `Set<string>` of message IDs (max 10,000) prevents duplicate delivery\n- **Keepalive**: Ping/pong every 30s with 10s pong timeout. Dead connections are auto-terminated\n- **Auto-reconnect**: Client mode uses exponential backoff (1s → 2s → 4s → ... → 30s max)\n- **Rate limiting**: 3 failed auth attempts from the same IP triggers a 60s cooldown\n\n## Remote Agent Visibility\n\nRemote agents appear throughout the Symphony CLI and MCP tools:\n\n- `paradigm symphony list` shows remote agents with a `(remote: peer-name)` tag\n- `paradigm symphony status` includes peer count and remote agent totals\n- `paradigm_symphony_status` MCP tool returns a `peers` array in its response\n- Platform UI `GET /api/symphony/peers` endpoint returns connected peer data\n\nLocal MCP tools (`peek`, `poll`, `send`) work unchanged — they just read/write local files. The relay handles the network transport transparently.\n\n## Backward Compatibility\n\nIf `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.",
|
|
963
|
+
"keyConcepts": [
|
|
964
|
+
"Hub-and-spoke topology: one serve (hub), multiple join --remote (spokes)",
|
|
965
|
+
"WebSocket relay watches local outboxes and delivers remote messages to local inboxes",
|
|
966
|
+
"Pairing: 6-digit code + HMAC-SHA256 challenge-response authentication",
|
|
967
|
+
"Codes rotate every 5 minutes; 3 failed auth attempts trigger 60s cooldown",
|
|
968
|
+
"Two modes: LAN pairing (interactive code) and internet direct connect (embedded code in connection string)",
|
|
969
|
+
"Peer trust stored in ~/.paradigm/score/peers.json (mode 0600)",
|
|
970
|
+
"Trust management: peers list/revoke/forget commands",
|
|
971
|
+
"Outbox watcher polls every 2s; dedup via bounded Set<string> (max 10,000)",
|
|
972
|
+
"Auto-reconnect with exponential backoff (1s → 30s max)",
|
|
973
|
+
"Remote agents visible in list/status CLI and MCP tools with peer provenance"
|
|
974
|
+
],
|
|
975
|
+
"quiz": [
|
|
976
|
+
{
|
|
977
|
+
"id": "net-q1",
|
|
978
|
+
"question": "Developer A runs `paradigm symphony serve` and sees pairing code 472831. Developer B runs `paradigm symphony join --remote 192.168.1.42:3939`. What happens next?",
|
|
979
|
+
"choices": {
|
|
980
|
+
"A": "Developer B's agents automatically appear in A's inbox",
|
|
981
|
+
"B": "Developer B is prompted to enter the 6-digit pairing code from A's terminal",
|
|
982
|
+
"C": "The connection fails because Developer B didn't specify the --public flag",
|
|
983
|
+
"D": "Developer B must also run `paradigm symphony serve` to create a peer-to-peer link",
|
|
984
|
+
"E": "Developer B receives A's full agent list immediately without authentication"
|
|
985
|
+
},
|
|
986
|
+
"correct": "B",
|
|
987
|
+
"explanation": "When connecting via --remote without an embedded code (no # in the address), the user is prompted to enter the 6-digit pairing code displayed on the hub. The code is used to compute an HMAC proof for authentication. Only after successful verification does the agent list exchange occur."
|
|
988
|
+
},
|
|
989
|
+
{
|
|
990
|
+
"id": "net-q2",
|
|
991
|
+
"question": "A spoke machine loses its network connection to the hub. What happens?",
|
|
992
|
+
"choices": {
|
|
993
|
+
"A": "All local messages are deleted and the agent must re-pair from scratch",
|
|
994
|
+
"B": "The spoke immediately attempts to reconnect using a fixed 5-second interval",
|
|
995
|
+
"C": "The spoke schedules reconnect with exponential backoff (1s → 2s → 4s → ... → 30s max)",
|
|
996
|
+
"D": "The spoke shuts down and the user must manually restart `paradigm symphony join`",
|
|
997
|
+
"E": "The hub removes the spoke's peer record from peers.json"
|
|
998
|
+
},
|
|
999
|
+
"correct": "C",
|
|
1000
|
+
"explanation": "The client-mode relay uses exponential backoff for auto-reconnect: starting at 1 second and doubling each attempt up to a maximum of 30 seconds. On successful reconnect, the delay resets to 1 second. Local messages are unaffected — they remain in the JSONL files."
|
|
1001
|
+
},
|
|
1002
|
+
{
|
|
1003
|
+
"id": "net-q3",
|
|
1004
|
+
"question": "An attacker tries to brute-force the pairing code. After entering 3 wrong codes from IP 10.0.0.5, what happens on the next attempt?",
|
|
1005
|
+
"choices": {
|
|
1006
|
+
"A": "The pairing code is rotated and a new code must be obtained from the hub",
|
|
1007
|
+
"B": "The hub blocks all incoming connections permanently until restarted",
|
|
1008
|
+
"C": "The connection is accepted but messages are quarantined for review",
|
|
1009
|
+
"D": "The hub sends `auth_fail` with 'Too many failed attempts' and enforces a 60-second cooldown for that IP",
|
|
1010
|
+
"E": "The hub disconnects but allows immediate retry with the correct code"
|
|
1011
|
+
},
|
|
1012
|
+
"correct": "D",
|
|
1013
|
+
"explanation": "After 3 failed auth attempts from the same IP address, the relay enforces a 60-second cooldown. During this period, any connection from that IP receives an immediate auth_fail with the message 'Too many failed attempts — try again later' and is disconnected."
|
|
1014
|
+
},
|
|
1015
|
+
{
|
|
1016
|
+
"id": "net-q4",
|
|
1017
|
+
"question": "How does the relay prevent duplicate message delivery when two peers forward the same message?",
|
|
1018
|
+
"choices": {
|
|
1019
|
+
"A": "Messages include a TTL counter that decrements on each hop",
|
|
1020
|
+
"B": "A bounded Set of seen message IDs (max 10,000) skips already-processed messages",
|
|
1021
|
+
"C": "Each peer maintains a sequence number and only accepts higher-numbered messages",
|
|
1022
|
+
"D": "The hub assigns unique relay IDs to prevent duplicates",
|
|
1023
|
+
"E": "Messages are only forwarded once per minute, allowing time for dedup"
|
|
1024
|
+
},
|
|
1025
|
+
"correct": "B",
|
|
1026
|
+
"explanation": "The relay maintains a bounded Set<string> of message IDs it has already processed. When a message arrives, if its ID is in the set, the relay sends an ack but skips delivery. When the set exceeds 10,000 entries, the oldest half is evicted. This prevents both echo (receiving your own message back) and multi-path duplicates."
|
|
1027
|
+
},
|
|
1028
|
+
{
|
|
1029
|
+
"id": "net-q5",
|
|
1030
|
+
"question": "Developer B wants to connect to Developer A's machine over the internet. Developer A runs `paradigm symphony serve --public`. What is the correct command for Developer B?",
|
|
1031
|
+
"choices": {
|
|
1032
|
+
"A": "`paradigm symphony join --remote devA.example.com` and enter the code when prompted",
|
|
1033
|
+
"B": "`paradigm symphony join --remote 73.162.44.103:3939#847291` with the embedded code",
|
|
1034
|
+
"C": "`paradigm symphony serve --connect 73.162.44.103:3939`",
|
|
1035
|
+
"D": "`paradigm symphony peers add 73.162.44.103:3939 --code 847291`",
|
|
1036
|
+
"E": "`paradigm symphony join --public 73.162.44.103`"
|
|
1037
|
+
},
|
|
1038
|
+
"correct": "B",
|
|
1039
|
+
"explanation": "Internet direct connect uses the connection string format: address:port#code. The --public flag on the hub displays this connection string. The spoke parses the embedded code from after the # character and uses it automatically — no interactive prompt needed. Port 3939 must be reachable from the internet (port forward, VPN, or SSH tunnel)."
|
|
1040
|
+
}
|
|
1041
|
+
]
|
|
1042
|
+
},
|
|
1043
|
+
{
|
|
1044
|
+
"id": "review-compliance",
|
|
1045
|
+
"title": "Automated Review Pipeline & Compliance Checking",
|
|
1046
|
+
"content": "## paradigm review\n\nThe automated review pipeline uses a two-stage protocol:\n\n### Stage 1: Spec Compliance (always runs)\n\n- **Purpose coverage**: All touched symbols registered in .purpose files\n- **Portal gate compliance**: Routes declared in portal.yaml with gates\n- **Aspect anchors**: Anchor files still exist, no drift\n- **Broken references**: Parent symbols exist\n- **Route coverage**: New routes have portal.yaml entries\n\n### Stage 2: Code Quality (--deep only)\n\n- **Security**: eval() detection, hardcoded secrets\n- **Convention**: console.log usage (use Paradigm logger)\n- **Test coverage**: Gaps in test files\n\n### ReviewFinding Format\n\nEach finding has:\n- **type**: blocking (must fix), improvement (should fix), note (informational)\n- **category**: purpose-coverage, portal-compliance, aspect-anchors, security, convention\n- **message**: Human-readable description\n- **suggestion**: How to fix it\n\n### Usage\n\n```bash\nparadigm review # Staged changes\nparadigm review --pr 123 # PR via gh CLI\nparadigm review --ci # Exit 1 on blocking\nparadigm review --deep # Include code quality\nparadigm review --json # JSON output\n```\n\n## Dynamic Tool Loading\n\nTools are organized in three tiers:\n- **Core** (~15 tools): Always loaded (search, ripple, status, navigate, etc.)\n- **Feature**: Auto-detected from filesystem (lore → .paradigm/lore/, etc.)\n- **Advanced**: On-demand via `paradigm_tool_activate`\n\n## Response Format\n\n`response_format: 'concise'` on high-traffic tools strips secondary data:\n- paradigm_search: returns only { symbol, type }\n- paradigm_ripple: returns only { symbol, impact, summary }\n- paradigm_status: returns only { project, counts, total }\n\n## compliance-checker.ts\n\nShared logic extracted from pm.ts postflight. Both `paradigm_pm_postflight` and `paradigm review` use the same compliance checks.",
|
|
1047
|
+
"quiz": [
|
|
1048
|
+
{
|
|
1049
|
+
"id": "Q-501-RC-001",
|
|
1050
|
+
"question": "paradigm review --ci finds 2 blocking and 3 improvement findings. What's the exit code?",
|
|
1051
|
+
"options": [
|
|
1052
|
+
"Exit code 0 — improvements are non-blocking",
|
|
1053
|
+
"Exit code 1 — any blocking findings cause non-zero exit in CI mode",
|
|
1054
|
+
"Exit code 2 — one per blocking finding",
|
|
1055
|
+
"Exit code 5 — total findings count"
|
|
1056
|
+
],
|
|
1057
|
+
"correct": 1,
|
|
1058
|
+
"explanation": "In CI mode, any blocking findings cause exit code 1. Improvements and notes do not affect the exit code."
|
|
1059
|
+
},
|
|
1060
|
+
{
|
|
1061
|
+
"id": "Q-501-RC-002",
|
|
1062
|
+
"question": "A project has no features: section in config.yaml. How many MCP tools are loaded?",
|
|
1063
|
+
"options": [
|
|
1064
|
+
"Only core tools (~15)",
|
|
1065
|
+
"Core + explicitly enabled features",
|
|
1066
|
+
"All of them — auto-detection is generous, defaulting to current behavior",
|
|
1067
|
+
"None — features must be explicitly configured"
|
|
1068
|
+
],
|
|
1069
|
+
"correct": 2,
|
|
1070
|
+
"explanation": "No features config + generous auto-detection = all tools loaded, matching pre-4.0 behavior for backward compat."
|
|
1071
|
+
},
|
|
1072
|
+
{
|
|
1073
|
+
"id": "Q-501-RC-003",
|
|
1074
|
+
"question": "You call paradigm_search with response_format: 'concise'. What fields are returned?",
|
|
1075
|
+
"options": [
|
|
1076
|
+
"Full results with descriptions, paths, and fuzzy matches",
|
|
1077
|
+
"Only { symbol, type } per result — descriptions and secondary data stripped",
|
|
1078
|
+
"Only symbol names as a flat array",
|
|
1079
|
+
"Compressed binary format"
|
|
1080
|
+
],
|
|
1081
|
+
"correct": 1,
|
|
1082
|
+
"explanation": "Concise mode strips results to { symbol, type } per entry and removes fuzzyMatched, fuzzyNote, suggestions, workspace data."
|
|
1083
|
+
},
|
|
1084
|
+
{
|
|
1085
|
+
"id": "Q-501-RC-004",
|
|
1086
|
+
"question": "An agent needs the graph generation tool but it's in the advanced tier. What does it do?",
|
|
1087
|
+
"options": [
|
|
1088
|
+
"Request an admin to enable it in config.yaml",
|
|
1089
|
+
"Call paradigm_tool_activate with feature: 'graph'",
|
|
1090
|
+
"Modify the agent's permissions to include graph tools",
|
|
1091
|
+
"Restart the session with --enable-graph flag"
|
|
1092
|
+
],
|
|
1093
|
+
"correct": 1,
|
|
1094
|
+
"explanation": "paradigm_tool_activate enables advanced-tier modules for the current session. The tools become available immediately."
|
|
1095
|
+
},
|
|
1096
|
+
{
|
|
1097
|
+
"id": "Q-501-RC-005",
|
|
1098
|
+
"question": "What's the relationship between paradigm review Stage 1 and paradigm_pm_postflight?",
|
|
1099
|
+
"options": [
|
|
1100
|
+
"They are completely independent with different checks",
|
|
1101
|
+
"paradigm review calls paradigm_pm_postflight internally",
|
|
1102
|
+
"They share the same compliance logic extracted into compliance-checker.ts",
|
|
1103
|
+
"paradigm_pm_postflight is deprecated in favor of paradigm review"
|
|
1104
|
+
],
|
|
1105
|
+
"correct": 2,
|
|
1106
|
+
"explanation": "Both use compliance-checker.ts for shared compliance logic — purpose coverage, portal gates, aspect anchors, and broken refs."
|
|
1107
|
+
}
|
|
1108
|
+
]
|
|
958
1109
|
}
|
|
959
1110
|
]
|
|
960
1111
|
}
|