@bongos/core 1.21.12 → 1.21.14

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.
@@ -5,7 +5,7 @@
5
5
  "adr": "0341 D3",
6
6
  "reread": "node scripts/gds/page-reader.js --stale",
7
7
  "how": ["Generated by node scripts/gds/page-reader.js (BV2.TW04, task 1004315; ADR 0341 D3). Do not hand-edit.","One entry per page of docs/page-inventory.json. Lines are in page order: the default state first, and a line only another state shows sits where that state shows it, with its state named.","placement: placed = a docs/copy-registry.json row renders it (file, line, string_id); shared = shell text every page of the surface carries (top bar, sidebar, footer), with its row when the registry has one; unplaced = the registry cannot place it (a rewrite becomes an engineer task, ADR 0341 D4).","text keeps {…} where the registry row has a hole, or where a value the page read from its API was filled in. A string that is only such data is counted under omitted.data, not listed.","reading_hash is over the non-shared lines (key, section, text); files_hash is over the page's inventory files. --check compares files_hash only and never opens a browser.","Rendered through the hall-preview harness (hall) and the ui-design kit stub (landing, status), at 1280x800 with the clock pinned, so a reading is the fixture world's page."],
8
- "counts": {"pages":42,"lines":4577,"placed":1497,"shared":250,"unplaced":2830,"omitted_data":2553},
8
+ "counts": {"pages":42,"lines":4610,"placed":1501,"shared":250,"unplaced":2859,"omitted_data":2560},
9
9
  "pages": [
10
10
  {
11
11
  "id": "builders:atlas",
@@ -67,9 +67,9 @@
67
67
  "surface": "builders",
68
68
  "title": "Board Room",
69
69
  "states_read": ["room","out","sitting-meta","objection-form"],
70
- "files_hash": "023ee53d46eff8bd",
71
- "reading_hash": "202a0cbb6bc54aac",
72
- "counts": {"lines":56,"placed":26,"shared":5,"unplaced":25},
70
+ "files_hash": "9eab030a3c91e250",
71
+ "reading_hash": "957790508a6850df",
72
+ "counts": {"lines":66,"placed":30,"shared":5,"unplaced":31},
73
73
  "omitted": {"data":9},
74
74
  "notes": [],
75
75
  "lines": [
@@ -78,37 +78,37 @@
78
78
  {"key":"L0003","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":495,"string_id":"eba610d25523"},
79
79
  {"key":"L0004","section":"top bar","text":"Ctrl K","placement":"shared"},
80
80
  {"key":"L0005","section":"Board Room","text":"Board Room","placement":"placed","file":"modules/hall-ui/public/board-room.html","line":19,"string_id":"118026595c16"},
81
- {"key":"L0006","section":"Board Room","text":"3 open sittings.","placement":"unplaced"},
81
+ {"key":"L0006","section":"Board Room","text":"4 open sittings.","placement":"unplaced"},
82
82
  {"key":"L0007","section":"Board Room","text":"Read an idea, then decide. An objection needs a reason and the section it faults.","placement":"placed","file":"modules/hall-ui/public/board-room.html","line":51,"string_id":"fae2f90927bd"},
83
83
  {"key":"L0008","section":"{…} Full Idea","text":"Full Idea","placement":"unplaced","occurrences":3},
84
84
  {"key":"L0009","section":"{…} Full Idea","text":"open","placement":"placed","file":"modules/hall-ui/public/approval-queue.js","line":163,"string_id":"9a803563c948"},
85
85
  {"key":"L0010","section":"{…} Full Idea","text":"closes in 73m","placement":"unplaced"},
86
- {"key":"L0011","section":"{…} Full Idea","text":"Vote yes","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":368,"string_id":"b2937e14ee9b"},
86
+ {"key":"L0011","section":"{…} Full Idea","text":"Vote yes","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":377,"string_id":"b2937e14ee9b"},
87
87
  {"key":"L0012","section":"{…} Full Idea","text":"Object…","placement":"unplaced"},
88
- {"key":"L0013","section":"{…} Full Idea","text":"This sends the idea back to its author. Say why, and which section.","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":368,"string_id":"69e8beced2ff","state":"objection-form"},
89
- {"key":"L0014","section":"{…} Full Idea","text":"Why — the reason the author will act on","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":368,"string_id":"fbd8a815b808","attr":"placeholder","state":"objection-form"},
90
- {"key":"L0015","section":"{…} Full Idea","text":"Its author gave no scope recommendation.","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":300,"string_id":"a21788f84e29"},
88
+ {"key":"L0013","section":"{…} Full Idea","text":"This sends the idea back to its author. Say why, and which section.","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":377,"string_id":"69e8beced2ff","state":"objection-form"},
89
+ {"key":"L0014","section":"{…} Full Idea","text":"Why — the reason the author will act on","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":377,"string_id":"fbd8a815b808","attr":"placeholder","state":"objection-form"},
90
+ {"key":"L0015","section":"{…} Full Idea","text":"Its author gave no scope recommendation.","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":309,"string_id":"a21788f84e29"},
91
91
  {"key":"L0016","section":"{…} Full Idea","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","occurrences":2},
92
92
  {"key":"L0017","section":"{…} Full Idea","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":4},
93
93
  {"key":"L0018","section":"{…} Full Idea","text":"What does the Big Picture look like","placement":"unplaced","occurrences":2},
94
94
  {"key":"L0019","section":"{…} Full Idea","text":"Why did you have the Idea","placement":"unplaced","occurrences":2},
95
95
  {"key":"L0020","section":"{…} Full Idea","text":"Why does the Idea Matter","placement":"unplaced","occurrences":2},
96
96
  {"key":"L0021","section":"{…} Full Idea","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5","occurrences":3},
97
- {"key":"L0022","section":"{…} Full Idea","text":"Cast objection","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":368,"string_id":"bdca1f219e6f","state":"objection-form"},
98
- {"key":"L0023","section":"{…} Full Idea","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":449,"string_id":"d73256fbc395","occurrences":3},
97
+ {"key":"L0022","section":"{…} Full Idea","text":"Cast objection","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":377,"string_id":"bdca1f219e6f","state":"objection-form"},
98
+ {"key":"L0023","section":"{…} Full Idea","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":458,"string_id":"d73256fbc395","occurrences":3},
99
99
  {"key":"L0024","section":"{…} Full Idea","text":"Every {…}","placement":"unplaced","state":"sitting-meta"},
100
100
  {"key":"L0025","section":"{…} Full Idea","text":"{…} or {…}","placement":"unplaced","state":"sitting-meta"},
101
101
  {"key":"L0026","section":"{…} Full Idea","text":"may vote on this.","placement":"unplaced","state":"sitting-meta"},
102
102
  {"key":"L0027","section":"{…} Full Idea","text":"The sitting runs 1 day, closing early once every member has voted.","placement":"unplaced","state":"sitting-meta"},
103
- {"key":"L0028","section":"{…} Full Idea","text":"It cleared the completeness grade at {…}/100.","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":331,"string_id":"bd8d04eb265c","state":"sitting-meta"},
103
+ {"key":"L0028","section":"{…} Full Idea","text":"It cleared the completeness grade at {…}/100.","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":340,"string_id":"bd8d04eb265c","state":"sitting-meta"},
104
104
  {"key":"L0029","section":"{…} and {…}","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":4},
105
105
  {"key":"L0030","section":"{…} and {…}","text":"Full Idea","placement":"unplaced"},
106
106
  {"key":"L0031","section":"{…} and {…}","text":"open","placement":"placed","file":"modules/hall-ui/public/approval-queue.js","line":163,"string_id":"9a803563c948"},
107
107
  {"key":"L0032","section":"{…} and {…}","text":"no clock","placement":"placed","file":"modules/hall-ui/public/government.js","line":607,"string_id":"b9f2e0d43c94"},
108
- {"key":"L0033","section":"{…} and {…}","text":"Your own idea. You may vote, but it can’t be decided by your vote alone, and a vote on your own idea earns no karma.","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":366,"string_id":"c0a01a95e97e"},
109
- {"key":"L0034","section":"{…} and {…}","text":"Vote yes","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":368,"string_id":"b2937e14ee9b"},
108
+ {"key":"L0033","section":"{…} and {…}","text":"Your own idea. You may vote, but it can’t be decided by your vote alone, and a vote on your own idea earns no karma.","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":375,"string_id":"c0a01a95e97e"},
109
+ {"key":"L0034","section":"{…} and {…}","text":"Vote yes","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":377,"string_id":"b2937e14ee9b"},
110
110
  {"key":"L0035","section":"{…} and {…}","text":"Object…","placement":"unplaced"},
111
- {"key":"L0036","section":"{…} and {…}","text":"Its author recommends this becomes","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":299,"string_id":"680491549e47"},
111
+ {"key":"L0036","section":"{…} and {…}","text":"Its author recommends this becomes","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":308,"string_id":"680491549e47"},
112
112
  {"key":"L0037","section":"{…} and {…}","text":"a {…} inside an existing goal","placement":"unplaced"},
113
113
  {"key":"L0038","section":"{…} and {…}","text":". The board decides.","placement":"unplaced"},
114
114
  {"key":"L0039","section":"{…} and {…}","text":"What made you have the idea","placement":"unplaced"},
@@ -116,19 +116,29 @@
116
116
  {"key":"L0041","section":"{…} and {…}","text":"What should an {…} or artist know prior to building","placement":"unplaced"},
117
117
  {"key":"L0042","section":"{…} and {…}","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5","occurrences":2},
118
118
  {"key":"L0043","section":"{…} and {…}","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","occurrences":2},
119
- {"key":"L0044","section":"{…} and {…}","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":449,"string_id":"d73256fbc395"},
119
+ {"key":"L0044","section":"{…} and {…}","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":458,"string_id":"d73256fbc395"},
120
120
  {"key":"L0045","section":"Constitutional amendment amendment","text":"Constitutional amendment","placement":"unplaced"},
121
121
  {"key":"L0046","section":"Constitutional amendment amendment","text":"amendment","placement":"unplaced"},
122
122
  {"key":"L0047","section":"Constitutional amendment amendment","text":"open","placement":"placed","file":"modules/hall-ui/public/approval-queue.js","line":163,"string_id":"9a803563c948"},
123
123
  {"key":"L0048","section":"Constitutional amendment amendment","text":"closes in 15m","placement":"unplaced"},
124
124
  {"key":"L0049","section":"Constitutional amendment amendment","text":"Proposes","placement":"unplaced"},
125
125
  {"key":"L0050","section":"Constitutional amendment amendment","text":"{\"pass_rule\":\"{…}\",\"window_minutes\":2880}","placement":"unplaced"},
126
- {"key":"L0051","section":"Constitutional amendment amendment","text":"Vote yes","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":368,"string_id":"b2937e14ee9b"},
126
+ {"key":"L0051","section":"Constitutional amendment amendment","text":"Vote yes","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":377,"string_id":"b2937e14ee9b"},
127
127
  {"key":"L0052","section":"Constitutional amendment amendment","text":"Object…","placement":"unplaced"},
128
- {"key":"L0053","section":"Constitutional amendment amendment","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":449,"string_id":"d73256fbc395"},
129
- {"key":"L0054","section":"Constitutional amendment amendment","text":"Closed sittings","placement":"unplaced"},
130
- {"key":"L0055","section":"{…} Full Idea","text":"passed","placement":"placed","file":"modules/hall-ui/public/government.js","line":633,"string_id":"da5368d10f85"},
131
- {"key":"L0056","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":471,"string_id":"1883ad7f07fc"}
128
+ {"key":"L0053","section":"Constitutional amendment amendment","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":458,"string_id":"d73256fbc395"},
129
+ {"key":"L0054","section":"Who decides what amendment","text":"Who decides what","placement":"unplaced"},
130
+ {"key":"L0055","section":"Who decides what amendment","text":"amendment","placement":"unplaced"},
131
+ {"key":"L0056","section":"Who decides what amendment","text":"open","placement":"placed","file":"modules/hall-ui/public/approval-queue.js","line":163,"string_id":"9a803563c948"},
132
+ {"key":"L0057","section":"Who decides what amendment","text":"closes in 24.0h","placement":"unplaced"},
133
+ {"key":"L0058","section":"Who decides what amendment","text":"Proposes","placement":"unplaced"},
134
+ {"key":"L0059","section":"Who decides what amendment","text":"{\"{…}\":[{\"area\":\"{…}\",\"decided_by\":\"{…}\",\"rule\":\"{…}\",\"who\":\"{…}\"}]}","placement":"unplaced"},
135
+ {"key":"L0060","section":"Who decides what amendment","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9"},
136
+ {"key":"L0061","section":"Who decides what amendment","text":"Vote yes","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":377,"string_id":"b2937e14ee9b"},
137
+ {"key":"L0062","section":"Who decides what amendment","text":"Object…","placement":"unplaced"},
138
+ {"key":"L0063","section":"Who decides what amendment","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":458,"string_id":"d73256fbc395"},
139
+ {"key":"L0064","section":"Who decides what amendment","text":"Closed sittings","placement":"unplaced"},
140
+ {"key":"L0065","section":"{…} Full Idea","text":"passed","placement":"placed","file":"modules/hall-ui/public/government.js","line":633,"string_id":"da5368d10f85"},
141
+ {"key":"L0066","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":471,"string_id":"1883ad7f07fc"}
132
142
  ]
133
143
  },
134
144
  {
@@ -2821,19 +2831,19 @@
2821
2831
  "id": "builders:street",
2822
2832
  "surface": "builders",
2823
2833
  "title": "The street — {{worldName}}",
2824
- "states_read": ["street","card","switched","focus","here","inside-rules","inside-disputes","inside-people","inside-planning","inside-automation","inside-review","inside-release","inside-treasury","floor","amend","district"],
2825
- "files_hash": "8ff3ad5230672d7b",
2826
- "reading_hash": "f647716a9da6da1d",
2827
- "counts": {"lines":184,"placed":36,"shared":5,"unplaced":143},
2828
- "omitted": {"data":257},
2834
+ "states_read": ["street","card","switched","focus","here","inside-rules","inside-disputes","inside-people","inside-planning","inside-automation","inside-review","inside-release","inside-treasury","floor","amend","district","sitting","object","voted","admission","settled"],
2835
+ "files_hash": "85876b6d71946c08",
2836
+ "reading_hash": "04a2cf8e8e609ca8",
2837
+ "counts": {"lines":207,"placed":36,"shared":5,"unplaced":166},
2838
+ "omitted": {"data":264},
2829
2839
  "notes": [],
2830
2840
  "lines": [
2831
- {"key":"L0001","section":"top bar","text":"the street","placement":"shared","file":"modules/hall-ui/public/street.html","line":52,"string_id":"22fc2137739d"},
2832
- {"key":"L0002","section":"top bar","text":"needs you","placement":"shared","file":"modules/hall-ui/public/street.html","line":57,"string_id":"e07cafb1f696"},
2833
- {"key":"L0003","section":"top bar","text":"your share this month","placement":"shared","file":"modules/hall-ui/public/street.html","line":65,"string_id":"dd7f7d6a97fe"},
2841
+ {"key":"L0001","section":"top bar","text":"the street","placement":"shared","file":"modules/hall-ui/public/street.html","line":53,"string_id":"22fc2137739d"},
2842
+ {"key":"L0002","section":"top bar","text":"needs you","placement":"shared","file":"modules/hall-ui/public/street.html","line":58,"string_id":"e07cafb1f696"},
2843
+ {"key":"L0003","section":"top bar","text":"your share this month","placement":"shared","file":"modules/hall-ui/public/street.html","line":66,"string_id":"dd7f7d6a97fe"},
2834
2844
  {"key":"L0004","section":"top bar","text":"light","placement":"shared","state":"switched"},
2835
2845
  {"key":"L0005","section":"top bar","text":"dark","placement":"shared"},
2836
- {"key":"L0006","section":"page top","text":"back to the street","placement":"placed","file":"modules/hall-ui/public/street.html","line":103,"string_id":"daad412fa988","state":"here"},
2846
+ {"key":"L0006","section":"page top","text":"back to the street","placement":"placed","file":"modules/hall-ui/public/street.html","line":104,"string_id":"daad412fa988","state":"here"},
2837
2847
  {"key":"L0007","section":"page top","text":"{…} · builder {…} — hall, dev box, and…","placement":"unplaced","state":"district"},
2838
2848
  {"key":"L0008","section":"page top","text":"{…} · ui","placement":"unplaced","state":"district","occurrences":5},
2839
2849
  {"key":"L0009","section":"{…} and {…}","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"district"},
@@ -2856,7 +2866,7 @@
2856
2866
  {"key":"L0026","section":"page top","text":"the starting government","placement":"unplaced","state":"here"},
2857
2867
  {"key":"L0027","section":"page top","text":"not recorded yet","placement":"unplaced","state":"here","occurrences":8},
2858
2868
  {"key":"L0028","section":"page top","text":"AI {…}","placement":"unplaced","state":"inside-treasury"},
2859
- {"key":"L0029","section":"page top","text":"the reviewer that grades every ship","placement":"unplaced","state":"inside-treasury"},
2869
+ {"key":"L0029","section":"page top","text":"the {…} that grades every ship","placement":"unplaced","state":"inside-treasury"},
2860
2870
  {"key":"L0030","section":"page top","text":"Testers","placement":"unplaced","state":"inside-people"},
2861
2871
  {"key":"L0031","section":"page top","text":"Removals","placement":"unplaced","state":"inside-disputes"},
2862
2872
  {"key":"L0032","section":"page top","text":"New {…}","placement":"unplaced","state":"inside-rules"},
@@ -2885,31 +2895,31 @@
2885
2895
  {"key":"L0055","section":"page top","text":"empty floor","placement":"unplaced","state":"here","occurrences":6},
2886
2896
  {"key":"L0056","section":"{…}","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"inside-treasury","occurrences":6},
2887
2897
  {"key":"L0057","section":"{…}","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5","state":"inside-treasury","occurrences":9},
2888
- {"key":"L0058","section":"{…}","text":"change how this works","placement":"placed","file":"modules/hall-ui/public/street.html","line":140,"string_id":"3c593c73628a","state":"inside-treasury","occurrences":8},
2889
- {"key":"L0059","section":"{…}","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"inside-treasury","occurrences":9},
2890
- {"key":"L0060","section":"{…}","text":"on the table here","placement":"placed","file":"modules/hall-ui/public/street.html","line":149,"string_id":"7a0398261747","state":"inside-treasury","occurrences":6},
2898
+ {"key":"L0058","section":"{…}","text":"change how this works","placement":"placed","file":"modules/hall-ui/public/street.html","line":141,"string_id":"3c593c73628a","state":"inside-treasury","occurrences":8},
2899
+ {"key":"L0059","section":"{…}","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"inside-treasury","occurrences":10},
2900
+ {"key":"L0060","section":"{…}","text":"on the table here","placement":"placed","file":"modules/hall-ui/public/street.html","line":150,"string_id":"7a0398261747","state":"inside-treasury","occurrences":6},
2891
2901
  {"key":"L0061","section":"{…}","text":"{…} · oct 8","placement":"unplaced","state":"inside-treasury"},
2892
2902
  {"key":"L0062","section":"{…}","text":"floor 5 · not recorded yet","placement":"unplaced","state":"inside-treasury","occurrences":2},
2893
2903
  {"key":"L0063","section":"Spending matters","text":"Spending matters","placement":"unplaced","state":"inside-treasury"},
2894
2904
  {"key":"L0064","section":"Spending matters","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5","state":"inside-treasury"},
2895
- {"key":"L0065","section":"Spending matters","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":156,"string_id":"4bde7b562cf4","state":"inside-treasury"},
2905
+ {"key":"L0065","section":"Spending matters","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":157,"string_id":"4bde7b562cf4","state":"inside-treasury"},
2896
2906
  {"key":"L0066","section":"Spending matters","text":"1 matter on the docket","placement":"unplaced","state":"inside-treasury"},
2897
2907
  {"key":"L0067","section":"Spending matters","text":"sep","placement":"unplaced","state":"inside-treasury"},
2898
2908
  {"key":"L0068","section":"{…}","text":"{…} you · oct 5","placement":"unplaced","state":"inside-rules"},
2899
2909
  {"key":"L0069","section":"{…}","text":"floor 2 · not recorded yet","placement":"unplaced","state":"inside-rules"},
2900
2910
  {"key":"L0070","section":"New {…}","text":"New {…}","placement":"unplaced","state":"inside-rules"},
2901
- {"key":"L0071","section":"New {…}","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":156,"string_id":"4bde7b562cf4","state":"inside-rules"},
2911
+ {"key":"L0071","section":"New {…}","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":157,"string_id":"4bde7b562cf4","state":"inside-rules"},
2902
2912
  {"key":"L0072","section":"New {…}","text":"1 matter on the docket","placement":"unplaced","state":"inside-rules"},
2903
2913
  {"key":"L0073","section":"New {…}","text":"oct","placement":"unplaced","state":"inside-rules"},
2904
- {"key":"L0074","section":"New {…}","text":"needs you","placement":"placed","file":"modules/hall-ui/public/street.html","line":57,"string_id":"e07cafb1f696","state":"inside-rules"},
2914
+ {"key":"L0074","section":"New {…}","text":"needs you","placement":"placed","file":"modules/hall-ui/public/street.html","line":58,"string_id":"e07cafb1f696","state":"inside-rules"},
2905
2915
  {"key":"L0075","section":"{…}","text":"Drafting an amendment from here is not built yet. For now, raise it with the council on the {…}.","placement":"unplaced","state":"amend"},
2906
2916
  {"key":"L0076","section":"{…}","text":"{…} you · oct 6","placement":"unplaced","state":"here"},
2907
2917
  {"key":"L0077","section":"{…}","text":"floor 8 · not recorded yet","placement":"unplaced","state":"here"},
2908
2918
  {"key":"L0078","section":"§7 {…}","text":"What this floor holds is not recorded in Bongos yet.","placement":"unplaced","state":"here"},
2909
- {"key":"L0079","section":"§7 {…}","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":156,"string_id":"4bde7b562cf4","state":"here"},
2919
+ {"key":"L0079","section":"§7 {…}","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":157,"string_id":"4bde7b562cf4","state":"here"},
2910
2920
  {"key":"L0080","section":"§7 {…}","text":"1 matter on the docket","placement":"unplaced","state":"here"},
2911
2921
  {"key":"L0081","section":"§7 {…}","text":"oct","placement":"unplaced","state":"here"},
2912
- {"key":"L0082","section":"§7 {…}","text":"needs you","placement":"placed","file":"modules/hall-ui/public/street.html","line":57,"string_id":"e07cafb1f696","state":"here"},
2922
+ {"key":"L0082","section":"§7 {…}","text":"needs you","placement":"placed","file":"modules/hall-ui/public/street.html","line":58,"string_id":"e07cafb1f696","state":"here"},
2913
2923
  {"key":"L0083","section":"page top","text":"work moves left to right · orange waits on you · white is {…} without you","placement":"unplaced"},
2914
2924
  {"key":"L0084","section":"page top","text":"1 {…} you","placement":"unplaced","occurrences":3},
2915
2925
  {"key":"L0085","section":"page top","text":"27 goals {…}","placement":"unplaced"},
@@ -2929,7 +2939,7 @@
2929
2939
  {"key":"L0099","section":"{…}","text":"floor 3 · not recorded yet","placement":"unplaced","state":"inside-review","occurrences":2},
2930
2940
  {"key":"L0100","section":"Signed off","text":"Signed off","placement":"unplaced","state":"inside-review"},
2931
2941
  {"key":"L0101","section":"Signed off","text":"What this floor holds is not recorded in Bongos yet.","placement":"unplaced","state":"inside-review"},
2932
- {"key":"L0102","section":"Signed off","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":156,"string_id":"4bde7b562cf4","state":"inside-review"},
2942
+ {"key":"L0102","section":"Signed off","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":157,"string_id":"4bde7b562cf4","state":"inside-review"},
2933
2943
  {"key":"L0103","section":"Signed off","text":"{…} file{…}","placement":"placed","file":"modules/hall-ui/public/gate.js","line":151,"string_id":"3efa67dc6e07","state":"inside-review"},
2934
2944
  {"key":"L0104","section":"page top","text":"Allowed goals","placement":"unplaced","state":"inside-automation"},
2935
2945
  {"key":"L0105","section":"page top","text":"the goals it may build","placement":"unplaced","state":"inside-automation"},
@@ -2941,7 +2951,7 @@
2941
2951
  {"key":"L0111","section":"page top","text":"what it did, told without asking","placement":"unplaced","state":"inside-automation"},
2942
2952
  {"key":"L0112","section":"Reports","text":"Reports","placement":"unplaced","state":"inside-automation"},
2943
2953
  {"key":"L0113","section":"Reports","text":"What this floor holds is not recorded in Bongos yet.","placement":"unplaced","state":"inside-automation"},
2944
- {"key":"L0114","section":"Reports","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":156,"string_id":"4bde7b562cf4","state":"inside-automation"},
2954
+ {"key":"L0114","section":"Reports","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":157,"string_id":"4bde7b562cf4","state":"inside-automation"},
2945
2955
  {"key":"L0115","section":"Reports","text":"{…} file{…}","placement":"placed","file":"modules/hall-ui/public/gate.js","line":151,"string_id":"3efa67dc6e07","state":"inside-automation"},
2946
2956
  {"key":"L0116","section":"page top","text":"18 built","placement":"unplaced"},
2947
2957
  {"key":"L0117","section":"page top","text":"9 built","placement":"unplaced"},
@@ -2963,44 +2973,44 @@
2963
2973
  {"key":"L0133","section":"Release","text":"Release","placement":"placed","file":"modules/hall-ui/public/bulk-toolbar.js","line":249,"string_id":"975ffb256651","state":"inside-release"},
2964
2974
  {"key":"L0134","section":"Release","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"inside-release"},
2965
2975
  {"key":"L0135","section":"Release","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5","state":"inside-release"},
2966
- {"key":"L0136","section":"Release","text":"change how this works","placement":"placed","file":"modules/hall-ui/public/street.html","line":140,"string_id":"3c593c73628a","state":"inside-release"},
2976
+ {"key":"L0136","section":"Release","text":"change how this works","placement":"placed","file":"modules/hall-ui/public/street.html","line":141,"string_id":"3c593c73628a","state":"inside-release"},
2967
2977
  {"key":"L0137","section":"Release","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"inside-release"},
2968
- {"key":"L0138","section":"Release","text":"on the table here","placement":"placed","file":"modules/hall-ui/public/street.html","line":149,"string_id":"7a0398261747","state":"inside-release"},
2978
+ {"key":"L0138","section":"Release","text":"on the table here","placement":"placed","file":"modules/hall-ui/public/street.html","line":150,"string_id":"7a0398261747","state":"inside-release"},
2969
2979
  {"key":"L0139","section":"Release","text":"floor 6","placement":"unplaced","state":"inside-release"},
2970
2980
  {"key":"L0140","section":"Ready to go","text":"Ready to go","placement":"unplaced","state":"inside-release"},
2971
2981
  {"key":"L0141","section":"Ready to go","text":"Nothing {…} here.","placement":"unplaced","state":"inside-release"},
2972
- {"key":"L0142","section":"Ready to go","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":156,"string_id":"4bde7b562cf4","state":"inside-release"},
2982
+ {"key":"L0142","section":"Ready to go","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":157,"string_id":"4bde7b562cf4","state":"inside-release"},
2973
2983
  {"key":"L0143","section":"Ready to go","text":"1 matter on the docket","placement":"unplaced","state":"inside-release"},
2974
2984
  {"key":"L0144","section":"Ready to go","text":"sep","placement":"unplaced","state":"inside-release"},
2975
2985
  {"key":"L0145","section":"page top","text":"Ranks","placement":"unplaced","state":"inside-people"},
2976
2986
  {"key":"L0146","section":"page top","text":"Goal {…}","placement":"placed","file":"modules/hall-ui/public/gate.js","line":360,"string_id":"ec88b946ad16","state":"inside-people"},
2977
- {"key":"L0147","section":"page top","text":"asked to join a goal team","placement":"unplaced","state":"inside-people"},
2987
+ {"key":"L0147","section":"page top","text":"asked to join a goal {…}","placement":"unplaced","state":"inside-people"},
2978
2988
  {"key":"L0148","section":"{…}","text":"{…} you · sat","placement":"unplaced","state":"inside-people"},
2979
2989
  {"key":"L0149","section":"{…}","text":"floor 1 · not recorded yet","placement":"unplaced","state":"floor"},
2980
2990
  {"key":"L0150","section":"The council","text":"The council","placement":"unplaced","state":"floor"},
2981
2991
  {"key":"L0151","section":"The council","text":"What this floor holds is not recorded in Bongos yet.","placement":"unplaced","state":"floor"},
2982
- {"key":"L0152","section":"The council","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":156,"string_id":"4bde7b562cf4","state":"floor"},
2992
+ {"key":"L0152","section":"The council","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":157,"string_id":"4bde7b562cf4","state":"floor"},
2983
2993
  {"key":"L0153","section":"The council","text":"1 matter on the docket","placement":"unplaced","state":"floor"},
2984
2994
  {"key":"L0154","section":"The council","text":"sep","placement":"unplaced","state":"floor"},
2985
- {"key":"L0155","section":"The council","text":"needs you","placement":"placed","file":"modules/hall-ui/public/street.html","line":57,"string_id":"e07cafb1f696","state":"floor"},
2995
+ {"key":"L0155","section":"The council","text":"needs you","placement":"placed","file":"modules/hall-ui/public/street.html","line":58,"string_id":"e07cafb1f696","state":"floor"},
2986
2996
  {"key":"L0156","section":"{…}","text":"floor 5 · being decided","placement":"unplaced","state":"inside-people"},
2987
2997
  {"key":"L0157","section":"Waiting to join","text":"Waiting to join","placement":"unplaced","state":"inside-people"},
2988
2998
  {"key":"L0158","section":"Waiting to join","text":"{…} you · sat","placement":"unplaced","state":"inside-people"},
2989
- {"key":"L0159","section":"Waiting to join","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":156,"string_id":"4bde7b562cf4","state":"inside-people"},
2999
+ {"key":"L0159","section":"Waiting to join","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":157,"string_id":"4bde7b562cf4","state":"inside-people"},
2990
3000
  {"key":"L0160","section":"Waiting to join","text":"1 matter on the docket","placement":"unplaced","state":"inside-people"},
2991
3001
  {"key":"L0161","section":"Waiting to join","text":"sep","placement":"unplaced","state":"inside-people"},
2992
- {"key":"L0162","section":"Waiting to join","text":"needs you","placement":"placed","file":"modules/hall-ui/public/street.html","line":57,"string_id":"e07cafb1f696","state":"inside-people"},
3002
+ {"key":"L0162","section":"Waiting to join","text":"needs you","placement":"placed","file":"modules/hall-ui/public/street.html","line":58,"string_id":"e07cafb1f696","state":"inside-people"},
2993
3003
  {"key":"L0163","section":"page top","text":"Grade appeals","placement":"unplaced","state":"inside-disputes"},
2994
3004
  {"key":"L0164","section":"page top","text":"a grade someone asks to change","placement":"unplaced","state":"inside-disputes"},
2995
3005
  {"key":"L0165","section":"Grade appeals","text":"Grade appeals","placement":"unplaced","state":"inside-disputes"},
2996
- {"key":"L0166","section":"Grade appeals","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":156,"string_id":"4bde7b562cf4","state":"inside-disputes"},
3006
+ {"key":"L0166","section":"Grade appeals","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":157,"string_id":"4bde7b562cf4","state":"inside-disputes"},
2997
3007
  {"key":"L0167","section":"Grade appeals","text":"1 matter on the docket","placement":"unplaced","state":"inside-disputes"},
2998
3008
  {"key":"L0168","section":"Grade appeals","text":"sep","placement":"unplaced","state":"inside-disputes"},
2999
3009
  {"key":"L0169","section":"{…}","text":"{…} · oct 4","placement":"unplaced","state":"inside-planning"},
3000
3010
  {"key":"L0170","section":"{…}","text":"floor 6","placement":"unplaced","state":"inside-planning"},
3001
3011
  {"key":"L0171","section":"Waiting on {…}","text":"Waiting on {…}","placement":"placed","file":"modules/hall-ui/public/goals-lib.js","line":91,"string_id":"b18832e219dc","state":"inside-planning"},
3002
3012
  {"key":"L0172","section":"Waiting on {…}","text":"{…} · oct 4","placement":"unplaced","state":"inside-planning"},
3003
- {"key":"L0173","section":"Waiting on {…}","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":156,"string_id":"4bde7b562cf4","state":"inside-planning"},
3013
+ {"key":"L0173","section":"Waiting on {…}","text":"the record","placement":"placed","file":"modules/hall-ui/public/street.html","line":157,"string_id":"4bde7b562cf4","state":"inside-planning"},
3004
3014
  {"key":"L0174","section":"Waiting on {…}","text":"1 matter on the docket","placement":"unplaced","state":"inside-planning"},
3005
3015
  {"key":"L0175","section":"Waiting on {…}","text":"sep","placement":"unplaced","state":"inside-planning"},
3006
3016
  {"key":"L0176","section":"page top","text":"{…} · oct 6","placement":"unplaced"},
@@ -3008,10 +3018,33 @@
3008
3018
  {"key":"L0178","section":"page top","text":"{…} · sat","placement":"unplaced"},
3009
3019
  {"key":"L0179","section":"page top","text":"{…} · oct 4","placement":"unplaced"},
3010
3020
  {"key":"L0180","section":"page top","text":"{…} · oct 8","placement":"unplaced"},
3011
- {"key":"L0181","section":"page top","text":"oct 6","placement":"unplaced","state":"card"},
3012
- {"key":"L0182","section":"{…}","text":"raised by {…} · 4 for · 1 against · {…}","placement":"unplaced","state":"card"},
3013
- {"key":"L0183","section":"{…}","text":"This waits on you.","placement":"unplaced","state":"card"},
3014
- {"key":"L0184","section":"{…}","text":"open it where it lives","placement":"placed","file":"modules/hall-ui/public/street.html","line":183,"string_id":"b9d1b0f0dfb4","state":"card"}
3021
+ {"key":"L0181","section":"{…}","text":"Someone who may {…} it will.","placement":"unplaced","state":"settled"},
3022
+ {"key":"L0182","section":"page top","text":"sat","placement":"unplaced","state":"admission"},
3023
+ {"key":"L0183","section":"{…}","text":"{…} asked to join as a builder.","placement":"unplaced","state":"admission"},
3024
+ {"key":"L0184","section":"{…}","text":"The call is yours. Fine by you lets them in; an objection keeps them out.","placement":"unplaced","state":"admission"},
3025
+ {"key":"L0185","section":"{…}","text":"fine by me","placement":"unplaced","state":"admission"},
3026
+ {"key":"L0186","section":"{…}","text":"object","placement":"unplaced","state":"admission","occurrences":2},
3027
+ {"key":"L0187","section":"{…}","text":"open it where it lives","placement":"placed","file":"modules/hall-ui/public/street.html","line":182,"string_id":"b9d1b0f0dfb4","state":"admission","occurrences":2},
3028
+ {"key":"L0188","section":"page top","text":"oct 6","placement":"unplaced","state":"card"},
3029
+ {"key":"L0189","section":"{…}","text":"the change","placement":"unplaced","state":"card"},
3030
+ {"key":"L0190","section":"{…}","text":"B","placement":"unplaced","state":"card","occurrences":3},
3031
+ {"key":"L0191","section":"{…}","text":"you","placement":"unplaced","state":"card"},
3032
+ {"key":"L0192","section":"{…}","text":"3 for · 0 against · {…}","placement":"unplaced","state":"card"},
3033
+ {"key":"L0193","section":"{…}","text":"counsel","placement":"unplaced","state":"card"},
3034
+ {"key":"L0194","section":"{…}","text":"Everyone who votes has to agree, so one objection sends it back to Builder to revise. If you object, say what would answer it.","placement":"unplaced","state":"card"},
3035
+ {"key":"L0195","section":"{…}","text":"why you object (it goes on the record)","placement":"unplaced","state":"object"},
3036
+ {"key":"L0196","section":"{…}","text":"the part you object to","placement":"unplaced","state":"object"},
3037
+ {"key":"L0197","section":"{…}","text":"pick one","placement":"unplaced","state":"object"},
3038
+ {"key":"L0198","section":"{…}","text":"what it changes","placement":"unplaced","state":"object"},
3039
+ {"key":"L0199","section":"{…}","text":"what it is for","placement":"unplaced","state":"object"},
3040
+ {"key":"L0200","section":"{…}","text":"why it matters","placement":"unplaced","state":"object"},
3041
+ {"key":"L0201","section":"{…}","text":"how it fits the rest","placement":"unplaced","state":"object"},
3042
+ {"key":"L0202","section":"{…}","text":"how we will know it worked","placement":"unplaced","state":"object"},
3043
+ {"key":"L0203","section":"{…}","text":"put it on the record","placement":"unplaced","state":"object"},
3044
+ {"key":"L0204","section":"{…}","text":"not now","placement":"unplaced","state":"object"},
3045
+ {"key":"L0205","section":"{…}","text":"vote for","placement":"unplaced","state":"card"},
3046
+ {"key":"L0206","section":"{…}","text":"abstain","placement":"unplaced","state":"card"},
3047
+ {"key":"L0207","section":"{…}","text":"Your yes is on the record.","placement":"unplaced","state":"voted"}
3015
3048
  ]
3016
3049
  },
3017
3050
  {
@@ -48,6 +48,7 @@ const REFUSALS = {
48
48
  no_allowlist: 'no goal is allowlisted, so there is nothing this runner may work on',
49
49
  goal_not_allowlisted: 'that goal is not on the allowlist',
50
50
  protected_path: 'the task declares work on a permission, migration, infrastructure or deploy-pipeline surface',
51
+ needs_host_access: 'the work needs shell access to a live host (SSH, root, systemd) that the runner machine does not have',
51
52
  grader_unavailable: 'the grader is bypassed, and it is the only review between an unattended worker and main',
52
53
  not_permitted: 'your rank does not hold autonomy.run, so your runner may not work on this project',
53
54
  builder_paused: 'the owner paused your runner',
@@ -247,6 +248,82 @@ function decideRun({ fence: rawFence, requestedGoals = [], graderBypassed = null
247
248
  return { go: true, goals, priorityGoal, refusedGoals: refused, code: null, reason: null };
248
249
  }
249
250
 
251
+ // needsHostAccess — can this task only be done ON a live host? (task 1004537)
252
+ //
253
+ // The runner machine holds no SSH key, no root and no service environment for any
254
+ // live droplet (ADR 0031 §6, ADR 0055), so a task whose work is "edit the unit on
255
+ // the droplet" is one it can only claim, fail and hand back as an owner blocker.
256
+ // Tasks 1003969 and 1003980 did exactly that three times between them.
257
+ //
258
+ // TWO SIGNALS, in a fixed order:
259
+ //
260
+ // 1. THE EXPLICIT TAG, which wins both ways. `automation_tag` already carries a
261
+ // 'live-only' value (migration 003, the claimable views' fit rules): it
262
+ // refuses with no text needed. 'overnight-safe' is the owner saying "an
263
+ // unattended session may do this", and it silences the text rule below — so
264
+ // a false positive costs one PATCH, not a task the runner refuses forever.
265
+ //
266
+ // 2. THE TEXT, when the tag says nothing. Neither real task carried a tag (nor
267
+ // touches[] on a host path — 1003980 has none; nor a manual_degree), so an
268
+ // explicit-only rule would have skipped neither of the two shapes this exists
269
+ // for. The phrases are OPERATIONS on a host, never the nouns: "a droplet" is
270
+ // code about the DigitalOcean API, "on the production droplet" or
271
+ // "sudo systemctl restart" is work done there. Each match is returned, so the
272
+ // skip row can say which phrase refused the task.
273
+ //
274
+ // ONE MENTION IS NOT ENOUGH; it takes HOST_ACCESS_MIN_SIGNALS distinct
275
+ // phrases. Measured against the 150 ready tasks on 2026-10-02, a single hit
276
+ // was a code task describing the box in passing ("the owner's only route is
277
+ // ssh ... systemctl restart", "a manual fix already applied on the live box")
278
+ // as often as it was host work. Both real shapes carry three or more. A
279
+ // host task described in one phrase is missed and costs one claim; the
280
+ // 'live-only' tag is the fix for it, and the skip row names the phrases so a
281
+ // false positive is visible too.
282
+ //
283
+ // manual_degree is NOT a signal: it is null on most rows and the views read null
284
+ // as 5, so using it would refuse nearly everything; and a high degree says a task
285
+ // is human-heavy, not that it is host-bound.
286
+ const HOST_ACCESS_PATTERNS = [
287
+ /\/etc\/(?:systemd|caddy|nginx|cron)\b/i, // host config files
288
+ /\bsudo\s+(?:systemctl|journalctl|-u\b|cp|mv|tee|install|chown|chmod|rm|nano|vim?)\b/i,
289
+ /\bsystemctl\s+(?:daemon-reload|restart|start|stop|enable|disable|edit)\b/i,
290
+ /\b(?:root|via)\s+ssh\b/i,
291
+ /\bssh\s+(?:to|into|onto|in\s+to)\b/i,
292
+ /\b(?:on|onto|to|from)\s+the\s+(?:old|live|production|prod|control-plane|co-hosting|remote)\s+(?:droplet|box|host|server)s?\b/i,
293
+ /\blive\s+(?:droplet|box|host|server)(?:es|s)?\b/i,
294
+ ];
295
+ const HOST_ACCESS_MIN_SIGNALS = 2;
296
+
297
+ // Every match of every pattern, overlapping ones merged into one span, so
298
+ // "on the live box" (two patterns, one phrase) counts once.
299
+ function hostAccessSpans(text) {
300
+ const hits = [];
301
+ for (const re of HOST_ACCESS_PATTERNS) {
302
+ const g = new RegExp(re.source, 'gi');
303
+ let m;
304
+ while ((m = g.exec(text))) hits.push({ start: m.index, end: m.index + m[0].length, text: m[0] });
305
+ }
306
+ hits.sort((a, b) => a.start - b.start || b.end - a.end);
307
+ const spans = [];
308
+ for (const h of hits) {
309
+ const last = spans[spans.length - 1];
310
+ if (last && h.start < last.end) { last.end = Math.max(last.end, h.end); continue; }
311
+ spans.push({ ...h });
312
+ }
313
+ return spans;
314
+ }
315
+
316
+ function needsHostAccess(task) {
317
+ if (!task || typeof task !== 'object') return { needs: false, source: null, signals: [] };
318
+ const tag = task.automation_tag;
319
+ if (tag === 'live-only') return { needs: true, source: 'automation_tag', signals: ["automation_tag 'live-only'"] };
320
+ if (tag === 'overnight-safe') return { needs: false, source: 'automation_tag', signals: [] };
321
+ const spans = hostAccessSpans(`${task.title || ''}\n${task.description || ''}`);
322
+ const signals = [...new Set(spans.map((s) => s.text.replace(/\s+/g, ' ').toLowerCase()))];
323
+ if (spans.length < HOST_ACCESS_MIN_SIGNALS) return { needs: false, source: null, signals };
324
+ return { needs: true, source: 'text', signals };
325
+ }
326
+
250
327
  // decideTask — may THIS task be handed to an unattended worker?
251
328
  //
252
329
  // `protectedHits` is the output of the ADR 0043 registry matcher run over the
@@ -273,7 +350,15 @@ function decideTask({ task, goals = [], protectedHits = [] } = {}) {
273
350
  globs,
274
351
  };
275
352
  }
353
+ const host = needsHostAccess(task);
354
+ if (host.needs) {
355
+ return {
356
+ go: false, code: 'needs_host_access',
357
+ reason: `${REFUSALS.needs_host_access} (${host.signals.join('; ')})`,
358
+ signals: host.signals,
359
+ };
360
+ }
276
361
  return { go: true, code: null, reason: null };
277
362
  }
278
363
 
279
- module.exports = { REFUSALS, normaliseFence, prioritise, allowedGoals, effectiveFence, decideRun, decideTask };
364
+ module.exports = { REFUSALS, HOST_ACCESS_PATTERNS, HOST_ACCESS_MIN_SIGNALS, normaliseFence, prioritise, allowedGoals, effectiveFence, decideRun, decideTask, needsHostAccess };
@@ -137,6 +137,15 @@
137
137
  const label = item.subject ? item.subject.label : `stage ${item.subject_id}`;
138
138
  return `Close the ${escapeHtml(label)} stage ${pill('quiet', 'genesis stage')}`;
139
139
  }
140
+ // task 1004528: a building's matter (task 1004529's <area>_matter subjects)
141
+ // is put to that building's sitting, not an amendment; and a change to who
142
+ // decides what is an amendment of its own kind.
143
+ const matterArea = /^([a-z]+)_matter$/.exec(String(item.subject_type || ''));
144
+ if (matterArea) {
145
+ const title = item.subject && item.subject.title ? item.subject.title : `A matter at ${matterArea[1]}`;
146
+ return `${escapeHtml(title)} ${pill('quiet', `${matterArea[1]} matter`)}`;
147
+ }
148
+ if (item.subject && item.subject.kind === 'decision_rules') return `Who decides what ${pill('quiet', 'amendment')}`;
140
149
  return `Constitutional amendment ${pill('quiet', 'amendment')}`;
141
150
  }
142
151