@bongos/core 1.19.300 → 1.19.302
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/.bongos-core.json +33 -23
- package/.claude/skills/idea-triage/SKILL.md +19 -0
- package/docs/copy-inventory.md +36 -27
- package/docs/copy-registry.json +112 -31
- package/docs/file-map.md +1 -1
- package/modules/hall-ui/public/idea.css +15 -0
- package/modules/hall-ui/public/idea.js +91 -5
- package/modules/hall-ui/public/ideas.css +27 -0
- package/modules/hall-ui/public/ideas.html +29 -7
- package/modules/hall-ui/public/ideas.js +141 -17
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/render-ideas.js +62 -9
- package/scripts/gds/triage.js +19 -2
- package/src/module-api.js +5 -1
- package/tests/idea_detail_page.mjs +130 -4
- package/tests/idea_hall_composer.mjs +51 -0
- package/tests/idea_spark_hall.mjs +263 -0
- package/tests/idea_triage_grade.mjs +167 -0
package/docs/copy-registry.json
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"generator": "scripts/gds/copy-inventory.js",
|
|
4
4
|
"goal": 1000074,
|
|
5
5
|
"counts": {
|
|
6
|
-
"strings":
|
|
7
|
-
"unique_ids":
|
|
8
|
-
"certain":
|
|
6
|
+
"strings": 1379,
|
|
7
|
+
"unique_ids": 1224,
|
|
8
|
+
"certain": 1379,
|
|
9
9
|
"heuristic": 0,
|
|
10
10
|
"duplicate_ids": 125
|
|
11
11
|
},
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"builders-hall": {
|
|
14
14
|
"at": "modules/hall-ui/public",
|
|
15
15
|
"files": 65,
|
|
16
|
-
"strings":
|
|
16
|
+
"strings": 1095
|
|
17
17
|
},
|
|
18
18
|
"status-dashboard": {
|
|
19
19
|
"at": "modules/status-ui/public",
|
|
@@ -1184,8 +1184,8 @@
|
|
|
1184
1184
|
"text": "idea {…}",
|
|
1185
1185
|
"occurrences": 2,
|
|
1186
1186
|
"at": [
|
|
1187
|
-
"modules/hall-ui/public/idea.js:
|
|
1188
|
-
"modules/hall-ui/public/ideas.js:
|
|
1187
|
+
"modules/hall-ui/public/idea.js:190",
|
|
1188
|
+
"modules/hall-ui/public/ideas.js:326"
|
|
1189
1189
|
]
|
|
1190
1190
|
},
|
|
1191
1191
|
{
|
|
@@ -1225,7 +1225,7 @@
|
|
|
1225
1225
|
"occurrences": 2,
|
|
1226
1226
|
"at": [
|
|
1227
1227
|
"modules/hall-ui/public/gate.js:123",
|
|
1228
|
-
"modules/hall-ui/public/idea.js:
|
|
1228
|
+
"modules/hall-ui/public/idea.js:187"
|
|
1229
1229
|
]
|
|
1230
1230
|
},
|
|
1231
1231
|
{
|
|
@@ -1649,7 +1649,7 @@
|
|
|
1649
1649
|
"surface": "builders-hall",
|
|
1650
1650
|
"text": "A Full Idea answers five questions, so that someone else can deliver against it without having to interview you first. Open to every role — the score below is the only filter, and it counts substance, not who you are.",
|
|
1651
1651
|
"file": "modules/hall-ui/public/ideas.html",
|
|
1652
|
-
"line":
|
|
1652
|
+
"line": 44,
|
|
1653
1653
|
"origin": "html-text",
|
|
1654
1654
|
"confidence": "certain"
|
|
1655
1655
|
},
|
|
@@ -1712,7 +1712,7 @@
|
|
|
1712
1712
|
"surface": "builders-hall",
|
|
1713
1713
|
"text": "A quick idea is a thought filed fast. It is not an unfinished Full Idea — only its author can offer it up for development.",
|
|
1714
1714
|
"file": "modules/hall-ui/public/idea.js",
|
|
1715
|
-
"line":
|
|
1715
|
+
"line": 237,
|
|
1716
1716
|
"origin": "js-markup",
|
|
1717
1717
|
"confidence": "certain"
|
|
1718
1718
|
},
|
|
@@ -1905,6 +1905,15 @@
|
|
|
1905
1905
|
"origin": "js-markup",
|
|
1906
1906
|
"confidence": "certain"
|
|
1907
1907
|
},
|
|
1908
|
+
{
|
|
1909
|
+
"id": "14bdceaac078",
|
|
1910
|
+
"surface": "builders-hall",
|
|
1911
|
+
"text": "Answer the five questions and this spark becomes a Full Idea.",
|
|
1912
|
+
"file": "modules/hall-ui/public/ideas.js",
|
|
1913
|
+
"line": 415,
|
|
1914
|
+
"origin": "js-text-assign",
|
|
1915
|
+
"confidence": "certain"
|
|
1916
|
+
},
|
|
1908
1917
|
{
|
|
1909
1918
|
"id": "52ed0e2e3470",
|
|
1910
1919
|
"surface": "builders-hall",
|
|
@@ -2063,7 +2072,7 @@
|
|
|
2063
2072
|
"surface": "builders-hall",
|
|
2064
2073
|
"text": "As first filed",
|
|
2065
2074
|
"file": "modules/hall-ui/public/idea.js",
|
|
2066
|
-
"line":
|
|
2075
|
+
"line": 229,
|
|
2067
2076
|
"origin": "js-markup",
|
|
2068
2077
|
"confidence": "certain"
|
|
2069
2078
|
},
|
|
@@ -3048,6 +3057,15 @@
|
|
|
3048
3057
|
"origin": "js-markup",
|
|
3049
3058
|
"confidence": "certain"
|
|
3050
3059
|
},
|
|
3060
|
+
{
|
|
3061
|
+
"id": "589a4cfc5442",
|
|
3062
|
+
"surface": "builders-hall",
|
|
3063
|
+
"text": "Could not load idea {…}.",
|
|
3064
|
+
"file": "modules/hall-ui/public/ideas.js",
|
|
3065
|
+
"line": 444,
|
|
3066
|
+
"origin": "js-text-assign",
|
|
3067
|
+
"confidence": "certain"
|
|
3068
|
+
},
|
|
3051
3069
|
{
|
|
3052
3070
|
"id": "192c893fc64e",
|
|
3053
3071
|
"surface": "builders-hall",
|
|
@@ -3116,7 +3134,7 @@
|
|
|
3116
3134
|
"surface": "builders-hall",
|
|
3117
3135
|
"text": "Could not load the idea template. Reload, or file from the terminal with capture.js.",
|
|
3118
3136
|
"file": "modules/hall-ui/public/ideas.js",
|
|
3119
|
-
"line":
|
|
3137
|
+
"line": 422,
|
|
3120
3138
|
"origin": "js-text-assign",
|
|
3121
3139
|
"confidence": "certain"
|
|
3122
3140
|
},
|
|
@@ -3143,7 +3161,16 @@
|
|
|
3143
3161
|
"surface": "builders-hall",
|
|
3144
3162
|
"text": "Could not load the question labels; showing the answers as stored.",
|
|
3145
3163
|
"file": "modules/hall-ui/public/idea.js",
|
|
3146
|
-
"line":
|
|
3164
|
+
"line": 221,
|
|
3165
|
+
"origin": "js-markup",
|
|
3166
|
+
"confidence": "certain"
|
|
3167
|
+
},
|
|
3168
|
+
{
|
|
3169
|
+
"id": "edd5bafbe075",
|
|
3170
|
+
"surface": "builders-hall",
|
|
3171
|
+
"text": "Could not load the queue just now.",
|
|
3172
|
+
"file": "modules/hall-ui/public/ideas.js",
|
|
3173
|
+
"line": 379,
|
|
3147
3174
|
"origin": "js-markup",
|
|
3148
3175
|
"confidence": "certain"
|
|
3149
3176
|
},
|
|
@@ -3548,7 +3575,7 @@
|
|
|
3548
3575
|
"surface": "builders-hall",
|
|
3549
3576
|
"text": "Counted, not judged: each question is worth the same, and earns its share in proportion to how much real text it carries. Whitespace and padding score nothing.",
|
|
3550
3577
|
"file": "modules/hall-ui/public/ideas.html",
|
|
3551
|
-
"line":
|
|
3578
|
+
"line": 104,
|
|
3552
3579
|
"origin": "html-text",
|
|
3553
3580
|
"confidence": "certain"
|
|
3554
3581
|
},
|
|
@@ -3678,6 +3705,24 @@
|
|
|
3678
3705
|
"origin": "html-text",
|
|
3679
3706
|
"confidence": "certain"
|
|
3680
3707
|
},
|
|
3708
|
+
{
|
|
3709
|
+
"id": "0a4fe7150971",
|
|
3710
|
+
"surface": "builders-hall",
|
|
3711
|
+
"text": "Develop this idea",
|
|
3712
|
+
"file": "modules/hall-ui/public/ideas.js",
|
|
3713
|
+
"line": 414,
|
|
3714
|
+
"origin": "js-text-assign",
|
|
3715
|
+
"confidence": "certain"
|
|
3716
|
+
},
|
|
3717
|
+
{
|
|
3718
|
+
"id": "11b8266d6aab",
|
|
3719
|
+
"surface": "builders-hall",
|
|
3720
|
+
"text": "Developing a Big Idea Spark",
|
|
3721
|
+
"file": "modules/hall-ui/public/ideas.html",
|
|
3722
|
+
"line": 56,
|
|
3723
|
+
"origin": "html-text",
|
|
3724
|
+
"confidence": "certain"
|
|
3725
|
+
},
|
|
3681
3726
|
{
|
|
3682
3727
|
"id": "457f4967541b",
|
|
3683
3728
|
"surface": "builders-hall",
|
|
@@ -3710,7 +3755,7 @@
|
|
|
3710
3755
|
"surface": "builders-hall",
|
|
3711
3756
|
"text": "Discard draft",
|
|
3712
3757
|
"file": "modules/hall-ui/public/ideas.html",
|
|
3713
|
-
"line":
|
|
3758
|
+
"line": 82,
|
|
3714
3759
|
"origin": "html-text",
|
|
3715
3760
|
"confidence": "certain"
|
|
3716
3761
|
},
|
|
@@ -3854,7 +3899,7 @@
|
|
|
3854
3899
|
"surface": "builders-hall",
|
|
3855
3900
|
"text": "Draft discarded.",
|
|
3856
3901
|
"file": "modules/hall-ui/public/ideas.js",
|
|
3857
|
-
"line":
|
|
3902
|
+
"line": 339,
|
|
3858
3903
|
"origin": "js-notice",
|
|
3859
3904
|
"confidence": "certain"
|
|
3860
3905
|
},
|
|
@@ -4043,7 +4088,7 @@
|
|
|
4043
4088
|
"surface": "builders-hall",
|
|
4044
4089
|
"text": "File this idea",
|
|
4045
4090
|
"file": "modules/hall-ui/public/ideas.html",
|
|
4046
|
-
"line":
|
|
4091
|
+
"line": 81,
|
|
4047
4092
|
"origin": "html-text",
|
|
4048
4093
|
"confidence": "certain"
|
|
4049
4094
|
},
|
|
@@ -4124,7 +4169,7 @@
|
|
|
4124
4169
|
"surface": "builders-hall",
|
|
4125
4170
|
"text": "Five questions, and a score that counts how much of each you actually answered.",
|
|
4126
4171
|
"file": "modules/hall-ui/public/ideas.js",
|
|
4127
|
-
"line":
|
|
4172
|
+
"line": 432,
|
|
4128
4173
|
"origin": "js-text-assign",
|
|
4129
4174
|
"confidence": "certain"
|
|
4130
4175
|
},
|
|
@@ -4601,7 +4646,7 @@
|
|
|
4601
4646
|
"surface": "builders-hall",
|
|
4602
4647
|
"text": "Idea {…}",
|
|
4603
4648
|
"file": "modules/hall-ui/public/idea.js",
|
|
4604
|
-
"line":
|
|
4649
|
+
"line": 244,
|
|
4605
4650
|
"origin": "js-text-assign",
|
|
4606
4651
|
"confidence": "certain"
|
|
4607
4652
|
},
|
|
@@ -4632,6 +4677,15 @@
|
|
|
4632
4677
|
"origin": "js-markup",
|
|
4633
4678
|
"confidence": "certain"
|
|
4634
4679
|
},
|
|
4680
|
+
{
|
|
4681
|
+
"id": "379b20d548ad",
|
|
4682
|
+
"surface": "builders-hall",
|
|
4683
|
+
"text": "Ideas whose author has said \"I had the thought but not the full picture\". Anyone can develop one — the author keeps the credit for having had it, and you are recorded as its developer.",
|
|
4684
|
+
"file": "modules/hall-ui/public/ideas.html",
|
|
4685
|
+
"line": 33,
|
|
4686
|
+
"origin": "html-text",
|
|
4687
|
+
"confidence": "certain"
|
|
4688
|
+
},
|
|
4635
4689
|
{
|
|
4636
4690
|
"id": "ef224c9de7c8",
|
|
4637
4691
|
"surface": "builders-hall",
|
|
@@ -4736,7 +4790,7 @@
|
|
|
4736
4790
|
"surface": "builders-hall",
|
|
4737
4791
|
"text": "Its author marked this as needing development — anyone can turn it into a Full Idea, and they keep the credit for having had it.",
|
|
4738
4792
|
"file": "modules/hall-ui/public/idea.js",
|
|
4739
|
-
"line":
|
|
4793
|
+
"line": 235,
|
|
4740
4794
|
"origin": "js-markup",
|
|
4741
4795
|
"confidence": "certain"
|
|
4742
4796
|
},
|
|
@@ -5114,7 +5168,7 @@
|
|
|
5114
5168
|
"surface": "builders-hall",
|
|
5115
5169
|
"text": "Loading the five questions…",
|
|
5116
5170
|
"file": "modules/hall-ui/public/ideas.html",
|
|
5117
|
-
"line":
|
|
5171
|
+
"line": 75,
|
|
5118
5172
|
"origin": "html-text",
|
|
5119
5173
|
"confidence": "certain"
|
|
5120
5174
|
},
|
|
@@ -5564,7 +5618,7 @@
|
|
|
5564
5618
|
"surface": "builders-hall",
|
|
5565
5619
|
"text": "No description.",
|
|
5566
5620
|
"file": "modules/hall-ui/public/idea.js",
|
|
5567
|
-
"line":
|
|
5621
|
+
"line": 106,
|
|
5568
5622
|
"origin": "js-markup",
|
|
5569
5623
|
"confidence": "certain"
|
|
5570
5624
|
},
|
|
@@ -5798,7 +5852,7 @@
|
|
|
5798
5852
|
"surface": "builders-hall",
|
|
5799
5853
|
"text": "Not scored.",
|
|
5800
5854
|
"file": "modules/hall-ui/public/idea.js",
|
|
5801
|
-
"line":
|
|
5855
|
+
"line": 70,
|
|
5802
5856
|
"origin": "js-markup",
|
|
5803
5857
|
"confidence": "certain"
|
|
5804
5858
|
},
|
|
@@ -5883,6 +5937,15 @@
|
|
|
5883
5937
|
"origin": "js-markup",
|
|
5884
5938
|
"confidence": "certain"
|
|
5885
5939
|
},
|
|
5940
|
+
{
|
|
5941
|
+
"id": "2ec0fbb20a42",
|
|
5942
|
+
"surface": "builders-hall",
|
|
5943
|
+
"text": "Nothing is waiting. A spark appears here when its author offers a quick idea up for development.",
|
|
5944
|
+
"file": "modules/hall-ui/public/ideas.js",
|
|
5945
|
+
"line": 357,
|
|
5946
|
+
"origin": "js-markup",
|
|
5947
|
+
"confidence": "certain"
|
|
5948
|
+
},
|
|
5886
5949
|
{
|
|
5887
5950
|
"id": "ad9a17a8a5eb",
|
|
5888
5951
|
"surface": "builders-hall",
|
|
@@ -5951,7 +6014,7 @@
|
|
|
5951
6014
|
"surface": "builders-hall",
|
|
5952
6015
|
"text": "One line. This is what the idea is called everywhere else.",
|
|
5953
6016
|
"file": "modules/hall-ui/public/ideas.html",
|
|
5954
|
-
"line":
|
|
6017
|
+
"line": 64,
|
|
5955
6018
|
"origin": "html-text",
|
|
5956
6019
|
"confidence": "certain"
|
|
5957
6020
|
},
|
|
@@ -7359,6 +7422,15 @@
|
|
|
7359
7422
|
"origin": "html-text",
|
|
7360
7423
|
"confidence": "certain"
|
|
7361
7424
|
},
|
|
7425
|
+
{
|
|
7426
|
+
"id": "2af4c0f2b4b9",
|
|
7427
|
+
"surface": "builders-hall",
|
|
7428
|
+
"text": "Showing {…} of {…}.",
|
|
7429
|
+
"file": "modules/hall-ui/public/ideas.js",
|
|
7430
|
+
"line": 361,
|
|
7431
|
+
"origin": "js-markup",
|
|
7432
|
+
"confidence": "certain"
|
|
7433
|
+
},
|
|
7362
7434
|
{
|
|
7363
7435
|
"id": "2f12d46f96ca",
|
|
7364
7436
|
"surface": "builders-hall",
|
|
@@ -8457,6 +8529,15 @@
|
|
|
8457
8529
|
"origin": "html-text",
|
|
8458
8530
|
"confidence": "certain"
|
|
8459
8531
|
},
|
|
8532
|
+
{
|
|
8533
|
+
"id": "f2e019bfdbe8",
|
|
8534
|
+
"surface": "builders-hall",
|
|
8535
|
+
"text": "Waiting to be developed",
|
|
8536
|
+
"file": "modules/hall-ui/public/ideas.html",
|
|
8537
|
+
"line": 32,
|
|
8538
|
+
"origin": "html-text",
|
|
8539
|
+
"confidence": "certain"
|
|
8540
|
+
},
|
|
8460
8541
|
{
|
|
8461
8542
|
"id": "3a9cd9a27a84",
|
|
8462
8543
|
"surface": "builders-hall",
|
|
@@ -8741,7 +8822,7 @@
|
|
|
8741
8822
|
"surface": "builders-hall",
|
|
8742
8823
|
"text": "Write a Full Idea",
|
|
8743
8824
|
"file": "modules/hall-ui/public/ideas.html",
|
|
8744
|
-
"line":
|
|
8825
|
+
"line": 43,
|
|
8745
8826
|
"origin": "html-text",
|
|
8746
8827
|
"confidence": "certain"
|
|
8747
8828
|
},
|
|
@@ -8750,7 +8831,7 @@
|
|
|
8750
8831
|
"surface": "builders-hall",
|
|
8751
8832
|
"text": "Write one",
|
|
8752
8833
|
"file": "modules/hall-ui/public/idea.js",
|
|
8753
|
-
"line":
|
|
8834
|
+
"line": 235,
|
|
8754
8835
|
"origin": "js-markup",
|
|
8755
8836
|
"confidence": "certain"
|
|
8756
8837
|
},
|
|
@@ -9578,7 +9659,7 @@
|
|
|
9578
9659
|
"surface": "builders-hall",
|
|
9579
9660
|
"text": "idea {…}",
|
|
9580
9661
|
"file": "modules/hall-ui/public/idea.js",
|
|
9581
|
-
"line":
|
|
9662
|
+
"line": 190,
|
|
9582
9663
|
"origin": "js-markup",
|
|
9583
9664
|
"confidence": "certain"
|
|
9584
9665
|
},
|
|
@@ -9587,7 +9668,7 @@
|
|
|
9587
9668
|
"surface": "builders-hall",
|
|
9588
9669
|
"text": "idea {…}",
|
|
9589
9670
|
"file": "modules/hall-ui/public/ideas.js",
|
|
9590
|
-
"line":
|
|
9671
|
+
"line": 326,
|
|
9591
9672
|
"origin": "js-markup",
|
|
9592
9673
|
"confidence": "certain"
|
|
9593
9674
|
},
|
|
@@ -9749,7 +9830,7 @@
|
|
|
9749
9830
|
"surface": "builders-hall",
|
|
9750
9831
|
"text": "merged into",
|
|
9751
9832
|
"file": "modules/hall-ui/public/idea.js",
|
|
9752
|
-
"line":
|
|
9833
|
+
"line": 190,
|
|
9753
9834
|
"origin": "js-markup",
|
|
9754
9835
|
"confidence": "certain"
|
|
9755
9836
|
},
|
|
@@ -10145,7 +10226,7 @@
|
|
|
10145
10226
|
"surface": "builders-hall",
|
|
10146
10227
|
"text": "task {…}",
|
|
10147
10228
|
"file": "modules/hall-ui/public/idea.js",
|
|
10148
|
-
"line":
|
|
10229
|
+
"line": 187,
|
|
10149
10230
|
"origin": "js-markup",
|
|
10150
10231
|
"confidence": "certain"
|
|
10151
10232
|
},
|
|
@@ -10298,7 +10379,7 @@
|
|
|
10298
10379
|
"surface": "builders-hall",
|
|
10299
10380
|
"text": "what the idea is, in one line",
|
|
10300
10381
|
"file": "modules/hall-ui/public/ideas.html",
|
|
10301
|
-
"line":
|
|
10382
|
+
"line": 67,
|
|
10302
10383
|
"origin": "html-attr:placeholder",
|
|
10303
10384
|
"confidence": "certain"
|
|
10304
10385
|
},
|
|
@@ -10712,7 +10793,7 @@
|
|
|
10712
10793
|
"surface": "builders-hall",
|
|
10713
10794
|
"text": "{…}/100 complete",
|
|
10714
10795
|
"file": "modules/hall-ui/public/idea.js",
|
|
10715
|
-
"line":
|
|
10796
|
+
"line": 73,
|
|
10716
10797
|
"origin": "js-markup",
|
|
10717
10798
|
"confidence": "certain"
|
|
10718
10799
|
},
|
package/docs/file-map.md
CHANGED
|
@@ -234,7 +234,7 @@
|
|
|
234
234
|
│ ├── terrain.js ← (Phase D + ADR 0012, CJS): TERRAIN + OBJECT enums + BLOCKING_TERRAINS + BLOCKING_OBJECTS (server twin of public/game/world/terrain.js)
|
|
235
235
|
│ └── map.js ← (Phase D + ADR 0012): two-grid INITIAL_MAP {ground, objects}; isBlocked checks both layers (mirrors public/game/world/{terrain,map}.js)
|
|
236
236
|
│ (public-status/ moved to modules/status-ui/public/ in BV1.R84 — see the modules/ block above)
|
|
237
|
-
│ (public-builders/ moved to modules/hall-ui/public/ in BV1.R85 — the authenticated builders' hall; see the modules/ block above. It keeps its DEDICATED serving block in src/bongos/serve-internal.js: the builders.<apex> + apex /builders/* shim, canonical redirects, the citizen/Archon page gates, asset-stamping, and the module hall-widget injection — partitioned out of the generic web-surface loop. index.html=the hall dashboard; work/board/roadmap/goals/watch/harbor/gate/pair/settings/ranks/sessions/primer/diagrams/atlas pages; ideas.{html,js,css}=the Full Idea composer (task 1002928 / R152 of goal 1000062 — the five R141 fields with a live R142 completeness meter, both fetched from the server so the page carries no copy of the rules; drafts in localStorage so navigation costs nothing); idea.html/idea.js=the idea-detail PAGE (/idea/:id, task 1002929 / R153 — the SECOND two-segment hall page after /task/:id: grade, the five answers in template order, the score, and both attributions. The GRADE decides what the page contains — a quick idea gets no five-field skeleton. task-detail.js keeps the #/idea/N overlay because ~320 of its lines are the Metic+ triage panel; the overlay now links here); profile.html/profile.js=the public, shareable builder profile page (/profile?id=N — rank, works, credits, karma, achievements; task 1467); task.html/task.js=the task-detail page (/task/:id, task 751 — replaced the old #/task/N overlay); builders.js=the controller; dom-utils.js/hall-widgets.js=the widget+settings-panel registries.)
|
|
237
|
+
│ (public-builders/ moved to modules/hall-ui/public/ in BV1.R85 — the authenticated builders' hall; see the modules/ block above. It keeps its DEDICATED serving block in src/bongos/serve-internal.js: the builders.<apex> + apex /builders/* shim, canonical redirects, the citizen/Archon page gates, asset-stamping, and the module hall-widget injection — partitioned out of the generic web-surface loop. index.html=the hall dashboard; work/board/roadmap/goals/watch/harbor/gate/pair/settings/ranks/sessions/primer/diagrams/atlas pages; ideas.{html,js,css}=the Full Idea composer (task 1002928 / R152 of goal 1000062 — the five R141 fields with a live R142 completeness meter, both fetched from the server so the page carries no copy of the rules; drafts in localStorage so navigation costs nothing. Task 1002930 / R154 added the SPARK QUEUE above it and a second mode: `?develop=<id>` reuses the same form to develop a spark — the spark's words shown above the fields, its title read-only, and the file routed to POST /inbox/:id/develop instead of POST /inbox, under its own per-idea draft key); idea.html/idea.js=the idea-detail PAGE (/idea/:id, task 1002929 / R153 — the SECOND two-segment hall page after /task/:id: grade, the five answers in template order, the score, and both attributions. The GRADE decides what the page contains — a quick idea gets no five-field skeleton. task-detail.js keeps the #/idea/N overlay because ~320 of its lines are the Metic+ triage panel; the overlay now links here); profile.html/profile.js=the public, shareable builder profile page (/profile?id=N — rank, works, credits, karma, achievements; task 1467); task.html/task.js=the task-detail page (/task/:id, task 751 — replaced the old #/task/N overlay); builders.js=the controller; dom-utils.js/hall-widgets.js=the widget+settings-panel registries.)
|
|
238
238
|
│
|
|
239
239
|
├── infra/ ← ON-BOX scripts (task 1002699): the four reporter/heartbeat crons every dev box runs from its /workspace clone — box-heartbeat.sh (idle-sweep activity signal), box-report-version.sh (HEAD → POST /box/version), box-report-host-keys.sh (SSH host keys → POST /box/host-keys), box-report-terminal.sh (ttyd URL+credential → POST /box/terminal). Delivered by the workspace clone itself (modules/dev-box/box-access.js sparse scope includes infra/); crons self-installed by box-source-fetch.sh's per-tick bring-up. API base resolves GDS_BASE env → session-file api_base → skip (no hardcoded host in the neutral core).
|
|
240
240
|
├── devbox-app/ ← OTB Dev Box — Electron menu-bar/tray switch for the builder's box (#904, ADR 0045; internal). SELF-CONTAINED: own package.json (never feeds the droplet's npm ci); built by .github/workflows/build-devbox-app.yml; published to the public releases repo per config/devbox-app.json; release recipe docs/recipes/devbox-app-release.md
|
|
@@ -72,3 +72,18 @@
|
|
|
72
72
|
.ig-note { font-size: 0.82rem; color: var(--ink-faint); line-height: 1.55; margin: 14px 0 0; }
|
|
73
73
|
.ig-sub { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--border); }
|
|
74
74
|
.ig-sub__h { margin: 0 0 8px; font-size: 0.95rem; }
|
|
75
|
+
|
|
76
|
+
/* ---- the mark control (task 1002930 / R154) -----------------------------
|
|
77
|
+
Author-only, and rendered as its own block rather than a button in a toolbar:
|
|
78
|
+
offering your idea up for someone else to develop is a decision, and the one
|
|
79
|
+
sentence explaining what it means to you is the part that makes it one. */
|
|
80
|
+
.ig-mark {
|
|
81
|
+
margin-top: 20px;
|
|
82
|
+
padding: 14px;
|
|
83
|
+
border: 1px solid var(--border);
|
|
84
|
+
border-radius: var(--radius-sm);
|
|
85
|
+
background: var(--surface-2);
|
|
86
|
+
}
|
|
87
|
+
.ig-mark__lede { margin: 0 0 10px; font-size: 13px; color: var(--ink-soft); max-width: 62ch; line-height: 1.55; }
|
|
88
|
+
.ig-mark__err { margin: 8px 0 0; font-size: 13px; color: var(--danger); }
|
|
89
|
+
.ig-mark__err:empty { display: none; }
|
|
@@ -27,6 +27,13 @@
|
|
|
27
27
|
// The five QUESTIONS come from GET /inbox/template, not from this file, for the
|
|
28
28
|
// same reason the composer's do (R152): the labels live in the R141 declaration,
|
|
29
29
|
// and a copy here would silently ignore a per-project template.
|
|
30
|
+
//
|
|
31
|
+
// THE MARK CONTROL (task 1002930 / R154) is the one WRITE on this page, and it is
|
|
32
|
+
// AUTHOR-ONLY — a done-when, and the server enforces it regardless (R144 checks
|
|
33
|
+
// captured_by and no rank overrides it). Hiding it from a non-author is therefore
|
|
34
|
+
// cosmetic, exactly like the hall's nav gates: the wall is the route. It renders
|
|
35
|
+
// only on an OPEN quick-or-spark idea, because those are the only states R144
|
|
36
|
+
// accepts — showing a button that is guaranteed to 409 teaches the rule wrong.
|
|
30
37
|
|
|
31
38
|
(() => {
|
|
32
39
|
'use strict';
|
|
@@ -114,6 +121,64 @@
|
|
|
114
121
|
}).join('')}</div>`;
|
|
115
122
|
}
|
|
116
123
|
|
|
124
|
+
// ---- the R154 mark control -------------------------------------------------
|
|
125
|
+
|
|
126
|
+
// Rendered only when the viewer IS the author. The server re-checks; this is
|
|
127
|
+
// the same cosmetic-gate posture as shell.js's nav.
|
|
128
|
+
function markControl(idea, viewer) {
|
|
129
|
+
const isAuthor = viewer && idea.captured_by != null
|
|
130
|
+
&& String(viewer.id) === String(idea.captured_by);
|
|
131
|
+
if (!isAuthor) return '';
|
|
132
|
+
if (idea.status !== 'open') return '';
|
|
133
|
+
if (idea.grade === 'full') return '';
|
|
134
|
+
const sparked = idea.grade === 'spark';
|
|
135
|
+
return `
|
|
136
|
+
<div class="ig-mark">
|
|
137
|
+
<p class="ig-mark__lede">${sparked
|
|
138
|
+
? 'You have offered this up for development. Anyone can turn it into a Full Idea; you keep the credit for having had it.'
|
|
139
|
+
: 'Not sure you have the full picture? Offer it up and someone else can develop it into a Full Idea — you keep the credit for the thought.'}</p>
|
|
140
|
+
<button type="button" class="btn${sparked ? ' btn--ghost' : ''}" id="ig-mark-btn">${sparked ? 'Withdraw the spark mark' : 'Mark as a Big Idea Spark'}</button>
|
|
141
|
+
<p class="ig-mark__err" id="ig-mark-err" role="alert"></p>
|
|
142
|
+
</div>`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function toggleMark(idea) {
|
|
146
|
+
const btn = $('#ig-mark-btn');
|
|
147
|
+
const err = $('#ig-mark-err');
|
|
148
|
+
if (!btn) return;
|
|
149
|
+
// Which direction to go is read from the IDEA, not from a data- attribute on
|
|
150
|
+
// the button. The idea is already in hand, so a DOM round-trip would be a
|
|
151
|
+
// second copy of the same fact — and the one that goes stale first, since the
|
|
152
|
+
// grade is what the server actually returns.
|
|
153
|
+
const sparked = idea.grade === 'spark';
|
|
154
|
+
btn.disabled = true;
|
|
155
|
+
err.textContent = '';
|
|
156
|
+
const r = sparked
|
|
157
|
+
? await api.inbox.deleteInboxIdSpark({ id: idea.id })
|
|
158
|
+
: await api.inbox.postInboxIdSpark({ id: idea.id, body: {} });
|
|
159
|
+
if (!r.ok) {
|
|
160
|
+
btn.disabled = false;
|
|
161
|
+
// The server's own words, per code — a generic failure here would hide the
|
|
162
|
+
// one thing worth knowing (that the rule is about authorship, or state).
|
|
163
|
+
const e = r.data && r.data.error;
|
|
164
|
+
const code = e && typeof e === 'object' ? e.code : e;
|
|
165
|
+
err.textContent = code === 'not_your_idea'
|
|
166
|
+
? 'Only the builder who filed this idea can offer it up for development.'
|
|
167
|
+
: code === 'not_a_quick_idea'
|
|
168
|
+
? 'This is already a Full Idea — there is nothing to hand off.'
|
|
169
|
+
: code === 'idea_not_open'
|
|
170
|
+
? 'This idea is no longer open, so it cannot be marked.'
|
|
171
|
+
: `Could not change the mark (${r.status}).`;
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
// Re-render from what the server returned rather than toggling a local flag:
|
|
175
|
+
// the response is the authority on the new grade, and R144 is idempotent so a
|
|
176
|
+
// no-op comes back as the same truth.
|
|
177
|
+
const next = (r.data && r.data.idea) ? r.data.idea : idea;
|
|
178
|
+
window.OTB.toast(next.grade === 'spark' ? 'Offered up for development.' : 'Mark withdrawn.');
|
|
179
|
+
boot({ ...idea, ...next });
|
|
180
|
+
}
|
|
181
|
+
|
|
117
182
|
function statusLine(idea) {
|
|
118
183
|
const bits = [];
|
|
119
184
|
bits.push(`<span><strong>${escapeHtml(idea.status || 'open')}</strong></span>`);
|
|
@@ -131,7 +196,12 @@
|
|
|
131
196
|
// render
|
|
132
197
|
// ---------------------------------------------------------------------------
|
|
133
198
|
|
|
134
|
-
|
|
199
|
+
// Cached across a re-render: the template and the viewer do not change when the
|
|
200
|
+
// grade does, and re-fetching them on every mark toggle would be two needless
|
|
201
|
+
// requests plus a visible flicker.
|
|
202
|
+
const state = { template: null, viewer: null };
|
|
203
|
+
|
|
204
|
+
function render(idea, template, viewer) {
|
|
135
205
|
const grade = GRADE_WORD[idea.grade] ? idea.grade : 'quick';
|
|
136
206
|
const parts = [];
|
|
137
207
|
|
|
@@ -168,11 +238,21 @@
|
|
|
168
238
|
}
|
|
169
239
|
}
|
|
170
240
|
|
|
241
|
+
parts.push(markControl(idea, viewer));
|
|
242
|
+
|
|
171
243
|
$('#idea-body').innerHTML = parts.join('');
|
|
172
244
|
$('#idea-sub').textContent = `Idea ${idea.id}`;
|
|
173
245
|
document.title = `${idea.title || `Idea ${idea.id}`} — idea ${idea.id}`;
|
|
174
246
|
}
|
|
175
247
|
|
|
248
|
+
// render + wire. Separate from render() so the mark toggle can re-render from
|
|
249
|
+
// the server's response without re-fetching anything.
|
|
250
|
+
function boot(idea) {
|
|
251
|
+
render(idea, state.template, state.viewer);
|
|
252
|
+
const btn = $('#ig-mark-btn');
|
|
253
|
+
if (btn) btn.addEventListener('click', () => { toggleMark(idea); });
|
|
254
|
+
}
|
|
255
|
+
|
|
176
256
|
function fail(msg) {
|
|
177
257
|
$('#idea-body').innerHTML = `<p class="deeplink-card__title" id="idea-h">${escapeHtml(msg)}</p>`;
|
|
178
258
|
$('#idea-sub').textContent = '';
|
|
@@ -189,14 +269,20 @@
|
|
|
189
269
|
const idea = r.data.idea;
|
|
190
270
|
|
|
191
271
|
// The labels are only needed for a Full Idea, so a quick idea costs one
|
|
192
|
-
// request, not two — and a template outage cannot stop a quick idea
|
|
193
|
-
|
|
272
|
+
// request for them, not two — and a template outage cannot stop a quick idea
|
|
273
|
+
// rendering.
|
|
194
274
|
if (idea.grade === 'full') {
|
|
195
275
|
const key = idea.template_key;
|
|
196
276
|
const t = await api.inbox.getInboxTemplate(key ? { query: { template_key: key } } : {});
|
|
197
|
-
if (t.ok && t.data && t.data.template) template = t.data.template;
|
|
277
|
+
if (t.ok && t.data && t.data.template) state.template = t.data.template;
|
|
198
278
|
}
|
|
199
|
-
|
|
279
|
+
// Who is looking — for the author-only mark control (R154). Best-effort: the
|
|
280
|
+
// page is a READ first, so a /me hiccup must hide the button, never blank the
|
|
281
|
+
// idea. The route is the wall regardless.
|
|
282
|
+
const me = await api.me.getMe({});
|
|
283
|
+
if (me.ok && me.data && me.data.builder) state.viewer = me.data.builder;
|
|
284
|
+
|
|
285
|
+
boot(idea);
|
|
200
286
|
}
|
|
201
287
|
|
|
202
288
|
main();
|
|
@@ -118,3 +118,30 @@
|
|
|
118
118
|
.fi-mrow__fill { display: block; height: 100%; width: 0; border-radius: 0.2rem; background: var(--accent); transition: width 0.18s ease-out; }
|
|
119
119
|
|
|
120
120
|
.fi-meter__note { margin: 0.9rem 0 0; font-size: 0.76rem; opacity: 0.65; line-height: 1.5; }
|
|
121
|
+
|
|
122
|
+
/* ---- the spark queue + develop mode (task 1002930 / R154) --------------- */
|
|
123
|
+
|
|
124
|
+
.fi-queue { display: grid; gap: 10px; }
|
|
125
|
+
.fi-spark {
|
|
126
|
+
display: flex; flex-wrap: wrap; gap: 6px 12px; align-items: baseline;
|
|
127
|
+
padding: 12px 14px;
|
|
128
|
+
border: 1px solid var(--border); border-radius: var(--radius-sm);
|
|
129
|
+
background: var(--surface-2);
|
|
130
|
+
}
|
|
131
|
+
.fi-spark__title { margin: 0; font-weight: 600; font-size: 0.92rem; flex: 1 1 20rem; }
|
|
132
|
+
.fi-spark__title a { color: inherit; }
|
|
133
|
+
.fi-spark__who { font-size: 0.8rem; color: var(--ink-faint); }
|
|
134
|
+
.fi-spark__go { font-size: 0.84rem; white-space: nowrap; }
|
|
135
|
+
.fi-queue-empty { font-size: 0.88rem; color: var(--ink-faint); }
|
|
136
|
+
|
|
137
|
+
/* The spark being developed. Bordered on the leading edge rather than boxed: it
|
|
138
|
+
is context for the fields below it, not a competing card. */
|
|
139
|
+
.fi-develop {
|
|
140
|
+
margin: 0 0 6px;
|
|
141
|
+
padding: 2px 0 2px 14px;
|
|
142
|
+
border-left: 3px solid var(--warn);
|
|
143
|
+
}
|
|
144
|
+
.fi-develop__label { margin: 0; font-size: 0.76rem; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--warn); }
|
|
145
|
+
.fi-develop__title { margin: 4px 0 0; font-weight: 600; }
|
|
146
|
+
.fi-develop__body { margin: 4px 0 0; max-width: 70ch; line-height: 1.6; white-space: pre-wrap; color: var(--ink-soft); font-size: 0.9rem; }
|
|
147
|
+
.fi-develop__who { margin: 6px 0 0; font-size: 0.8rem; color: var(--ink-faint); }
|
|
@@ -23,11 +23,22 @@
|
|
|
23
23
|
<div class="page-head"><p class="page-head__sub" id="fi-sub">Loading the idea template…</p></div>
|
|
24
24
|
|
|
25
25
|
<main>
|
|
26
|
-
<!-- The
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
<!-- The spark queue (task 1002930 / R154). ABOVE the composer, because
|
|
27
|
+
"what is already waiting" is the thing to scan before starting
|
|
28
|
+
something new — and because a queue nobody sees is not a pickup
|
|
29
|
+
surface. Collapsed to a single line when empty so it never pushes the
|
|
30
|
+
composer down the page for nothing. -->
|
|
31
|
+
<section class="scroll" id="fi-queue-scroll" aria-labelledby="fi-queue-h">
|
|
32
|
+
<h2 id="fi-queue-h" class="scroll__h">Waiting to be developed</h2>
|
|
33
|
+
<p class="scroll__lede">
|
|
34
|
+
Ideas whose author has said "I had the thought but not the full picture".
|
|
35
|
+
Anyone can develop one — the author keeps the credit for having had it,
|
|
36
|
+
and you are recorded as its developer.
|
|
37
|
+
</p>
|
|
38
|
+
<div id="fi-queue"><p class="fi-note">Loading…</p></div>
|
|
39
|
+
</section>
|
|
40
|
+
|
|
41
|
+
<!-- The composer. The idea detail view lives on its own page (R153). -->
|
|
31
42
|
<section class="scroll" id="fi-compose-scroll" aria-labelledby="fi-compose-h">
|
|
32
43
|
<h2 id="fi-compose-h" class="scroll__h">Write a Full Idea</h2>
|
|
33
44
|
<p class="scroll__lede">
|
|
@@ -37,7 +48,18 @@
|
|
|
37
48
|
</p>
|
|
38
49
|
|
|
39
50
|
<form id="fi-form" novalidate>
|
|
40
|
-
|
|
51
|
+
<!-- DEVELOP MODE (R154): when the composer was opened from a spark,
|
|
52
|
+
this block carries the spark's own words and the title becomes a
|
|
53
|
+
read-only fact rather than a field — developing an idea must not
|
|
54
|
+
quietly rename it out from under its author. -->
|
|
55
|
+
<div class="fi-develop" id="fi-develop" hidden>
|
|
56
|
+
<p class="fi-develop__label">Developing a Big Idea Spark</p>
|
|
57
|
+
<p class="fi-develop__title" id="fi-develop-title"></p>
|
|
58
|
+
<p class="fi-develop__body" id="fi-develop-body"></p>
|
|
59
|
+
<p class="fi-develop__who" id="fi-develop-who"></p>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<label class="fi-label" for="fi-title" id="fi-title-label">
|
|
41
63
|
Title
|
|
42
64
|
<span class="fi-hint">One line. This is what the idea is called everywhere else.</span>
|
|
43
65
|
</label>
|
|
@@ -90,6 +112,6 @@
|
|
|
90
112
|
<script src="/builders/shell.js?v=2026-07-02-shell1"></script>
|
|
91
113
|
<script src="/builders/palette.js" defer></script>
|
|
92
114
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
93
|
-
<script src="/builders/ideas.js?v=2026-08-22-
|
|
115
|
+
<script src="/builders/ideas.js?v=2026-08-22-r154"></script>
|
|
94
116
|
</body>
|
|
95
117
|
</html>
|