@bongos/core 1.19.499 → 1.19.500

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.
@@ -383,7 +383,7 @@
383
383
  "occurrences": 3,
384
384
  "at": [
385
385
  "modules/hall-ui/public/goals-lib.js:32",
386
- "modules/hall-ui/public/goals-render.js:621",
386
+ "modules/hall-ui/public/goals-render.js:631",
387
387
  "modules/hall-ui/public/goals.js:45"
388
388
  ]
389
389
  },
@@ -944,8 +944,8 @@
944
944
  "text": "Only an open goal can be managed.",
945
945
  "occurrences": 2,
946
946
  "at": [
947
- "modules/hall-ui/public/goals-render.js:1031",
948
- "modules/hall-ui/public/goals-render.js:1047"
947
+ "modules/hall-ui/public/goals-render.js:1042",
948
+ "modules/hall-ui/public/goals-render.js:1058"
949
949
  ]
950
950
  },
951
951
  {
@@ -954,8 +954,8 @@
954
954
  "text": "Only this goal's owner or a manager (or an Archon) may do this.",
955
955
  "occurrences": 2,
956
956
  "at": [
957
- "modules/hall-ui/public/goals-render.js:1030",
958
- "modules/hall-ui/public/goals-render.js:1046"
957
+ "modules/hall-ui/public/goals-render.js:1041",
958
+ "modules/hall-ui/public/goals-render.js:1057"
959
959
  ]
960
960
  },
961
961
  {
@@ -1274,8 +1274,8 @@
1274
1274
  "text": "This goal is not open.",
1275
1275
  "occurrences": 2,
1276
1276
  "at": [
1277
- "modules/hall-ui/public/goals-render.js:1001",
1278
- "modules/hall-ui/public/goals-render.js:1017"
1277
+ "modules/hall-ui/public/goals-render.js:1012",
1278
+ "modules/hall-ui/public/goals-render.js:1028"
1279
1279
  ]
1280
1280
  },
1281
1281
  {
@@ -1740,7 +1740,7 @@
1740
1740
  "surface": "builders-hall",
1741
1741
  "text": "+ Invite",
1742
1742
  "file": "modules/hall-ui/public/goals-render.js",
1743
- "line": 949,
1743
+ "line": 960,
1744
1744
  "origin": "js-markup",
1745
1745
  "confidence": "certain"
1746
1746
  },
@@ -1947,7 +1947,7 @@
1947
1947
  "surface": "builders-hall",
1948
1948
  "text": "A protected-scope goal requires a Metic+ member.",
1949
1949
  "file": "modules/hall-ui/public/goals-render.js",
1950
- "line": 999,
1950
+ "line": 1010,
1951
1951
  "origin": "js-notice",
1952
1952
  "confidence": "certain"
1953
1953
  },
@@ -2352,7 +2352,7 @@
2352
2352
  "surface": "builders-hall",
2353
2353
  "text": "Awaiting the owner/manager's approval",
2354
2354
  "file": "modules/hall-ui/public/goals-render.js",
2355
- "line": 843,
2355
+ "line": 854,
2356
2356
  "origin": "js-markup",
2357
2357
  "confidence": "certain"
2358
2358
  },
@@ -3081,7 +3081,7 @@
3081
3081
  "surface": "builders-hall",
3082
3082
  "text": "Contribution to this goal",
3083
3083
  "file": "modules/hall-ui/public/goals-render.js",
3084
- "line": 700,
3084
+ "line": 711,
3085
3085
  "origin": "js-markup",
3086
3086
  "confidence": "certain"
3087
3087
  },
@@ -3288,7 +3288,7 @@
3288
3288
  "surface": "builders-hall",
3289
3289
  "text": "Could not change that just now.",
3290
3290
  "file": "modules/hall-ui/public/goals-render.js",
3291
- "line": 1048,
3291
+ "line": 1059,
3292
3292
  "origin": "js-notice",
3293
3293
  "confidence": "certain"
3294
3294
  },
@@ -3369,7 +3369,7 @@
3369
3369
  "surface": "builders-hall",
3370
3370
  "text": "Could not invite that builder just now.",
3371
3371
  "file": "modules/hall-ui/public/goals-render.js",
3372
- "line": 1002,
3372
+ "line": 1013,
3373
3373
  "origin": "js-notice",
3374
3374
  "confidence": "certain"
3375
3375
  },
@@ -3774,7 +3774,7 @@
3774
3774
  "surface": "builders-hall",
3775
3775
  "text": "Could not send the request just now.",
3776
3776
  "file": "modules/hall-ui/public/goals-render.js",
3777
- "line": 1063,
3777
+ "line": 1074,
3778
3778
  "origin": "js-notice",
3779
3779
  "confidence": "certain"
3780
3780
  },
@@ -3819,7 +3819,7 @@
3819
3819
  "surface": "builders-hall",
3820
3820
  "text": "Could not update visibility just now.",
3821
3821
  "file": "modules/hall-ui/public/goals-render.js",
3822
- "line": 1032,
3822
+ "line": 1043,
3823
3823
  "origin": "js-notice",
3824
3824
  "confidence": "certain"
3825
3825
  },
@@ -3855,7 +3855,7 @@
3855
3855
  "surface": "builders-hall",
3856
3856
  "text": "Could not {…} just now.",
3857
3857
  "file": "modules/hall-ui/public/goals-render.js",
3858
- "line": 1018,
3858
+ "line": 1029,
3859
3859
  "origin": "js-notice",
3860
3860
  "confidence": "certain"
3861
3861
  },
@@ -4386,7 +4386,7 @@
4386
4386
  "surface": "builders-hall",
4387
4387
  "text": "Every task linked to this criterion has shipped — a Metic can confirm it",
4388
4388
  "file": "modules/hall-ui/public/goals-render.js",
4389
- "line": 643,
4389
+ "line": 654,
4390
4390
  "origin": "js-markup",
4391
4391
  "confidence": "certain"
4392
4392
  },
@@ -4404,7 +4404,7 @@
4404
4404
  "surface": "builders-hall",
4405
4405
  "text": "Everyone is already a member",
4406
4406
  "file": "modules/hall-ui/public/goals-render.js",
4407
- "line": 965,
4407
+ "line": 976,
4408
4408
  "origin": "js-markup",
4409
4409
  "confidence": "certain"
4410
4410
  },
@@ -4746,7 +4746,7 @@
4746
4746
  "surface": "builders-hall",
4747
4747
  "text": "Goal id",
4748
4748
  "file": "modules/hall-ui/public/goals-render.js",
4749
- "line": 768,
4749
+ "line": 779,
4750
4750
  "origin": "js-markup",
4751
4751
  "confidence": "certain"
4752
4752
  },
@@ -5241,7 +5241,7 @@
5241
5241
  "surface": "builders-hall",
5242
5242
  "text": "Invited.",
5243
5243
  "file": "modules/hall-ui/public/goals-render.js",
5244
- "line": 991,
5244
+ "line": 1002,
5245
5245
  "origin": "js-notice",
5246
5246
  "confidence": "certain"
5247
5247
  },
@@ -5304,7 +5304,7 @@
5304
5304
  "surface": "builders-hall",
5305
5305
  "text": "Join goal",
5306
5306
  "file": "modules/hall-ui/public/goals-render.js",
5307
- "line": 853,
5307
+ "line": 864,
5308
5308
  "origin": "js-markup",
5309
5309
  "confidence": "certain"
5310
5310
  },
@@ -5322,7 +5322,7 @@
5322
5322
  "surface": "builders-hall",
5323
5323
  "text": "Join requests",
5324
5324
  "file": "modules/hall-ui/public/goals-render.js",
5325
- "line": 1102,
5325
+ "line": 1113,
5326
5326
  "origin": "js-markup",
5327
5327
  "confidence": "certain"
5328
5328
  },
@@ -5493,7 +5493,7 @@
5493
5493
  "surface": "builders-hall",
5494
5494
  "text": "Leave goal",
5495
5495
  "file": "modules/hall-ui/public/goals-render.js",
5496
- "line": 840,
5496
+ "line": 851,
5497
5497
  "origin": "js-markup",
5498
5498
  "confidence": "certain"
5499
5499
  },
@@ -5862,7 +5862,7 @@
5862
5862
  "surface": "builders-hall",
5863
5863
  "text": "Module scope — tasks authored in this goal are bounded to these modules",
5864
5864
  "file": "modules/hall-ui/public/goals-render.js",
5865
- "line": 774,
5865
+ "line": 785,
5866
5866
  "origin": "js-markup",
5867
5867
  "confidence": "certain"
5868
5868
  },
@@ -6303,7 +6303,7 @@
6303
6303
  "surface": "builders-hall",
6304
6304
  "text": "Not taking requests",
6305
6305
  "file": "modules/hall-ui/public/goals-render.js",
6306
- "line": 848,
6306
+ "line": 859,
6307
6307
  "origin": "js-markup",
6308
6308
  "confidence": "certain"
6309
6309
  },
@@ -6492,7 +6492,7 @@
6492
6492
  "surface": "builders-hall",
6493
6493
  "text": "Only an open goal can be managed.",
6494
6494
  "file": "modules/hall-ui/public/goals-render.js",
6495
- "line": 1031,
6495
+ "line": 1042,
6496
6496
  "origin": "js-notice",
6497
6497
  "confidence": "certain"
6498
6498
  },
@@ -6501,7 +6501,7 @@
6501
6501
  "surface": "builders-hall",
6502
6502
  "text": "Only an open goal can be managed.",
6503
6503
  "file": "modules/hall-ui/public/goals-render.js",
6504
- "line": 1047,
6504
+ "line": 1058,
6505
6505
  "origin": "js-notice",
6506
6506
  "confidence": "certain"
6507
6507
  },
@@ -6510,7 +6510,7 @@
6510
6510
  "surface": "builders-hall",
6511
6511
  "text": "Only this goal's owner or a manager (or an Archon) may do this.",
6512
6512
  "file": "modules/hall-ui/public/goals-render.js",
6513
- "line": 1030,
6513
+ "line": 1041,
6514
6514
  "origin": "js-notice",
6515
6515
  "confidence": "certain"
6516
6516
  },
@@ -6519,7 +6519,7 @@
6519
6519
  "surface": "builders-hall",
6520
6520
  "text": "Only this goal's owner or a manager (or an Archon) may do this.",
6521
6521
  "file": "modules/hall-ui/public/goals-render.js",
6522
- "line": 1046,
6522
+ "line": 1057,
6523
6523
  "origin": "js-notice",
6524
6524
  "confidence": "certain"
6525
6525
  },
@@ -6528,7 +6528,7 @@
6528
6528
  "surface": "builders-hall",
6529
6529
  "text": "Only this goal's owner or a manager (or an Archon) may invite.",
6530
6530
  "file": "modules/hall-ui/public/goals-render.js",
6531
- "line": 1000,
6531
+ "line": 1011,
6532
6532
  "origin": "js-notice",
6533
6533
  "confidence": "certain"
6534
6534
  },
@@ -6771,7 +6771,7 @@
6771
6771
  "surface": "builders-hall",
6772
6772
  "text": "Pending invitations",
6773
6773
  "file": "modules/hall-ui/public/goals-render.js",
6774
- "line": 1103,
6774
+ "line": 1114,
6775
6775
  "origin": "js-markup",
6776
6776
  "confidence": "certain"
6777
6777
  },
@@ -6924,7 +6924,7 @@
6924
6924
  "surface": "builders-hall",
6925
6925
  "text": "Private — join is by invitation or an approved request",
6926
6926
  "file": "modules/hall-ui/public/goals-render.js",
6927
- "line": 786,
6927
+ "line": 797,
6928
6928
  "origin": "js-markup",
6929
6929
  "confidence": "certain"
6930
6930
  },
@@ -7023,7 +7023,7 @@
7023
7023
  "surface": "builders-hall",
7024
7024
  "text": "Protected module scope — join by request; an Archon admits members",
7025
7025
  "file": "modules/hall-ui/public/goals-render.js",
7026
- "line": 792,
7026
+ "line": 803,
7027
7027
  "origin": "js-markup",
7028
7028
  "confidence": "certain"
7029
7029
  },
@@ -7464,7 +7464,7 @@
7464
7464
  "surface": "builders-hall",
7465
7465
  "text": "Request sent — the owner or a manager will review it.",
7466
7466
  "file": "modules/hall-ui/public/goals-render.js",
7467
- "line": 1054,
7467
+ "line": 1065,
7468
7468
  "origin": "js-notice",
7469
7469
  "confidence": "certain"
7470
7470
  },
@@ -7473,7 +7473,7 @@
7473
7473
  "surface": "builders-hall",
7474
7474
  "text": "Request withdrawn.",
7475
7475
  "file": "modules/hall-ui/public/goals-render.js",
7476
- "line": 1070,
7476
+ "line": 1081,
7477
7477
  "origin": "js-notice",
7478
7478
  "confidence": "certain"
7479
7479
  },
@@ -8382,7 +8382,7 @@
8382
8382
  "surface": "builders-hall",
8383
8383
  "text": "Tasks could not be loaded.",
8384
8384
  "file": "modules/hall-ui/public/goals-render.js",
8385
- "line": 922,
8385
+ "line": 933,
8386
8386
  "origin": "js-markup",
8387
8387
  "confidence": "certain"
8388
8388
  },
@@ -8562,7 +8562,7 @@
8562
8562
  "surface": "builders-hall",
8563
8563
  "text": "The goal's leads have paused applications; they can still invite you",
8564
8564
  "file": "modules/hall-ui/public/goals-render.js",
8565
- "line": 848,
8565
+ "line": 859,
8566
8566
  "origin": "js-markup",
8567
8567
  "confidence": "certain"
8568
8568
  },
@@ -8940,7 +8940,7 @@
8940
8940
  "surface": "builders-hall",
8941
8941
  "text": "This goal is Archon-mediated — request to join instead.",
8942
8942
  "file": "modules/hall-ui/public/goals-render.js",
8943
- "line": 1014,
8943
+ "line": 1025,
8944
8944
  "origin": "js-notice",
8945
8945
  "confidence": "certain"
8946
8946
  },
@@ -8949,7 +8949,7 @@
8949
8949
  "surface": "builders-hall",
8950
8950
  "text": "This goal is blocked until each prerequisite goal is achieved",
8951
8951
  "file": "modules/hall-ui/public/goals-render.js",
8952
- "line": 780,
8952
+ "line": 791,
8953
8953
  "origin": "js-markup",
8954
8954
  "confidence": "certain"
8955
8955
  },
@@ -8958,7 +8958,7 @@
8958
8958
  "surface": "builders-hall",
8959
8959
  "text": "This goal is not open.",
8960
8960
  "file": "modules/hall-ui/public/goals-render.js",
8961
- "line": 1001,
8961
+ "line": 1012,
8962
8962
  "origin": "js-notice",
8963
8963
  "confidence": "certain"
8964
8964
  },
@@ -8967,7 +8967,7 @@
8967
8967
  "surface": "builders-hall",
8968
8968
  "text": "This goal is not open.",
8969
8969
  "file": "modules/hall-ui/public/goals-render.js",
8970
- "line": 1017,
8970
+ "line": 1028,
8971
8971
  "origin": "js-notice",
8972
8972
  "confidence": "certain"
8973
8973
  },
@@ -8976,7 +8976,7 @@
8976
8976
  "surface": "builders-hall",
8977
8977
  "text": "This goal is open — joining directly instead.",
8978
8978
  "file": "modules/hall-ui/public/goals-render.js",
8979
- "line": 1061,
8979
+ "line": 1072,
8980
8980
  "origin": "js-notice",
8981
8981
  "confidence": "certain"
8982
8982
  },
@@ -8985,7 +8985,7 @@
8985
8985
  "surface": "builders-hall",
8986
8986
  "text": "This goal is private — request to join instead.",
8987
8987
  "file": "modules/hall-ui/public/goals-render.js",
8988
- "line": 1015,
8988
+ "line": 1026,
8989
8989
  "origin": "js-notice",
8990
8990
  "confidence": "certain"
8991
8991
  },
@@ -8994,7 +8994,7 @@
8994
8994
  "surface": "builders-hall",
8995
8995
  "text": "This goal is scoped to a protected module — only an Archon may add members.",
8996
8996
  "file": "modules/hall-ui/public/goals-render.js",
8997
- "line": 998,
8997
+ "line": 1009,
8998
8998
  "origin": "js-notice",
8999
8999
  "confidence": "certain"
9000
9000
  },
@@ -9003,7 +9003,7 @@
9003
9003
  "surface": "builders-hall",
9004
9004
  "text": "This goal isn't taking requests right now.",
9005
9005
  "file": "modules/hall-ui/public/goals-render.js",
9006
- "line": 1062,
9006
+ "line": 1073,
9007
9007
  "origin": "js-notice",
9008
9008
  "confidence": "certain"
9009
9009
  },
@@ -9696,7 +9696,7 @@
9696
9696
  "surface": "builders-hall",
9697
9697
  "text": "You already have a pending request or invitation for this goal.",
9698
9698
  "file": "modules/hall-ui/public/goals-render.js",
9699
- "line": 1059,
9699
+ "line": 1070,
9700
9700
  "origin": "js-notice",
9701
9701
  "confidence": "certain"
9702
9702
  },
@@ -9705,7 +9705,7 @@
9705
9705
  "surface": "builders-hall",
9706
9706
  "text": "You are already a member of this goal.",
9707
9707
  "file": "modules/hall-ui/public/goals-render.js",
9708
- "line": 1060,
9708
+ "line": 1071,
9709
9709
  "origin": "js-notice",
9710
9710
  "confidence": "certain"
9711
9711
  },
@@ -9714,7 +9714,7 @@
9714
9714
  "surface": "builders-hall",
9715
9715
  "text": "You are not a member of this goal.",
9716
9716
  "file": "modules/hall-ui/public/goals-render.js",
9717
- "line": 1016,
9717
+ "line": 1027,
9718
9718
  "origin": "js-notice",
9719
9719
  "confidence": "certain"
9720
9720
  },
@@ -10632,7 +10632,7 @@
10632
10632
  "surface": "builders-hall",
10633
10633
  "text": "invited — awaiting their response",
10634
10634
  "file": "modules/hall-ui/public/goals-render.js",
10635
- "line": 1094,
10635
+ "line": 1105,
10636
10636
  "origin": "js-markup",
10637
10637
  "confidence": "certain"
10638
10638
  },
@@ -11082,7 +11082,7 @@
11082
11082
  "surface": "builders-hall",
11083
11083
  "text": "scope: {…}",
11084
11084
  "file": "modules/hall-ui/public/goals-render.js",
11085
- "line": 774,
11085
+ "line": 785,
11086
11086
  "origin": "js-markup",
11087
11087
  "confidence": "certain"
11088
11088
  },
@@ -11100,7 +11100,7 @@
11100
11100
  "surface": "builders-hall",
11101
11101
  "text": "shipped ·",
11102
11102
  "file": "modules/hall-ui/public/goals-render.js",
11103
- "line": 696,
11103
+ "line": 707,
11104
11104
  "origin": "js-markup",
11105
11105
  "confidence": "certain"
11106
11106
  },
@@ -11217,7 +11217,7 @@
11217
11217
  "surface": "builders-hall",
11218
11218
  "text": "task{…} shipped",
11219
11219
  "file": "modules/hall-ui/public/goals-render.js",
11220
- "line": 737,
11220
+ "line": 748,
11221
11221
  "origin": "js-markup",
11222
11222
  "confidence": "certain"
11223
11223
  },
@@ -11595,7 +11595,7 @@
11595
11595
  "surface": "builders-hall",
11596
11596
  "text": "{…} earned",
11597
11597
  "file": "modules/hall-ui/public/goals-render.js",
11598
- "line": 737,
11598
+ "line": 748,
11599
11599
  "origin": "js-markup",
11600
11600
  "confidence": "certain"
11601
11601
  },
@@ -11631,7 +11631,7 @@
11631
11631
  "surface": "builders-hall",
11632
11632
  "text": "{…} of {…} criteria satisfied",
11633
11633
  "file": "modules/hall-ui/public/goals-render.js",
11634
- "line": 621,
11634
+ "line": 631,
11635
11635
  "origin": "js-markup",
11636
11636
  "confidence": "certain"
11637
11637
  },
@@ -12225,7 +12225,7 @@
12225
12225
  "surface": "builders-hall",
12226
12226
  "text": "🔒 Private",
12227
12227
  "file": "modules/hall-ui/public/goals-render.js",
12228
- "line": 786,
12228
+ "line": 797,
12229
12229
  "origin": "js-markup",
12230
12230
  "confidence": "certain"
12231
12231
  },
@@ -12234,7 +12234,7 @@
12234
12234
  "surface": "builders-hall",
12235
12235
  "text": "🔒 Request to join",
12236
12236
  "file": "modules/hall-ui/public/goals-render.js",
12237
- "line": 850,
12237
+ "line": 861,
12238
12238
  "origin": "js-markup",
12239
12239
  "confidence": "certain"
12240
12240
  },
@@ -12243,7 +12243,7 @@
12243
12243
  "surface": "builders-hall",
12244
12244
  "text": "🛡 Archon-mediated",
12245
12245
  "file": "modules/hall-ui/public/goals-render.js",
12246
- "line": 792,
12246
+ "line": 803,
12247
12247
  "origin": "js-markup",
12248
12248
  "confidence": "certain"
12249
12249
  },
@@ -1435,5 +1435,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
1435
1435
  landed since 1.19.497 with no explicit bump. run 33768753719. (task 1002620)
1436
1436
  1.19.499 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1437
1437
  landed since 1.19.498 with no explicit bump. run 33769500709. (task 1002620)
1438
+ 1.19.500 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1439
+ landed since 1.19.499 with no explicit bump. run 33772499045. (task 1002620)
1438
1440
  ---------------------------------------------------------------------------
1439
1441
  ```
@@ -608,7 +608,13 @@
608
608
  if (back && state.current != null) back.setAttribute('href', `#/goal/${state.current}`);
609
609
  }
610
610
  const isPending = (c) => !c.satisfied && !!c.pending_review;
611
- function completionSummaryHtml(g, crit, sat, ringSize) {
611
+ // criterionlessTaskCount: task 1003157's DONE WHEN item 2 — the count of this
612
+ // goal's tasks linked to no criterion, rendered beside the criteria rollup so
613
+ // the gap is visible here too, not only in the create-time advisory. Shown
614
+ // only when the goal HAS criteria (an empty-criteria goal has nothing to be
615
+ // unlinked from) and the count is >0 — silent otherwise, the goal_advisory
616
+ // fail-open posture.
617
+ function completionSummaryHtml(g, crit, sat, ringSize, criterionlessTaskCount) {
612
618
  const pending = crit.filter(isPending).length;
613
619
  // task 1002164 — an open goal used to punt confirmation to the /goal-review
614
620
  // CLI skill here; confirming now happens on this page, so the line reports
@@ -618,11 +624,16 @@
618
624
  : 'Open — a criterion becomes confirmable once every task linked to it has shipped.';
619
625
  const line = g.status === 'achieved' ? 'Goal achieved — every criterion confirmed.'
620
626
  : (g.status === 'archived' ? 'Archived.' : openLine);
627
+ const unlinked = crit.length > 0 && criterionlessTaskCount > 0
628
+ ? `<div style="font-size:12.5px;color:var(--ink-faint)">${fmtNum(criterionlessTaskCount)} `
629
+ + `task${criterionlessTaskCount === 1 ? '' : 's'} in this goal ${criterionlessTaskCount === 1 ? 'is' : 'are'} linked to no criterion.</div>`
630
+ : '';
621
631
  return `<div style="display:flex;align-items:center;gap:16px">
622
632
  ${ring(sat, crit.length, g.status === 'achieved', ringSize)}
623
633
  <div>
624
634
  <div style="font-weight:650">${sat} of ${crit.length} criteria satisfied</div>
625
635
  <div style="font-size:12.5px;color:var(--ink-faint)">${line}</div>
636
+ ${unlinked}
626
637
  </div>
627
638
  </div>`;
628
639
  }
@@ -655,11 +666,11 @@
655
666
  // task 1002164 — an archived/achieved goal has nothing left to confirm.
656
667
  const canConfirm = g.status === 'open' && canConfirmCriteria();
657
668
  const band = $('#goal-completion-body');
658
- if (band) band.innerHTML = completionSummaryHtml(g, crit, sat, 56) + critListHtml(crit.slice(0, CRITERIA_CAP), false, canConfirm);
669
+ if (band) band.innerHTML = completionSummaryHtml(g, crit, sat, 56, d.criterionless_task_count) + critListHtml(crit.slice(0, CRITERIA_CAP), false, canConfirm);
659
670
  renderViewAllFoot('#goal-completion-foot', crit.length, CRITERIA_CAP, 'completion', 'criteria');
660
671
  setCount('#goal-completion-count', crit.length);
661
672
  const full = $('#goal-completion-full');
662
- if (full) full.innerHTML = completionSummaryHtml(g, crit, sat, 64) + critListHtml(crit, true, canConfirm);
673
+ if (full) full.innerHTML = completionSummaryHtml(g, crit, sat, 64, d.criterionless_task_count) + critListHtml(crit, true, canConfirm);
663
674
  const back = $('#goal-completion-back');
664
675
  if (back && state.current != null) back.setAttribute('href', `#/goal/${state.current}`);
665
676
  }
@@ -315,6 +315,28 @@ async function resolveCriterionIds(versionId, refs) {
315
315
  return { ids, unresolved };
316
316
  }
317
317
 
318
+ // countTasksWithoutCriterionLink — task 1003157's DONE WHEN item 2: the count of
319
+ // this goal's tasks linked to NO done-when criterion, so the gap the create-time
320
+ // advisory nudges about is also visible on the goal's own detail view (GET
321
+ // /goals/:id) without waiting for a builder to file another task. kind='bug' is
322
+ // excluded for the same reason buildGoalAdvisory (goal-advisory.js) goes quiet
323
+ // for one: a bug fix is the goal's "fix category" and needs no criterion, so
324
+ // counting it here would make an intentional non-link read as a standing defect.
325
+ // `executor` defaults to the module pool but is overridable — the findCycle /
326
+ // unsatisfiedDeps seam in this same file — so it's unit-testable with a fake
327
+ // SQL-recording client and needs no live Postgres.
328
+ async function countTasksWithoutCriterionLink(goalId, executor = pool) {
329
+ const { rows } = await executor.query(
330
+ `SELECT COUNT(*)::int AS n
331
+ FROM tasks t
332
+ WHERE t.goal_id = $1
333
+ AND t.kind <> 'bug'
334
+ AND NOT EXISTS (SELECT 1 FROM task_criteria tc WHERE tc.task_id = t.id)`,
335
+ [goalId]
336
+ );
337
+ return rows[0]?.n ?? 0;
338
+ }
339
+
318
340
  // Read the criteria linked to a task, with the live "Cn" position + link source.
319
341
 
320
342
  async function getTaskCriteria(taskId) {
@@ -425,6 +447,7 @@ module.exports = {
425
447
  addTaskCriterion,
426
448
  addTaskDependency,
427
449
  attachTaskDepSummaries,
450
+ countTasksWithoutCriterionLink,
428
451
  findCycle,
429
452
  findDependencyCycle,
430
453
  getTaskCriteria,
@@ -130,6 +130,7 @@ const {
130
130
  addTaskCriterion,
131
131
  addTaskDependency,
132
132
  attachTaskDepSummaries,
133
+ countTasksWithoutCriterionLink,
133
134
  findCycle,
134
135
  findDependencyCycle,
135
136
  getTaskCriteria,
@@ -309,6 +310,7 @@ module.exports = {
309
310
  addTaskCriterion,
310
311
  removeTaskCriterion,
311
312
  linkTaskCriteria,
313
+ countTasksWithoutCriterionLink,
312
314
  claimTask,
313
315
  claimUniqueViolationError,
314
316
  claimTasksBatch,