@maycombhq/atticus 2.0.0-beta.12 → 2.0.0-beta.12.1

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.
Files changed (154) hide show
  1. package/dist/bin.js +2 -2
  2. package/dist/{chunk-NL6XQZSV.js → chunk-2DJUQ6CO.js} +8 -8
  3. package/dist/{chunk-MNCQ2GL7.js → chunk-2OWSG6BK.js} +3 -3
  4. package/dist/{chunk-PCCPXWJC.js → chunk-2QT6WVAK.js} +11 -11
  5. package/dist/{chunk-HP32HUWR.js → chunk-2RMWW6G3.js} +9 -9
  6. package/dist/{chunk-KUYA2E7M.js → chunk-36CTZGPH.js} +4 -4
  7. package/dist/{chunk-VP5H6DII.js → chunk-3PLE3ZQ5.js} +7 -7
  8. package/dist/{chunk-4G56W6H7.js → chunk-3W5R5J65.js} +5 -5
  9. package/dist/{chunk-EU7VTBAI.js → chunk-42L2WHP6.js} +2 -2
  10. package/dist/{chunk-5FFMJMVH.js → chunk-4GNKICU5.js} +8 -8
  11. package/dist/{chunk-SCBU46AJ.js → chunk-4JLB5ISS.js} +2 -2
  12. package/dist/{chunk-5GGGAI5C.js → chunk-5C24MOXU.js} +5 -5
  13. package/dist/{chunk-7AXMUE2U.js → chunk-5G5GD5HF.js} +4 -4
  14. package/dist/{chunk-ITJ7ST5E.js → chunk-5I5JDJ3R.js} +2 -2
  15. package/dist/{chunk-ZBQCLKTH.js → chunk-5IMZYLDW.js} +3 -3
  16. package/dist/{chunk-FBFSTYAB.js → chunk-5R2EWR47.js} +1 -1
  17. package/dist/{chunk-2ELFEKOO.js → chunk-65XZSK6S.js} +1 -1
  18. package/dist/{chunk-P76AW3PA.js → chunk-6AYUBYK6.js} +54 -5
  19. package/dist/{chunk-TVSNWIAM.js → chunk-6HSRGY4B.js} +1 -1
  20. package/dist/{chunk-BTOGAUWX.js → chunk-6IKYFARG.js} +15 -9
  21. package/dist/{chunk-YURIUFKF.js → chunk-6R2OM6Y3.js} +5 -5
  22. package/dist/{chunk-7TEQF64E.js → chunk-7C7PTJM2.js} +151 -31
  23. package/dist/{chunk-ENZWVTTN.js → chunk-7FPTI62T.js} +7 -7
  24. package/dist/{chunk-F6FGIYPT.js → chunk-7H5HYERS.js} +7 -7
  25. package/dist/{chunk-O5W4ECUY.js → chunk-7MASAGFE.js} +4 -4
  26. package/dist/{chunk-NWL7XEQ4.js → chunk-7UXSS23C.js} +8 -7
  27. package/dist/{chunk-MLAACAES.js → chunk-7VAMO66T.js} +343 -99
  28. package/dist/{chunk-FQ6IBYFC.js → chunk-7XWCTVJS.js} +1 -1
  29. package/dist/{chunk-LDUJ6NIT.js → chunk-AUSC47BK.js} +1 -1
  30. package/dist/{chunk-KNGESBFW.js → chunk-AY7Y3WPD.js} +10 -10
  31. package/dist/{chunk-CW5SEPUT.js → chunk-BFZSO2TP.js} +4 -4
  32. package/dist/{chunk-6S27MUQQ.js → chunk-BHHIHENP.js} +1 -1
  33. package/dist/{chunk-6FG7QKJC.js → chunk-BUD6JILH.js} +9 -9
  34. package/dist/{chunk-V3VCUSQ6.js → chunk-CCXEXCRO.js} +4 -4
  35. package/dist/{chunk-ZS47PQ3O.js → chunk-CGF4LKXR.js} +1 -1
  36. package/dist/{chunk-BSVTNNUK.js → chunk-CJ5FQHST.js} +4 -4
  37. package/dist/{chunk-NWXY3B4R.js → chunk-CKI4VG2I.js} +8 -8
  38. package/dist/{chunk-F5GA6G3U.js → chunk-CU35HXQ7.js} +11 -11
  39. package/dist/{chunk-PVW2N63M.js → chunk-CUD4I2U6.js} +17 -17
  40. package/dist/{chunk-GN5ZLSLD.js → chunk-CUX4GRTB.js} +2 -2
  41. package/dist/{chunk-GKPOCUQR.js → chunk-CYDJK34J.js} +1 -1
  42. package/dist/{chunk-SHAAGH3T.js → chunk-DBVU45FY.js} +4 -4
  43. package/dist/{chunk-22GLUHGE.js → chunk-DBZNQAMN.js} +1 -1
  44. package/dist/{chunk-RZWZO2JQ.js → chunk-DDOLWHIM.js} +8 -7
  45. package/dist/{chunk-HJUEQERG.js → chunk-DIAYQLEY.js} +4 -4
  46. package/dist/{chunk-Q55UP5EZ.js → chunk-DKGWE5ZL.js} +9 -9
  47. package/dist/{chunk-QJ3OX7OC.js → chunk-DLX2R3MI.js} +18 -18
  48. package/dist/{chunk-XVIVWG7B.js → chunk-DREIS5Z5.js} +1 -1
  49. package/dist/{chunk-QAFMLBPF.js → chunk-DX5H5YKM.js} +2 -2
  50. package/dist/{chunk-MNUZX67F.js → chunk-EOCZDNWU.js} +2 -2
  51. package/dist/{chunk-TV4CGNEY.js → chunk-EOWO4YPF.js} +10 -10
  52. package/dist/{chunk-Z4JSRKNR.js → chunk-EZ3FDHW3.js} +11 -11
  53. package/dist/{chunk-4BPROPGG.js → chunk-F5L23NGR.js} +12 -12
  54. package/dist/{chunk-WE5VMPUP.js → chunk-FF5Q7ONT.js} +90 -80
  55. package/dist/{chunk-NSJ6ZR2A.js → chunk-FLROTO6F.js} +2 -2
  56. package/dist/{chunk-VF4VOPMB.js → chunk-FNVY656P.js} +9 -9
  57. package/dist/{chunk-BXP2Q4TD.js → chunk-FP6GJJY7.js} +10 -10
  58. package/dist/{chunk-GFZ5MIQG.js → chunk-FSR7OUVJ.js} +9 -9
  59. package/dist/{chunk-JXXQHETS.js → chunk-FT3RXIN4.js} +2 -2
  60. package/dist/{chunk-6JV3YHRR.js → chunk-FYWA2CPF.js} +5 -5
  61. package/dist/{chunk-CXK27ZUY.js → chunk-G2K2D6XS.js} +4 -4
  62. package/dist/{chunk-U5T4A2QV.js → chunk-G5SKNMPC.js} +1 -1
  63. package/dist/{chunk-TH526O6E.js → chunk-GIPQHVJF.js} +3 -3
  64. package/dist/{chunk-RMLUZYEA.js → chunk-GJ4B2FYS.js} +5 -5
  65. package/dist/{chunk-SAC6FNKR.js → chunk-GRZGEMO5.js} +76 -75
  66. package/dist/{chunk-6ENDKY52.js → chunk-GU7PEYRC.js} +2 -2
  67. package/dist/{chunk-SGNHNN3G.js → chunk-GX3Q5PRC.js} +3 -3
  68. package/dist/{chunk-TXV2AYZB.js → chunk-HK2CF6KQ.js} +10 -10
  69. package/dist/{chunk-ZYASEL7K.js → chunk-HMQXIFOL.js} +1 -1
  70. package/dist/{chunk-PKJ3K3GM.js → chunk-IDLO7UCZ.js} +4 -4
  71. package/dist/{chunk-SNSFQ47W.js → chunk-IJ7TPOXQ.js} +2 -2
  72. package/dist/{chunk-VLDM4QZM.js → chunk-IZF2VJU5.js} +9 -9
  73. package/dist/{chunk-GHSVJNVL.js → chunk-J22RSFKY.js} +4 -1
  74. package/dist/{chunk-JGLZUQVN.js → chunk-J3DTLYER.js} +5 -5
  75. package/dist/{chunk-ZBOPIYOY.js → chunk-JC3BMRB5.js} +3 -3
  76. package/dist/{chunk-ZGI7DNJ6.js → chunk-JOG6LBOP.js} +11 -11
  77. package/dist/{chunk-P6UJ22XR.js → chunk-JS3DJH3Q.js} +1 -1
  78. package/dist/{chunk-Z53ZB34U.js → chunk-JWQMD54C.js} +6 -6
  79. package/dist/{chunk-INCECZ2E.js → chunk-KJ6IH2D5.js} +1 -1
  80. package/dist/{chunk-GMDOXWIS.js → chunk-KPHPVOME.js} +1 -1
  81. package/dist/{chunk-RLJDYLID.js → chunk-LAOZB5YC.js} +7 -7
  82. package/dist/{chunk-RSVBX6A3.js → chunk-LRCWWMHH.js} +15 -15
  83. package/dist/{chunk-FMV6IZ3P.js → chunk-LVQMS54L.js} +18 -18
  84. package/dist/{chunk-DDZZXVQ5.js → chunk-M3BJTXLR.js} +4 -4
  85. package/dist/{chunk-TWHZU36X.js → chunk-M4D3VKAS.js} +1 -1
  86. package/dist/{chunk-5M3CLAOV.js → chunk-MI3GGF7V.js} +6 -6
  87. package/dist/{chunk-NCONDPHH.js → chunk-MIOY6EXD.js} +1 -1
  88. package/dist/{chunk-ZPT4QX3J.js → chunk-ML3HOWPI.js} +2 -2
  89. package/dist/{chunk-J3VAFDEX.js → chunk-MOY52LHS.js} +3 -3
  90. package/dist/{chunk-L4UIKAWD.js → chunk-N2FA53DA.js} +3 -3
  91. package/dist/{chunk-SK5OYWIY.js → chunk-N6YELFHL.js} +1 -1
  92. package/dist/{chunk-V5XV3JSP.js → chunk-N7HG4UP7.js} +3 -3
  93. package/dist/{chunk-4VOG5H2K.js → chunk-NAKVQU6F.js} +1 -1
  94. package/dist/{chunk-VRYQJZFL.js → chunk-NZY72PGJ.js} +8 -2
  95. package/dist/{chunk-36KD4OGC.js → chunk-O62VA6MH.js} +3 -3
  96. package/dist/{chunk-QEZSA2O7.js → chunk-OKUYBXXI.js} +5 -5
  97. package/dist/{chunk-E73QLYK7.js → chunk-P3VBYYAS.js} +1 -1
  98. package/dist/{chunk-5OACMWWI.js → chunk-P7SONIEO.js} +50 -27
  99. package/dist/{chunk-2VQLFNBO.js → chunk-PAOIMLTK.js} +7 -7
  100. package/dist/{chunk-3CFBU2O6.js → chunk-PAQDPB6T.js} +2 -2
  101. package/dist/{chunk-4Q2PGM5T.js → chunk-PKCYRG6G.js} +51 -11
  102. package/dist/{chunk-AYVLEB55.js → chunk-PUGPT4Y6.js} +6 -6
  103. package/dist/{chunk-DGZXJO5I.js → chunk-PVMGHQWB.js} +3 -3
  104. package/dist/{chunk-VXSJKWB7.js → chunk-Q4AWUD6C.js} +12 -12
  105. package/dist/{chunk-U4NNG3ES.js → chunk-QC24Z5JU.js} +2 -2
  106. package/dist/{chunk-SSL6JMPA.js → chunk-QKSWQBWD.js} +3 -3
  107. package/dist/{chunk-QY7RGTUP.js → chunk-QOF7U6BI.js} +49 -12
  108. package/dist/{chunk-4HIQ2FTI.js → chunk-QOPX5M7Y.js} +1 -1
  109. package/dist/{chunk-Y3ZKT6IF.js → chunk-RMNYY5IE.js} +3 -3
  110. package/dist/{chunk-5CSZTVXH.js → chunk-S3QCJWCF.js} +8 -8
  111. package/dist/{chunk-TLCRIAU3.js → chunk-S4USA5WC.js} +11 -11
  112. package/dist/{chunk-AEZ3EICK.js → chunk-S5X7BVWP.js} +6 -6
  113. package/dist/{chunk-DWYPYVPJ.js → chunk-SR2M7DWL.js} +3 -3
  114. package/dist/{chunk-2P6IHSRO.js → chunk-T4TMX54Q.js} +6 -6
  115. package/dist/{chunk-WIF7A6JU.js → chunk-T72K4PLH.js} +3 -3
  116. package/dist/{chunk-A5GY2EWH.js → chunk-TBKJPKDN.js} +3 -3
  117. package/dist/{chunk-WEG7DY5K.js → chunk-TIUBGJG3.js} +4 -4
  118. package/dist/{chunk-MQHYCS6A.js → chunk-TJHDFS33.js} +16 -14
  119. package/dist/{chunk-2Q2YBAR5.js → chunk-TJP2KLZI.js} +5 -4
  120. package/dist/{chunk-HKGQUOQ3.js → chunk-TV6ECMN3.js} +7 -7
  121. package/dist/{chunk-NHS55U7T.js → chunk-U2SGLXFR.js} +5 -5
  122. package/dist/{chunk-CWSZP2LU.js → chunk-U3JGJ3BO.js} +12 -12
  123. package/dist/{chunk-DPNCAFMB.js → chunk-U43G5EUN.js} +5 -5
  124. package/dist/{chunk-CJXM6SG4.js → chunk-UQUDITWL.js} +11 -11
  125. package/dist/{chunk-VS6FS472.js → chunk-UYKKTEWB.js} +4 -4
  126. package/dist/{chunk-DWN7RSNQ.js → chunk-VAL7HAIR.js} +1 -1
  127. package/dist/{chunk-Z47YGBUY.js → chunk-VC4JMXM5.js} +9 -8
  128. package/dist/{chunk-X64BFQ3R.js → chunk-VRH6ITQH.js} +3 -3
  129. package/dist/{chunk-FAET4BB6.js → chunk-VUBVBFJW.js} +4 -4
  130. package/dist/{chunk-UT5OA7KA.js → chunk-W3ZWS3B3.js} +2 -2
  131. package/dist/{chunk-NTTXTLCQ.js → chunk-WBOVB3XR.js} +11 -11
  132. package/dist/{chunk-B6X5PJSA.js → chunk-WFJMKUTR.js} +6 -6
  133. package/dist/{chunk-5H46QFSL.js → chunk-WRLEYM3T.js} +1 -1
  134. package/dist/{chunk-EJDZEK22.js → chunk-WSFPKNKT.js} +10 -10
  135. package/dist/{chunk-47HPZ34V.js → chunk-XB64FJLU.js} +11 -11
  136. package/dist/{chunk-HJ52XDST.js → chunk-XBNKOARP.js} +1 -1
  137. package/dist/chunk-XDTD55UU.js +89 -0
  138. package/dist/{chunk-3RP34PYV.js → chunk-XMYGEZQ7.js} +5 -5
  139. package/dist/{chunk-FSJMFPA3.js → chunk-XP3KLC4S.js} +2 -2
  140. package/dist/{chunk-BRCDEGNE.js → chunk-XRDYEEDE.js} +1 -1
  141. package/dist/{chunk-3ZKLWM5Y.js → chunk-XSNIHYO6.js} +2 -2
  142. package/dist/{chunk-76QVBNEM.js → chunk-XVQGT4SL.js} +7 -7
  143. package/dist/{chunk-GYS64N6F.js → chunk-XZLSKGJX.js} +2 -2
  144. package/dist/{chunk-GLSNVC67.js → chunk-Y2FMWQQB.js} +5 -5
  145. package/dist/{chunk-LTLR4JZJ.js → chunk-Y6LFFSRV.js} +5 -5
  146. package/dist/{chunk-MH7UBG47.js → chunk-YISWYR3Q.js} +3 -3
  147. package/dist/{chunk-7TH6I6TL.js → chunk-YSFIQGDK.js} +3 -3
  148. package/dist/{chunk-4RDW2X43.js → chunk-YVQWJDVN.js} +10 -10
  149. package/dist/{chunk-I2PNEG3M.js → chunk-ZDZCUZ4N.js} +3 -3
  150. package/dist/{chunk-BZRWJUB4.js → chunk-ZPPLFE4N.js} +4 -4
  151. package/dist/{chunk-XJRC3ZDI.js → chunk-ZRP6ZXOF.js} +3 -3
  152. package/dist/{chunk-FEBYMFZA.js → chunk-ZWGU46YO.js} +10 -10
  153. package/dist/files.json +371 -367
  154. package/package.json +4 -4
@@ -10,15 +10,15 @@ import {
10
10
  findingAction,
11
11
  findings,
12
12
  statusLine
13
- } from "./chunk-ITJ7ST5E.js";
13
+ } from "./chunk-5I5JDJ3R.js";
14
14
  import "./chunk-VOGCSYOI.js";
15
- import "./chunk-GMDOXWIS.js";
16
- import "./chunk-U5T4A2QV.js";
15
+ import "./chunk-KPHPVOME.js";
16
+ import "./chunk-G5SKNMPC.js";
17
17
  import "./chunk-JQG4VO47.js";
18
18
  import "./chunk-DW4BM73R.js";
19
- import "./chunk-22GLUHGE.js";
19
+ import "./chunk-DBZNQAMN.js";
20
20
  import "./chunk-QR65C3DV.js";
21
- import "./chunk-MLAACAES.js";
21
+ import "./chunk-7VAMO66T.js";
22
22
  import "./chunk-HY2VVVFZ.js";
23
23
  import "./chunk-PJRMMWU4.js";
24
24
  import "./chunk-34NWVIBC.js";
@@ -3,13 +3,20 @@ import { fileURLToPath as __atticusFileURLToPath } from "node:url";
3
3
  var require = __atticusCreateRequire(import.meta.url);
4
4
  var __atticusUrl = (p) => new URL("./" + p, import.meta.url).href;
5
5
  var __atticusPath = (p) => __atticusFileURLToPath(__atticusUrl(p));
6
+ import {
7
+ modelsData,
8
+ modelsLine,
9
+ reachHeadOf,
10
+ reachPlanOf,
11
+ readPathsOf
12
+ } from "./chunk-XDTD55UU.js";
6
13
  import {
7
14
  notesAt
8
- } from "./chunk-ZS47PQ3O.js";
15
+ } from "./chunk-CGF4LKXR.js";
9
16
  import {
10
17
  houseUntaughtLines,
11
18
  houseUntaughtOf
12
- } from "./chunk-3CFBU2O6.js";
19
+ } from "./chunk-PAQDPB6T.js";
13
20
  import {
14
21
  carryOf,
15
22
  checkoutOf,
@@ -18,20 +25,23 @@ import {
18
25
  excludesOf,
19
26
  headOf,
20
27
  loadReadPlan,
28
+ modelsModeOf,
21
29
  partOfWords,
22
30
  raiseReadQuestions,
23
31
  readCorrections,
24
32
  readPlanProgress,
25
33
  readPlanRelOf,
26
34
  readReviewed,
35
+ recordNotReached,
27
36
  reviewedProblemsOf,
28
37
  saveReadPlan,
29
38
  slipNoteLines,
30
39
  writeReadPlan,
31
40
  writeVerifyFiles
32
- } from "./chunk-P76AW3PA.js";
41
+ } from "./chunk-6AYUBYK6.js";
33
42
  import {
34
43
  ABOUT_RULE,
44
+ MODELS_RULE,
35
45
  assistantTier,
36
46
  mapBatchInstructions,
37
47
  readProbes,
@@ -39,7 +49,7 @@ import {
39
49
  taughtFrameworksText,
40
50
  tierSource,
41
51
  tierWords
42
- } from "./chunk-GHSVJNVL.js";
52
+ } from "./chunk-J22RSFKY.js";
43
53
  import {
44
54
  FILE_KINDS,
45
55
  SHOWN_PROPOSALS,
@@ -61,7 +71,7 @@ import {
61
71
  sliceText,
62
72
  staleMessage,
63
73
  verifyFacts
64
- } from "./chunk-MLAACAES.js";
74
+ } from "./chunk-7VAMO66T.js";
65
75
  import {
66
76
  loadRepos
67
77
  } from "./chunk-RA64IK43.js";
@@ -396,6 +406,12 @@ async function packFor(root, s, batch, source, op, now, notes) {
396
406
  const onFile = (await listQuestions(root, { repo: s.repo })).questions.filter((q) => q.state !== "retired");
397
407
  const rules = await rulesCovering(root, s.repo, op);
398
408
  const slices = fix ? [] : s.batches[batch];
409
+ const inBatch = new Set(slices.map((x) => x.path));
410
+ const reachedHere = (s.reached ?? []).filter((r) => inBatch.has(r.path));
411
+ const models = reachedHere.length ? [
412
+ "Model classes in this batch the entry points and calls reach (read these, and write their fields):",
413
+ ...reachedHere.map((r) => `- ${r.path} (${r.types.join(", ")}), from ${r.from}`)
414
+ ].join("\n") : void 0;
399
415
  const rejected = s.rejected.map((r) => rejectedText(r, source));
400
416
  const own = kindsOf(slices.map((x) => x.path));
401
417
  const theirs = kindsOf(s.rejected.flatMap((r) => citedFiles(r.fact)));
@@ -424,11 +440,23 @@ async function packFor(root, s, batch, source, op, now, notes) {
424
440
  // A-taught: how to read the wrapper calls and annotations of the frameworks it is built on.
425
441
  ...taughtOption(taughtIn(source, op)),
426
442
  // ADR 0163: what the organisation's terms mean here and what must hold, as data.
427
- ...notes ? { notes } : {}
443
+ ...notes ? { notes } : {},
444
+ // ADR 0169: the model classes of this batch the read reaches, listed beside it.
445
+ ...models ? { models: true } : {}
428
446
  }),
429
447
  classification: "public",
430
448
  trusted: true
431
449
  },
450
+ ...models ? [
451
+ {
452
+ id: "1-models",
453
+ kind: "document",
454
+ origin: "atticus/reachable",
455
+ text: models,
456
+ classification: "internal",
457
+ priority: 9
458
+ }
459
+ ] : [],
432
460
  ...s.reread ? [
433
461
  {
434
462
  id: "0-reread",
@@ -552,7 +580,7 @@ async function mapCommand(root, repo, o, io, deps = {}) {
552
580
  const repoNotes = await notesAt(root, repo, dir, op);
553
581
  const notesPrompt = notesText(repoNotes.notes, repoNotes.type);
554
582
  if (o.gaps) {
555
- const { mapGaps } = await import("./chunk-4Q2PGM5T.js");
583
+ const { mapGaps } = await import("./chunk-PKCYRG6G.js");
556
584
  const tier = await tierHere(root, op);
557
585
  let part;
558
586
  if (o.part !== void 0) {
@@ -571,11 +599,14 @@ async function mapCommand(root, repo, o, io, deps = {}) {
571
599
  source,
572
600
  session: sessionTokensFor(limitOf(o, op, tier).limit),
573
601
  ...o.json ? { json: true } : {},
574
- ...part ? { part } : {}
602
+ ...part ? { part } : {},
603
+ ...o.models ? { models: o.models } : {},
604
+ exclude,
605
+ conventions
575
606
  }, io);
576
607
  }
577
608
  if (o.rules && !deps.runtime) {
578
- const { mapRules } = await import("./chunk-2Q2YBAR5.js");
609
+ const { mapRules } = await import("./chunk-TJP2KLZI.js");
579
610
  const tier = await tierHere(root, op);
580
611
  return mapRules(root, repo, {
581
612
  commit,
@@ -584,7 +615,8 @@ async function mapCommand(root, repo, o, io, deps = {}) {
584
615
  conventions,
585
616
  session: sessionTokensFor(limitOf(o, op, tier).limit),
586
617
  notes: notesPrompt,
587
- ...o.json ? { json: true } : {}
618
+ ...o.json ? { json: true } : {},
619
+ ...o.models ? { models: o.models } : {}
588
620
  }, io);
589
621
  }
590
622
  if (o.estimate)
@@ -660,13 +692,14 @@ async function mapCommand(root, repo, o, io, deps = {}) {
660
692
  return tooSmall(0);
661
693
  const frameworks = await frameworksFor(root, repo, existing);
662
694
  if (o.rules) {
663
- const { topUpOf, recordRulesNow, ruleSetsOfFiles } = await import("./chunk-2Q2YBAR5.js");
695
+ const { topUpOf, recordRulesNow, ruleSetsOfFiles } = await import("./chunk-TJP2KLZI.js");
664
696
  const t = await topUpOf(root, repo, {
665
697
  commit,
666
698
  facts: existing,
667
699
  source,
668
700
  exclude,
669
- conventions
701
+ conventions,
702
+ ...o.models ? { models: o.models } : {}
670
703
  });
671
704
  if ("error" in t) {
672
705
  io.err(t.error);
@@ -695,8 +728,23 @@ async function mapCommand(root, repo, o, io, deps = {}) {
695
728
  next: 0,
696
729
  rejected: [],
697
730
  problems: [],
698
- sets
731
+ sets,
732
+ // ADR 0169: the reached model classes, listed in the prompts of the batches holding them.
733
+ ...t.reach?.reach.rooted && t.reach.reach.reached.length ? {
734
+ reached: t.reach.reach.reached.map((r) => ({
735
+ path: r.path,
736
+ types: r.types,
737
+ from: r.from
738
+ }))
739
+ } : {}
699
740
  };
741
+ if (t.reach)
742
+ await recordNotReached(root, repo, {
743
+ commit,
744
+ session: sessionTokensFor(limit),
745
+ models: t.reach.mode,
746
+ ...t.reach.notReached ? { notReached: t.reach.notReached } : {}
747
+ });
700
748
  await saveState(root, s);
701
749
  io.out(`Topping up ${repo} at ${commit.slice(0, 12)} for the reading rules added since it was read (${sets.join(", ")}): ${plural(plan.files, "source file")} in ${batches(plan.batches.length)}; facts go to ${factsFile}.`);
702
750
  } else {
@@ -707,7 +755,20 @@ async function mapCommand(root, repo, o, io, deps = {}) {
707
755
  io.out(`Nothing ${repo}'s facts cite changed since ${since}, and no source file did: atticus verify ${repo} carries its ${plural(reread.carried, "fact")} to ${commit.slice(0, 12)}.`);
708
756
  return 0;
709
757
  }
710
- const plan = planBatches(reread ? onlyFiles(source, reread.files.map((f) => f.path)) : source, { room, exclude, overhead: overheadOf(repo, commit, frameworks), conventions });
758
+ const mode = await modelsModeOf(root, repo, o.models);
759
+ const rp = reread ? void 0 : reachPlanOf({
760
+ paths: readPathsOf(source, exclude, conventions),
761
+ source,
762
+ facts: existing,
763
+ mode
764
+ });
765
+ const plan = planBatches(reread ? onlyFiles(source, reread.files.map((f) => f.path)) : source, {
766
+ room,
767
+ exclude,
768
+ overhead: overheadOf(repo, commit, frameworks),
769
+ conventions,
770
+ ...rp?.reach.rooted && rp.reach.models ? { reach: { first: rp.first, leaveOut: rp.leaveOut } } : {}
771
+ });
711
772
  if (plan.leastRoom < MIN_ROOM)
712
773
  return tooSmall(room - plan.leastRoom);
713
774
  if (!plan.batches.length && !reread) {
@@ -728,6 +789,13 @@ async function mapCommand(root, repo, o, io, deps = {}) {
728
789
  return { id: r.id, code: "cite-changed", message: staleMessage(fact, r, commit), fact };
729
790
  }),
730
791
  problems: [],
792
+ ...rp?.reach.rooted && rp.reach.reached.length ? {
793
+ reached: rp.reach.reached.map((r) => ({
794
+ path: r.path,
795
+ types: r.types,
796
+ from: r.from
797
+ }))
798
+ } : {},
731
799
  ...reread ? {
732
800
  reread: {
733
801
  from: reread.from.map((x) => x.commit),
@@ -737,6 +805,15 @@ async function mapCommand(root, repo, o, io, deps = {}) {
737
805
  } : {}
738
806
  };
739
807
  await saveState(root, s);
808
+ if (rp)
809
+ await recordNotReached(root, repo, {
810
+ commit,
811
+ session: sessionTokensFor(limit),
812
+ models: mode,
813
+ ...rp.notReached ? { notReached: rp.notReached } : {}
814
+ });
815
+ if (rp?.leaveOut.length)
816
+ io.out(`${rp.leaveOut.length} model ${rp.leaveOut.length === 1 ? "class" : "classes"} no entry or call reaches are left out (ADR 0169; recorded in ${readPlanRelOf(root, repo)}): atticus map ${repo} --models all reads them.`);
740
817
  io.out(reread ? `Re-reading ${repo} at ${commit.slice(0, 12)}: ${plural(plan.files, "source file")} changed since ${since}, in ${batches(plan.batches.length)}${plan.batches.length ? ` (about ${plan.tokens} tokens${limit ? `, each prompt within ${limit} tokens` : ""})` : ""}; ${plural(reread.reread.length, "fact")} to rewrite, ${reread.carried} carried as they are; facts go to ${factsFile}.` : `Reading ${repo} at ${commit.slice(0, 12)} in ${batches(plan.batches.length)} (${plural(plan.files, "source file")}, about ${plan.tokens} tokens${limit ? `, each prompt within ${limit} tokens` : ""}); facts go to ${factsFile}.`);
741
818
  }
742
819
  }
@@ -830,7 +907,9 @@ async function takeAnswer(root, s, run, batch, source, exclude, now, io, at) {
830
907
  ...estate ? { estate } : {},
831
908
  conventions: await conventionsAt(root),
832
909
  // ADR 0163: a term's note is one of those the batch was handed.
833
- notes: (await notesAt(root, s.repo, at.dir)).notes
910
+ notes: (await notesAt(root, s.repo, at.dir)).notes,
911
+ // ADR 0169: the model files the read leaves out, counted apart.
912
+ notReached: (await loadReadPlan(root, s.repo))?.notReached?.files ?? []
834
913
  });
835
914
  const q = await raiseReadQuestions(root, s.repo, answer.questions, source, {
836
915
  command: `atticus map ${s.repo}`,
@@ -839,7 +918,7 @@ async function takeAnswer(root, s, run, batch, source, exclude, now, io, at) {
839
918
  });
840
919
  const summary = await writeVerifyFiles(root, s.repo, report, s.commit, q.problems, [], reviewedProblemsOf(reviewed.bad, report), answer.slips);
841
920
  if (answer.about) {
842
- const { keepDraftedDescription } = await import("./chunk-ZYASEL7K.js");
921
+ const { keepDraftedDescription } = await import("./chunk-HMQXIFOL.js");
843
922
  const d = await keepDraftedDescription(root, s.repo, answer.about, now());
844
923
  if (d.kept)
845
924
  io.out(`Your assistant says ${s.repo} is: "${answer.about.text}" \u2014 written to the manifest as a draft, unconfirmed. Confirm it (atticus repo describe ${s.repo} --accept), change it (--description "...") or drop it (--reject).`);
@@ -873,7 +952,7 @@ async function finish(root, s, io, o) {
873
952
  await saveState(root, s);
874
953
  const last = s.last;
875
954
  if (last && !last.rejected && !s.reread) {
876
- const { recordRulesNow } = await import("./chunk-2Q2YBAR5.js");
955
+ const { recordRulesNow } = await import("./chunk-TJP2KLZI.js");
877
956
  await recordRulesNow(root, s.repo, s.commit);
878
957
  }
879
958
  const rel = factsRelOf(root);
@@ -885,7 +964,7 @@ async function finish(root, s, io, o) {
885
964
  io.out(`Read ${s.repo}: nothing was kept.`);
886
965
  return 0;
887
966
  }
888
- io.out(`Read ${s.repo} in ${batches(s.batches.length)}: ${plural(last.accepted, "fact")} kept in ${rel}/${s.repo}.jsonl, ${last.rejected} still rejected; coverage ${Math.round(last.coverage.ratio * 100)}% (${last.coverage.read} read, ${last.coverage.reviewed ? `${last.coverage.reviewed} reviewed with nothing to record, ` : ""}${last.coverage.unknown.length} unknown).`);
967
+ io.out(`Read ${s.repo} in ${batches(s.batches.length)}: ${plural(last.accepted, "fact")} kept in ${rel}/${s.repo}.jsonl, ${last.rejected} still rejected; coverage ${Math.round(last.coverage.ratio * 100)}% (${last.coverage.read} read, ${last.coverage.reviewed ? `${last.coverage.reviewed} reviewed with nothing to record, ` : ""}${last.coverage.unknown.length} unknown${last.coverage.notReached?.length ? `, ${last.coverage.notReached.length} model files no entry or call reaches` : ""}).`);
889
968
  if (last.rejected)
890
969
  io.out(`The rejected facts are in ${rel}/${s.repo}.rejected.jsonl; fix them by hand or with your assistant, then atticus verify ${s.repo}.`);
891
970
  if (last.coverage.unknown.length)
@@ -932,13 +1011,6 @@ async function estimate(root, repo, c, io) {
932
1011
  exclude: c.exclude,
933
1012
  conventions
934
1013
  });
935
- const planned = room >= MIN_ROOM ? planBatches(readSource, {
936
- room,
937
- exclude: c.exclude,
938
- conventions,
939
- overhead: overheadOf(repo, c.commit, await frameworksFor(root, repo, typeof existing === "string" ? [] : existing))
940
- }) : void 0;
941
- const plan = planned && planned.leastRoom >= MIN_ROOM ? planned : void 0;
942
1014
  const files = whole.batches.flat().map((s) => ({ path: s.path, tokens: s.tokens }));
943
1015
  const proposed = reread ? { proposals: [], before: whole.tokens, after: whole.tokens } : proposeExclusions(files, c.source.list(), (p) => c.source.read(p), {
944
1016
  // What the person's description plainly says this repo holds (ADR 0128).
@@ -952,18 +1024,38 @@ async function estimate(root, repo, c, io) {
952
1024
  const text = c.source.read(f.path);
953
1025
  return text === void 0 ? f : { ...f, lines: text.split(/\r?\n/).length };
954
1026
  });
955
- const parts = planParts(product, session);
1027
+ const mode = await modelsModeOf(root, repo, c.o.models);
1028
+ const facts0 = typeof existing === "string" ? [] : existing;
1029
+ const rp = reread ? void 0 : reachPlanOf({ paths: product.map((f) => f.path), source: c.source, facts: facts0, mode });
1030
+ const leave = new Set(rp?.leaveOut ?? []);
1031
+ const kept = product.filter((f) => !leave.has(f.path));
1032
+ const ordered = rp && rp.reach.rooted && rp.reach.models > 0;
1033
+ const parts = planParts(kept, session, ordered ? {
1034
+ head: reachHeadOf(kept.map((f) => f.path), rp),
1035
+ models: rp.reach.reached.map((r) => r.path),
1036
+ leftOut: rp.leaveOut
1037
+ } : void 0);
1038
+ const planned = room >= MIN_ROOM ? planBatches(readSource, {
1039
+ room,
1040
+ exclude: c.exclude,
1041
+ conventions,
1042
+ overhead: overheadOf(repo, c.commit, await frameworksFor(root, repo, facts0)),
1043
+ ...rp && ordered ? { reach: { first: rp.first, leaveOut: rp.leaveOut } } : {}
1044
+ }) : void 0;
1045
+ const plan = planned && planned.leastRoom >= MIN_ROOM ? planned : void 0;
956
1046
  const plan0 = await loadReadPlan(root, repo);
957
1047
  const same = plan0 !== void 0 && plan0.commit === c.commit && plan0.session === session && plan0.parts.length === parts.length && plan0.parts.every((p, i) => p.paths.length === parts[i].paths.length && p.paths.every((x, j) => x === parts[i].paths[j]));
958
1048
  const estimate2 = {
959
- files: product.length,
960
- tokens: product.reduce((n, f) => n + f.tokens, 0),
1049
+ files: kept.length,
1050
+ tokens: kept.reduce((n, f) => n + f.tokens, 0),
961
1051
  sessions: parts.length || 1,
962
1052
  ...reread ? { reread: true } : {}
963
1053
  };
964
1054
  const sameEstimate = plan0?.estimate !== void 0 && plan0.estimate.files === estimate2.files && plan0.estimate.tokens === estimate2.tokens && plan0.estimate.sessions === estimate2.sessions && plan0.estimate.reread === estimate2.reread;
965
1055
  const firstRead = typeof existing !== "string" && existing.length === 0 && !reread;
966
1056
  const readRules = firstRead ? rulesNow() : plan0?.rules;
1057
+ const notReached = rp ? rp.notReached : plan0?.notReached;
1058
+ const sameModels = plan0 !== void 0 && (plan0.models ?? "reachable") === mode && JSON.stringify(plan0.notReached ?? null) === JSON.stringify(notReached ?? null);
967
1059
  if (!same)
968
1060
  await writeReadPlan(root, repo, {
969
1061
  commit: c.commit,
@@ -972,10 +1064,20 @@ async function estimate(root, repo, c, io) {
972
1064
  estimate: estimate2,
973
1065
  // What the reader reported of an earlier plan stays, under the commit it was of.
974
1066
  ...plan0?.reported ? { reported: plan0.reported } : {},
975
- ...readRules ? { rules: readRules } : {}
1067
+ ...readRules ? { rules: readRules } : {},
1068
+ models: mode,
1069
+ ...notReached ? { notReached } : {}
1070
+ });
1071
+ else if (!sameEstimate || !sameModels || firstRead && plan0.rules?.hash !== readRules?.hash) {
1072
+ const { notReached: _n, models: _m, ...rest0 } = plan0;
1073
+ await saveReadPlan(root, {
1074
+ ...rest0,
1075
+ estimate: estimate2,
1076
+ ...readRules ? { rules: readRules } : {},
1077
+ ...mode === "all" ? { models: "all" } : {},
1078
+ ...notReached ? { notReached } : {}
976
1079
  });
977
- else if (!sameEstimate || firstRead && plan0.rules?.hash !== readRules?.hash)
978
- await saveReadPlan(root, { ...plan0, estimate: estimate2, ...readRules ? { rules: readRules } : {} });
1080
+ }
979
1081
  const progress = parts.length ? await readPlanProgress(root, repo, { commit: c.commit }) : void 0;
980
1082
  const questions = (await listQuestions(root, { repo })).questions.filter((q) => q.state !== "retired");
981
1083
  const notes = await notesAt(root, repo, c.dir, c.op);
@@ -1000,6 +1102,8 @@ async function estimate(root, repo, c, io) {
1000
1102
  maxTokensGiven: given !== void 0,
1001
1103
  maxTokensFrom: from ?? "example",
1002
1104
  batches: plan?.batches.length ?? null,
1105
+ // ADR 0169: what the read plans to read (the model classes it leaves out, out).
1106
+ read: { files: estimate2.files, tokens: estimate2.tokens },
1003
1107
  order: whole.batches.flat().map((x) => x.path),
1004
1108
  // ADR 0128: what a person says the repo is, and whether that eased the proposals.
1005
1109
  about: about ? { text: about.text, trust: about.trust, eased: saysNotProduct(about) } : null,
@@ -1023,6 +1127,13 @@ async function estimate(root, repo, c, io) {
1023
1127
  }
1024
1128
  } : {}
1025
1129
  },
1130
+ // ADR 0169: the model classes reached from the entry points and calls, and those left out.
1131
+ models: rp ? {
1132
+ mode,
1133
+ roots: rp.reach.roots,
1134
+ reached: rp.reach.reached,
1135
+ notReached: rp.leaveOut
1136
+ } : null,
1026
1137
  tier,
1027
1138
  // A-taught: the frameworks of the organisation it is built on, as taught to Atticus.
1028
1139
  taughtFrameworks: taughtIn(c.source, c.op).map((m) => m.name),
@@ -1100,6 +1211,15 @@ repo: ${repo}`);
1100
1211
  io.out(` part ${p.part} is part-read: nothing in the facts yet for ${p.left.join(", ")}.`);
1101
1212
  }
1102
1213
  }
1214
+ const line = rp ? modelsLine(repo, rp) : void 0;
1215
+ if (rp && line) {
1216
+ io.out(line);
1217
+ const data = modelsData(repo, rp);
1218
+ if (data) {
1219
+ io.out(MODELS_RULE);
1220
+ io.out(data);
1221
+ }
1222
+ }
1103
1223
  io.out(`Your assistant: ${tierWords(tier)}, ${tierSource(tier)}. ${tier.how}`);
1104
1224
  io.out(`Another agentic assistant (Claude Code, Cursor, Gemini CLI) reads it the same way: /atticus-map ${repo}; one without file tools gets batches with atticus map ${repo} --handoff --max-tokens <its limit>.`);
1105
1225
  if (tier.fallback)
@@ -15,19 +15,19 @@ import {
15
15
  glossaryScan,
16
16
  testsGenerate,
17
17
  traceCommand
18
- } from "./chunk-WEG7DY5K.js";
19
- import "./chunk-DGZXJO5I.js";
18
+ } from "./chunk-TIUBGJG3.js";
19
+ import "./chunk-PVMGHQWB.js";
20
20
  import "./chunk-TA2ZNDYD.js";
21
- import "./chunk-DWYPYVPJ.js";
21
+ import "./chunk-SR2M7DWL.js";
22
22
  import "./chunk-ISXNWUG7.js";
23
23
  import "./chunk-VOGCSYOI.js";
24
- import "./chunk-GMDOXWIS.js";
25
- import "./chunk-U5T4A2QV.js";
24
+ import "./chunk-KPHPVOME.js";
25
+ import "./chunk-G5SKNMPC.js";
26
26
  import "./chunk-JQG4VO47.js";
27
27
  import "./chunk-DW4BM73R.js";
28
- import "./chunk-22GLUHGE.js";
28
+ import "./chunk-DBZNQAMN.js";
29
29
  import "./chunk-QR65C3DV.js";
30
- import "./chunk-MLAACAES.js";
30
+ import "./chunk-7VAMO66T.js";
31
31
  import "./chunk-HY2VVVFZ.js";
32
32
  import "./chunk-PJRMMWU4.js";
33
33
  import "./chunk-34NWVIBC.js";
@@ -5,21 +5,21 @@ var __atticusUrl = (p) => new URL("./" + p, import.meta.url).href;
5
5
  var __atticusPath = (p) => __atticusFileURLToPath(__atticusUrl(p));
6
6
  import {
7
7
  targetFlowsOf
8
- } from "./chunk-BSVTNNUK.js";
9
- import "./chunk-ZPT4QX3J.js";
8
+ } from "./chunk-CJ5FQHST.js";
9
+ import "./chunk-ML3HOWPI.js";
10
10
  import {
11
11
  MAX_CHAIN_DEPTH,
12
12
  changeImpact,
13
13
  loadEstate
14
- } from "./chunk-DWYPYVPJ.js";
14
+ } from "./chunk-SR2M7DWL.js";
15
15
  import "./chunk-ISXNWUG7.js";
16
- import "./chunk-GMDOXWIS.js";
17
- import "./chunk-U5T4A2QV.js";
16
+ import "./chunk-KPHPVOME.js";
17
+ import "./chunk-G5SKNMPC.js";
18
18
  import "./chunk-JQG4VO47.js";
19
19
  import "./chunk-DW4BM73R.js";
20
- import "./chunk-22GLUHGE.js";
20
+ import "./chunk-DBZNQAMN.js";
21
21
  import "./chunk-QR65C3DV.js";
22
- import "./chunk-MLAACAES.js";
22
+ import "./chunk-7VAMO66T.js";
23
23
  import "./chunk-HY2VVVFZ.js";
24
24
  import "./chunk-PJRMMWU4.js";
25
25
  import "./chunk-34NWVIBC.js";
@@ -9,12 +9,12 @@ import {
9
9
  } from "./chunk-DQKNOHUZ.js";
10
10
  import {
11
11
  changeStore
12
- } from "./chunk-U5T4A2QV.js";
12
+ } from "./chunk-G5SKNMPC.js";
13
13
  import "./chunk-JQG4VO47.js";
14
14
  import "./chunk-DW4BM73R.js";
15
- import "./chunk-22GLUHGE.js";
15
+ import "./chunk-DBZNQAMN.js";
16
16
  import "./chunk-QR65C3DV.js";
17
- import "./chunk-MLAACAES.js";
17
+ import "./chunk-7VAMO66T.js";
18
18
  import "./chunk-HY2VVVFZ.js";
19
19
  import "./chunk-PJRMMWU4.js";
20
20
  import "./chunk-34NWVIBC.js";
@@ -27,7 +27,7 @@ import "./chunk-TV45EUGM.js";
27
27
 
28
28
  // packages/cli/dist/watch-commands.js
29
29
  async function watchLine(root, change) {
30
- const { cockpit } = await import("./chunk-QJ3OX7OC.js");
30
+ const { cockpit } = await import("./chunk-DLX2R3MI.js");
31
31
  try {
32
32
  const c = await cockpit(root, change);
33
33
  const parts = [
@@ -9,15 +9,16 @@ import {
9
9
  verifyAllCommand,
10
10
  verifyCommand,
11
11
  verifyInputsOf
12
- } from "./chunk-BTOGAUWX.js";
13
- import "./chunk-QY7RGTUP.js";
14
- import "./chunk-ZS47PQ3O.js";
15
- import "./chunk-P76AW3PA.js";
12
+ } from "./chunk-6IKYFARG.js";
13
+ import "./chunk-QOF7U6BI.js";
14
+ import "./chunk-XDTD55UU.js";
15
+ import "./chunk-CGF4LKXR.js";
16
+ import "./chunk-6AYUBYK6.js";
16
17
  import "./chunk-7VNEDDCC.js";
17
- import "./chunk-GHSVJNVL.js";
18
- import "./chunk-22GLUHGE.js";
18
+ import "./chunk-J22RSFKY.js";
19
+ import "./chunk-DBZNQAMN.js";
19
20
  import "./chunk-QR65C3DV.js";
20
- import "./chunk-MLAACAES.js";
21
+ import "./chunk-7VAMO66T.js";
21
22
  import "./chunk-HY2VVVFZ.js";
22
23
  import "./chunk-PJRMMWU4.js";
23
24
  import "./chunk-34NWVIBC.js";