@takagaki/cortex-decisions-viewer 0.12.95 → 0.12.97

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/build.js CHANGED
@@ -2208,10 +2208,14 @@ async function build(opts) {
2208
2208
  // 同一プロセスで2回ビルドしても前回の値が残らないよう、毎回入れ替える
2209
2209
  PROPOSALS_BY_PATH = await readGoldProposals(repoRoot);
2210
2210
  PROPOSAL_PATHS_MATCHED = new Set();
2211
- // 再導出の 3 帳簿(#665 便 12b)。**帳簿が無い案件では帯も並び替えも作らない**。
2211
+ // 再導出の 3 帳簿(#665 便 12b)と用語の強さ(#790)。**帳簿が無い案件では帯も並び替えも作らない**。
2212
2212
  // 人か機械かの見分けは engine が帳簿(`rewritten`)に書くので、画面は git の素性を読まない(#799)
2213
+ //
2214
+ // 🔴 **強さ(`state` が on のときだけ中身が入る)だけの案件でも器を作る**——作らないと、活性度の帳簿を
2215
+ // 持たない案件で用語集が目次(engine の `termRows`)と違う順になる。帯は `confirmation` の行が無ければ
2216
+ // 1 件も立たない(`rederivedContentKey` の門)ので、器を作っても帯・印は変わらない
2213
2217
  const ledgers = await (0, rederivation_1.readRederivationLedgers)(repoRoot);
2214
- const rederive = ledgers.confirmation.size || ledgers.activity.size
2218
+ const rederive = ledgers.confirmation.size || ledgers.activity.size || ledgers.strength.size
2215
2219
  ? {
2216
2220
  ledgers: ledgers,
2217
2221
  // 🔴 **`repoRoot` で走らせる**(`collectAiChangeHistory` の `process.cwd()` に倣わない)。
@@ -50,7 +50,7 @@ exports.ENGAGEMENT_LEDGER_VERSION = 1;
50
50
  /** 半減期(日)。engine `weights.mjs` の `HALF_LIFE_DAYS`(正本 6-B「半減期 90 日固定」) */
51
51
  exports.HALF_LIFE_DAYS = 90;
52
52
  /**
53
- * 行為 1 件の重み。engine `weights.mjs` の `WEIGHTS` の写し(24 値・**表に無い `kind` は 0**)。
53
+ * 行為 1 件の重み。engine `weights.mjs` の `WEIGHTS` の写し(25 値・**表に無い `kind` は 0**)。
54
54
  *
55
55
  * 🔴 契約の表(fixture)は `message.posted` しか使っていないので、**ここの写し間違いは表では
56
56
  * 捕まらない**。重みの番人は `test/member-engagement-parity.test.mjs` の `[重み]` が持つ。
@@ -66,6 +66,8 @@ exports.WEIGHTS = Object.freeze({
66
66
  "issue.created": 1.5,
67
67
  "issue.updated": 0.3,
68
68
  "issue.closed": 1.0,
69
+ // 課題の削除(engine #889・#699 F9g PR2-4a)。削除は数えないので 0
70
+ "issue.deleted": 0,
69
71
  "page.revised": 1.5,
70
72
  "page.deleted": 0,
71
73
  "commit.pushed": 1.0,
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.HUMAN_FOLLOWUP_STATES = exports.FOLLOWUP_EVIDENCE_VERDICTS = exports.FOLLOWUP_SHOWN_STATES = exports.DECISION_FOLLOWUP_FILE = exports.emptyLedgers = exports.LEDGER_VERSION = void 0;
6
+ exports.HUMAN_FOLLOWUP_STATES = exports.FOLLOWUP_EVIDENCE_VERDICTS = exports.FOLLOWUP_SHOWN_STATES = exports.DECISION_FOLLOWUP_FILE = exports.emptyLedgers = exports.TERM_STRENGTH_FILE = exports.LEDGER_VERSION = void 0;
7
7
  exports.isConfirmedStatus = isConfirmedStatus;
8
8
  exports.parseLedger = parseLedger;
9
9
  exports.readRederivationLedgers = readRederivationLedgers;
@@ -20,15 +20,17 @@ exports.readDecisionFollowup = readDecisionFollowup;
20
20
  exports.shownFollowupOf = shownFollowupOf;
21
21
  exports.humanFollowupOf = humanFollowupOf;
22
22
  /**
23
- * 再導出の 3 帳簿を読み、帯「人が確認した版から変わりました」と用語集の並びを作る(#665 便 12b)。
23
+ * 再導出の 3 帳簿(+用語の強さの帳簿)を読み、帯「人が確認した版から変わりました」と用語集の並びを作る(#665 便 12b)。
24
24
  *
25
25
  * | 帳簿 | 何を持つか | 書き手 |
26
26
  * | --- | --- | --- |
27
27
  * | `.cortex/gold-confirmation.json` | レコードごとの「人が確認した版」と、その後の機械の書き直しの最新(`rewritten`・中身の指紋つき・#799) | 夜間(全置換・git から作り直せる) |
28
28
  * | `.cortex/gold-rederivation.json` | 書き直しの根拠の件数・shadow の「書くつもりだった差分」 | 夜間(追記・区画ごとの節) |
29
29
  * | `.cortex/gold-activity.json` | 「最後に見た日」と触れた日の列(+観測の到達点 `cursor`) | 夜間(追記・剪定つき) |
30
+ * | `.cortex/gold-term-strength.json` | 用語ごとの強さ(場面の数・使った人の数・資料の下地)と栓の状態 `state`(#790・engine #727) | 夜間(全置換) |
30
31
  *
31
- * 形の正本は cortex-engine `scripts/rederive/ledgers.mjs` と `docs/cortex-derived-files.md`。
32
+ * 形の正本は cortex-engine `scripts/rederive/ledgers.mjs` と `docs/cortex-derived-files.md`
33
+ * (強さの帳簿は `scripts/gold/term-gate.mjs` の `strengthLedgerOf`)。
32
34
  *
33
35
  * ## 🔴 帳簿が無い・壊れている・古い形の案件は「今までと 1 バイトも同じ画面」
34
36
  *
@@ -80,10 +82,13 @@ const MIN_ELAPSED_DAYS = 0.5;
80
82
  function isConfirmedStatus(status, recordPath = null) {
81
83
  return !(0, confirmed_1.machineOwned)(recordPath, status);
82
84
  }
85
+ /** 強さの帳簿のファイル名(`.cortex/` の下) */
86
+ exports.TERM_STRENGTH_FILE = "gold-term-strength.json";
83
87
  const emptyLedgers = () => ({
84
88
  confirmation: new Map(),
85
89
  rederivation: new Map(),
86
90
  activity: new Map(),
91
+ strength: new Map(),
87
92
  });
88
93
  exports.emptyLedgers = emptyLedgers;
89
94
  /**
@@ -103,15 +108,19 @@ function parseLedger(text) {
103
108
  return null;
104
109
  }
105
110
  }
106
- /** 1 本読む。無い(ENOENT)ことは警告しない(既定の状態)。壊れているときだけ 1 行残す */
107
- async function readOne(repoRoot, file) {
111
+ /**
112
+ * 1 本読む。無い(ENOENT)ことは警告しない(既定の状態)。壊れているときだけ 1 行残す。
113
+ *
114
+ * @param then 警告の括弧の中(読めなかったあと画面がどうなるか)。強さの帳簿は帯を持たないので文言を変える
115
+ */
116
+ async function readOne(repoRoot, file, then = "帯と並びは出さずに続けます") {
108
117
  let raw;
109
118
  try {
110
119
  raw = await promises_1.default.readFile(node_path_1.default.join(repoRoot, ".cortex", file), "utf8");
111
120
  }
112
121
  catch (e) {
113
122
  if (e?.code !== "ENOENT") {
114
- console.warn(`${file} を読めませんでした(帯と並びは出さずに続けます): ${String(e)}`);
123
+ console.warn(`${file} を読めませんでした(${then}): ${String(e)}`);
115
124
  }
116
125
  return null;
117
126
  }
@@ -119,7 +128,7 @@ async function readOne(repoRoot, file) {
119
128
  // **壊れている・版が違うときは 1 行残す。** 静かに 0 件になると、帯が出ない理由が
120
129
  // 「夜間がまだ書いていない」のか「読めていない」のか切り分けられない
121
130
  if (!parsed)
122
- console.warn(`${file} の形式か version が想定と違います(帯と並びは出さずに続けます)`);
131
+ console.warn(`${file} の形式か version が想定と違います(${then})`);
123
132
  return parsed;
124
133
  }
125
134
  const asRecord = (v) => v != null && typeof v === "object" && !Array.isArray(v) ? v : null;
@@ -219,6 +228,38 @@ async function readRederivationLedgers(repoRoot) {
219
228
  }
220
229
  }
221
230
  }
231
+ // 用語の強さ(#790)。**engine の目次(`scripts/memory-index.mjs` の `termStrengthLookup`)の写し**
232
+ const strengthThen = "用語集は今の並びのまま続けます";
233
+ const strength = await readOne(repoRoot, exports.TERM_STRENGTH_FILE, strengthThen);
234
+ if (strength) {
235
+ const terms = strength.terms;
236
+ // 🔴 **engine と同じ判定**(`body.version !== 1`(厳密)・`!body.terms || typeof body.terms !== "object"`)。
237
+ // `readOne` の `parseLedger` は `Number(version)` で読むので `"1"` を通す——目次は通さないので、ここで締める。
238
+ // 壊れているのと同じなので 1 行残す(無いときだけ黙る)
239
+ if (strength.version !== exports.LEDGER_VERSION || !terms || typeof terms !== "object") {
240
+ console.warn(`${exports.TERM_STRENGTH_FILE} の形式か version が想定と違います(${strengthThen})`);
241
+ }
242
+ else if (strength.state === "on") {
243
+ // 🔴 **並びに使うのは `state === "on"` のときだけ**。`shadow` は「夜間が数えているが、まだ並びに
244
+ // 効かせない」段階で、目次も栓が on になるまで強さを使わない。ここで shadow を読むと、画面だけが
245
+ // 先に並び替わり、目次(AI に渡る順)と食い違う。on 以外は既定の状態なので警告しない
246
+ const t = terms;
247
+ for (const p of Object.keys(t)) {
248
+ // 語ごとの値は engine と同じ門(`Object.hasOwn(terms, p) && terms[p] && typeof terms[p] === "object"`。
249
+ // `Object.keys` は自前のキーだけを返すので `hasOwn` はここで満たされている)。
250
+ // 通らない語はキーごと持たない=「知らない」(末尾へ)
251
+ const v = t[p];
252
+ if (!v || typeof v !== "object")
253
+ continue;
254
+ const s = v;
255
+ out.strength.set(p, {
256
+ scenes: Number(s.scenes) || 0,
257
+ people: Number(s.people) || 0,
258
+ base: s.base === true,
259
+ });
260
+ }
261
+ }
262
+ }
222
263
  return out;
223
264
  }
224
265
  /** `YYYY-MM-DD` を「その日の正午(UTC)」として読む(時刻を持たない日付に時差を持ち込まない) */
@@ -496,11 +537,24 @@ function rederivedBandOf(recordPath, status, ledgers, nowShaOf, verdict, miss) {
496
537
  * **流し込んだ別の実体**で、2 つが一致していることは `rederived-mark-ui.test.mjs` の `[札との一致]` が見る。
497
538
  * ここで変えるのは**並びだけ**で、札・帯・印・プロンプトに渡る材料は 1 つも変えていない。
498
539
  *
499
- * - 活性度を持つレコードが 1 件も無い区画は **1 バイトも触らない**(帳簿が無い案件は従来順)
540
+ * - 活性度を持つレコードが 1 件も無い区画は活性度の段では **1 バイトも触らない**(帳簿が無い案件は従来順。
541
+ * 強さの段は別に通る・下の「強さの段」)
500
542
  * - 活性度を知らないレコードは**末尾**へ、**元の並びのまま**(安定)
501
543
  * - 同じ活性度なら元の並び(日付降順 → タイトル昇順がそのまま残る)
502
544
  * - 用語集だけ(関係者の並びは `engagement.ts`・便 14b。Decisions と Rules は対象外)
503
545
  *
546
+ * ## 強さの段(#790・engine #727)
547
+ *
548
+ * 活性度で並べた**後に**、用語の強さ(場面の数 → 使った人の数 → 資料の下地の辞書式降順)を
549
+ * かぶせる(`rankByStrength`)。🔴 **engine の目次(`scripts/memory-index.mjs` の `termRows`)の写し**
550
+ * ——画面と目次で同じ語の順番が食い違うと「目次の上から N 件を AI に読ませる」構想(#544)の
551
+ * 土台が崩れるので、**目次と同じ並び**にする。一致は `glossary-activity-parity.test.mjs` の
552
+ * `[強さ]`(engine を実際に呼んで焼いた表)が見る。
553
+ * - 🔴 **帳簿の `state` が `"on"` のときだけ**(`readRederivationLedgers` がそれ以外を空にする)
554
+ * - 強さを持つ語が 1 件も無ければ活性度の並びのまま(帳簿が無い案件は 1 バイトも触らない)
555
+ * - 強さを知らない語は**末尾**へ、活性度の並びのまま。同点も活性度の並びのまま(安定)
556
+ * - 🔴 活性度の帳簿が無く強さだけある案件でも並べる(活性度の段が「何もしない」でも強さの段は飛ばさない)
557
+ *
504
558
  * ℹ️ `ledgers` と `statusOf` は**受け取り続ける**。`ledgers` は活性度のために要る。
505
559
  * `statusOf` は並びに使わなくなったが、**引数から落とすと「群分けを足し戻す」退行が
506
560
  * コンパイルで止まる代わりに、変異検証でそれを実演できなくなる**(`ledgers` と同じ流儀)。
@@ -512,6 +566,11 @@ function rederivedBandOf(recordPath, status, ledgers, nowShaOf, verdict, miss) {
512
566
  function orderByActivity(records, pathOf, statusOf, ledgers, nowIso) {
513
567
  if (!records.length)
514
568
  return records;
569
+ // 🔴 **強さの段は活性度の段の後に必ず通す**(活性度が 1 件も無い案件でも・上の「強さの段」)
570
+ return rankByStrength(rankByActivity(records, pathOf, ledgers, nowIso), pathOf, ledgers);
571
+ }
572
+ /** 活性度の段。活性度を持つ語が 1 件も無ければ**渡された配列をそのまま返す** */
573
+ function rankByActivity(records, pathOf, ledgers, nowIso) {
515
574
  // この区画が並べ替えの対象か(用語集で、活性度の行が 1 件以上あるか)
516
575
  const scored = records.map((r, i) => {
517
576
  const p = pathOf(r);
@@ -537,6 +596,40 @@ function orderByActivity(records, pathOf, statusOf, ledgers, nowIso) {
537
596
  })
538
597
  .map((s) => s.r);
539
598
  }
599
+ /**
600
+ * 強さの段(#790)。**engine `scripts/glossary/activity.mjs` の `rankByStrength` の写し**——鍵・同点・
601
+ * 「知らない」の扱いを 1 つでも変えると、画面と目次で同じ語の順番が割れる。
602
+ *
603
+ * - 強さを持つ語が 1 件も無ければ**渡された配列をそのまま返す**(`state` が on でない案件はここ)
604
+ * - 知らない語(帳簿に無い・用語集の区画の外)は末尾へ、渡された順のまま
605
+ * - 鍵は `[場面の数, 使った人の数, 下地]` の辞書式降順。同点は渡された順(=活性度の並び・安定)
606
+ */
607
+ function rankByStrength(records, pathOf, ledgers) {
608
+ if (!ledgers.strength.size)
609
+ return records;
610
+ const scored = records.map((r, i) => {
611
+ const p = pathOf(r);
612
+ return { r: r, i: i, s: ORDER_SECTION_RE.test(p) ? (ledgers.strength.get(p) ?? null) : null };
613
+ });
614
+ if (!scored.some((x) => x.s != null))
615
+ return records;
616
+ const key = (s) => [s.scenes, s.people, s.base ? 1 : 0];
617
+ return scored
618
+ .slice()
619
+ .sort((a, b) => {
620
+ if ((a.s == null) !== (b.s == null))
621
+ return a.s == null ? 1 : -1;
622
+ if (a.s != null && b.s != null) {
623
+ const ka = key(a.s);
624
+ const kb = key(b.s);
625
+ for (let k = 0; k < ka.length; k++)
626
+ if (ka[k] !== kb[k])
627
+ return kb[k] - ka[k];
628
+ }
629
+ return a.i - b.i;
630
+ })
631
+ .map((x) => x.r);
632
+ }
540
633
  /* ---------------------------------------------------------------------------
541
634
  * 決定の「その後」の帳簿(#705・engine #509 便 4)
542
635
  * ---------------------------------------------------------------------------
package/dist/render.js CHANGED
@@ -10877,8 +10877,12 @@ ${calendarAddUrl.toString()}
10877
10877
  * **文書化されている形だけを使う。** target_id に組織のログイン名を渡す形は GitHub の
10878
10878
  * 文書に無く、未ログインだとログイン画面へ転送されて 200 が返るので、効いているかを
10879
10879
  * 外から確かめられない。**確かめられないものを顧客に押させない。**
10880
+ *
10881
+ * **窓口の読む App(R)と同じ App を指す**(cortex-engine #769)。正本は infra の
10882
+ * githubBrokerSettings.apps.R.slug。R を切り替える・戻す便でここも一緒に直す
10883
+ * (食い違いは infra/test/github-broker-stack.test.ts の二重持ちの番人が落とす)。
10880
10884
  */
10881
- var GITHUB_APP_INSTALL_URL = "https://github.com/apps/classmethod-cortex-app/installations/new";
10885
+ var GITHUB_APP_INSTALL_URL = "https://github.com/apps/classmethod-cortex-reader/installations/new";
10882
10886
 
10883
10887
  /**
10884
10888
  * GitHub App のインストールへ行くリンク(2026-08-20 に部品化)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.95",
3
+ "version": "0.12.97",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,